AI Thuis Deel 1: Een Doos Schroot
Het is een interessante tijd om softwareontwikkelaar te zijn; het transformer large language model is naar mijn mening de eerste echt nieuwe en interessante technologische ontwikkeling in het veld in lange tijd. AI-codeeragenten die hierop zijn gebouwd, zijn snel essentieel geworden voor dit beroep. Het voelt een beetje als de overstap van houtbewerking met handgereedschap naar het gebruik van elektrisch gereedschap, voor beter of slechter.
Persoonlijk kan ik technologie pas vertrouwen als ik het in mijn garage uit elkaar kan halen en weer in elkaar kan zetten. Het idee dat je verbinding maakt met een dienst en een codeeragent gebruikt die onder controle staat van iemand anders, stoort me; er zijn te veel dingen die mis kunnen gaan. Je wordt er afhankelijk van, en dan kan het je worden afgenomen. Deze hele technologie is spannend, maar ik wil niet verbinden met een groot AI-datacenter ergens ver weg; ik wil een klein AI-datacenter in elk huis! En we zitten momenteel in een soort tekort aan computeronderdelen (of waren de late jaren 2010 misschien juist een overschot?), dus om het betaalbaar te houden, ga ik het bouwen van schroot.
De GPU's: Waarom de AMD V620?
Het belangrijkste dat ik nodig heb is een reeks GPU's. Ik heb snel geheugen nodig dat gekoppeld is aan iets dat veel parallelle matrixberekeningen kan uitvoeren, en dat is precies wat een GPU doet. Zoals ik al zei: alles wat ontworpen is om AI-workloads te draaien, of waarvan bekend is dat het daar goed in is, is momenteel extreem duur.
In 2022 probeerden verschillende bedrijven "cloud gaming" te laten slagen; waarbij je videospellen in een datacenter draait zodat je geen dure gaming-pc of console hoeft te kopen. AMD nam een van hun workstation-GPU's, gaf deze extra RAM en verwijderde alle video-uitgangen. De resulterende kaart noemden ze de "V620". Deze werd nooit aan het publiek verkocht, dus je hebt er misschien nog niet van gehoord. AMD heeft deze kaarten massaal overgeproduceerd, maar cloud gaming werkte uiteindelijk niet vanwege (achteraf gezien voor de hand liggende) problemen met vertraging (lag).
Deze kaarten zijn niet echt ontworpen voor AI-workloads en de softwareondersteuning van AMD is berucht slecht, waardoor ze relatief goedkoop te koop zijn via wederverkopers van "gebruikte serverhardware" (e-waste) op eBay. Ik denk niet dat die van mij daadwerkelijk gebruikt zijn; ze zien er vrijwel nieuw uit. Ze hebben elk 32 GB aan vrij snel VRAM. Natuurlijk hebben ze een reputatie voor het niet geschikt zijn voor waar ik ze voor wil gebruiken, maar hoe moeilijk kan het zijn om dit echt werkend te krijgen?
Overigens hebben ze geen ventilatoren. Het zijn serverkaarten en ze gaan ervan uit dat de server ze koelt met een extreem luidruchtige blower-ventilator. Daar komen we zo op terug.
Moederbord, CPU en Geheugen
Omdat er een tekort is aan onderdelen, heb ik ander e-waste gekocht om het GPU-array aan elkaar te knopen. Het moederbord komt van het X299-platform uit 2017; het was de oude gaming-rig van iemand en was oud genoeg om goedkoop op eBay te zijn. Het heeft vier PCIe x16-slots met de juiste tussenruimte om vier GPU's naast elkaar te plaatsen, wat het enige was waar ik om gaf.
De CPU is de Intel Core i9 10900X, wat de slechtste CPU is die Intel in de afgelopen twintig jaar heeft geproduceerd. Toen hij in 2019 werd gelanceerd, was het een "re-re-re-refreshed" versie van de Skylake-chips; te duur en stroomvretend omdat Intel destijds niet kon meekomen met de Ryzen-chips van AMD, noch qua processorontwerp, noch qua lithografieknooppuntgrootte. Prima voor mij: dat betekent dat hij nu goedkoop is en het werk zal doen!
Het RAM en de SSD zijn gesloopt uit andere computers in huis. Dat is natuurlijk valsspelen; als ik ze nu zou moeten kopen, zouden ze vervelend duur zijn. Maar de eisen zijn minder streng dan je zou denken; al het werk wordt gedaan op het VRAM van de GPU's. Nadat het model vanaf de schijf is geladen, blijven deze onderdelen grotendeels inactief. Als ik geen reserveonderdelen had gehad, had ik hier vrij goedkoop uit de lossen kunnen gaan.
Stroomvoorziening en Behuizing
Omdat ik vier GPU's en Intel's minst efficiënte processor van stroom voorzie, heb ik een grote voeding gekocht. Om redenen die ik niet ken was een 1600W voeding op eBay goedkoper dan een 1200W versie. Ik verwacht niet constant zoveel stroom te verbruiken, maar hij moet het aankunnen wanneer alles tijdens het opstarten tegelijk inschakelt.
Ik heb uitgegiven aan een nieuwe behuizing en ventilatoren. En daar zijn we weer: de ventilatoren! Die datacenter-GPU's hebben geen eigen koeling; ze rekenen op de luchtstroom van een muur van serverventilatoren. Er staan online veel 3D-printbare modellen voor ventilatorbehuizingen (shrouds), maar als je er vier naast elkaar stapelt, lijken die suboptimaal. Ze gebruiken ofwel een kleine, superluide 40mm ventilator aan het uiteinde, of ze steken te ver uit naar de zijkant waardoor je geen kaarten naast elkaar kunt plaatsen. Vier dual-slot kaarten naast elkaar hebben een breedte van ongeveer 160 mm; wat ik echt wil zijn zijn twee 80mm serverventilatoren die direct over de koelblokken van de kaarten blazen.
Ik heb OnShape gebruikt om een shroud te ontwerpen en printen waarmee een 80mm ventilator aan twee kaarten kan worden bevestigd. De kaarten hadden een soort metalen kabelgeleidingsvin aan de achterkant, vastgehouden door kleine schroefjes; ik gebruikte die schroefgaten om de shroud te bevestigen. Er is een uitsparing voor de elektrische connectoren en vier gaten om de ventilatoren aan de achterkant te monteren. Ik heb dit geprint van carbon-fiber ASA, maar gewoon PLA zou waarschijnlijk ook prima hebben gewerkt.
Ik heb 10.000 RPM ventilatoren gekozen omdat ik zeker wilde weten dat er genoeg lucht bewoog, en ze kostten hetzelfde als langzamere ventilatoren. Ze zijn echt luid! Ik wilde dat het moederbord hun snelheid zou regelen op basis van de GPU-temperatuur, maar dat werkte in eerste instantie niet, dus droeg ik tijdens de initiële setup gehoorbescherming.
Software en Eerste Boot-pogingen
De box wilde in eerste instantie niet booten. Ik heb waarschijnlijk een uur met gehoorbescherming in de garage gestaan te klooien met BIOS-instellingen totdat ik ontdekte welke PCIe-instellingen aangepast moesten worden om het moederbord daadwerkelijk op te starten met alle vier de kaarten verbonden. (Je moet Resizable BAR en MMIO High Size inschakelen in twee aparte menu's diep in de geavanceerde instellingen, omdat niemand in 2017 dacht dat je zoveel VRAM op dit bord zou aansluiten). Rond die tijd realiseerde ik me ook dat ik geen ethernet in de garage had, dus begon ik om 23:00 uur gaten in de gipswand te snijden.
Na die valse starts kreeg ik het systeem aan de praat en installeerde ik Ubuntu 24.04. Met oordoppen in en nog steeds geen fan-controle, compileerde ik een build van mijn favoriete inference server, de uitstekende llama.cpp, en testte ik het Gemma4-model, dat comfortabel in één kaart past. Dit was mijn favoriete lokale model toen ik met een enkelvoudig GPU-workstation experimenteerde; het presteerde behoorlijk goed, al niet zo snel als op de RTX 3090 die ik vroeger had. Daarna startte ik Deepseek V4 Flash op, wat het echte doel van deze build was. Het is traag! Op dit punt heb ik geen idee hoe ik het sneller moet maken (daarover in het volgende hoofdstuk), ik wilde gewoon zien of het paste, en dat deed het.
Fanbeheer via Arduino
Terug naar de ventilatoren: ik kan niet genoeg benadrukken hoe luid ze zijn. Op vol vermogen kun je ze door de muren van het huis heen horen, en dit systeem heeft geen vol vermogen nodig. Het oorspronkelijke plan was om de ventilatoren te regelen via de ingebouwde fan-control van het moederbord, maar dit bord weigert verschillende ventilatoren op verschillende snelheden aan te sturen. Blijkbaar is dit gebruikelijk voor moederborden van Supermicro.
Daarom heb ik een eigen fan-controller gebouwd. Ik heb een hele doos met off-brand Arduino Nano-clones die ik van Aliexpress heb gekocht in de tijd vóór de importtarieven. Ik graafde wat code op die ik meer dan tien jaar geleden voor een microcontroller-cursus op de universiteit had geschreven om een PWM-motor aan te sturen, en heb deze opgeschoond.
De controller ontvangt simpelweg een percentage van de server; ik heb een script op de server nodig dat temperaturen uitleest en de ventilatorsnelheid dienovereenkomstig schaalt. En aangezien het een AI-server is, heb ik de AI zijn eigen fan-controlscript laten schrijven; dat leek passend. Deepseek V4 Flash is hier prima in staat toe, mits er de gebruikelijke hoeveelheid begeleiding en menselijke interactie is die nodig is om fatsoenlijke software uit een lichtgewicht AI-model te krijgen. We hadden een grappig moment toen ik hem vroeg iets te bedenken om de GPU's op te warmen zodat ik het script kon testen; hij begon een PyTorch-script te schrijven voor matrixvermenigvuldiging. Ik zei: "Nee, je draait op deze kaarten, je bestaat in een llama.cpp-instantie op deze computer, gewoon iets zeggen zal de kaarten al belasten." Hij had een korte existentiële crisis. Schattig!
De controller zelf zit op een prototyping breadboard dat ik gewoon in de serverbehuizing heb gestopt. Ik heb er wat isolatietape op geplakt zodat hij niet kortsluit tegen de behuizing. Het zal waarschijnlijk wel goed gaan! Maak je geen zorgen.
Op dit moment is de box vrij stabiel, heb ik de GPU's getest en ben ik klaar om echt in te duiken hoe ik het snel kan laten draaien, waarover ik in het volgende hoofdstuk zal spreken.
Groetjes,