2018년 1월 15일 월요일

AC922에서 Ubuntu 기반 container image로 caffe 및 tensorflow 수행하기

좋은 소식입니다.  원래 발표에서는 AC922에서는 2018년 2Q가 되어야 정식으로 Ubuntu가 지원될 예정이었습니다.  caffe나 tensorflow 등도 그때나 되어야 지원될 예정이었고요. 

오늘 테스트해보니 AC922의 CUDA9.1 + Redhat 7.4 + nvidia-docker v1 환경에서 테스트해보니, 기존 ubuntu 16.04에서 빌드해놓았던 tensorflow 1.3과 caffe 1.0이 다 잘 돌아갑니다.

그리고 성능도 기존 Minsky P100에서보다 약 1.7~1.8배 정도 나옵니다.  V100의 공식 TFLOPS 성능이 P100의 1.5배인 것을 생각하면 이는 POWER9과 NVLink 2.0 덕분인 것 같습니다.

[root@ac922 ~]# nvidia-docker run -ti --rm -v /nvme:/nvme bsyu/tf1.3-ppc64le:v0.1 bash

root@2be8a3ffc5fd:/nvme/models/tutorials/image/cifar10# which python
/opt/anaconda3/bin/python

root@2be8a3ffc5fd:/nvme/models/tutorials/image/cifar10# time python cifar10_multi_gpu_train.py --batch_size 512
...
2018-01-15 13:10:45.808267: step 8220, loss = 0.75 (27044.5 examples/sec; 0.019 sec/batch)
2018-01-15 13:10:46.585492: step 8230, loss = 0.60 (27071.8 examples/sec; 0.019 sec/batch)
2018-01-15 13:10:47.353298: step 8240, loss = 0.59 (26355.8 examples/sec; 0.019 sec/batch)
2018-01-15 13:10:48.130751: step 8250, loss = 0.67 (26219.3 examples/sec; 0.020 sec/batch)
2018-01-15 13:10:48.909557: step 8260, loss = 0.61 (27011.5 examples/sec; 0.019 sec/batch)
2018-01-15 13:10:49.681004: step 8270, loss = 0.65 (27131.1 examples/sec; 0.019 sec/batch)


단, 이런 성능을 내기 위해서는 예전과 마찬가지로 GPU auto boost를 해줘야 하며, V100에 대해서는 다음과 같이 해주시기 바랍니다.

[root@ac922 ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local

/usr/bin/nvidia-smi -pm ENABLED
/usr/bin/nvidia-smi -ac 877,1530
/usr/sbin/ppc64_cpu --smt=off
sleep 30
/usr/bin/cpupower frequency-set --governor performance
/usr/bin/nvidia-docker-plugin &


또한 이렇게 docker container를 이용할 경우, cuda를 initialize하는데 시간이 꽤 오래 걸립니다.  이건 Redhat 위에서 ubuntu 기반 container를 띄우기 때문인지, 아니면 nvidia-docker v1을 사용하기 때문인지, 아니면 CUDA 9의 문제인지 아직 불분명합니다.

그리고 그대로 nvidia-smi를 수행하면 failed call to cuInit: CUDA_ERROR_NOT_INITIALIZED error가 납니다.  그 문제는 아래와 같이 해결 가능합니다.  아래 내용은 IBM 이보란 과장이 정리해주었습니다.

# vi /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
# sudo dracut --force
# vi /usr/lib/systemd/system/nvidia-persistenced.service
[Unit]
Description=NVIDIA Persistence Daemon
Wants=syslog.target

[Service]
Type=forking
PIDFile=/var/run/nvidia-persistenced/nvidia-persistenced.pid
Restart=always
ExecStart=/usr/bin/nvidia-persistenced --verbose
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced

[Install]
WantedBy=multi-user.target
# sudo systemctl enable nvidia-persistenced

$ vi /lib/udev/rules.d/40-redhat.rules  (아래 줄을 #으로 comment-out)
#SUBSYSTEM=="memory", ACTION=="add", PROGRAM="/bin/uname -p", RESULT!="s390*", ATTR{state}=="offline", ATTR{state}="online"

# /usr/bin/nvidia-persistenced --verbose
# sudo yum install freeglut-devel libX11-devel libXi-devel libXmu-devel make mesa-libGLU-devel
Error downloading packages:
  libXext-devel-1.3.3-3.el7.ppc64le: [Errno 256] No more mirrors to try.
  libXdamage-devel-1.1.4-4.1.el7.ppc64le: [Errno 256] No more mirrors to try. (생략)
==> 설치부분은 위와 같이 다운로드 에러가 납니다만, 그냥 무시하고 넘어갔습니다.
이후 PYTHONPATH, PATH, LD_LIBRARY_PATH 설정 후에 tensorflow 1.4 로 cifar10이든, mnist 든 수행하면 다음의 에러가 납니다. 
[root@ac922 cifar10]# python cifar10_train.py
Traceback (most recent call last):
  File "cifar10_train.py", line 42, in <module>
    import tensorflow as tf
  File "/opt/anaconda3/lib/python3.6/site-packages/tensorflow/__init__.py", line 24, in <module>
    from tensorflow.python import *
  File "/opt/anaconda3/lib/python3.6/site-packages/tensorflow/python/__init__.py", line 30, in <module>
    import traceback
  File "/opt/anaconda3/lib/python3.6/traceback.py", line 5, in <module>
    import linecache
  File "/opt/anaconda3/lib/python3.6/linecache.py", line 11, in <module>
    import tokenize
  File "/opt/anaconda3/lib/python3.6/tokenize.py", line 33, in <module>
    import re
  File "/opt/anaconda3/lib/python3.6/re.py", line 142, in <module>
    class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'
enum34가 설치되어 있어서 발생하는 에러인데, Python 3.4 버전 이상부터는 enum34와 호환이 되지 않아서 이를 삭제해야 한다고 합니다. 삭제를 위해, 우선 PYTHONPATH를 Python 2.7 경로로 바꿔줍니다.
# export PYTHONPATH=/opt/DL/tensorflow/lib/python2.7/site-packages
# pip uninstall enum34
# export PYTHONPATH=<python3.6/site-packages의 경로로 재설정>
# export PYTHONPATH=/opt/anaconda3/lib/python3.6/site-packages
그 다음, cifar10 이든 mnist를 수행하면 enum 관련 에러는 발생하지 않고, nvidia-smi 에서는 unknown error 대신 GPU 메모리 상태 정보를 제대로 띄우는 것을 확인할 수 있습니다. 






댓글 없음:

댓글 쓰기