2018년 4월 2일 월요일

AC922 Redhat 7.4 + Python 3.6에서 Tensorflow 1.5.0 build하기

이번에는 Tensorflow 1.5.0을 AC922 Redhat 7.4 + Python 3.6에서 build하고 테스트 삼아 CIFAR10 training 돌리는 것까지를 해보겠습니다.

기본적인 사전 준비 작업은 아래 URL에 나온 TF 1.4.1의 것과 동일합니다.  즉 anaconda 5.1을 설치하고 또 bazel-0.8.1을 빌드해서 /usr/local/bin 밑에 copy 해두면 됩니다.

https://hwengineer.blogspot.kr/2018/01/ac922-redhat-python3-tensorflow-141.html


먼저 tensorflow의 source code를 github에서 download 받습니다. 

[user1@ac922 ~]$ git clone https://github.com/tensorflow/tensorflow

[user1@ac922 ~]$ cd tensorflow

v1.5.0으로 checkout 합니다.  위의 posting에 따라 1.4.1에 patch가 적용된 상태라면 '변경된 source가 있으니 stash이든 commit이든 먼저 하고 checkout하라'고 나올텐데, 우리는 기존 patch 적용은 다 버리고 갈 것이니 그냥 -f 옵션을 써서 강제로 checkout 하겠습니다. 

[user1@ac922 tensorflow]$ git checkout -f tags/v1.5.0

이제 몇가지 python package와 환경변수들을 맞춰두겠습니다.

[user1@ac922 tensorflow]$ conda install wheel numpy six

[user1@ac922 tensorflow]$ which protoc
~/anaconda3/bin/protoc

[user1@ac922 tensorflow]$ export PROTOC=~/anaconda3/bin/protoc

[user1@ac922 tensorflow]$ which bazel
/usr/local/bin/bazel

[user1@ac922 tensorflow]$ export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64:/usr/lib64:/usr/lib:/usr/local/lib64:/usr/local/lib:$LD_LIBRARY_PATH

TF1.5에서는 1.4와는 달리 ppc64le 아키텍처에서도 boring_ssl에서 error가 나지 않습니다.  대신 그냥 bazel을 수행하면 다음과 같은 error가 날 수 있습니다.

gcc: error: unrecognized command line option '-march=native'

이는 gcc 4.8에 ppc64le 아키텍처에 대해서는 -march라는 argument가 없는데, TF1.5에 포함된 configure.py에는 저 -march=native라는 것이 default로 되어 있기 때문입니다.  따라서 아래와 같이 고쳐주어야 error가 나지 않습니다.

[user1@ac922 tensorflow]$ vi ./configure.py
...
    # gcc on ppc64le does not support -march, use mcpu instead
""" default_cc_opt_flags = '-mcpu=native' """
    default_cc_opt_flags = '-mcpu=power8'
  else:
""" default_cc_opt_flags = '-march=native' """
    default_cc_opt_flags = '-mcpu=power8'
...
  # It should be safe on the same build host.
  """write_to_bazelrc('build:opt --host_copt=-march=native')"""
  write_to_bazelrc('build:opt --host_copt=-mcpu=power8')
...

이제 configure를 수행합니다.

[user1@ac922 tensorflow]$ ./configure
...
Do you wish to build TensorFlow with Google Cloud Platform support? [Y/n]: n
...
Do you wish to build TensorFlow with Amazon S3 File System support? [Y/n]: n
...
Do you wish to build TensorFlow with CUDA support? [y/N]: y
Please specify the CUDA SDK version you want to use, e.g. 7.0. [Leave empty to default to CUDA 8.0]: 9.1
Please specify the location where CUDA 9.1 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: /usr/local/cuda-9.1
Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 6.0]: 7
Please specify the location where cuDNN 7.0 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda-9.1]:/usr/local/cuda-9.1/targets/ppc64le-linux/lib
Please note that each additional compute capability significantly increases your build time and binary size. [Default is: 3.5,5.2]7.0
...
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -mcpu=power8]:
(위에서 configure.py를 수정했으므로 이미 default가 -mcpu=power8로 바뀌어 있는 것이 보입니다.  따라서 그냥 아무 input을 넣지 않아도 됩니다.)
...

이제 bazel build를 수행합니다.

[user1@ac922 tensorflow]$ bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
...
cc1plus: warning: unrecognized command line option "-Wno-self-assign" [enabled by default]
Target //tensorflow/tools/pip_package:build_pip_package up-to-date:
  bazel-bin/tensorflow/tools/pip_package/build_pip_package
INFO: Elapsed time: 432.069s, Critical Path: 138.14s
INFO: Build completed successfully, 6026 total actions

아무 문제없이 완료됩니다.  이제 wheel package를 build합니다. 

[user1@ac922 tensorflow]$ bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/files/tensorflow_pkg
...
Mon Apr 2 16:26:06 KST 2018 : === Output wheel file is in: /home/user1/files/tensorflow_pkg

아래와 같이 wheel package가 build된 것을 보실 수 있습니다.

[user1@ac922 tensorflow]$ ls -l ~/files/tensorflow_pkg
total 76724
-rw-rw-r--. 1 user1 user1 78562178 Apr  2 16:26 tensorflow-1.5.0-cp36-cp36m-linux_ppc64le.whl

