TensorFlow를 설치하는 방법은 여기저기 나와있지만 환경이 조금씩 다르고 심지어 홈페이지에서 추천하는 방식도 정작 파이썬에서 import 해보면 이상한 오류를 내보내고 해서 소스코드로부터 직접 빌드하는 방법을 찾아보았다.

일단 텐서플로 홈페이지를 참조한다.


여기서는 이전에 올린 글에서와 같은 GTX980m 그래픽 카드가 설치된 머신에 Ubuntu 16.04 운영체제 환경에서 진행하였다.

GPU관련 Cuda toolkit, CUDNN설치는 위 문서를 참조하기 바람.


1. 사전 준비 작업


1.1 PIP 설치

파이썬 2.7 기준으로 numpy, pip, wheel을 설치한다.

$ sudo apt-get install python-numpy python-dev python-pip python-wheel

Pip가 설치되어 있으면 다음을 설치한다.

$ sudo pip install six numpy wheel 


1.2. Bazel 설치하기


텐서플로는 Bazel이라는 빌드 환경에서 설치되므로 Bazel을 필수적으로 설치해야한다.

자세한 설치 방법은 해당문서를 참조하기 바란다. 아래는 요약한 내용이다.

JDK 8 설치하기


sudo apt-get install openjdk-8-jdk

 Bazel 배포 URI를 패키지 소스에 추가하기.


echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -

apt-get 명령어를 사용하여 bazel 설치하기


sudo apt-get update && sudo apt-get install bazel

업그레이드 진행


sudo apt-get upgrade bazel


1.3 CUDA 관련 설정 확인 (GPU 없으면 Skip)


CUDA 코딩을 지원하는 nVidia 그래픽 카드가 장착되어있는 경우 연산 속도를 크게 높일 수 있다. 텐서플로우를 설치하기 전에 현재 설치되어 있는 모듈들의 버전, 위치를 확인해야 한다.


먼저 설치된 그래픽 카드는 nvidia-smi로 확인할 수 있다.

$ nvidia-smi Fri Apr 13 08:47:26 2018 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 384.130 Driver Version: 384.130 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 GeForce GTX 980M Off | 00000000:01:00.0 Off | N/A | | N/A 46C P0 25W / N/A | 419MiB / 4040MiB | 3% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 1146 G /usr/lib/xorg/Xorg 187MiB | | 0 2119 G compiz 135MiB | | 0 2763 G ...-token=7127A03DF0128C3A7BB88237BFA5FB44 94MiB | +-----------------------------------------------------------------------------+

설치되어있는 CUDA 버전 확인 (2018.4.13현재 최신 버전은 9.0)

$ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2017 NVIDIA Corporation Built on Sun_Nov_19_03:10:15_CST_2017 Cuda compilation tools, release 9.0, V9.0.252

NVCC가 설치된 위치 확인 -- 여기에서 cuda가 설치된 장소가 /usr/local/cuda-9.0 임을 확인할 수 있다.

$ which nvcc /usr/local/cuda-9.0/bin/nvcc


설치된 CUDNN의 버전 확인 (2018.4.13 현재 최신 버전은 7.0). 참고로 cudnn 은 /usr/include/x86_64-linux-gnu 에 존재한다.(마지막 부분은 시스템 환경에 따라 달라질 수 있음)

$ cat /usr/include/x86_64-linux-gnu/cudnn_v*.h | grep CUDNN_MAJOR -A 2 #define CUDNN_MAJOR 7 #define CUDNN_MINOR 0 #define CUDNN_PATCHLEVEL 5 -- #define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL) #include <driver_types.h>


TensorRT는 nVidia 에서 딥러닝 연산 속도를 높이고 네트웍에서 최적화하기 위해 제공하는 SDK이다. 2018.4.13현재 최신 버전은 4.0 이다.

자세한 설치 방법은 아래 링크를 참조.

http://docs.nvidia.com/deeplearning/sdk/tensorrt-install-guide/index.html

$ pip show tensorrt Name: tensorrt Version: 4.0.0.3 Summary: Python API for TensorRT, a high-performance deep learning inference optimizer and runtime for deep learning applications. Home-page: https://developer.nvidia.com/tensorrt Author: NVIDIA Corporation Author-email: kismats@nvidia.com License: NVIDIA Software License Location: /usr/local/lib/python2.7/dist-packages Requires: argparse, enum34, protobuf, pycuda, Flask, future, pillow, numpy

문제는 텐서플로우를 설치할때 tensorrt 관련 항목을 물어보는데 아직 버전의 차이 혹은 설치 방법의 차이로 인해 빌드가 성공하지 못하는 현상이 발견되었다. 아직까지 해결책을 찾지 못했기때문에 여기에서는 적용하지 않는다.

아래 문서를 보면 몇가지 known issue 에 대해 설명하고 있다.

http://docs.nvidia.com/deeplearning/sdk/tensorrt-release-notes/rel_4.html#rel_4


2. TensorFlow 설치하기


홈 폴더에서 Tensorflow 가져오기

$ git clone https://github.com/tensorflow/tensorflow 


다운로드한 위치로 이동하여 최신 버전(2018.4.13현재 1.7)으로 checkout 후 configure 를 실행한다.

$ cd tensorflow
$ git checkout r1.7
./configure

