Ciencia de los datos

Programación de GPU con Python

Programación de GPU con Python

En este artículo, nos sumergiremos en la programación de GPU con Python. Con la facilidad de Python, puede desbloquear la increíble potencia informática de la GPU (unidad de procesamiento de gráficos) de su tarjeta de video. En este ejemplo, trabajaremos con la biblioteca CUDA de NVIDIA.

Requisitos

Para este ejercicio, necesitará una máquina física con Linux y una GPU basada en NVIDIA, o lanzar una instancia basada en GPU en Amazon Web Services. Cualquiera de los dos debería funcionar bien, pero si elige usar una máquina física, deberá asegurarse de tener instalados los controladores patentados de NVIDIA; consulte las instrucciones: https: // linuxhint.com / install-nvidia-drivers-linux

También necesitará tener instalado CUDA Toolkit. Este ejemplo usa Ubuntu 16.04 LTS específicamente, pero hay descargas disponibles para la mayoría de las principales distribuciones de Linux en la siguiente URL: https: // desarrollador.nvidia.com / cuda-downloads

Prefiero el .descarga basada en deb, y estos ejemplos supondrán que eligió esa ruta. El archivo que descarga es un .paquete deb pero no tiene un .deb extensión, así que renombrarlo para tener una .deb al final su útil. Luego lo instalas con:

sudo dpkg -i nombre-paquete.debutante

Si se le solicita que instale una clave GPG, siga las instrucciones dadas para hacerlo.

Ahora deberá instalar el paquete cuda en sí. Para hacerlo, ejecute:

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

Esta parte puede llevar un tiempo, por lo que es posible que desee tomar una taza de café. Una vez hecho esto, recomiendo reiniciar para asegurarse de que todos los módulos se vuelvan a cargar correctamente.

A continuación, necesitará la distribución Anaconda Python. Puede descargarlo aquí: https: // www.anaconda.com / download / # linux

Toma la versión de 64 bits e instálala así:

sh Anaconda *.sh

(la estrella en el comando anterior asegurará que el comando se ejecute independientemente de la versión menor)

La ubicación de instalación predeterminada debería estar bien, y en este tutorial, la usaremos. De forma predeterminada, se instala en ~ / anaconda3

Al final de la instalación, se le pedirá que decida si desea agregar Anaconda a su ruta. Responda sí aquí para facilitar la ejecución de los comandos necesarios. Para asegurarse de que se lleve a cabo este cambio, una vez que el instalador finalice por completo, cierre la sesión y vuelva a iniciarla en su cuenta.

Más información sobre la instalación de Anaconda: https: // linuxhint.com / install-anaconda-python-on-ubuntu /

Finalmente necesitaremos instalar Numba. Numba usa el compilador LLVM para compilar Python en código de máquina. Esto no solo mejora el rendimiento del código Python normal, sino que también proporciona el pegamento necesario para enviar instrucciones a la GPU en forma binaria. Para hacer esto, ejecute:

conda instalar numba

Limitaciones y beneficios de la programación de GPU

Es tentador pensar que podemos convertir cualquier programa de Python en un programa basado en GPU, acelerando drásticamente su rendimiento. Sin embargo, la GPU en una tarjeta de video funciona de manera considerablemente diferente a una CPU estándar en una computadora.

Las CPU manejan muchas entradas y salidas diferentes y tienen una amplia variedad de instrucciones para lidiar con estas situaciones. También son responsables de acceder a la memoria, gestionar el bus del sistema, gestionar los anillos de protección, segmentar y la funcionalidad de entrada / salida. Son extremadamente multitarea sin un enfoque específico.

Por otro lado, las GPU están diseñadas para procesar funciones simples con una velocidad increíblemente rápida. Para lograr esto, esperan un estado más uniforme de entrada y salida. Especializándose en funciones escalares. Una función escalar toma una o más entradas pero devuelve solo una salida. Estos valores deben ser tipos predefinidos por numpy.

Código de ejemplo

En este ejemplo, crearemos una función simple que toma una lista de valores, los suma y devuelve la suma. Para demostrar el poder de la GPU, ejecutaremos una de estas funciones en la CPU y otra en la GPU y mostraremos los tiempos. El código documentado está a continuación:

import numpy as np from timeit import default_timer as timer from numba import vectorize # Este debería ser un valor sustancialmente alto. En mi máquina de prueba, esto tomó 33 segundos para ejecutarse a través de la CPU y poco más de 3 segundos en la GPU. NUM_ELEMENTS = 100000000 # Esta es la versión de la CPU. def vector_add_cpu (a, b): c = np.ceros (NUM_ELEMENTS, dtype = np.float32) para i en el rango (NUM_ELEMENTS): c [i] = a [i] + b [i] return c # Esta es la versión de GPU. Tenga en cuenta el decorador @vectorize. Esto le dice a # numba que convierta esto en una función vectorizada de GPU. @vectorize (["float32 (float32, float32)"], target = "cuda") def vector_add_gpu (a, b): return a + b; def main (): a_source = np.unos (NUM_ELEMENTS, dtype = np.float32) b_source = np.unos (NUM_ELEMENTS, dtype = np.float32) # Hora de la función de la CPU start = timer () vector_add_cpu (a_source, b_source) vector_add_cpu_time = timer () - start # Hora de la función de GPU start = timer () vector_add_gpu (a_source, b_source) vector_add_gpu_time = timer () - inicio # Informe times print ("La función de la CPU tomó% f segundos."% vector_add_cpu_time) print (" La función GPU tardó% f segundos."% vector_add_gpu_time) devuelve 0 si __name__ ==" __main__ ": main () 

Para ejecutar el ejemplo, escriba:

Python gpu-ejemplo.py

NOTA: Si tiene problemas al ejecutar su programa, intente usar "conda install accelerate".

Como puede ver, la versión de la CPU es considerablemente más lenta.

Si no es así, tus iteraciones son demasiado pequeñas. Ajusta los NUM_ELEMENTS a un valor mayor (en el mío, la marca de equilibrio parecía estar alrededor de 100 millones). Esto se debe a que la configuración de la GPU lleva una pequeña pero notable cantidad de tiempo, por lo que para que la operación valga la pena, se necesita una mayor carga de trabajo. Una vez que lo eleve por encima del umbral para su máquina, notará mejoras sustanciales en el rendimiento de la versión de GPU sobre la versión de CPU.

Conclusión

Espero que hayas disfrutado de nuestra introducción básica a la programación de GPU con Python. Aunque el ejemplo anterior es trivial, proporciona el marco que necesita para llevar sus ideas más lejos utilizando el poder de su GPU.

Las 5 mejores cartas de captura de juegos
Todos hemos visto y amado la transmisión de juegos en YouTube. PewDiePie, Jakesepticye y Markiplier son solo algunos de los mejores jugadores que han ...
Cómo desarrollar un juego en Linux
Hace una década, no muchos usuarios de Linux predecían que su sistema operativo favorito algún día sería una plataforma de juegos popular para videoju...
Puertos de código abierto de motores de juegos comerciales
Las recreaciones gratuitas, de código abierto y de motores de juegos multiplataforma se pueden usar para jugar títulos de juegos antiguos y también al...