본문 바로가기
Autonomous Vehicle/ROS programming

Ubuntu 16.04 에서 Docker 를 사용하여 Cuda 9.0, Cudnn 7.0 으로 환경 설정하고 Tensorflow 1.8 을 Source에서 설치하기

by kim.jeff 2021. 9. 6.

Ubuntu 16.04 에서 Docker 를 사용하여 Cuda 9.0, Cudnn 7.0 으로 환경 설정하고 Tensorflow 1.8 을 Source에서 설치하기 

 

Installing Tensorflow 1.8 from source by setting cuda 9.0 and cudnn 7.0 using Docker in Ubuntu 16.04


요약 

도커세팅 >> ubuntu16.04 cuda 9.0 image pull >> nvidia-docker 설치 >> 그래픽카드 드라이버 설치확인 >> 텐서플로우 버전호환 체크 >> Cudnn 7.0 설치 >> Tensorflow1.8-gpu 소스에서 설치 >> 설치확인 >> ROS설치

1. Docker Setting

  도커는 환경설정을 편리하게 관리하기 위해서 많이 쓰이는 도구이다. 자세한 정보는 도커 홈페이지에서 확인하기 바란다. 본 단락에서는 도커의 설치부터 도커 불러오기 그리고 불러온 이미지를 실행시키는것까지를 목표로 한다.

https://docs.docker.com/engine/install/ubuntu/

 

Install Docker Engine on Ubuntu

 

docs.docker.com

1.1 도커 설치하기

# Installing Docker 
$ sudo apt-get update
$ sudo apt-get install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg \
   lsb-release
    
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ sudo docker run hello-world

1.2 도커 시작 후 우분투 16.04 설치하기

$ sudo service docker start
$ docker pull nvidia/cuda:9.0-devel-ubuntu16.04
$ sudo docker images # pull을 한 후 추가된 이미지를 확인할 수 있을것.
REPOSITORY                                              TAG                              IMAGE ID       CREATED         SIZE
874                                                     latest                           f8acc071683a   2 days ago      23.5GB
tensorflow1.14.0                                        cuda-10.0cudnn7.4anacondapy3.6   874461a8d9e3   5 days ago      2.29GB
369                                                     latest                           937745e8c58d   5 days ago      2.29GB
nvidia/cuda                                             10.0-devel-ubuntu16.04           369515955235   3 weeks ago     2.29GB
nvidia/cuda                                             9.0-devel-ubuntu16.04            6e5221b2f465   2 months ago    1.82GB
meadml/cuda10.0-cudnn7-devel-ubuntu16.04-python3.6      latest                           04aa3c76f9ca   20 months ago   3.34GB
tensorflow/tensorflow                                   1.14.0-gpu-py3                   a7a1861d2150   2 years ago     3.51GB
restrd/tensorflow1.8-cuda9.0-cudnn7-devel-ubuntu16.04   latest                           7ad839790e4a   3 years ago     8.41GB
$ sudo docker run -it 6e5
root@98952d3f9752:/#

아래의 명령어를 통해 이미지로부터 받아온 우분투 버전을 확인해보자.

# cat /etc/issue
Ubuntu 16.04.7 LTS \n \l

Cuda9.0 가 설치되어있는 image 파일을 받아왔기 때문에 cuda가 설치되어있다. 명령어를 통해 확인해보자.

# nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176

 

2.  Nvidia-docker 를 통해 그래픽 드라이버를 도커 컨테이너에 입력하기

기존 환경에서의 그래픽 드라이버가 설치되어있어야 한다. 기존 환경에서 그래픽 드라이버가 설치되어있다고 해서 도커 컨테이너 환경에서도 그래픽 드라이버가 적용된다는 것은 아니다. 그것을 이어주는 툴이 바로 Nvidia-Docker이다.

$ nvidia-smi
Thu Sep  2 15:08:07 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.78       Driver Version: 410.78       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| 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 1060    Off  | 00000000:01:00.0  On |                  N/A |
| N/A   52C    P3    17W /  N/A |    382MiB /  6078MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1609      G   /usr/lib/xorg/Xorg                           262MiB |
|    0      3215      G   compiz                                        49MiB |
|    0      4226      G   /usr/lib/firefox/firefox                      19MiB |
|    0     18995      G   ...AAgAAAAAAAAACAAAAAAAAAA= --shared-files    48MiB |
+-----------------------------------------------------------------------------+

