Usando Keras & Tensorflow con AMD GPU

Estoy empezando a aprender Keras, que creo que es una capa sobre Tensorflow y Theano. Sin embargo, solo tengo acceso a las GPU de AMD, como la AMD R9 280X.

¿Cómo puedo configurar mi entorno de Python para que pueda utilizar mis GPU de AMD a través del soporte de Keras / Tensorflow para OpenCL?

Estoy corriendo en OSX.

Estoy escribiendo un backend OpenCL 1.2 para Tensorflow en https://github.com/hughperkins/tensorflow-cl

Este tenedor de tensorflow para OpenCL tiene las siguientes características:

  • se dirige a cualquier / todos los dispositivos OpenCL 1.2. No necesita OpenCL 2.0, no necesita SPIR-V o SPIR. No necesita memoria virtual compartida. Y así …
  • se basa en una biblioteca subyacente llamada ‘cuda-on-cl’, https://github.com/hughperkins/cuda-on-cl
    • Los objectives de cuda-on-cl pueden tomar cualquier código fuente de NVIDIA® CUDA ™ y comstackrlo para dispositivos OpenCL 1.2. Es un objective muy general, y un comstackdor muy general.
  • Por ahora, se implementan las siguientes funcionalidades:
  • está desarrollado en Ubuntu 16.04 (con Intel HD5500 y GPU NVIDIA) y Mac Sierra (con Intel HD 530 y Radeon Pro 450)

Esta no es la única bifurcación OpenCL de Tensorflow disponible. También hay un tenedor que está siendo desarrollado por Codeplay https://www.codeplay.com , usando Computecpp, https://www.codeplay.com/products/computesuite/computecpp Su tenedor tiene requisitos más estrictos que los míos, en lo que respecta saber, en términos de qué dispositivos GPU específicos funciona. Deberá consultar las Notas de soporte de la plataforma (en la parte inferior de la página hte computecpp), para determinar si su dispositivo es compatible. La bifurcación de código de código es en realidad una bifurcación oficial de Google, que se encuentra aquí: https://github.com/benoitsteiner/tensorflow-opencl

La pregunta original en esta publicación fue: Cómo hacer que Keras y Tensorflow se ejecuten con una GPU de AMD.

La respuesta a esta pregunta es la siguiente:

1.) Keras funcionará si puede hacer que Tensorflow funcione correctamente (opcionalmente en su entorno virtual / conda).

2.) Para que Tensorflow funcione en una GPU de AMD, como han dicho otros, una forma en que esto podría funcionar es comstackr Tensorflow para usar OpenCl. Para ello lee el siguiente enlace. Pero para abreviar, resumiré los pasos necesarios aquí:

  • Necesitará controladores propietarios de AMD. Actualmente solo están disponibles en Ubuntu 14.04 (la versión anterior a Ubuntu decidió cambiar la forma en que se representa la interfaz de usuario). El soporte para Ubuntu 16.04 se encuentra en la redacción de este post limitado a algunas GPU a través de AMDProDrivers. ¡Los lectores que quieran realizar un aprendizaje profundo sobre las GPU de AMD deben estar conscientes de esto!

  • La comstackción de Tensorflow con el soporte de OpenCl también requiere que obtenga e instale los siguientes requisitos previos: encabezados de OpenCl, ComputeCpp.

  • Una vez que se cumplan los requisitos previos, configure su comstackción. Tenga en cuenta que hay 3 opciones para comstackr Tensorflow: Std Tensorflow (estable), Benoits Steiner Tensorflow-opencl (desarrollo) y Tensorflow-opencl de Luke Iwanski (altamente experimental) que puede extraer de github. También tenga en cuenta que si decide comstackr a partir de cualquiera de las versiones de opencl, faltará la pregunta de usar opencl porque se supone que lo está utilizando. A la inversa, esto significa que si configura desde el tensorflow estándar, deberá seleccionar “Sí” cuando el script de configuración le pida que use opencl y “NO” para CUDA.

  • Luego ejecute pruebas como esta:

    $ bazel test –config = sycl -k –test_timeout 1600 – // tensorflow / … – // tensorflow / contrib / … – // tensorflow / java / … – // tensorflow / compiler / …

