Наука за данните

GPU програмиране с Python

GPU програмиране с Python

В тази статия ще се потопим в GPU програмирането с Python. Използвайки лекотата на Python, можете да отключите невероятната изчислителна мощ на графичния процесор на вашата видеокарта (графичен процесор). В този пример ще работим с библиотеката CUDA на NVIDIA.

Изисквания

За това упражнение ще ви трябва или физическа машина с Linux и графичен процесор, базиран на NVIDIA, или стартиране на базиран на GPU екземпляр на Amazon Web Services. И двете трябва да работят добре, но ако решите да използвате физическа машина, ще трябва да се уверите, че имате инсталирани собствени драйвери на NVIDIA, вижте инструкциите: https: // linuxhint.com / install-nvidia-drivers-linux

Също така ще ви трябва инсталиран CUDA Toolkit. Този пример използва Ubuntu 16.04 LTS, но има налични изтегляния за повечето основни дистрибуции на Linux на следния URL адрес: https: // разработчик.nvidia.com / cuda-downloads

Предпочитам .deb базирано изтегляне и тези примери ще приемат, че сте избрали този маршрут. Изтегленият от вас файл е .deb пакет, но няма .deb разширение, така че го преименувайте, за да има .deb в края му полезен. След това го инсталирате с:

sudo dpkg -i име на пакета.деб

Ако бъдете подканени да инсталирате GPG ключ, моля, следвайте инструкциите, дадени за това.

Сега ще трябва да инсталирате самия пакет cuda. За да направите това, изпълнете:

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

Тази част може да отнеме известно време, така че може да искате да вземете чаша кафе. След като приключи, препоръчвам да рестартирате, за да сте сигурни, че всички модули са презаредени правилно.

След това ще ви трябва дистрибуцията на Anaconda Python. Можете да го изтеглите от тук: https: // www.анаконда.com / download / # linux

Вземете 64-битовата версия и я инсталирайте по следния начин:

sh Anaconda *.ш

(звездата в горната команда ще гарантира, че командата се изпълнява независимо от второстепенната версия)

Мястото за инсталиране по подразбиране трябва да е наред и в този урок ще го използваме. По подразбиране се инсталира на ~ / anaconda3

В края на инсталацията ще бъдете подканени да решите дали искате да добавите Anaconda към пътя си. Отговорете да тук, за да улесните изпълнението на необходимите команди. За да сте сигурни, че тази промяна се извършва, след като инсталационната програма завърши напълно, излезте и след това влезте отново във вашия акаунт.

Повече информация за инсталирането на Anaconda: https: // linuxhint.com / install-anaconda-python-on-ubuntu /

Накрая ще трябва да инсталираме Numba. Numba използва компилатора LLVM, за да компилира Python в машинен код. Това не само подобрява производителността на обикновения код на Python, но също така осигурява лепилото, необходимо за изпращане на инструкции към графичния процесор в двоична форма. За да направите това, изпълнете:

conda инсталиране на numba

Ограничения и предимства на GPU програмирането

Изкушаващо е да мислим, че можем да конвертираме всяка програма на Python в програма, базирана на GPU, драстично ускорявайки нейната производителност. GPU на видеокарта обаче работи значително по-различно от стандартния процесор в компютър.

Процесорите обработват много различни входове и изходи и имат широк набор от инструкции за справяне с тези ситуации. Те също така отговарят за достъпа до паметта, справяне със системната шина, боравене със защитни пръстени, сегментиране и въвеждане / извеждане на функционалност. Те са екстремни мултитаскъри без конкретен фокус.

Графичните процесори от друга страна са създадени да обработват прости функции с ослепително бърза скорост. За да постигнат това, те очакват по-еднакво състояние на входа и изхода. Като се специализира в скаларни функции. Скаларна функция приема един или повече входове, но връща само един изход. Тези стойности трябва да бъдат типове, предварително дефинирани от numpy.

Примерен код

В този пример ще създадем проста функция, която взема списък със стойности, събира ги и връща сумата. За да демонстрираме мощността на графичния процесор, ще изпълним една от тези функции на процесора и една на графичния процесор и ще покажем времената. Документираният код е по-долу:

импортиране на numpy като np от timeit import default_timer като таймер от numba import vectorize # Това трябва да бъде значително висока стойност. На моята тестова машина това отне # 33 секунди, за да се стартира през процесора и малко над 3 секунди на графичния процесор. NUM_ELEMENTS = 100000000 # Това е версията на процесора. def vector_add_cpu (a, b): c = np.нули (NUM_ELEMENTS, dtype = np.float32) за i в обхват (NUM_ELEMENTS): c [i] = a [i] + b [i] return c # Това е версията на графичния процесор. Обърнете внимание на декоратора @vectorize. Това казва на # numba да превърне това във векторизирана функция на GPU. @vectorize (["float32 (float32, float32)"], target = "cuda") def vector_add_gpu (a, b): върнете a + b; def main (): a_source = np.единици (NUM_ELEMENTS, dtype = np.float32) b_source = np.единици (NUM_ELEMENTS, dtype = np.float32) # Време за стартиране на функцията на процесора = таймер () vector_add_cpu (a_source, b_source) vector_add_cpu_time = timer () - start # Време на функцията GPU start = timer () vector_add_gpu (a_source, b_source) vector_add_gpu_time = start (timer) times print ("функцията на процесора отне% f секунди."% vector_add_cpu_time) print (" GPU функцията отне% f секунди."% vector_add_gpu_time) връща 0, ако __name__ ==" __main__ ": main () 

За да стартирате примера, напишете:

python gpu-пример.py

ЗАБЕЛЕЖКА: Ако срещнете проблеми при стартиране на вашата програма, опитайте да използвате “conda install accelerate”.

Както можете да видите, версията на процесора работи значително по-бавно.

Ако не, тогава вашите повторения са твърде малки. Настройте NUM_ELEMENTS на по-голяма стойност (при мен марката на безубытност изглежда е около 100 милиона). Това е така, защото настройката на графичния процесор отнема малко, но забележимо време, така че за да си струва операцията, е необходимо по-голямо натоварване. След като го вдигнете над прага за вашата машина, ще забележите значителни подобрения в производителността на версията на GPU спрямо версията на процесора.

Заключение

Надявам се да ви е харесало нашето основно въведение в GPU програмирането с Python. Въпреки че горният пример е тривиален, той предоставя рамката, от която се нуждаете, за да продължите вашите идеи, използвайки по-нататък силата на вашия графичен процесор.

Как да използвам AutoKey за автоматизиране на Linux игри
AutoKey е програма за автоматизация на настолни компютри за Linux и X11, програмирана в Python 3, GTK и Qt. Използвайки неговата функционалност за скр...
Как да покажа брояч на FPS в игрите на Linux
Linux игрите получиха голям тласък, когато Valve обяви поддръжка на Linux за Steam клиент и техните игри през 2012 г. Оттогава много AAA и независими ...
Как да изтеглите и пуснете Civilization VI на Сид Майер на Linux
Въведение в играта Civilization 6 е модерен поглед върху класическата концепция, въведена в поредицата от игрите Age of Empires. Идеята беше доста про...