호환이 되는지를 확인할 필요가 있다. 

현재 필요로 하는 Cuda 버전은 9.0 이다. 384.81 과 차이가 많지 않은 410.48을 사용하고 있는데, 인덱스 상에선 일정 수준 이상의 드라이버를 사용하면 된다고 하니 그대로 사용하고 문제가 생기면 다운그레이드를 해주도록 하자.

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html

 

Release Notes :: CUDA Toolkit Documentation

Beginning in 2022, the NVIDIA Math Libraries official hardware support will follow an N-2 policy, where N is an x100 series GPU.

docs.nvidia.com

https://www.tensorflow.org/install/source?hl=ko 

 

소스에서 빌드  |  TensorFlow

Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기 소스에서 빌드 소스에서 TensorFlow pip 패키지를 빌드하고 Ubuntu Linux 및 macOS에 설치합니다. 명령어는

www.tensorflow.org

본 포스트에서는 텐서플로우를 소스에서 빌드할 것이기 때문에 Bazel, Python, Cudnn, Cuda의 버전에도 신경을 써주어야 한다. 도커에서 이미지를 pull 할 때 cudnn의 버전이 7.0 인 것이 없었기 때문에 cudnn은 따로 설치하는 방향으로 진행할 것이다.

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker

 

Installation Guide — NVIDIA Cloud Native Technologies documentation

On RHEL 7, install the nvidia-container-toolkit package (and dependencies) after updating the package listing: Restart the Docker daemon to complete the installation after setting the default runtime: Note Depending on how your RHEL 7 system is configured

docs.nvidia.com

3. CuDNN 7.0 설치하기

http://ejklike.github.io/2017/03/06/install-tensorflow1.0-on-ubuntu16.04-2.html

 

Eunji Kim @ CAU - 우분투 16.04에 텐서플로 1.0 설치하기 (2) Anaconda, Bazel 설치

이전 포스트에서 Nvidia 관련 소프트웨어 설치까지 끝마쳤다. 이제 파이썬 3를 위한 Anaconda를 설치하고, tensorflow를 위한 Bazel을 설치하자. 1. Anaconda Python 3.6 설치 공식 다운로드 페이지에서 파이썬 3

ejklike.github.io

먼저 김 은지 님의 블로그에서 큰 도움을 받았다. 자세한 설명을 위해서는 본 글을 참고하기 바란다.

Cudnn v7.0을 설치해보자. CuDNN의 경우 파일을 다운로드하기 위해서는 Nvidia 회원가입이 필요하다.

https://developer.nvidia.com/rdp/cudnn-archive   

wget을 통해서 컨테이너의 폴더 안에 다운로드하여주자. 다운로드한 파일의 이름은 원본과 약간의 차이를 보인다. (크롬으로 다운로드를 진행하다 정지한 후 링크를 복사해서 wget으로 다운로드하면 이런 현상을 보임) 터미널 mv명령어로 이름을 바꿔준 후 압축을 푼 뒤 직접 Cuda 경로에 넣어주면 된다.

# mv cudnn-9.0-linux-x64-v7.tgz\?Uz9lsrUIiIQRpm-cgBA95QNfiGqgV7CFh5Tu0f9AyOE8SgnWVzpdjLMabaNu721ykauPCVtlBnifpCjrAqw9uk64cy39mSGj7ekSUt2sLt0SCSRw8ROy4rQWvM9-w-arBkIzYeAgY9btuNOuS085RBitazJr3hZD6iyHnUg89BevKpe6gnZxWhEcO8fBja38WZsnkAWNliQ  /home/Downloads/cudnn-9.0-lunux-x64-v7.tgz
# ls
Anaconda3-4.3.0-Linux-x86_64.sh  cudnn-9.0-lunux-x64-v7.tgz
# tar xzvf cudnn-9.0-lunux-x64-v7.tgz 
cuda/include/cudnn.h
cuda/NVIDIA_SLA_cuDNN_Support.txt
...
# which nvcc
/usr/local/cuda/bin/nvcc
*여기에서 나온 주소로 변경하여 밑의 명령어를 통해 복사 붙혀넣기 및 권한 설정을 해주어야 함.
# sudo cp cuda/lib64/* /usr/local/cuda/lib64/
# sudo cp cuda/include/* /usr/local/cuda/include/
# sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
# sudo chmod a+r /usr/local/cuda/include/cudnn.h

