python - instalar - install tensorflow jupyter notebook
Uso de Keras y Tensorflow con GPU AMD (7)
Esta es una vieja pregunta, pero dado que pasé las últimas semanas tratando de resolverlo por mi cuenta:
- El soporte de OpenCL para Theano es impredecible. Agregaron un back-end libgpuarray que todavía parece tener errores (es decir, el proceso se ejecuta en la GPU pero la respuesta es incorrecta, como un 8% de precisión en MNIST para un modelo DL que obtiene ~ 95 +% de precisión en CPU o nVidia CUDA). También porque ~ 50-80% del aumento de rendimiento en la pila nVidia proviene de las bibliotecas CUDNN ahora, OpenCL simplemente quedará en el polvo. (¡VEA ABAJO!) :)
- ROCM parece ser muy bueno, pero la documentación (e incluso una declaración clara de qué es ROCM / qué hace) es difícil de entender. Están haciendo lo mejor que pueden, pero están más de 4 años atrás. NO NO NO funciona en un RX550 (a partir de este escrito). Así que no pierdas tu tiempo (aquí es donde pasó 1 de las semanas :)). Al principio, parece que ROCM es una nueva adición al conjunto de controladores (que reemplaza a AMDGPU-Pro o lo aumenta), pero de hecho es un módulo de núcleo y un conjunto de bibliotecas que esencialmente reemplazan a AMDGPU-Pro. (Piense en esto como el equivalente del controlador Nvidia-381 + CUDA en algunas bibliotecas). https://rocm.github.io/dl.html (Honestamente, todavía no he probado el rendimiento ni he intentado que funcione con los controladores de Mesa más recientes. Lo haré alguna vez.
- Agregue MiOpen a ROCM, y eso es esencialmente CUDNN. También tienen algunas guías bastante claras para migrar. Pero mejor aún.
- Crearon "HIP", que es un traductor automático de CUDA / CUDNN a MiOpen. Parece funcionar bastante bien, ya que alinearon las API directamente para ser traducibles. Hay conceptos que no son mapas perfectos, pero en general se ve bien.
Ahora, finalmente, después de 3-4 semanas de intentar descubrir OpenCL, etc., encontré este tutorial para ayudarlo a comenzar rápidamente. Es un paso a paso para poner en funcionamiento hipCaffe. Sin embargo, a diferencia de nVidia, ¡asegúrese de haber admitido el 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 tiene ROCM, realizará una prueba de validación MNIST en 10 minutos, ¡genial! https://rocm.github.io/ROCmHipCaffeQuickstart.html
Estoy empezando a aprender Keras, que creo que es una capa encima de Tensorflow y Theano. Sin embargo, solo tengo acceso a las GPU AMD como la AMD R9 280X.
¿Cómo puedo configurar mi entorno Python de modo que pueda usar mis GPU AMD a través del soporte Keras / Tensorflow para OpenCL?
Estoy corriendo en OSX.
Estoy escribiendo un backend de OpenCL 1.2 para Tensorflow en https://github.com/hughperkins/tensorflow-cl
Esta bifurcación de tensorflow para OpenCL tiene las siguientes características:
- se dirige a cualquiera / a 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
- objetivos de cuda-on-cl para poder tomar cualquier código de memoria NVIDIA® CUDA ™ y compilarlo para dispositivos OpenCL 1.2. Es un objetivo muy general y un compilador muy general.
-
por ahora, se implementan las siguientes funcionalidades:
- operaciones por elemento, utilizando Eigen sobre OpenCL, (más información en https://bitbucket.org/hughperkins/eigen/src/eigen-cl/unsupported/test/cuda-on-cl/?at=eigen-cl )
- blas / matriz-multiplicación, usando CLBlast de Cedric Nugteren https://github.com/cnugteren/CLBlast
- reducciones, argmin, argmax, nuevamente usando Eigen, según información y enlaces anteriores
- aprendizaje, formadores, gradientes. Al menos, el entrenador StochasticGradientDescent está trabajando, y los otros están comprometidos, pero aún no han sido probados.
- está desarrollado en Ubuntu 16.04 (usando Intel HD5500 y GPU NVIDIA) y Mac Sierra (usando Intel HD 530 y Radeon Pro 450)
Esta no es la única bifurcación OpenCL de Tensorflow disponible. Codeplay también está desarrollando una bifurcación https://www.codeplay.com , usando Computecpp, https://www.codeplay.com/products/computesuite/computecpp Su bifurcación tiene requisitos más estrictos que los míos, por lo que a mí respecta saber, en términos de qué dispositivos GPU específicos funciona. Debería 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 codeplay es en realidad una bifurcación oficial de Google, que está aquí: https://github.com/benoitsteiner/tensorflow-opencl
La pregunta original en esta publicación fue: Cómo hacer que Keras y Tensorflow funcionen con una GPU AMD.
La respuesta a esta pregunta es la siguiente:
1.) Keras funcionará si puede hacer que Tensorflow funcione correctamente (opcionalmente dentro de su entorno virtual / conda).
2.) Para que Tensorflow funcione en una GPU AMD, como han dicho otros, una forma en que esto podría funcionar es compilando Tensorflow para usar OpenCl. Para hacerlo, lea el siguiente enlace. Pero por brevedad 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 esta publicación limitada a unas pocas GPU a través de AMDProDrivers. ¡Los lectores que quieran hacer un aprendizaje profundo en las GPU AMD deben estar conscientes de esto!
-
Compilar Tensorflow con 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 compilación. Tenga en cuenta que hay 3 opciones para compilar Tensorflow: Std Tensorflow (estable), Tensorflow-opencl (desarrollo) de Benoits Steiner y Tensorflow-opencl (altamente experimental) de Luke Iwanski que puede extraer de github. También tenga en cuenta que si decide compilar a partir de cualquiera de las versiones de opencl, la pregunta para usar opencl se perderá porque se supone que lo está usando. Por el contrario, esto significa que si configura desde el flujo de tensor estándar, deberá seleccionar "Sí" cuando el script de configuración le pida que use opencl y "NO" para CUDA.
-
Luego ejecute pruebas así:
$ bazel test --config = sycl -k --test_timeout 1600 - // tensorflow / ... - // tensorflow / contrib / ... - // tensorflow / java / ... - // tensorflow / compiler / ...
Actualización: Hacer esto en mi configuración lleva mucho tiempo en mi configuración. La parte que lleva mucho tiempo son todas las pruebas en ejecución. No estoy seguro de lo que esto significa, pero muchas de mis pruebas tienen un tiempo de espera de 1600 segundos. La duración probablemente se puede acortar a expensas del tiempo de espera de más pruebas. Alternativamente, puede crear un flujo de tensor sin pruebas. Al momento de escribir esto, ejecutar las pruebas ya ha tomado 2 días.
O simplemente cree 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
Lea la publicación del blog en Codeplay: Lukas Iwansky publicó una publicación exhaustiva de tutorial sobre cómo hacer que Tensorflow funcione con OpenCl el 30 de marzo de 2017. Esta es una publicación muy reciente. También hay algunos detalles sobre los que no escribí aquí.
Como se indica en las muchas publicaciones anteriores, pequeños fragmentos de información se extienden a través de las interwebs. Lo que agrega 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 desalentadora. Solo 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/
Difiere principalmente al decirle explícitamente al usuario que necesita:
- crear enlaces simbólicos a una subcarpeta
- y luego instalar tensorflow a través del comando "python setup.py desarrollo".
Tenga en cuenta que un enfoque alternativo se mencionó anteriormente usando 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 resolverlos. Hubo un gran impulso el año pasado. Desde noviembre de 2016, han disminuido los esfuerzos adicionales, aunque Hugh parece haber enviado algunas actualizaciones hace unos días a partir de la redacción de esta publicación. (Actualización: si lee parte 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 la prueba de tensorflow-opencl a continuación.
- El futuro usuario de este paquete debe tener en cuenta que el uso de opencl significa que todo el trabajo pesado en términos de computación se traslada a la GPU. Menciono esto porque personalmente estaba pensando 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).
Los siguientes son algunos números para calcular 1 época usando el conjunto de datos CIFAR10 para MI CONFIGURACIÓN (A10-7850 con iGPU). ¡Su millaje casi seguramente variará!
- Tensorflow (a través de la instalación de pip): ~ 1700 s / epoch
- Tensorflow (con SSE + AVX): ~ 1100 s / época
- Tensorflow (con opencl e iGPU): ~ 5800 s / época
Puede ver que en este caso particular el rendimiento es peor. Atribuyo esto a los siguientes factores:
- El iGPU solo tiene 1GB. Esto lleva a muchas copias entre CPU y GPU. (Opencl 1.2 todavía no tiene la capacidad de pasar datos a través de punteros; en cambio, los datos deben copiarse de un lado a otro).
- El iGPU solo tiene 512 procesadores de flujo (y 32 Gb / s de ancho de banda de memoria) que en este caso es más lento que 4 CPU que usan 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, seguramente obtendrá 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 si / cuando las actualizaciones se envían.
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 actualmente solo existe para Linux, y que miOpen aún no se ha lanzado a la naturaleza, pero Raja (jefe de GPU AMD) ha dicho en un AMA que usando lo anterior, debería ser posible hacer un aprendizaje profundo en GPU AMD. De hecho, el soporte está planeado no solo para Tensorflow, sino también para Cafe2, Cafe, Torch7 y MxNet.
Se puede usar la GPU AMD a través del backend PlaidML Keras.
Más rápido : PlaidML es a menudo 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 (Keras y ONNX actualmente)
Gratis : PlaidML es completamente de código abierto y no depende de ninguna biblioteca 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 instalado Python (v2 o v3)):
virtualenv plaidml
source plaidml/bin/activate
pip install plaidml-keras plaidbench
Elija qué acelerador desea usar (muchas computadoras, especialmente las portátiles, tienen múltiples):
plaidml-setup
A continuación, intente comparar el rendimiento de inferencia de MobileNet:
plaidbench keras mobilenet
O intente entrenar 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/rstudio/keras/issues/205#issuecomment-348336284
Si tiene acceso a otras GPU de AMD, consulte aquí: https://github.com/ROCmSoftwarePlatform/hiptensorflow/tree/hip/rocm_docs
Esto debería llevarlo en la dirección correcta para el flujo de tensor 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 enumeran v3 o más nuevas, las tarjetas gráficas son un poco más exigentes. gfx8 o más reciente con algunas pequeñas excepciones, polaris y quizás otros a medida que pasa el tiempo.
ACTUALIZACIÓN: parece que hiptensorflow tiene una opción para el soporte de opencl durante la configuración. 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 sin aliento, 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 pila AMD ROCm:
También se ha publicado públicamente una imagen acoplada preconstruida:
Theano tiene soporte para OpenCL pero todavía está en sus primeras etapas. Theano en sí no está interesado en OpenCL y depende del apoyo de la comunidad .
Most de las operaciones ya están implementadas y se trata principalmente de ajustar y optimizar las operaciones dadas.
Para utilizar el backend de OpenCL, debe
build
libgpuarray
usted mismo.
Por experiencia personal, puedo decirle que obtendrá rendimiento de la CPU si tiene suerte. La asignación de memoria parece implementarse de manera muy ingenua (por lo tanto, el cálculo será lento) y se bloqueará cuando se quede sin memoria. Pero le animo a que pruebe y tal vez incluso optimice el código o ayude a informar errores.