Duomenų mokslas

GPU programavimas su „Python“

GPU programavimas su „Python“

Šiame straipsnyje mes pasinersime į GPU programavimą su „Python“. Naudodamiesi „Python“ paprastumu, galite atrakinti neįtikėtiną vaizdo plokštės GPU (grafikos procesoriaus) skaičiavimo galią. Šiame pavyzdyje dirbsime su NVIDIA CUDA biblioteka.

Reikalavimai

Norėdami atlikti šį pratimą, jums reikės arba fizinės mašinos su „Linux“ ir NVIDIA pagrindu veikiančiu GPU, arba paleisti „GPU“ pagrįstą egzempliorių „Amazon Web Services“. Bet kuri iš jų turėtų veikti gerai, bet jei nuspręsite naudoti fizinę mašiną, turėsite įsitikinti, kad įdiegėte nuosavų „NVIDIA“ tvarkyklių, žiūrėkite instrukcijas: https: // linuxhint.com / install-nvidia-drivers-linux

Jums taip pat reikės įdiegti CUDA įrankių rinkinį. Šiame pavyzdyje naudojamas „Ubuntu 16“.04 LTS specialiai, tačiau daugumai pagrindinių „Linux“ paskirstymų galima atsisiųsti šiuo URL: https: // developer.nvidia.com / cuda-downloads

Man labiau patinka .deb pagrįstas atsisiuntimas ir šie pavyzdžiai manys, kad pasirinkote tą maršrutą. Atsisiųstas failas yra .deb paketas, bet neturi a .deb pratęsimas, todėl jį pervadinus į .deb pabaigoje jo naudinga. Tada įdiekite jį naudodami:

sudo dpkg -i paketo pavadinimas.deb

Jei būsite paraginti įdiegti GPG raktą, vykdykite pateiktas instrukcijas.

Dabar turėsite įdiegti patį „cuda“ paketą. Norėdami tai padaryti, paleiskite:

sudo apt-get update sudo apt-get install cuda -y 

Ši dalis gali užtrukti, todėl galbūt norėsite paimti kavos puodelį. Kai tai bus padaryta, rekomenduoju iš naujo paleisti, kad visi moduliai būtų tinkamai įkelti.

Tada jums reikės „Anaconda Python“ paskirstymo. Atsisiųsti galite čia: https: // www.anakonda.lt / atsisiųsti / # linux

Paimkite 64 bitų versiją ir įdiekite ją taip:

sh Anaconda *.sh

(aukščiau nurodytos komandos žvaigždė užtikrins, kad komanda būtų vykdoma neatsižvelgiant į antrinę versiją)

Numatytoji diegimo vieta turėtų būti tinkama, ir šioje pamokoje mes ją naudosime. Pagal numatytuosius nustatymus jis įdiegiamas į ~ / anaconda3

Diegimo pabaigoje būsite paraginti nuspręsti, ar norite pridėti „Anaconda“ prie savo kelio. Jei norite lengviau paleisti reikiamas komandas, atsakykite taip. Norėdami užtikrinti, kad šis pakeitimas įvyktų, diegimo programai visiškai baigus, atsijunkite ir vėl prisijunkite prie savo paskyros.

Daugiau informacijos apie „Anaconda“ diegimą: https: // linuxhint.com / install-anaconda-python-on-ubuntu /

Galiausiai reikės įdiegti „Numba“. Numba naudoja „LLVM“ kompiliatorių, kad sukompiliuotų „Python“ į mašininį kodą. Tai ne tik pagerina įprasto „Python“ kodo veikimą, bet ir suteikia klijų, reikalingų instrukcijoms siųsti GPU dvejetainiu pavidalu. Norėdami tai padaryti, paleiskite:

conda install numba

GPU programavimo apribojimai ir privalumai

Pagunda manyti, kad bet kurią „Python“ programą galime konvertuoti į GPU pagrįstą programą, žymiai pagreitindami jos našumą. Tačiau vaizdo plokštės GPU veikia gerokai kitaip nei standartinis kompiuterio procesorius.

Centriniai procesoriai valdo daugybę skirtingų įėjimų ir išėjimų ir turi platų instrukcijų, kaip spręsti šias situacijas, asortimentą. Jie taip pat yra atsakingi už prieigą prie atminties, sistemos magistralės valdymą, apsaugos žiedų valdymą, segmentavimą ir įvesties / išvesties funkcionalumą. Jie yra ekstremalūs multitaskeriai, neturintys jokio konkretaus dėmesio.

