apache-spark - precios - hadoop común
Cómo configurar BLAS/LAPACK de alto rendimiento para Breeze en Amazon EMR, EC2 (1)
Seguir:
Mi conclusión provisional es que las bibliotecas de Atlas instaladas por defecto en la instancia de Amazon EMR son simplemente lentas. O bien es una versión genérica que no se ha optimizado para el tipo de máquina específico, o es fundamentalmente más lenta que otras bibliotecas. Usando este script como guía, construí e instalé OpenBLAS para el tipo de máquina específico en el que ejecutaba los puntos de referencia (también encontré información útil here ). Una vez que se instaló OpenBLAS, mi punto de referencia de multiplicación de matriz de 3000x3000 se completó en 3.9s (en comparación con los 15.1 enumerados anteriormente cuando se usan las librerías Atlas por defecto). Esto es aún más lento que el mismo benchmark ejecutado en mi Mac (por un factor de x2), pero esta diferencia se encuentra en un rango que podría ser creíble debido al rendimiento h / w subyacente.
Aquí hay una lista completa de los comandos que utilicé para instalar OpenBLAS libs en el EMR de Amazon, instancia de Spark:
sudo yum install git
git clone https://github.com/xianyi/OpenBlas.git
cd OpenBlas/
make clean
make -j4
sudo mkdir /usr/lib64/OpenBLAS
sudo chmod o+w,g+w /usr/lib64/OpenBLAS/
make PREFIX=/usr/lib64/OpenBLAS install
sudo rm /etc/ld.so.conf.d/atlas-x86_64.conf
sudo ldconfig
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/libblas.so
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/libblas.so.3
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/libblas.so.3.5
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/liblapack.so
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/liblapack.so.3
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/liblapack.so.3.5
Estoy intentando configurar un entorno para admitir análisis de datos exploratorios en un clúster. Basado en una encuesta inicial de lo que hay por ahí, mi objetivo es utilizar Scala / Spark con Amazon EMR para aprovisionar el clúster.
Actualmente estoy tratando de poner en marcha algunos ejemplos básicos para validar que tengo todo configurado correctamente. El problema que estoy teniendo es que no veo el rendimiento que espero de las bibliotecas de Atlas BLAS en la instancia de máquina de Amazon.
A continuación se muestra un fragmento de código de mi punto de referencia simple. Es solo una multiplicación de matriz cuadrada seguida de una multiplicación de grasa corta y una multiplicación alta y delgada para producir una matriz pequeña que se puede imprimir (quería estar seguro de que Scala no omitiría ninguna parte del cálculo debido a la evaluación perezosa).
Estoy usando Breeze para la biblioteca de álgebra lineal y netlib-java para extraer las bibliotecas nativas locales para BLAS / LAPACK
import breeze.linalg.{DenseMatrix, DenseVector}
import org.apache.spark.annotation.DeveloperApi
import org.apache.spark.rdd.RDD
import org.apache.spark.{Partition, SparkContext, TaskContext}
import org.apache.spark.SparkConf
import com.github.fommil.netlib.BLAS.{getInstance => blas}
import scala.reflect.ClassTag
object App {
def NaiveMultiplication(n: Int) : Unit = {
val vl = java.text.NumberFormat.getIntegerInstance.format(n)
println(f"Naive Multipication with vector length " + vl)
println(blas.getClass().getName())
val sm: DenseMatrix[Double] = DenseMatrix.rand(n, n)
val a: DenseMatrix[Double] = DenseMatrix.rand(2,n)
val b: DenseMatrix[Double] = DenseMatrix.rand(n,3)
val c: DenseMatrix[Double] = sm * sm
val cNormal: DenseMatrix[Double] = (a * c) * b
println(s"Dot product of a and b is /n$cNormal")
}
Basado en una encuesta en la web de los puntos de referencia, estoy esperando que una multiplicación de matriz de 3000x3000 tome aprox. 2-4s usando una biblioteca BLAS nativa optimizada. Cuando corro localmente en mi MacBook Air, este punto de referencia se completa en 1.8s. Cuando ejecuto esto en EMR, se completa en aprox. 11s (utilizando una instancia g2.2xlarge, aunque se obtuvieron resultados similares en una instancia m3.xlarge). Como otra comprobación cruzada ejecuté un EC1 EC2 precompuesto del proyecto BIDMach en el mismo tipo de instancia EC2, g2.2xlarge, y obtuve 2.2s (nota, el punto de referencia GPU para el mismo cálculo arrojó 0.047s).
En este punto, sospecho que netlib-java no está cargando la lib correcta, pero aquí es donde estoy atascado. He revisado muchas times el netlib-java README y parece que las bibliotecas de ATLAS ya están instaladas según sea necesario (ver a continuación)
[hadoop@ip-172-31-3-69 ~]$ ls /usr/lib64/atlas/
libatlas.a libcblas.a libclapack.so libf77blas.so liblapack.so libptcblas.so libptf77blas.so
libatlas.so libcblas.so libclapack.so.3 libf77blas.so.3 liblapack.so.3 libptcblas.so.3 libptf77blas.so.3
libatlas.so.3 libcblas.so.3 libclapack.so.3.0 libf77blas.so.3.0 liblapack.so.3.0 libptcblas.so.3.0 libptf77blas.so.3.0
libatlas.so.3.0 libcblas.so.3.0 libf77blas.a liblapack.a libptcblas.a libptf77blas.a
[hadoop@ip-172-31-3-69 ~]$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
[hadoop@ip-172-31-3-69 ~]$ ls /etc/ld.so.conf.d
atlas-x86_64.conf kernel-4.4.11-23.53.amzn1.x86_64.conf kernel-4.4.8-20.46.amzn1.x86_64.conf mysql55-x86_64.conf R-x86_64.conf
[hadoop@ip-172-31-3-69 ~]$ cat /etc/ld.so.conf.d/atlas-x86_64.conf
/usr/lib64/atlas
A continuación, se muestran 2 ejemplos que ejecutan el benchmark en la instancia de Amazon EMR. El primero muestra cuando el sistema nativo BLAS supuestamente carga correctamente. El segundo muestra cuando el BLAS nativo no se carga y el paquete vuelve a la implementación de referencia. Parece que está cargando un BLAS nativo según los mensajes y el tiempo. Comparado con la ejecución local en mi Mac, el caso sin BLAS se ejecuta aproximadamente al mismo tiempo, pero el caso BLAS nativo se ejecuta en 1.8s en mi Mac en comparación con 15s en el caso de abajo. Los mensajes de información son los mismos para mi Mac en comparación con EMR (que no sean nombres específicos de dir / file, etc.).
[hadoop@ip-172-31-3-69 ~]$ spark-submit --class "com.cyberatomics.simplespark.App" --conf "spark.driver.extraClassPath=/home/hadoop/simplespark-0.0.1-SNAPSHOT-jar-with-dependencies.jar" --master local[4] simplespark-0.0.1-SNAPSHOT-jar-with-dependencies.jar 3000 naive
Naive Multipication with vector length 3,000
Jun 16, 2016 12:30:39 AM com.github.fommil.jni.JniLoader liberalLoad
INFO: successfully loaded /tmp/jniloader2856061049061057802netlib-native_system-linux-x86_64.so
com.github.fommil.netlib.NativeSystemBLAS
Dot product of a and b is
1.677332076284315E9 1.6768329748988206E9 1.692150656424957E9
1.6999000993276503E9 1.6993872020220244E9 1.7149145239563465E9
Elapsed run time: 15.1s
[hadoop@ip-172-31-3-69 ~]$
[hadoop@ip-172-31-3-69 ~]$ spark-submit --class "com.cyberatomics.simplespark.App" --master local[4] simplespark-0.0.1-SNAPSHOT-jar-with-dependencies.jar 3000 naive
Naive Multipication with vector length 3,000
Jun 16, 2016 12:31:32 AM com.github.fommil.netlib.BLAS <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
Jun 16, 2016 12:31:32 AM com.github.fommil.netlib.BLAS <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
com.github.fommil.netlib.F2jBLAS
Dot product of a and b is
1.6640545115052865E9 1.6814609592261212E9 1.7062846398842275E9
1.64471099826913E9 1.6619129531594608E9 1.6864479674870768E9
Elapsed run time: 28.7s
En este punto mi mejor suposición es que en realidad está cargando una lib nativa, pero está cargando una genérica. ¿Alguna sugerencia sobre cómo puedo verificar qué biblioteca compartida está recogiendo en tiempo de ejecución? Intenté ''ldd'' pero parece que no funciona con spark-submit. O tal vez mis expectativas para Atlas son erróneas, pero parece difícil de creer que AWS preinstale las libs si no estuvieran ejecutando velocidades razonablemente competitivas.
Si ve que las librerías no están conectadas correctamente en EMR, proporcione una guía sobre lo que debo hacer para que netlib-java pueda recoger las libs de Atlas.
gracias tim