설치 확인 명령어는 다음과 같다.

# cat /usr/local/cuda/include/cudnn.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

 

마지막으로 NVIDIA CUDA Profiler Tools Interface를 설치한다.

# sudo apt-get install libcupti-dev

# apt update && apt install -y lsb-core

추가) ros 설치를 먼저 하길 권장

http://wiki.ros.org/kinetic/Installation/Ubuntu

 

kinetic/Installation/Ubuntu - ROS Wiki

We are building Debian packages for several Ubuntu platforms, listed below. These packages are more efficient than source-based builds and are our preferred installation method for Ubuntu. Note that there are also packages available from Ubuntu upstream. P

wiki.ros.org

4.  Anaconda, Bazel을 이용한 텐서플로 설치 준비

4.1 Anaconda 3.6 설치하기

먼저 Anaconda 아카이브에서 필요한 파일을 다운로드한다.

https://repo.anaconda.com/archive/

 

Index of /

 

repo.anaconda.com

마지막에 .bashrc 에 환경설정을 추가할지 물어보는데 yes 해줘야 설치가 된다.

# apt install wget
# wget https://repo.anaconda.com/archive/Anaconda3-4.3.0-Linux-x86_64.sh
# bash Anaconda3-4.3.0-Linux-x86_64.sh

# source ~/.bashrc
# python
Python 3.6.0 |Anaconda 4.3.0 (64-bit)| (default, Dec 23 2016, 12:22:00) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

파이썬 설치를 완료했음을 확인할 수 있다.

4.2 Bazel 설치하기

https://docs.bazel.build/versions/4.2.1/install.html

 

Installing Bazel - Bazel 4.2.1

Installing Bazel The Bazel team officially supports Bazel on these platforms: Bazel community members maintain these packages. The Bazel team doesn’t officially support them. Contact the package maintainers for support. For other platforms, you can try t

docs.bazel.build

바젤 공식 설치 문서를 참고하여 설치를 진행하도록 한다.

텐서플로우 1.8의 경우 Bazel 0.10.0의 버전을 필요로 한다. 때문에 아카이브에서 그 파일을 찾는다.

https://github.com/bazelbuild/bazel/releases/tag/0.10.0

 

Release 0.10.0 · bazelbuild/bazel

Release 0.10.0 (2018-02-01) Baseline: 22c2f9a Cherry picks: f6ca788: isable_presubmit 65c13dd: Fix StreamResourceLeak error e543674: windows: fix --symlink_prefix=/ throwing exception 22ccdd1: Fix...

github.com

공식 설치 페이지에서 제시되어 있는 대로 설치를 진행해준다.

# sudo apt install g++ unzip zip
# sudo apt-get install openjdk-8-jdk

# wget https://github.com/bazelbuild/bazel/releases/download/0.10.0/bazel-0.10.0-without-jdk-installer-linux-x86_64.sh
# chmod +x bazel-0.10.0-without-jdk-installer-linux-x86_64.sh 
# ./bazel-0.10.0-without-jdk-installer-linux-x86_64.sh --user

마찬가지로 ~/.bashrc 에 아래의 구문을 추가해준다.

export PATH="$PATH:$HOME/bin"

아래의 구문을 통해 설치를 마쳐줄 수 있다.

# source ~/.bashrc
# bazel version
Extracting Bazel installation...
Build label: 0.10.0
Build target: bazel-out/k8-fastbuild/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Thu Nov 9 04:43:10 +50056 (1517474666590)
Build timestamp: 1517474666590
Build timestamp as int: 1517474666590

5. Tensorflow 1.8 Source에서 빌드하기

# wget https://codeload.github.com/tensorflow/tensorflow/zip/refs/tags/v1.8.0-rc1
# mv v1.8.0-rc1 v1.8.0-rc1.zip
# unzip v1.8.0-rc1.zip
# cd tensorflow-1.8.0-rc1/
# ./configure

 

# ./configure
You have bazel 0.10.0 installed.
Please specify the location of python. [Default is /root/anaconda3/bin/python]: 


Found possible Python library paths:
  /root/anaconda3/lib/python3.6/site-packages
Please input the desired Python library path to use.  Default is [/root/anaconda3/lib/python3.6/site-packages]

Do you wish to build TensorFlow with jemalloc as malloc support? [Y/n]: Y
jemalloc as malloc support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Google Cloud Platform support? [Y/n]: N
No Google Cloud Platform support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Hadoop File System support? [Y/n]: N
No Hadoop File System support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Amazon S3 File System support? [Y/n]: N
No Amazon S3 File System support will be enabled for TensorFlow.