여러가지를 물어보는데 대부분 기본 설정으로 진행하는데 CUDA와 CUDNN을 설정하는 부분에서 막히게 된다. 빨간색으로 된 부분을 참조

Please specify the location of python. [Default is /usr/bin/python]: /usr/bin/python2.7 Found possible Python library paths: /usr/local/lib/python2.7/dist-packages /usr/lib/python2.7/dist-packages Please input the desired Python library path to use. Default is [/usr/lib/python2.7/dist-packages] Using python library path: /usr/local/lib/python2.7/dist-packages Do you wish to build TensorFlow with MKL support? [y/N] No MKL support will be enabled for TensorFlow Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: Do you wish to use jemalloc as the malloc implementation? [Y/n] y jemalloc enabled Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] No Google Cloud Platform support will be enabled for TensorFlow Do you wish to build TensorFlow with Hadoop File System support? [y/N] No Hadoop File System support will be enabled for TensorFlow Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N] No XLA support will be enabled for TensorFlow Do you wish to build TensorFlow with VERBS support? [y/N] No VERBS support will be enabled for TensorFlow Do you wish to build TensorFlow with OpenCL support? [y/N] No OpenCL support will be enabled for TensorFlow Do you wish to build TensorFlow with CUDA support? [y/N] Y CUDA support will be enabled for TensorFlow Please specify the CUDA SDK version you want to use, e.g. 7.0. [Leave empty to default to CUDA 9.0]: Please specify the location where CUDA 9.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: /usr/local/cuda-9.0 Please specify the location where CUDA 8.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 6.0]: 7.0.5 Please specify the location where cuDNN 7 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:

/usr/lib/x86_64-linux-gnu/ Do you wish to build TensorFlow with TensorRT support? [y/N]: n No TensorRT support will be enabled for TensorFlow. Please specify a list of comma-separated Cuda compute capabilities you want to build with. You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus. Please note that each additional compute capability significantly increases your build time and binary size. [Default is: "5.2"]: 5.2 Do you want to use clang as CUDA compiler? [y/N]: n nvcc will be used as CUDA compiler. Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]: Do you wish to build TensorFlow with MPI support? [y/N] n No MPI support will be enabled for TensorFlow. Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]: Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]:n Configuration finished

모든 설정이 끝나면 빌드를 하는데 GPU를 사용하므로 아래와 같이 실행한다. (GPU를 사용하지 않으면 --config=cuda 부분을 삭제한다.)

$ bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package


이제 bazel build 명령어를 사용하여 wheel package를 만든다.

$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

만들어진 패키지를 pip 명령어를 사용하여 설치한다.

$ sudo pip install /tmp/tensorflow_pkg/tensorflow-1.5.0rc1-cp27-cp27mu-linux_x86_64.whl

3. 설치 확인하기


이제 tensorflow 폴더에서 나온다음 아무 디렉토리로 이동하여 다음을 수행한다.


$ python

Python 2.7.12 (default, Dec 4 2017, 14:50:18) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow as tf >>> hello = tf.constant('Hello, TensorFlow!') >>> sess = tf.Session() 2018-01-30 12:57:13.316004: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:898] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2018-01-30 12:57:13.316264: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1206] Found device 0 with properties: name: GeForce GTX 980M major: 5 minor: 2 memoryClockRate(GHz): 1.1265 pciBusID: 0000:01:00.0 totalMemory: 3.95GiB freeMemory: 3.33GiB 2018-01-30 12:57:13.316281: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1306] Adding visible gpu devices: 0 2018-01-30 12:57:13.506250: I tensorflow/core/common_runtime/gpu/gpu_device.cc:987] Creating TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 3054 MB memory) -> physical GPU (device: 0, name: GeForce GTX 980M, pci bus id: 0000:01:00.0, compute capability: 5.2) >>> print(sess.run(hello)) Hello, TensorFlow! >>>


여기까지 아무 에러메세지 없이 진행되면 성공이다!


4. 문제 해결


간혹 빌드 과정에서 FAIL이 발생하는 경우가 있다. 

본인의 경우에는 빌드가 정상적으로 진행됬음에도 불구하고 python에서 tensorflow를 임포트 하는 과정에서 error __init__() got an unexpected keyword argument 'syntax' 라는 오류가 발생하였다. 구글 검색 결과 해당 문제는 구글에서 플랫폼간의 이식성을 돕기 위해 제공하는 프로토콜인 protobuf 의 버전이 맞지 않아서 발생하는 오류인듯 하다.

protobuf 의 버전이 3.0 이하인 경우 문제가 발생하는 것으로 보인다. 현재 설치된 protobuf 의 버전은 다음과 같이 확인할 수 있다.

$ pip show protobuf Name: protobuf Version: 3.5.2.post1 Summary: Protocol Buffers Home-page: https://developers.google.com/protocol-buffers/ Author: protobuf@googlegroups.com Author-email: protobuf@googlegroups.com License: 3-Clause BSD License Location: /usr/local/lib/python2.7/dist-packages Requires: setuptools, six

만약 현재 버전이 위와 다르다면 기존에 설치된 protobuf 를 제거하고 다시 설치하는것이 좋다.

$ sudo pip uninstall protobuf


2018/1/30 최초문서 발행.

2018/4/13 버전 업데이트 --> 1.7


+ Recent posts