Программирование на GPU с помощью Python

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

Требования

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

Вам также понадобится установленный CUDA Toolkit. В этом примере специально используется Ubuntu 16.04 LTS, но для большинства основных дистрибутивов Linux доступны загрузки по следующему URL-адресу: https://developer.nvidia.com/cuda-downloads

Я предпочитаю .deb на основе загрузки, и в этих примерах предполагается, что вы выбрали этот маршрут. Загружаемый файл представляет собой пакет .deb, но не имеет расширения .deb, поэтому переименуйте его, чтобы в конце было .deb. Затем вы устанавливаете его с помощью:

 sudo dpkg -i package-name.deb 

Если вам будет предложено установить ключ GPG, следуйте приведенным инструкциям. итак.

Теперь вам нужно установить сам пакет cuda. Для этого выполните:

 sudo apt-get updatesudo apt-get install cuda -y 

Эта часть может занять некоторое время, поэтому вы можете захотеть получить чашка кофе. Как только это будет сделано, я рекомендую перезагрузиться, чтобы убедиться, что все модули правильно перезагружены.

Далее вам понадобится дистрибутив Anaconda Python. Вы можете скачать это здесь: https://www.anaconda.com/download/#linux

Возьмите 64-битную версию и установите ее следующим образом:

sh Anaconda * .sh

(звездочка в приведенной выше команде гарантирует, что команда будет запущена независимо от дополнительной версии)

Место установки по умолчанию должно быть в порядке , и в этом уроке мы будем его использовать. По умолчанию он устанавливается в ~/anaconda3

В конце установки вам будет предложено решить, хотите ли вы добавить Anaconda в свой путь. Ответьте «да» здесь, чтобы упростить выполнение необходимых команд. Чтобы это изменение произошло, после полного завершения установки выйдите из системы и снова войдите в свою учетную запись.

Подробнее об установке Anaconda: https://linuxhint.com/install-anaconda- python-on-ubuntu/

Наконец, нам нужно установить Numba. Numba использует компилятор LLVM для компиляции Python в машинный код. Это не только повышает производительность обычного кода Python, но и обеспечивает связующее звено, необходимое для отправки инструкций на графический процессор в двоичной форме. Для этого запустите:

 conda install numba 

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

Заманчиво думаю, что мы можем преобразовать любую программу Python в программу на базе графического процессора, значительно увеличив ее производительность. Однако графический процессор видеокарты работает значительно иначе, чем стандартный процессор компьютера.

Процессоры обрабатывают множество различных входов и выходов и имеют широкий набор инструкций для решения этих ситуаций. Они также отвечают за доступ к памяти, работу с системной шиной, обработку защитных колец, сегментацию и функции ввода/вывода. Они являются экстремально многозадачными и не имеют конкретной цели.

С другой стороны, графические процессоры созданы для обработки простых функций с невероятно высокой скоростью. Для этого они ожидают более однородного состояния ввода и вывода. Специализируясь на скалярных функциях. Скалярная функция принимает один или несколько входов, но возвращает только один выход. Эти значения должны быть типами, предопределенными numpy.

Пример кода

В этом примере мы создадим простую функцию, которая принимает список значений, добавляет их вместе и возвращает сумму. Чтобы продемонстрировать мощь графического процессора, мы запустим одну из этих функций на центральном процессоре и одну на графическом процессоре и отобразим время. Документированный код ниже:

 import numpy as npfrom timeit import default_timer as timerfrom numba import vectorize # Это должно быть существенно высокое значение.  На моей тестовой машине это заняло # 33 секунды для запуска через CPU и чуть более 3 секунд на GPU. NUM_ELEMENTS = 100000000 # Это версия процессора. Def vector_add_cpu (a, b): c = np.zeros (NUM_ELEMENTS,  dtype = np.float32) для i в диапазоне (NUM_ELEMENTS): c [i] = a [i] + b [i] return c # Это версия графического процессора.  Обратите внимание на декоратор @vectorize.  Это говорит # numba превратить это в векторизованную функцию графического процессора. @ Vectorize (["float32 (float32, float32)"], target = 'cuda') def vector_add_gpu (a, b): return a + b; def main ()  : a_source = np.ones (NUM_ELEMENTS, dtype = np.float32) b_source = np.ones (NUM_ELEMENTS, dtype = np.float32) # Время запуска функции ЦП = timer () vector_add_cpu (a_source, b_source) vector_add_cpu_time =  - start # Время запуска функции GPU = timer () vector_add_gpu (a_source, b_source) vector_add_gpu_time = timer () - start # Время отчета print ("Функция CPU заняла% f секунд."% vector_add_cpu_time) print ("Функция GPU заняла% f  секунд. "% vector_add_gpu_time) return 0if __name__ ==" __main__ ": main () 

Чтобы запустить пример, введите:

 python gpu-example.py 

ПРИМЕЧАНИЕ. Если вы столкнетесь с проблемами при запуске вашей программы, попробуйте использовать «conda install accelerate».

Как видите, версия CPU работает значительно медленнее.

В противном случае ваши итерации слишком малы. Измените NUM_ELEMENTS на большее значение (на мой взгляд, безубыточность составляет около 100 миллионов). Это связано с тем, что настройка графического процессора занимает небольшое, но заметное количество времени, поэтому для того, чтобы операция того стоила, требуется более высокая рабочая нагрузка. Как только вы поднимете его выше порогового значения для вашей машины, вы заметите существенное улучшение производительности версии с графическим процессором по сравнению с версией с процессором..

Заключение

Надеюсь, вам понравилось наше базовое введение в программирование на GPU с помощью Python. Хотя приведенный выше пример является тривиальным, он предоставляет основу для дальнейшего развития ваших идей с использованием мощности вашего графического процессора.

Оцените статью
nanomode.ru
Добавить комментарий