이 파일을 pip 명령으로 설치하면 됩니다.  기존에 tensorflow 1.4.1이 설치되어있던 시스템이라면 이 과정에서 자동으로 TF1.4.1이 deinstall 됩니다.

[user1@ac922 tensorflow]$ pip install ~/files/tensorflow_pkg/tensorflow-1.5.0-cp36-cp36m-linux_ppc64le.whl
Processing /home/user1/files/tensorflow_pkg/tensorflow-1.5.0-cp36-cp36m-linux_ppc64le.whl
Requirement already satisfied: six>=1.10.0 in /home/user1/anaconda3/lib/python3.6/site-packages (from tensorflow==1.5.0)
Requirement already satisfied: numpy>=1.12.1 in /home/user1/anaconda3/lib/python3.6/site-packages (from tensorflow==1.5.0)
Requirement already satisfied: wheel>=0.26 in /home/user1/anaconda3/lib/python3.6/site-packages (from tensorflow==1.5.0)
Collecting absl-py>=0.1.6 (from tensorflow==1.5.0)
  Downloading absl-py-0.1.13.tar.gz (80kB)
    100% |████████████████████████████████| 81kB 721kB/s
Collecting tensorflow-tensorboard<1.6.0,>=1.5.0 (from tensorflow==1.5.0)
  Downloading tensorflow_tensorboard-1.5.1-py3-none-any.whl (3.0MB)
    100% |████████████████████████████████| 3.0MB 378kB/s
Requirement already satisfied: protobuf>=3.4.0 in /home/user1/anaconda3/lib/python3.6/site-packages (from tensorflow==1.5.0)
Requirement already satisfied: werkzeug>=0.11.10 in /home/user1/anaconda3/lib/python3.6/site-packages (from tensorflow-tensorboard<1.6.0,>=1.5.0->tensorflow==1.5.0)
Requirement already satisfied: html5lib==0.9999999 in /home/user1/anaconda3/lib/python3.6/site-packages (from tensorflow-tensorboard<1.6.0,>=1.5.0->tensorflow==1.5.0)
Requirement already satisfied: bleach==1.5.0 in /home/user1/anaconda3/lib/python3.6/site-packages (from tensorflow-tensorboard<1.6.0,>=1.5.0->tensorflow==1.5.0)
Requirement already satisfied: markdown>=2.6.8 in /home/user1/anaconda3/lib/python3.6/site-packages (from tensorflow-tensorboard<1.6.0,>=1.5.0->tensorflow==1.5.0)
Requirement already satisfied: setuptools in /home/user1/anaconda3/lib/python3.6/site-packages (from protobuf>=3.4.0->tensorflow==1.5.0)
Building wheels for collected packages: absl-py
  Running setup.py bdist_wheel for absl-py ... done
  Stored in directory: /home/user1/.cache/pip/wheels/76/f7/0c/88796d7212af59bb2f496b12267e0605f205170781e9b86479
Successfully built absl-py
Installing collected packages: absl-py, tensorflow-tensorboard, tensorflow
  Found existing installation: tensorflow-tensorboard 0.4.0
    Uninstalling tensorflow-tensorboard-0.4.0:
      Successfully uninstalled tensorflow-tensorboard-0.4.0
  Found existing installation: tensorflow 1.4.1
    Uninstalling tensorflow-1.4.1:
      Successfully uninstalled tensorflow-1.4.1
Successfully installed absl-py-0.1.13 tensorflow-1.5.0 tensorflow-tensorboard-1.5.1

pip list 명령으로 잘 설치되었는지 확인합니다.

[user1@ac922 tensorflow]$ pip list --format=columns | grep tensor
tensorflow                         1.5.0
tensorflow-tensorboard             1.5.1

이제 test 삼아 cifar10을 수행해보겠습니다.  아래와 같이 기존에 받아둔 https://github.com/tensorflow/models  속에 든 cifar10을 이용합니다.

[user1@ac922 tensorflow]$ cd ~/models/tutorials/image/cifar10

[user1@ac922 cifar10]$ python cifar10_multi_gpu_train.py --num_gpus=4 --batch_size=1024
...
2018-04-02 16:32:08.080741: step 0, loss = 4.67 (1175.1 examples/sec; 0.871 sec/batch)
2018-04-02 16:32:12.800667: step 10, loss = 4.58 (25133.3 examples/sec; 0.041 sec/batch)
2018-04-02 16:32:14.351431: step 20, loss = 4.40 (27159.8 examples/sec; 0.038 sec/batch)
2018-04-02 16:32:15.920159: step 30, loss = 4.38 (27289.8 examples/sec; 0.038 sec/batch)
...

위와 같이 잘 수행되는 것을 보실 수 있습니다.  TF1.4.1과 (당연하겠으나) 성능면에서는 별 차이가 없는 것으로 보입니다.

아울러 위 과정에서 빌드한 tensorflow 1.5.0 for python3의 wheel 파일을 아래 google drive에 올려두겠습니다.  품질을 책임질 수 있는 파일이 아닌 점은 양해부탁드립니다.

https://drive.google.com/open?id=1KY3tFk3wZW0z3puZtsnBYt9wPZqDPzho

댓글 없음:

댓글 쓰기