Наука о данных

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

Программирование на 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, поэтому переименовав его, .деб в конце его полезный. Затем вы устанавливаете его с помощью:

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

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

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

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

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

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

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

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 np from timeit import default_timer as timer from numba import vectorize # Это должно быть существенно высокое значение. На моей тестовой машине это заняло # 33 секунды для запуска через CPU и чуть более 3 секунд на GPU. 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 превратить это в векторизованную функцию графического процессора. @vectorize (["float32 (float32, float32)"], target = "cuda") def vector_add_gpu (a, b): return a + b; def main (): a_source = np.единицы (NUM_ELEMENTS, dtype = np.float32) b_source = np.единицы (NUM_ELEMENTS, dtype = np.float32) # Время запуска функции ЦП = timer () vector_add_cpu (a_source, b_source) vector_add_cpu_time = timer () - start # Время запуска функции GPU = timer () vector_add_gpu (a_source, b_source) vector_add_gpu_time = timer () - start # Report раз print ("Функция ЦП заняла% f секунд."% vector_add_cpu_time) print (" Функция GPU заняла% f секунд."% vector_add_gpu_time) возвращает 0, если __name__ ==" __main__ ": main () 

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

Python gpu-пример.ру

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

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

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

Заключение

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

Топ-5 карт для захвата игр
Все мы видели и любили потоковые игры на YouTube. PewDiePie, Jakesepticye и Markiplier - лишь некоторые из лучших игроков, которые заработали миллионы...
Как разработать игру в Linux
Десять лет назад не многие пользователи Linux могли бы предсказать, что их любимая операционная система однажды станет популярной игровой платформой д...
Порты коммерческих игровых движков с открытым исходным кодом
Бесплатные игры с открытым исходным кодом и кроссплатформенные версии игрового движка можно использовать для игры как в старые, так и в некоторые из с...