Artikel top billede

(Foto: Computerworld)

Guide: Kør et neuralt netværk på din Raspberry Pi

Tilbagevendende neurale netværk er vældig sjove at lege med. De består som regel af forførerisk enkel kode – i dette tilfælde en pakke ved navn Char-rnn, der er lavet af Andrej Karpathy. Andrej Karpathy er ph.d.-studerende ved Stanford Computer Science og ekspert i neurale netværk.

Af Torben Okholm, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Der er tale om en lettere udvidet version af hans oprindelige program på 100 linjer, som er kodet i Lua til indlæringsmiljøet Torch. Kort sagt giver man Char-rnn et kildedokument, der indeholder de sager, som man gerne vil have, at det lærer at skabe – det skal vi nok vise dig et par eksempler på – og lader det kværne løs.

Mens det sker, analyserer programmet originalen og sender neuroner ind i en virtuel hjerne, efterhånden som det begynder at genkende mønstre og strukturer, og programmet lærer det, som brugeren finder ønskværdigt, på baggrund af inputtet.

Eftersom dette er et “tilbagevendende” neuralt net, er det ikke kun under indflydelse af dette enkelte input, men af alt det, som det har lært i fortiden. Når man senere beder det om et eksempel, trækker det på sin indlæringsoplevelse og genererer resultater. Man kan læse meget mere i Andrej Karpathys omfattende blogindslag på (http://karpathy.github.io/2015/05/21/rnn-effectiveness).

1 Download og installer

Der forestår megen oprydning på din Raspberry Pi, før du kan begynde at tænke – og eftersom den ikke er overforsynet med processorkraft, må du vente en stund, mens det hele bliver installeret og kompileret. Begynd med en frisk installation af Raspbian, hvis du kan, og åbn terminal-appen ved at klikke på det relevante ikon øverst på skærmbilledet.

Først skriver du git clone https://github.com/torch/distro.git ~/torch --recursive for at trække de filer, som Torch skal bruge, fra GitHub. Placer dem i din hjemmemappe, og skriv så cd ~/torch; bash install-deps; for at forsyne din Raspberry Pi med alt det, som Torch har brug for. Det tager nogen tid, men ikke helt så lang tid som den endelige installationsproces [Billede A], som du opnår ved at skrive ./install.sh .

Skriv nu source ~/.bashrc for at føje stien til Torch til dine miljøvariabler, og installer de ekstra Lua-komponenter, som Char-rnn kræver, ved hjælp af luarocks install nngraph , luarocks install optim og luarocks install nn . Lad os sluttelig trække Char-rnn-pakken ned fra GitHub ved hjælp af git clone https://github.com/karpathy/char-rnn.git.

neuraltnetværk Billede A

 

2 Opsætning af din pi

Vi er ikke helt klar til at gå i gang. Det er vigtigt at give Char-rnn så store ressourcer som muligt at gøre godt med. Hvis du arbejder med en masse data, kan du nemt komme til at udsulte din Pis temmelig beskedne 1 GB ram, fordi den bliver delt mellem gpu’en og video-outputtet. Det problem løser du ved at køre sudo raspi-config [Billede B] i et terminalvindue.

Lad os slippe af med Raspbian-gui’et ved næste boot (option 3, B1, B2 for at springe direkte til en ind-logget kommandolinje) og allokere så meget ram som muligt til systemhukommelsen (option 7, A3, og sæt gpu-hukommelsesværdien til 16 MB). Genstart din Pi (skriv sudo reboot i kommandolinjen for at gøre det hurtigt), og så er vi klar til at køre.

neuraltnetværk Billede b

3 Begynd at tænke

Du kan sætte Char-rnn til at tænke med standardfunktionerne, idet du arbejder på det inkluderede Tiny Shakespeare-datasæt, ved at skrive th train.lua -gpuid -1 , der beder Torch (th) køre træningsfilen (train.lua) uden at bruge gpu-beregning (“-1” er gpu-id for “ingen gpu”). Men det fungerer ikke. Efter omkring 100 omgange gennem koden crasher den med en segmentationsfejl, fordi Raspberry Pi’s ram er komplet opbrugt.

Vi er nødt til at være mere konservative. Knyt -batch_size 25 til kommandoen for dermed at tvinge Char-rnn til at arbejde med mindre portioner af de oprindelige data. Men det er heller ikke helt godt, fordi det vil tage mere end 21 timer at færdiggøre processen. Derfor skal du også bruge -max_epochs 5 og -num_layers 1 til at skalere tingene endnu længere tilbage.

Mere kraft, større hastighed

Vi må hellere indrømme det: Tilbagevendende neurale netværk er ikke nødvendigvis bedst egnet til de beskedne kræfter hos Raspberry Pi, fordi de kræver en ret solid regnekraft. Det gælder navnlig, hvis man ønsker, at beregningerne skal gå hurtigt.

Hvis du har stærkere hardware liggende, er det absolut muligt at køre Torch og Char-rnn på andet udstyr, og du kan endda drage nytte af din gpu og få ekstra processorkraft ved hjælp af CUDA eller OpenCL på AMD-kort.

Vi kan ærgerligt nok ikke se nogen måde, hvorpå man kan bruge Torch udenfor Linux-miljøer. Derfor er du nødt til at fyre op under Ubuntu eller noget lignende, få styr på dine grafikkort-drivere og – i tilgift til de moduler, vi installerede i guiden – køre (til CUDA) luarocks install cutorch og luarocks install cunn eller (til OpenCL) køre luarocks install cltorch og luarocks install clnn .

Når du aktiverer træningsscriptet, skal du udelade argumentet “-gpuid -1” for at bruge standard-gpu’en og tilføje “-opencl 1”, hvis du er på AMD-hardware. Nu kan du selv tilføje ekstra beregningslag med “-num_layers” og øge din batchstørrelse, som du ønsker det.

4 Hvad foregår der?

Mens Char-rnn tænker, udskriver den sit output [Billede C], og du kan iagttage dens intelligens stige med hvert skridt. Hold øje med værdien “train_loss”, der sandsynligvis begynder omkring 4 og arbejder sig af sted mod 0, imens netværket arbejder.

En gang imellem – standarden siger for hvert tusinde skridt – gemmer den en log over sine træningsdata i mappen “/cv”, og det betyder, at du senere kan gå tilbage og tjekke dem. Den gemmer også en, når dens allokerede beregninger er færdige. I vores tilfælde sker det efter fem epoker. Hvis du på et tidspunkt vil stoppe processen, før den den er færdig, skal du blot trykke Ctrl-C.

neuraltnetværk billede c

5 Afprøv output

Hvis du har blot ét checkpoint gemt i mappen “/cv” (skriv ls ~/torch/char-rnn/cv for at se dens indhold), kan du hente noget output fra den. Men husk, at tidligere checkpoints vil være markant mere dumme end de senere. Skriv blot th sample.lua -gpuid -1 cv/<name of checkpoint> for at få vist output på skærmen [Billede D] eller brug > output.txt for at få ført dette output til en tekstfil.

neuraltnetværk Billede d

 

6 Forskellige data

Du er naturligvis ikke begrænset til det oprindelige data-sæt. Du kan bearbejde stort set alt gennem dit neurale net, forudsat at du kan lægge det i en rå tekstfil. Char-rnn leder efter en fil ved navn “input.txt” i en mappe under mappen “/data” directory. Lad os prøve det med et sæt af de 20.000 mest populære amerikansk-engelske ord på baggrund af Googles enorme sprogtrænings-korpus.

Først skal du gå til det rigtige sted ( cd ~/torch/char-rnn/data ), derefter skal du oprette en ny mappe (mkdir words ) og begive dig ind i den med cd words . Brug git clone https://github.com/first20hours/google-10000-english.git til at downloade et sæt ord, og brug mv /google-10000-english/20k.txt ./input.txt til at flytte den relevante fil og omdøbe den.

Nu kan du få Char-rnn til at fundere over dette nye datasæt ved at tilføje -data_dir data/words til vores oprindelige træningskommando. Den lægger sine checkpoints i den samme “/cv”-mappe som de andre træningsdata. Brug -savefile words til at ændre filnavnet og gøre dets checkpoints nemme at genkende. Resultaterne [Billede E] kan være ret underholdende. 

neuraltnetværk Billede e