Intel MKL과 같은 네이티브 수학 라이브러리로 Spark 기계 학습 알고리즘 가속화

최근 일상에서 Spark MLlib의 SVD(특이값 분해)로 MovieLens의 추천을 구현하는 앱의 성능 조사를 하고 있습니다. 생각보다 늦고 곤란했습니다. Spark의 Driver, Executor의 메모리, Executor의 수, OverHead 등 다양한 Spark 파라미터를 조정해 시험해 왔습니다만, 좀처럼 개선할 수 없습니다.

그리고 한층 더 조사한 바, 원래 Spark Mllib의 SVD의 구현이 낡은 것 같고, 성능이 나오지 않는 정보가 넷상에서 상당히 올라가고 있습니다. Workaround로는 SVD 대신 Alternating Least Squares (ALS) 등을 사용하거나 네이티브 수학 연산 라이브러리를 사용하여 고속화하는 등이 있습니다.

이번에는 HDP상에서 Intel MKL을 이용하기 위한 설정 방법을 소개합니다.

먼저 Cloudera의 Blog를 참조합니다. CDH 클러스터의 경우 MKL의 Parcels 파일이 제공되므로 Cloudera Manager에서 쉽게 설치할 수 있습니다.
Using Native Math Libraries to Accelerate Spark Machine Learning Applications
https://docs.cloudera.com/documentation/guru-howto/data_science/topics/ght_native_math_libs_to_accelerate_spark_ml.html#using_native_math_libs_with_spark_machine_learning

Native Math Libraries for Spark ML



Spark MLlib는 Breeze 선형 대수 패키지를 사용합니다. Breeze는 최적화된 수치 처리를 하기 위해서는 netlib-java라는 라이브러리에 의존한다.netlib-java는 저수준 BLAS, LAPACK 및 ARPACK 라이브러리의 래퍼입니다. 그러나 라이센스 관련 제한으로 CDH Spark 또는 Apache Community Spark에는 기본적으로 netlib-java의 네이티브 프록시가 포함되어 있지 않습니다. 특히 수동으로 아무것도 설정하지 않으면 netlib-java는 F2J라는 Java 기반 라이브러리를 사용합니다.

네이티브 수학 라이브러리를 사용하고 있는지, Java 기반 F2J를 사용하고 있는지 Spark-shell에서 확인할 수 있습니다.
scala> import com.github.fommil.netlib.BLAS
import com.github.fommil.netlib.BLAS

scala> println(BLAS.getInstance().getClass().getName())
com.github.fommil.netlib.F2jBLAS

com.github.fommil.netlib.F2jBLAS가 표시되면 F2j를 사용하고 있는지 확인할 수 있습니다.

Intel MKL 설치 및 구성



Intel MKL(Intel's Math Kernel Library)을 이용하여 (Alternating Least Squares (ALS) algorithm), Latent Dirichlet Allocation (LDA), Primary Component Analysis (PCA), Singular Value Decomposition (SVD) 등의 알고리즘을 사용한 모델 훈련을 가속화할 수 있습니다.

Intel MKL 설치



각 Spark 노드에서 구현
htps : // 그 f로. 그렇다면 l. 코 m / 엔 - s / 아 rc c s / in s t ぃ g ㄴ ㄴ
# curl -O https://yum.repos.intel.com/mkl/setup/intel-mkl.repo > /etc/yum.repos.d/intel-mkl.repo
# sudo yum -y install intel-mkl-2019.3-062
intel-mkl-<VERSION>.<UPDATE>-<BUILD_NUM>の形式で指定


MKL의 설치 대상은/opt/intel/mkl입니다.

mklWrapper 다운로드



mklWrapper.jar 및 mkl_wrapper.so를 아래 링크에서 다운로드
htps : // 기주 b. 코 m / 어서 l-bi g 였어 / mkl_w 랏페 r_ 후 r_ 논_CDH
Copy mkl_wrapper.jar to /opt/intel/mkl/wrapper/mkl_wrapper.jar
Copy mkl_wrapper.so to /opt/intel/mkl_wrapper/mkl_wrapper.so

스파크 구성


# echo "/opt/intel/mkl/lib/intel64" > /etc/ld.so.conf.d/mkl_blas.conf
# ldconfig

Ambari에서 Spark-default 설정 추가




propety
value


spark.driver.extraClassPath
/opt/intel/mkl/wrapper/mkl_wrapper.jar

spark.executor.extraClassPath
/opt/intel/mkl/wrapper/mkl_wrapper.jar

spark.driver.extraJavaOptions
-Dcom.github.fommil.netlib.BLAS=com.intel.mkl.MKLBLAS -Dcom.github.fommil.netlib.LAPACK=com.intel.mkl.MKLLAPACK

spark.executor.extraJavaOptions
-Dcom.github.fommil.netlib.BLAS=com.intel.mkl.MKLBLAS -Dcom.github.fommil.netlib.LAPACK=com.intel.mkl.MKLLAPACK

spark.driverEnv.MKL_VERBOSE
1

spark.executorEnv.MKL_VERBOSE
1


실제 설정 Custom Spark2-defaults


spark.executor.extraJavaOptions는 Advanced spark2-defaults에 있습니다. 이미 있던 값 뒤에 추가


확인





com.intel.mkl.MKLBLAS가 표시되는지 확인할 수 있습니다.

그리고 다시 SVD를 실행해 보니 이전에 비해 30%~35%의 시간 단축할 수 있었습니다.
알고리즘에 따라 가속하는 정도가 다르기 때문에 ALS의 경우 4.3배나 빠르다는 결과가 나와 있습니다. 꼭 사용해보십시오.

좋은 웹페이지 즐겨찾기