Kita vertus, GPU yra sukurti paprastoms funkcijoms apdoroti akinančiai greitai. Norėdami tai pasiekti, jie tikisi vienodesnės įvesties ir išvesties būsenos. Specializuojantis skaliarinėse funkcijose. Skaliarinė funkcija reikalauja vieno ar daugiau įėjimų, tačiau pateikia tik vieną išvestį. Šios vertės turi būti tipai, iš anksto apibrėžti numpy.

Kodo pavyzdys

Šiame pavyzdyje sukursime paprastą funkciją, kuri sudarys reikšmių sąrašą, sujungs jas ir grąžins sumą. Norėdami parodyti GPU galią, vykdysime vieną iš šių funkcijų procesoriuje ir vieną GPU ir parodysime laiką. Dokumentinis kodas yra žemiau:

importuoti numpy kaip np iš timeit importuoti default_timer kaip laikmatį iš numba importuoti vectorize # Tai turėtų būti iš esmės didelė vertė. Mano bandomojoje mašinoje užtruko # 33 sekundžių, kol jis veikė per centrinį procesorių, o GPU - šiek tiek daugiau nei 3 sekundes. NUM_ELEMENTS = 100000000 # Tai procesoriaus versija. def vektorius_add_cpu (a, b): c = np.nuliai (NUM_ELEMENTS, tipo tipas = np.float32) i diapazone (NUM_ELEMENTS): c [i] = a [i] + b [i] grąžinti c # Tai GPU versija. Atkreipkite dėmesį į dekoratorių @vectorize. Tai nurodo # numba paversti tai GPU vektorizuota funkcija. @vectorize (["float32 (float32, float32)"], target = "cuda") def vector_add_gpu (a, b): grąžinkite a + b; def pagrindinis (): a_ šaltinis = np.vieni (NUM_ELEMENTS, dtype = np.float32) b_source = np.vieni (NUM_ELEMENTS, dtype = np.float32) # Laikas, kai procesoriaus funkcija start = timer () vector_add_cpu (a_source, b_source) vector_add_cpu_time = timer () - start # GPU funkcija start = timer () vector_add_gpu (a_source, b_source) vector_add_gpu_time = timer () - # kartų spausdinti ("procesoriaus funkcija užtruko% f sekundžių."% vector_add_cpu_time) print (" GPU funkcija užtruko% f sekundės."% vector_add_gpu_time) grąžinti 0, jei __name__ ==" __main__ ": main () 

Norėdami paleisti pavyzdį, įveskite:

python gpu-pavyzdys.py

PASTABA: Jei vykdydami programą susiduriate su problemomis, pabandykite naudoti „conda install accelerate“.

Kaip matote, procesoriaus versija veikia žymiai lėčiau.

Jei ne, tada jūsų pakartojimai yra per maži. Sureguliuokite NUM_ELEMENTS didesne verte (mano manymu, lūžio riba buvo maždaug 100 milijonų). Taip yra todėl, kad GPU nustatymas užima mažai, bet pastebimai laiko, todėl norint, kad operacija būtų verta, reikia didesnio darbo krūvio. Kai pakelsite ją virš savo įrenginio slenksčio, pastebėsite esminius GPU versijos, palyginti su procesoriaus, našumo patobulinimus.

Išvada

Tikiuosi, kad jums patiko mūsų pagrindinis įvadas į GPU programavimą su „Python“. Nors aukščiau pateiktas pavyzdys yra nereikšmingas, jis suteikia pagrindą, kurio reikia, kad galėtumėte toliau panaudoti savo idėjas, naudodamiesi savo GPU galia.

Kaip pakeisti pelės ir jutiklinių plokščių slinkimo kryptį sistemoje „Windows 10“
Pelė ir Jutiklinė dalisTai ne tik palengvina skaičiavimus, bet ir efektyvesnį bei mažiau laiko reikalaujantį. Mes neįsivaizduojame gyvenimo be šių pri...
Kaip pakeisti pelės žymeklio ir žymeklio dydį, spalvą ir schemą sistemoje „Windows 10“
„Windows 10“ pelės žymeklis ir žymeklis yra labai svarbūs operacinės sistemos aspektai. Tai galima pasakyti ir apie kitas operacines sistemas, taigi, ...
Nemokami ir atvirojo kodo žaidimų varikliai, skirti kurti „Linux“ žaidimus
Šiame straipsnyje bus pateiktas nemokamų ir atvirojo kodo žaidimų variklių, kurie gali būti naudojami kuriant 2D ir 3D žaidimus „Linux“, sąrašas. Toki...