Do you wish to build TensorFlow with Apache Kafka Platform support? [Y/n]: N
No Apache Kafka Platform support will be enabled for TensorFlow.

Do you wish to build TensorFlow with XLA JIT support? [y/N]: N
No XLA JIT support will be enabled for TensorFlow.

Do you wish to build TensorFlow with GDR support? [y/N]: N
No GDR support will be enabled for TensorFlow.

Do you wish to build TensorFlow with VERBS support? [y/N]: N
No VERBS support will be enabled for TensorFlow.

Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: N
No OpenCL SYCL 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]: 


Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 7.0]: 


Please specify the location where cuDNN 7 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:


Do you wish to build TensorFlow with TensorRT support? [y/N]: N
No TensorRT support will be enabled for TensorFlow.

Please specify the NCCL version you want to use. [Leave empty to default to NCCL 1.3]: 


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: 3.5,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]:

이와 같이 탠서 플로 1.8 소스에서 설치하는 것을 정리할 수 있었다. 이왕이면 pip설치를 권하고 싶다. 시간을 너무 많이 버렸다. 원하는 버전이 확고하지 않은 분들은 설치되어있는 이미지를 pull 받을 수 있기 때문에 잘 이용하여 환경설정에 많은 시간을 쏟지 않길 바라며...

컨테이너는 끄면 저장되지 않기 때문에 commit 명령어를 통해서 저장해줘야 함을 잊지 말도록 하자.

https://eungbean.github.io/2018/12/03/til-docker-commit/

 

 

 

사용중인 docker 컨테이너를 그대로 저장하기 (commit)

docker image commit & Push Docker를 사용하다 보면, 어쩔 수 없이 현재 컨테이너를 종료하고 새롭게 컨테이너를 띄워야 하는 경우가 생깁니다. 예를 들어 새로운 port를 열어준다던가, 폴더를 바인딩하는

eungbean.github.io


추가) Tilix 설치

sudo add-apt-repository ppa:webupd8team/terminix

sudo apt update

sudo apt install tilix

<참고문헌>

1. Installation Guide of Nvidia-Docker
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker
2. nvidia-docker GPU 할당하여 사용하는 방법 3가지
https://kyumdoctor.co.kr/18
3. Release 1.8.0 of Tensorflow
https://github.com/tensorflow/tensorflow/releases/tag/v1.8.0-rc1
4. Install CUDA 10.0 and cuDNN v7.4.2 on Ubuntu 16.04
https://gist.github.com/matheustguimaraes/43e0b65aa534db4df2918f835b9b361d
5. Segmap
https://github.com/ethz-asl/segmap
6. Anaconda archive
https://repo.anaconda.com/archive/
7. Tensorflow Installation Guide from EunJi Kim
http://ejklike.github.io/2017/03/06/install-tensorflow1.0-on-ubuntu16.04-2.html
8. Docker - commit
https://eungbean.github.io/2018/12/03/til-docker-commit/
9. Compatibility of gpu and cuda
https://kyumdoctor.tistory.com/68
10. Trouble shooting for the ROS Installation (lsb_release: command
not found in latest Ubuntu Docker container)
https://stackoverflow.com/questions/58395566/lsb-release-command-not-found-in-latest-ubuntu-docker-container
11. Check version of cuda and cudnn
https://medium.com/@changrongko/nv-how-to-check-cuda-and-cudnn-version-e05aa21daf6c
12. Bazel build 0.24.1
https://github.com/bazelbuild/bazel/releases/tag/0.24.1
13. Bazel Installation Guide (official)
https://docs.bazel.build/versions/4.2.0/install-ubuntu.html
14. Cudnn archive
https://developer.nvidia.com/rdp/cudnn-archive

https://hub.docker.com/r/nvidia/cuda/tags?page=1&ordering=last_updated&name=10.0

https://docs.bazel.build/versions/main/install-ubuntu.html

https://www.tensorflow.org/install/source#linux

https://medium.com/@dun.chwong/the-simple-guide-deep-learning-with-rtx-3090-cuda-cudnn-tensorflow-keras-pytorch-e88a2a8249bc

http://ejklike.github.io/2017/03/06/install-tensorflow1.0-on-ubuntu16.04-3.html