(finger snap 하면 타노스인데 말입니다.)
이 Snap ML의 성능과 효용성에 대해서는 아래 IBM 공식 blog에 잘 나와 있습니다.
https://www.ibm.com/blogs/research/2018/03/machine-learning-benchmark/
위 블로그 내용을 요약하면 구글이 Google Cloud Platform (worker machine 60대 + parameter machine 34대)에서 tensorflow를 60분 동안 걸려 training한 결과 얻은 log loss를 IBM Snap ML은 IBM POWER9과 NVIDIA GPU를 장착한 AC922 4대에서 Snap ML로 불과 91.5초의 training 만으로 얻었다는 것입니다. 여기에 사용된 dataset은 Criteo Labs에서 제공하는 실제 internet 광고 click 건수 data로서, 총 40억 row에 달하는 광대한 data입니다.
이런 고성능이 가능했던 것은 물론 CPU와 GPU 간을 PCI 버스가 아닌 NVLink로 연결하는 AC922 서버의 우수한 아키텍처 영향도 있습니다만, 이 Snap ML이라는 framework SW 자체의 우수성도 있습니다.
이 posting에서는 PowerAI 5.4 버전에 포함된 Snap ML을 설치하고 거기에 포함된 example 몇 개를 돌려보겠습니다.
먼저, Anaconda2 5.2를 설치하여 conda/python 환경을 구성합니다.
[root@localhost home]# wget https://repo.continuum.io/archive/Anaconda2-5.2.0-Linux-ppc64le.sh
[root@localhost home]# chmod a+x Anaconda2-5.2.0-Linux-ppc64le.sh
[root@localhost home]# ./Anaconda2-5.2.0-Linux-ppc64le.sh
[root@localhost home]# . /root/.bashrc
[root@localhost home]# which python
/opt/anaconda2/bin/python
그 다음에 PowerAI의 장점을 살려 아주 간단하게 Snap ML을 설치합니다.
[root@localhost home]# yum install snap-ml-local.ppc64le
==============================================================================================
Package Arch Version Repository Size
==============================================================================================
Installing:
snap-ml-local ppc64le 1.1.0-241.1887dec mldl-repo-local 29 M
Installing for dependencies:
powerai-license ppc64le 5.4.0-124.150cee0 mldl-repo-local 4.3 M
python-devel ppc64le 2.7.5-76.el7 rhel-7-for-power-9-rpms 398 k
이렇게 설치된 snap-ml-local 속에는 아래와 같은 fileset들이 들어 있습니다. 보시다시피 저 위의 IBM 공식 블로그에 소개했던 Criteo Teraclick training의 미니 버전이라고 할 수 있는 criteo Kaggle example도 들어있습니다.
[root@localhost home]# rpm -ql snap-ml-local-1.1.0-241.1887dec.ppc64le
/opt/DL
/opt/DL/snap-ml-local
/opt/DL/snap-ml-local/bin
/opt/DL/snap-ml-local/bin/check_dependencies
/opt/DL/snap-ml-local/bin/install_dependencies
/opt/DL/snap-ml-local/bin/snap-ml-local-activate
/opt/DL/snap-ml-local/conda-pkgs
/opt/DL/snap-ml-local/conda-pkgs/channeldata.json
/opt/DL/snap-ml-local/conda-pkgs/icons
...
/opt/DL/snap-ml-local/examples/creditcard
/opt/DL/snap-ml-local/examples/creditcard/README.md
/opt/DL/snap-ml-local/examples/creditcard/example-creditcard.py
/opt/DL/snap-ml-local/examples/creditcard/preprocess-creditcard.py
/opt/DL/snap-ml-local/examples/criteo
/opt/DL/snap-ml-local/examples/criteo/README.md
/opt/DL/snap-ml-local/examples/criteo/example-criteo-kaggle-privacy.py
/opt/DL/snap-ml-local/examples/criteo/example-criteo-kaggle.py
/opt/DL/snap-ml-local/examples/criteo/preprocess-criteo-kaggle-privacy.py
/opt/DL/snap-ml-local/examples/criteo/preprocess-criteo-kaggle.py
...
Snap ML의 사용을 위해서는 먼저 install_dependencies를 수행하여 관련 conda package들을 설치합니다.
[root@localhost home]# /opt/DL/snap-ml-local/bin/install_dependencies
...
package | build
---------------------------|-----------------
powerai-snap-ml-local-prereqs-1.1.0_241.1887dec| py27_0 4 KB file:///opt/DL/snap-ml-local/conda-pkgs
conda-4.5.11 | py27_0 1.0 MB
openssl-1.0.2p | h14c3975_0 3.3 MB
openblas-devel-0.2.20 | 7 101 KB
blas-1.1 | openblas 4 KB file:///opt/DL/snap-ml-local/conda-pkgs
certifi-2018.11.29 | py27_0 146 KB
pai4sk-0.20rc1_241.1887dec | py27_0 14.0 MB file:///opt/DL/snap-ml-local/conda-pkgs
------------------------------------------------------------
Total: 18.5 MB
...
그리고 PowerAI license에 동의하는 script를 수행하고 이어서 snap-ml-local-activate를 수행하여 PATH 등의 환경 변수를 설정합니다.
[root@localhost home]# /opt/DL/license/bin/accept-powerai-license.sh
[root@localhost home]# source /opt/DL/snap-ml-local/bin/snap-ml-local-activate
이제 Amazone cloud에서 Criteo의 test dataset 미니 버전을 download 합니다. 4.5GB 정도 됩니다.
[root@localhost home]# mkdir data && cd data
[root@localhost data]# wget https://s3-us-west-2.amazonaws.com/criteo-public-svm-data/criteo.kaggle2014.svm.tar.gz
Length: 4849417655 (4.5G) [application/x-tar]
Saving to: ‘criteo.kaggle2014.svm.tar.gz’
100%[======================================>] 4,849,417,655 22.5MB/s in 4m 29s
2018-12-14 12:28:34 (17.2 MB/s) - ‘criteo.kaggle2014.svm.tar.gz’ saved [4849417655/4849417655]
이 tar 압축을 풀고 data preprocessing을 위한 python code를 수행합니다. 약 1시간 정도 걸립니다.
[root@localhost data]# tar xzf criteo.kaggle2014.svm.tar.gz
[root@localhost data]# time python /opt/DL/snap-ml-local/examples/criteo/preprocess-criteo-kaggle.py --data_path=/home
real 67m57.038s
user 67m20.277s
sys 0m27.750s
이제 다음과 같이 criteo kaggle2014 dataset의 포맷이 완료되었습니다.
[root@localhost data]# ls -ltr crit*
-r--r--r-- 1 1007 1007 3523847664 Sep 27 2017 criteo.kaggle2014.test.svm
-r--r--r-- 1 1007 1007 26737621696 Sep 27 2017 criteo.kaggle2014.train.svm
-rw-r--r-- 1 root root 4849417655 Sep 27 2017 criteo.kaggle2014.svm.tar.gz
-rw-r--r-- 1 root root 16227489113 Dec 14 13:46 criteo.kaggle2014.X_train.npz
-rw-r--r-- 1 root root 5409163153 Dec 14 13:47 criteo.kaggle2014.X_test.npz
-rw-r--r-- 1 root root 275043776 Dec 14 13:47 criteo.kaggle2014.y_train.npy
-rw-r--r-- 1 root root 91681320 Dec 14 13:47 criteo.kaggle2014.y_test.npy
이걸 GPU 1번 1개를 이용하여 training하기 위해 다음과 같이 example-criteo-kaggle.py를 수행해 줍니다.
[root@localhost data]# time python /opt/DL/snap-ml-local/examples/criteo/example-criteo-kaggle.py --data_path=/home --use_gpu --device_ids 1
Data load time (s): 28.92
[Info] Tolerance 0.001 attained after 49 epochs.
/opt/anaconda2/lib/python2.7/site-packages/pai4sk/sml_solvers/logistic.py:406: UserWarning: PowerAI: Default solver is set to 'snapml'. Specify a solver to silence this warning.
UserWarning)
[pai4sk] Training time (s): 25.89
[pai4sk] Logarithmic loss: 0.4558
[Info] Tolerance 0.001 attained after 49 epochs.
/opt/anaconda2/lib/python2.7/site-packages/pai4sk/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
FutureWarning)
[pai4sk.lmodel] Training time (s): 32.28
[pai4sk.lmodel] Logarithmic loss: 0.4558
[sklearn] Training time (s): 624.55
[sklearn] Logarithmic loss: 0.4558
real 12m14.974s
user 11m57.544s
sys 0m34.245s
위의 example 결과는 크게 3가지입니다.
[pai4sk] Training time (s): 25.89 : Snap ML을 이용한 training 결과
[pai4sk.lmodel] Training time (s): 32.28 : Snap ML Linear Regression을 이용한 training 결과
[sklearn] Training time (s): 624.55 : 일반 sklearn을 이용한 training 결과
즉, Snap ML을 이용하면 일반 sklearn을 이용하는 것보다 거의 25배 더 빨리 training을 마칠 수 있으며, 그럼에도 불구하고 log loss는 비슷한 수준이라는 것을 아실 수 있습니다.
더 자세한 내용은 아래 URL들을 참조하시기 바랍니다.
https://ibmsoe.github.io/snap-ml-doc/index.html
https://ibmsoe.github.io/snap-ml-doc/tutorials.html
https://ibmsoe.github.io/snap-ml-doc/notebookcreditlocal.html#notebook-credit-local
https://ibmsoe.github.io/snap-ml-doc/pai4skapidocumentation.html#pai4sk-api-documentation
댓글 없음:
댓글 쓰기