Este es el mensaje recibido al ejecutar un script para verificar si Tensorflow está funcionando:
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
Noté que ha mencionado SSE4.2 y AVX,
- ¿Qué son SSE4.2 y AVX?
- ¿Cómo estos SSE4.2 y AVX mejoran los cálculos de la CPU para las tareas de Tensorflow?
- ¿Cómo hacer que Tensorflow compile usando las dos bibliotecas?
tensorflow
x86
compiler-optimization
simd
compiler-options
GabrielChu
fuente
fuente
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
en Xeon E5 v3 que me da una mejora de 3x en la velocidad de CPU de 8k matmul en comparación con el lanzamiento oficial (0.35 -> 1.05 T ops / seg)NOTE on gcc 5 or later: the binary pip packages available on the TensorFlow website are built with gcc 4, which uses the older ABI. To make your build compatible with the older ABI, you need to add --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" to your bazel build command. ABI compatibility allows custom ops built against the TensorFlow pip package to continue to work against your built package.
de aquí tensorflow.org/install/install_sourcesRespuestas:
Acabo de encontrarme con este mismo problema, parece que la sugerencia de Yaroslav Bulatov no cubre el soporte SSE4.2,
--copt=-msse4.2
lo suficiente sería suficiente. Al final, construí con éxito consin recibir ninguna advertencia o error.
Probablemente la mejor opción para cualquier sistema es:
( Actualización: los scripts de compilación pueden estar comiendo
-march=native
, posiblemente porque contiene un=
.)-mfpmath=both
solo funciona con gcc, no clang.-mfpmath=sse
es probablemente igual de bueno, si no mejor, y es el valor predeterminado para x86-64. Las compilaciones de 32 bits están predeterminadas en-mfpmath=387
, por lo que cambiar eso ayudará a 32 bits. (Pero si desea un alto rendimiento para el procesamiento de números, debe crear binarios de 64 bits).No estoy seguro de lo que por defecto de TensorFlow para
-O2
o-O3
es.gcc -O3
permite la optimización completa, incluida la vectorización automática, pero eso a veces puede hacer que el código sea más lento.Lo que esto hace:
--copt
parabazel build
pasa una opción directamente a gcc para compilar archivos de C y C ++ (pero no vincular, por lo que necesita una opción diferente para entre archivos de enlace en tiempo-optimización)El valor predeterminado de x86-64 gcc es usar solo instrucciones SSE2 o SIMD anteriores, por lo que puede ejecutar los archivos binarios en cualquier sistema x86-64. (Ver https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html ). Eso no es lo que quieres. Desea crear un binario que aproveche todas las instrucciones que puede ejecutar su CPU, porque solo está ejecutando este binario en el sistema donde lo construyó.
-march=native
habilita todas las opciones que admite su CPU, por lo que se vuelve-mavx512f -mavx2 -mavx -mfma -msse4.2
redundante. (Además,-mavx2
ya está habilitado-mavx
y-msse4.2
, por lo tanto, el comando de Yaroslav debería haber estado bien). Además, si está utilizando una CPU que no admite una de estas opciones (como FMA), el uso-mfma
haría un binario que falla con instrucciones ilegales.El valor
./configure
predeterminado de TensorFlow es la habilitación-march=native
, por lo que usar eso debería evitar tener que especificar las opciones del compilador manualmente.-march=native
habilita-mtune=native
, por lo que se optimiza para su CPU para cosas como qué secuencia de instrucciones AVX es mejor para cargas no alineadas.Todo esto se aplica a gcc, clang o ICC. (Para ICC, puede usar en
-xHOST
lugar de-march=native
).fuente
-march=native
no es su trabajo. Además, soltar--config=cuda
(si no es necesario el soporte de CUDA) y el-k
(dado que no se produjo ningún error durante la compilación) también funciona.--copt=-mfpmath=both
para que funcioneclang
en macOS. ¿Afecta el binario resultante?Comencemos con la explicación de por qué ve estas advertencias en primer lugar .
Lo más probable es que no haya instalado TF desde la fuente y en lugar de eso haya usado algo como
pip install tensorflow
. Eso significa que instaló binarios pre-construidos (por otra persona) que no fueron optimizados para su arquitectura. Y estas advertencias le dicen exactamente esto: hay algo disponible en su arquitectura, pero no se usará porque el binario no se compiló con él. Aquí está la parte de la documentación .Lo bueno es que lo más probable es que solo quieras aprender / experimentar con TF para que todo funcione correctamente y no debes preocuparte por eso
¿Qué son SSE4.2 y AVX?
Wikipedia tiene una buena explicación sobre SSE4.2 y AVX . Este conocimiento no es necesario para ser bueno en el aprendizaje automático. Puede pensar en ellos como un conjunto de algunas instrucciones adicionales para que una computadora use múltiples puntos de datos contra una sola instrucción para realizar operaciones que pueden estar paralelizadas naturalmente (por ejemplo, agregar dos matrices).
Tanto SSE como AVX son la implementación de una idea abstracta de SIMD (instrucción única, datos múltiples), que es
Esto es suficiente para responder su próxima pregunta.
¿Cómo estos SSE4.2 y AVX mejoran los cálculos de CPU para las tareas de TF?
Permiten un cálculo más eficiente de varias operaciones de vectores (matriz / tensor). Puedes leer más en estas diapositivas
¿Cómo hacer que Tensorflow compile usando las dos bibliotecas?
Debe tener un binario que se compiló para aprovechar estas instrucciones. La forma más fácil es compilarlo usted mismo . Como sugirieron Mike y Yaroslav, puede usar el siguiente comando de bazel
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
fuente
bazel
en este caso?FAILED: Build did NOT complete successfully
. No es tan simple compilarlo usted mismo.Permítame responder su tercera pregunta primero:
Si desea ejecutar una versión autocompilada dentro de un conda-env, puede hacerlo. Estas son las instrucciones generales que ejecuto para que tensorflow se instale en mi sistema con instrucciones adicionales. Nota: Esta compilación fue para una compilación AMD A10-7850 (verifique en su CPU qué instrucciones son compatibles ... puede diferir) ejecutando Ubuntu 16.04 LTS. Yo uso Python 3.5 dentro de mi conda-env. El crédito va a la página de instalación de la fuente de tensorflow y las respuestas proporcionadas anteriormente.
En cuanto a su segunda pregunta:
Una versión autocompilada con optimizaciones bien vale la pena el esfuerzo en mi opinión. En mi configuración particular, ¡los cálculos que solían tomar 560-600 segundos ahora solo toman alrededor de 300 segundos! Aunque los números exactos variarán, creo que puede esperar un aumento de velocidad del 35-50% en general en su configuración particular.
Por último su primera pregunta:
Muchas de las respuestas ya se han proporcionado anteriormente. Para resumir: AVX , SSE4.1, SSE4.2 , MFA son diferentes tipos de conjuntos de instrucciones extendidas en las CPU X86. Muchos contienen instrucciones optimizadas para procesar operaciones de matriz u vectores.
Destacaré mi propio concepto erróneo para poder ahorrarle algo de tiempo: no es que SSE4.2 sea una versión más nueva de instrucciones que reemplacen a SSE4.1. SSE4 = SSE4.1 (un conjunto de 47 instrucciones) + SSE4.2 (un conjunto de 7 instrucciones).
En el contexto de la compilación de tensorflow, si su computadora es compatible con AVX2 y AVX, y SSE4.1 y SSE4.2, debe colocar esos indicadores de optimización para todos. No haga lo que hice y simplemente vaya con SSE4.2 pensando que es más nuevo y debería reemplazar a SSE4.1. Eso es claramente incorrecto! Tuve que volver a compilar debido a eso que me costó unos buenos 40 minutos.
fuente
Estos son conjuntos de instrucciones de procesamiento de vectores SIMD .
Usar instrucciones vectoriales es más rápido para muchas tareas; El aprendizaje automático es una tarea de este tipo.
Citando los documentos de instalación de tensorflow :
fuente
Gracias a todas estas respuestas + algunas pruebas y errores, logré instalarlo en una Mac con
clang
. Entonces, solo comparto mi solución en caso de que sea útil para alguien.Siga las instrucciones en Documentación - Instalación de TensorFlow desde las fuentes
Cuando se le solicite
Especifique los indicadores de optimización para usar durante la compilación cuando se especifica la opción "--config = opt" de Bazel [El valor predeterminado es -march = native]
luego copie y pegue esta cadena:
(La opción predeterminada causó errores, al igual que algunos de los otros indicadores. No obtuve errores con los indicadores anteriores. Por cierto, respondí
n
a todas las otras preguntas)Después de la instalación, verifico una aceleración de ~ 2x a 2.5x cuando entreno modelos profundos con respecto a otra instalación basada en las ruedas predeterminadas - Instalación de TensorFlow en macOS
Espero eso ayude
fuente
-march=native
debería ser aún mejor si su compilador lo admite correctamente. También se establece-mtune=native
para tomar buenas decisiones de instrucción para su CPU. por ejemplo, en Haswell y versiones posteriores, deshabilita-mavx256-split-unaligned-store
y-mavx256-split-unaligned-load
, que están activados de forma predeterminada para-mtune=generic
y perjudican el rendimiento cuando no se sabe que los datos están alineados pero resultan estar en tiempo de ejecución.-march=native
causó un error mientras que las otras opciones no. Tal vez es el compilador específico. Estaba compartiendo esto precisamente en caso de que otros experimentaran el mismo obstáculo.=
, o no esté utilizandogcc
oclang
, debería funcionar. ¿Y-mtune=native -mavx2 -mfma
funciona para ti? O-mtune=skylake
? (O cualquier CPU que tengas). Por cierto,-mavx2
implica-mavx
y-msse4.2
. No lastima para incluir a todos en una receta, y supongo que lo hace más fácil para las personas a dejar de lado los de su CPU no admite.-march=native
su sistema de compilación, me gustaría saberlo. (Y / o debe informarlo en sentido ascendente para que puedan arreglar sus scripts de compilación).-march=native
y este es el error: / Users / jose / Documents / code / tmptensorflow / tensorflow / tensorflow / core / BUILD: 1442: 1: compilación C ++ de la regla '// tensorflow / core: lib_internal_impl' falló (Salida 1). En el archivo incluido desde tensorflow / core / platform / denormal.cc: 37: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2/include/pmmintrin.h:28:2: error: "Conjunto de instrucciones SSE3 no habilitado" #error "Conjunto de instrucciones SSE3 no habilitado" utilizando Apple LLVM versión 7.0.2 (clang-700.1.81)Recientemente lo instalé desde la fuente y a continuación se detallan todos los pasos necesarios para instalarlo desde la fuente con las instrucciones mencionadas.
Otras respuestas ya describen por qué se muestran esos mensajes. Mi respuesta da un paso a paso sobre cómo instalar, lo que puede ayudar a las personas que luchan en la instalación real como lo hice yo.
Descárguelo de uno de sus lanzamientos disponibles , por ejemplo 0.5.2 . Extraerlo, entra en el directorio y configurarlo:
bash ./compile.sh
. Copie el ejecutable a/usr/local/bin
:sudo cp ./output/bazel /usr/local/bin
Clonar tensorflow:
git clone https://github.com/tensorflow/tensorflow.git
vaya al directorio clonado para configurarlo:./configure
Le indicará varias preguntas. A continuación, he sugerido la respuesta a cada una de las preguntas, por supuesto, puede elegir sus propias respuestas como prefiera:
Construir script pip:
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package
Construir paquete pip:
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
Instale el paquete pip Tensorflow que acaba de construir:
sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl
Ahora, la próxima vez que inicie Tensorflow, ya no se quejará por la falta de instrucciones.
fuente
-c opt --copt=-march=native
debería ser al menos tan bueno como--copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2
. (Ambos silenciarán la advertencia, pero-march=native
podrían hacer que el código sea aún más rápido si se ajusta específicamente para la CPU en el sistema en el que se está construyendo). También tenga en cuenta que--copt=-mavx2 --copt=-mfma
implica todas las opciones anteriores de AVX y SSE, por lo que esta larga serie de opciones fue escrita claramente por alguien que no entiende las opciones de gcc.--copt=-mavx2
no funcionó. Si--copt=-mfma
funciona,--copt=-march=native
debería funcionar, a menos que el análisis=
sea un problema. Para gcc / clang / icc, definitivamente desea que el script de compilación finalmente pase-march=native
al compilador. Hacer que eso suceda a través de scripts de construcción se convierte en el truco.Este es el método más simple. Solo un paso.
Tiene un impacto significativo en la velocidad. En mi caso, el tiempo necesario para un paso de entrenamiento casi se redujo a la mitad.
Consulte las compilaciones personalizadas de tensorflow
fuente
TensFlow
versión de @SreeraghAR es 1.10.0 y está usandoMacOS Sierra
. Ayúdame a encontrar el archivo.Compilé un pequeño script de Bash para Mac (se puede portar fácilmente a Linux) para recuperar todas las funciones de la CPU y aplicar algunas de ellas para construir TF. Estoy en TF master y uso un poco a menudo (un par de veces en un mes).
https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f
fuente
Para compilar TensorFlow con SSE4.2 y AVX, puede usar directamente
Fuente: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl
fuente
--copt="-march=native"
fue comer el=
. (Y, por cierto, esas comillas dobles no hacen nada; serán eliminadas por el shell antes debazel
ver su línea de comando).2.0 SOLUCIÓN COMPATIBLE:
Ejecute los siguientes comandos en Terminal (Linux / MacOS) o en el Símbolo del sistema (Windows) para instalar Tensorflow 2.0 usando Bazel :
fuente
-march=native
u otras opciones de GCC / clang? No veo ninguna mención de AVX, FMA o SSE4.2 en esto. (¿Y el script de compilación de Bazel o Tensorflow todavía está roto de una manera que solo opciones como el-mavx
trabajo, no-march=native
? Si ese es realmente el problema en la respuesta principal a esta pregunta)Al construir TensorFlow desde la fuente, ejecutará el
configure
script. Una de las preguntas que hace elconfigure
guión es la siguiente:El
configure
script adjuntará las banderas que especifique al comando bazel que construye el paquete de pip TensorFlow. En términos generales, puede responder a este mensaje de una de dos maneras:-march=native
). Esta opción optimizará el código generado para el tipo de CPU de su máquina.Después de configurar TensorFlow como se describe en la lista con viñetas anterior, debería poder construir TensorFlow completamente optimizado para la CPU de destino simplemente agregando la
--config=opt
bandera a cualquier comando de bazel que esté ejecutando.fuente
Para ocultar esas advertencias, puede hacer esto antes de su código real.
fuente