Datu zinātne

GPU programmēšana ar Python

GPU programmēšana ar Python

Šajā rakstā mēs iegremdēsimies GPU programmēšanā ar Python. Izmantojot Python vienkāršību, varat atbloķēt videokartes GPU (grafikas procesora) neticamo skaitļošanas jaudu. Šajā piemērā mēs strādāsim ar NVIDIA CUDA bibliotēku.

Prasības

Lai veiktu šo uzdevumu, jums būs nepieciešama vai nu fiziska mašīna ar Linux un NVIDIA bāzes GPU, vai arī jāuzsāk GPU balstīta instance Amazon Web Services. Jebkuram no tiem vajadzētu darboties labi, bet, ja izvēlaties izmantot fizisku mašīnu, jums jāpārliecinās, vai ir instalēti NVIDIA patentētie draiveri, skatiet instrukcijas:.com / install-nvidia-drivers-linux

Jums būs nepieciešams arī instalēt CUDA rīkkopa. Šajā piemērā tiek izmantota Ubuntu 16.04 LTS īpaši, taču lielākajai daļai galveno Linux izplatījumu ir pieejamas lejupielādes ar šādu vietrādi URL: https: // developer.nvidia.com / cuda-downloads

Es gribētu .deb balstīta lejupielāde, un šie piemēri pieņems, ka jūs izvēlējāties šo maršrutu. Lejupielādētais fails ir .deb pakete, bet tai nav a .deb paplašinājums, tāpēc pārdēvējot to, lai būtu .deb beigās viņa noderīga. Tad jūs to instalējat ar:

sudo dpkg -i pakotnes nosaukums.deb

Ja jums tiek piedāvāts instalēt GPG atslēgu, lūdzu, izpildiet dotos norādījumus, lai to izdarītu.

Tagad jums būs jāinstalē pati cuda pakotne. Lai to izdarītu, palaidiet:

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

Šī daļa var aizņemt kādu laiku, tāpēc jūs varētu vēlēties paķert tasi kafijas. Kad tas ir izdarīts, es iesaku atsāknēt, lai nodrošinātu, ka visi moduļi ir pareizi ielādēti.

Tālāk jums būs nepieciešams Anaconda Python izplatījums. To varat lejupielādēt šeit: https: // www.anakonda.com / download / # linux

Paņemiet 64 bitu versiju un instalējiet to šādi:

sh Anakonda *.sh

(zvaigznīte iepriekšminētajā komandā nodrošinās komandas palaišanu neatkarīgi no nelielās versijas)

Noklusējuma instalēšanas vietai jābūt labi, un šajā apmācībā mēs to izmantosim. Pēc noklusējuma tas tiek instalēts vietnē ~ / anaconda3

Instalēšanas beigās jums tiks piedāvāts izlemt, vai vēlaties savam ceļam pievienot Anaconda. Lai atvieglotu nepieciešamo komandu izpildi, šeit atbildiet ar jā. Lai nodrošinātu, ka šīs izmaiņas notiek, pēc instalētāja pilnīgas pabeigšanas piesakieties un pēc tam piesakieties savā kontā.

Plašāka informācija par Anaconda instalēšanu: https: // linuxhint.com / install-anaconda-python-on-ubuntu /

Visbeidzot, mums būs jāinstalē Numba. Numba izmanto LLVM kompilatoru, lai kompilētu Python uz mašīnkodu. Tas ne tikai uzlabo parastā Python koda veiktspēju, bet arī nodrošina līmi, kas nepieciešama, lai nosūtītu instrukcijas GPU binārā formā. Lai to izdarītu, palaidiet:

conda install numba

GPU programmēšanas ierobežojumi un priekšrocības

Ir vilinoši domāt, ka jebkuru Python programmu mēs varam pārvērst par GPU balstītu programmu, dramatiski paātrinot tās veiktspēju. Tomēr videokartes GPU darbojas ievērojami savādāk nekā standarta procesors datorā.

Centrālie procesori apstrādā daudz dažādu ieeju un izeju, un tiem ir plašs instrukciju klāsts, kā rīkoties šajās situācijās. Viņi ir atbildīgi arī par piekļuvi atmiņai, par sistēmas kopnes apstrādi, aizsardzības gredzenu apstrādi, segmentēšanu un ievades / izvades funkcionalitāti. Viņi ir ārkārtīgi daudzuzdevumu dalībnieki bez īpaša uzmanības.