Actualización: Hacer esto en mi configuración toma mucho tiempo en mi configuración. La parte que lleva mucho tiempo son todas las pruebas en ejecución. No estoy seguro de qué significa esto, pero muchas de mis pruebas se están agotando a 1600 segundos. La duración probablemente se puede acortar a expensas de que se agoten las pruebas. Alternativamente, puedes construir flujo tensorial sin pruebas. En el momento de redactar este documento, la ejecución de las pruebas ya ha tomado 2 días.

O simplemente construir el paquete pip de esta manera:

bazel build --local_resources 2048,.5,1.0 -c opt --config=sycl //tensorflow/tools/pip_package:build_pip_package 

Por favor, lea la publicación del blog en Codeplay: Lukas Iwansky publicó un tutorial completo sobre cómo hacer que Tensorflow funcione con OpenCl el 30 de marzo de 2017. Así que esta es una publicación muy reciente. También hay algunos detalles que no escribí aquí.

Como se indica en las muchas publicaciones anteriores, se distribuyen pequeños fragmentos de información a través de las redes. Lo que añade la publicación de Lukas en términos de valor es que toda la información se reunió en un solo lugar, lo que debería hacer que la configuración de Tensforflow y OpenCl sea un poco menos abrumadora. Sólo voy a proporcionar un enlace aquí:

https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl

Aquí se ha publicado un recorrido un poco más completo:

http://deep-beta.co.uk/setting-up-tensorflow-with-opencl-using-sycl/

Se diferencia principalmente al decirle explícitamente al usuario que necesita:

  • crear enlaces simbólicos a una subcarpeta
  • e instale Tensorflow a través del comando “python setup.py develop”.

Tenga en cuenta que se mencionó un enfoque alternativo utilizando tensorflow-cl:

https://github.com/hughperkins/tensorflow-cl

No puedo discernir qué enfoque es mejor en este momento, aunque parece que este enfoque es menos activo. Se publican menos problemas y se producen menos conversaciones para resolver esos problemas. Hubo un gran impulso el año pasado. Empujones adicionales han disminuido desde noviembre de 2016, aunque Hugh parece haber lanzado algunas actualizaciones hace unos días a partir de la redacción de este post. (Actualización: si leíste algo del archivo Léame de la documentación, esta versión de tensorflowo ahora solo depende del soporte de la comunidad, ya que el desarrollador principal está ocupado con la vida)

ACTUALIZACIÓN (2017-04-25): Tengo algunas notas basadas en las pruebas de tensorflow-opencl a continuación.

  • El futuro usuario de este paquete debe tener en cuenta que usar opencl significa que todo el trabajo pesado en términos de computación se desplaza a la GPU. Menciono esto porque personalmente pensaba que la carga de trabajo de cómputo se compartiría entre mi CPU y iGPU. Esto significa que la potencia de su GPU es muy importante (específicamente, ancho de banda y VRAM disponible).

A continuación se muestran algunos números para calcular 1 época utilizando el conjunto de datos CIFAR10 para MI CONFIGURACIÓN (A10-7850 con iGPU). ¡Su kilometraje casi ciertamente variará!

  • Tensorflow (a través de la instalación de pip): ~ 1700 s / epoch
  • Tensorflow (w / SSE + AVX): ~ 1100 s / epoch
  • Tensorflow (w / opencl & iGPU): ~ 5800 s / epoch

