Sé que Numpy puede usar diferentes backends como OpenBLAS o MKL. También he leído que MKL está muy optimizado para Intel, por lo que generalmente la gente sugiere usar OpenBLAS en AMD, ¿verdad?
Yo uso el siguiente código de prueba:
import numpy as np def testfunc(x): np.random.seed(x) X = np.random.randn(2000, 4000) np.linalg.eigh(X @ XT) %timeit testfunc(0)He probado este código usando diferentes CPU:
Estoy usando el mismo entorno Conda en los tres sistemas. Según np.show_config() , el sistema Intel usa el backend MKL para Numpy ( library libraries = ['mkl_rt', 'pthread'] ), mientras que los sistemas AMD usan OpenBLAS ( library libraries = ['openblas', 'openblas'] ) . El uso del núcleo de la CPU se determinó observando top de un shell de Linux:
Las anteriores observaciones dan lugar a las siguientes preguntas:
Actualización 1: la versión de OpenBLAS es 0.3.6. Leí en alguna parte que la actualización a una versión más nueva podría ayudar, sin embargo, con OpenBLAS actualizado a 0.3.10, el rendimiento de testfunc sigue siendo de 1,55 s en AMD Ryzen Threadripper 3970X.
Actualización 2: el uso del backend MKL para Numpy junto con la variable de entorno MKL_DEBUG_CPU_TYPE=5 (como se describe aquí ) reduce el tiempo de ejecución de testfunc en AMD Ryzen Threadripper 3970X a solo 0,52 s, lo que en realidad es más o menos satisfactorio. FTR, configurar esta variable a través de ~/.profile no funcionó para mí en Ubuntu 20.04. Además, configurar la variable desde dentro de Jupyter no funcionó. Entonces, en lugar de eso, lo puse en ~/.bashrc , que funciona ahora. De todos modos, con un rendimiento un 35 % más rápido que un Intel Xeon antiguo, ¿es esto todo lo que obtenemos o podemos sacarle más partido?
Actualización 3: juego con la cantidad de subprocesos utilizados por MKL/OpenBLAS:
Los tiempos de ejecución se informan en segundos. El mejor resultado de cada columna está subrayado. Usé OpenBLAS 0.3.6 para esta prueba. Las conclusiones de esta prueba:
Actualización 4: Solo para aclaración. No, no creo que (a) esto o (b) aquello responda a esta pregunta. (a) sugiere que "OpenBLAS funciona casi tan bien como MKL" , lo cual es una fuerte contradicción con los números que observé. Según mis números, OpenBLAS funciona ridículamente peor que MKL. La pregunta es por qué. (a) y (b) ambos sugieren usar MKL_DEBUG_CPU_TYPE=5 junto con MKL para lograr el máximo rendimiento. Esto podría ser correcto, pero tampoco explica por qué OpenBLAS es tan lento. Tampoco explica por qué, incluso con MKL y MKL_DEBUG_CPU_TYPE=5 , el Threadripper de 32 núcleos es solo un 36 % más rápido que el Xeon de 6 núcleos de seis años .
Creo que esto debería ayudar:
"El mejor resultado en el gráfico es para TR 3960x usando MKL con el entorno var MKL_DEBUG_CPU_TYPE=5. Y es significativamente mejor que la ruta de código de baja optimización de MKL solo. Y OpenBLAS funciona casi tan bien como MKL con MKL_DEBUG_CPU_TYPE=5 colocar." https://www.pugetsystems.com/labs/hpc/How-To-Use-MKL-with-AMD-Ryzen-and-Threadripper-CPU-s-Effectively-for-Python-Numpy-And-Other-Applications- 1637/
Cómo configurar: 'Haga que la configuración sea permanente ingresando MKL_DEBUG_CPU_TYPE=5 en las Variables de entorno del sistema. Esto tiene varias ventajas, una de ellas es que se aplica a todas las instancias de Matlab y no solo a la que se abrió con el archivo .bat' https://www.reddit.com/r/matlab/comments/dxn38s/howto_force_matlab_to_use_a_fast_codepath_on_amd/? ordenar = nuevo
¿No tendría sentido intentar usar una biblioteca BLIS optimizada de AMD ?
Tal vez me estoy perdiendo (malinterpretando) algo, pero supongo que podría usar BLIS en lugar de OpenBLAS. El único problema potencial podría ser que AMD BLIS esté optimizado para AMD EPYC (pero estás usando Ryzen). Tengo MUCHA curiosidad por los resultados, ya que estoy en proceso de comprar un servidor para trabajar, y estoy considerando AMD EPYC e Intel Xeon.
Aquí están las respectivas bibliotecas AMD BLIS: https://developer.amd.com/amd-aocl/
Lamentablemente, a partir de 2021, Intel eliminó MKL_DEBUG_CPU_TYPE para evitar que las personas en AMD usen la solución alternativa presentada en la respuesta aceptada. Esto significa que la solución ya no funciona y los usuarios de AMD tienen que cambiar a OpenBLAS o seguir usando MKL.
Para utilizar la solución alternativa, siga este método :
conda con MKL=2019 de conda y NumPy.MKL_DEBUG_CPU_TYPE = 5Los comandos para los pasos anteriores:
conda create -n my_env -c anaconda python numpy mkl=2019.* blas=*=*mklconda activate my_envconda env config vars set MKL_DEBUG_CPU_TYPE=5¡Y eso es!