Savukārt GPU ir veidoti, lai apstrādātu vienkāršas funkcijas ar akli ātru ātrumu. Lai to paveiktu, viņi sagaida vienmērīgāku ievades un izvades stāvokli. Specializējoties skalārajās funkcijās. Skalāra funkcija aizņem vienu vai vairākas ievades, bet atgriež tikai vienu izvadi. Šīm vērtībām ir jābūt numuriem iepriekš definētiem veidiem.

Koda piemērs

Šajā piemērā mēs izveidosim vienkāršu funkciju, kas ņem vērtību sarakstu, saskaita tās kopā un atgriež summu. Lai parādītu GPU jaudu, mēs izpildīsim vienu no šīm funkcijām centrālajā procesorā un vienu GPU un parādīsim laiku. Dokumentētais kods ir zemāk:

importēt numpy kā np no timeit importēt default_timer kā taimeri no numba importēt vectorize # Tam vajadzētu būt ievērojami lielai vērtībai. Manā testa mašīnā, lai to palaistu, izmantojot CPU, bija nepieciešamas # 33 sekundes, bet GPU - nedaudz vairāk kā 3 sekundes. NUM_ELEMENTS = 100000000 # Šī ir centrālā procesora versija. def vector_add_cpu (a, b): c = np.nulles (NUM_ELEMENTS, dtype = np.float32) i diapazonā (NUM_ELEMENTS): c [i] = a [i] + b [i] return c # Šī ir GPU versija. Ievērojiet dekoratoru @vectorize. Tas liek # numba to pārvērst par GPU vektorizētu funkciju. @vectorize (["float32 (float32, float32)"], target = "cuda") def vector_add_gpu (a, b): atgrieziet a + b; def main (): a_source = np.vieni (NUM_ELEMENTS, dtype = np.pludiņš32) b_source = np.vieni (NUM_ELEMENTS, dtype = np.float32) # CPU funkcijas sākuma laiks = taimeris () vector_add_cpu (a_source, b_source) vector_add_cpu_time = taimeris () - start # laiks GPU funkcijas start = taimeris () vector_add_gpu (a_source, b_source) vector_add_gpu_time = taimeris () - start # reizes drukāt ("CPU funkcija ilga% f sekundes."% vector_add_cpu_time) print (" GPU funkcija aizņēma% f sekundes."% vector_add_gpu_time) return 0 if __name__ ==" __main__ ": main () 

Lai palaistu piemēru, ierakstiet:

python gpu-piemērs.py

PIEZĪME. Ja, palaižot programmu, rodas problēmas, mēģiniet izmantot “conda install accelerate”.

Kā redzat, CPU versija darbojas ievērojami lēnāk.

Ja nē, tad jūsu atkārtojumi ir pārāk mazi. Pielāgojiet NUM_ELEMENTS lielākai vērtībai (manējā gadījumā likmju starpības atzīme, šķiet, bija aptuveni 100 miljoni). Tas ir tāpēc, ka GPU iestatīšana prasa nelielu, bet ievērojamu laiku, tāpēc, lai darbība būtu tā vērts, nepieciešama lielāka slodze. Kad jūs to paaugstināsiet virs savas mašīnas sliekšņa, pamanīsit būtiskus GPU versijas veiktspējas uzlabojumus salīdzinājumā ar CPU versiju.

Secinājums

Es ceru, ka jums patika mūsu pamata ievads GPU programmēšanā ar Python. Lai gan iepriekš minētais piemērs ir niecīgs, tas nodrošina sistēmu, kas jums jāturpina, lai turpinātu izmantot savas idejas, izmantojot GPU jaudu.

5 labākie ergonomiskie datoru peles izstrādājumi Linux
Vai ilgstoša datora lietošana izraisa sāpes plaukstas locītavā vai pirkstos? Vai jūs ciešat no stīvām locītavām un jums pastāvīgi ir jāspiež rokas? Va...
How to Change Mouse and Touchpad Settings Using Xinput in Linux
Most Linux distributions ship with “libinput” library by default to handle input events on a system. It can process input events on both Wayland and X...
Izmantojot X-Mouse Button Control, atšķirīgi mainiet peles pogas atšķirīgai programmatūrai
Varbūt jums ir nepieciešams rīks, kas varētu mainīt peles vadību ar katru lietoto lietojumprogrammu. Ja tas tā ir, varat izmēģināt lietojumprogrammu a...