Se puede ver que en este caso particular el rendimiento es peor. Lo atribuyo a los siguientes factores:

  • El iGPU solo tiene 1GB. Esto lleva a una gran cantidad de copias entre la CPU y la GPU. (Opencl 1.2 aún no tiene la capacidad de pasar datos a través de punteros; en su lugar, los datos deben copiarse de un lado a otro).
  • La iGPU solo tiene 512 procesadores de flujo (y un ancho de banda de memoria de 32 Gb / s) que en este caso es más lento que 4 CPU que utilizan conjuntos de instrucciones SSE4 + AVX.
  • El desarrollo de tensorflow-opencl está en sus etapas iniciales, y aún no se han realizado muchas optimizaciones en SYCL, etc.

Si está utilizando una GPU AMD con más VRAM y más procesadores de flujo, está seguro de obtener números de rendimiento mucho mejores. Me interesaría leer qué números están logrando las personas para saber qué es posible.

Continuaré manteniendo esta respuesta cuando / cuando las actualizaciones sean empujadas.

3.) Actualmente se está insinuando una forma alternativa de utilizar la iniciativa RocM de AMD y la biblioteca miOpen (equivalente a cuDNN). Estas son / serán bibliotecas de código abierto que permiten el aprendizaje profundo. La advertencia es que el soporte de RocM solo existe actualmente para Linux, y que miOpen no se ha liberado todavía, pero Raja (jefe de la GPU de AMD) ha dicho en una AMA que, utilizando lo anterior, debería ser posible realizar un aprendizaje profundo en GPUs AMD. De hecho, el soporte está planeado no solo para Tensorflow, sino también para Cafe2, Cafe, Torch7 y MxNet.

Esta es una pregunta antigua, pero ya que pasé las últimas semanas tratando de resolverlo por mi cuenta:

  1. El soporte de OpenCL para Theano es impredecible. Agregaron un back-end de libgpuarray que parece que todavía tiene errores (es decir, el proceso se ejecuta en la GPU pero la respuesta es incorrecta, como una precisión del 8% en el MNIST para un modelo DL que obtiene una precisión del 95% o más en la CPU o nVidia CUDA). Además, como ahora ~ 50-80% del aumento de rendimiento en la stack nVidia proviene de las bibliotecas CUDNN, OpenCL solo quedará en el polvo. (¡VEA ABAJO!) 🙂
  2. ROCM parece ser muy bueno, pero la documentación (e incluso una statement clara de qué es ROCM / qué hace) es difícil de entender. Lo están haciendo lo mejor que pueden, pero llevan más de 4 años atrás. NO NO funciona en un RX550 (a partir de este escrito). Así que no pierdas el tiempo (aquí es donde fue 1 de las semanas :)). Al principio, parece que ROCM es una nueva adición al conjunto de controladores (que reemplaza a AMDGPU-Pro o que lo aumenta), pero de hecho es un módulo del núcleo y un conjunto de bibliotecas que esencialmente reemplazan a AMDGPU-Pro. (Piense en esto como el equivalente de Nvidia-381 driver + CUDA algunas bibliotecas). https://rocm.github.io/dl.html (Sinceramente, todavía no he probado el rendimiento o he intentado que funcione con los controladores de Mesa más recientes. Lo haré alguna vez.
  3. Agregue MiOpen a ROCM, y eso es esencialmente CUDNN. También tienen algunas guías bastante claras para migrar. Pero mejor aún.
  4. Ellos crearon “HIP”, que es un traductor automático de CUDA / CUDNN a MiOpen. Parece funcionar bastante bien ya que alinearon las API’s directamente para ser traducibles. Hay conceptos que no son mapas perfectos, pero en general se ve bien.

Ahora, finalmente, después de 3 o 4 semanas de intentar descubrir OpenCL, etc., encontré este tutorial para ayudarlo a comenzar rápidamente. Es un paso a paso para poner en marcha el hipCaffe. Sin embargo, a diferencia de nVidia, asegúrate de que hayas soportado hardware !!!! https://rocm.github.io/hardware.html . ¿Crees que puedes hacerlo funcionar sin su hardware compatible? Buena suerte. Has sido advertido. Una vez que tenga ROCM en funcionamiento (Y EJECUTE LAS PRUEBAS DE VERIFICACIÓN), aquí está el tutorial de hipCaffe: si obtiene ROCM, realizará una prueba de validación de MNIST en 10 minutos. ¡Cariño! https://rocm.github.io/ROCmHipCaffeQuickstart.html

Theano tiene soporte para OpenCL pero aún se encuentra en sus primeras etapas. Theano en sí no está interesado en OpenCL y depende del apoyo de la comunidad .

La mayoría de las operaciones ya están implementadas y se trata principalmente de ajustar y optimizar las operaciones dadas.

Para usar el backend de OpenCL tienes que construir libgpuarray ti mismo.

Por experiencia personal, puedo decirle que obtendrá un rendimiento de la CPU si tiene suerte. La asignación de memoria parece estar implementada muy ingenuamente (por lo tanto, el cálculo será lento) y se bloqueará cuando se quede sin memoria. Pero lo aliento a que intente y tal vez incluso optimice el código o ayude a informar errores.

Uno puede usar AMD GPU a través del backend PlaidML Keras.

Más rápido : PlaidML suele ser 10 veces más rápido (o más) que las plataformas populares (como la CPU TensorFlow) porque admite todas las GPU, independientemente de la marca y el modelo. PlaidML acelera el aprendizaje profundo en AMD, Intel, NVIDIA, ARM y GPU integradas.

Más fácil : PlaidML es fácil de instalar y admite múltiples interfaces (actualmente Keras y ONNX)

Gratis : PlaidML es completamente de código abierto y no se basa en bibliotecas de proveedores con licencias propietarias y restrictivas.

Para la mayoría de las plataformas, comenzar con el aprendizaje profundo acelerado es tan fácil como ejecutar algunos comandos (suponiendo que tenga Python (v2 o v3) instalado):

 virtualenv plaidml source plaidml/bin/activate pip install plaidml-keras plaidbench 

Elija qué acelerador le gustaría usar (muchas computadoras, especialmente las computadoras portátiles, tienen múltiples):

 plaidml-setup 

A continuación, intente comparar el rendimiento de inferencia de MobileNet:

 plaidbench keras mobilenet 

O, intente entrenar a MobileNet:

 plaidbench --batch-size 16 keras --train mobilenet 

Para usarlo con keras set.

 os.environ["KERAS_BACKEND"] = "plaidml.keras.backend" 

Para más información

https://github.com/plaidml/plaidml

https://github.com/rstudio/keras/issues/205#issuecomment-348336284

Si tiene acceso a otros gpu de AMD, consulte aquí: https://github.com/ROCmSoftwarePlatform/hiptensorflow/tree/hip/rocm_docs

Esto debería llevarlo en la dirección correcta para tensorflow en la plataforma ROCm, pero la publicación de Selly sobre https://rocm.github.io/hardware.html es el trato con esta ruta. Esa página no es una lista exhaustiva, descubrí por mi cuenta que el Xeon E5 v2 Ivy Bridge funciona bien con ROCm a pesar de que tienen una versión v3 o más nueva, sin embargo las tarjetas gráficas son un poco más exigentes. gfx8 o más reciente, con algunas pequeñas excepciones, polaris y quizás otras a medida que pasa el tiempo.

ACTUALIZACIÓN: parece que hiptensorflow tiene una opción para el soporte de OpenCenter durante la configuración. Yo diría que investigue el enlace incluso si no tiene gfx8 + o polaris gpu si la implementación de opencl funciona. Es un proceso largo y sinuoso, pero una hora o tres (dependiendo del hardware) siguiendo una instrucción bien escrita no es mucho que perder para descubrirlo.

Tensorflow 1.3 ha sido compatible con la stack AMD ROCm:

También se ha publicado públicamente una imagen docker pre-construida: