Ubuntu 18.04 LTS에 Singularity를 설치한 후, NGC 컨테이너의 Tensorflow를 사용해 보는 것 까지의 일련의 과정을 설명하기 위한 포스팅이다. 나는 AWS상의 Ubuntu 18.04 인스턴스(인스턴스 타입은 g4dn.xlarge)를 생성하여 환경을 구축했다.
1. 준비
아래의 커맨드로 OS를 최신 상태로 업데이트한다.
$ sudo apt update
$ sudo apt upgrade -y
2. NVIDIA DRIVER 설치
NVIDIA Driver을 설치하는 방법은 여러 가지가 있지만, 여기서는 CUDA의 CUDA Driver만을 설치하는 방법을 사용할 것이다. 먼저 "CUDA Toolkit Archive" 사이트에 접속한다. 이 사이트에서 설치를 원하는 버전을 선택한다. 나는 CUDA Toolkit 11.0을 선택하였다.
그 다음 OS 환경 및 Version 등을 선택한 후 마지막의 Installer Type으로 "deb(network)"를 선택한다.
화면 아래의 표시된 커맨드를 실행시킨다.
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
$ sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
$ sudo apt-get update
$ sudo apt-get -y install cuda
참고로 선택한 버전이 아닌 최신 버전이 설치되는 경우가 있다. 그럴 경우 마지막 sudo apt-get -y install cuda부분에 버전을 지정해주는 것이 좋다. 예를 들어 11.0. 버전을 다운로드하고 싶은 경우 sudo apt-get -y install cuda-11-0 과 같이 수정한 후 커맨드를 실행시킨다.
위 커맨드의 설치가 끝나면, 앞서 말했듯 CUDA전체가 아닌 드라이버만 설치할 것이므로, 아래의 커맨드를 실행시킨다.
$ sudo apt install cuda-drivers
nvidia-smi를 실행하여 GPU가 인식되는지 확인한다.
$ nvidia-smi
아래는 예시인데 아래와 같이 CUDA Version과 GPU등의 표가 표시되면 인식되고 있는 것이다.
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06 Driver Version: 450.51.06 CUDA Version: 11.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce GTX 1070 On | 00000000:01:00.0 On | N/A |
| N/A 52C P8 10W / N/A | 186MiB / 8117MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
3. go언어의 설치
tmp 파일에 go 언어 압축파일을 다운로드 받아, /usr/local 아래에 압축을 푸는 형식으로 설치한다. 위의 버전 부분 빼고는 그대로 실행시켜도 정상 동작된다.
$ export VERSION=1.13.5 OS=linux ARCH=amd64 # Version 부분은 본인이 필요한 버전을 지정하면 된다.
$ wget -O /tmp/go${VERSION}.${OS}-${ARCH}.tar.gz https://dl.google.com/go/go${VERSION}.${OS}-${ARCH}.tar.gz && \
sudo tar -C /usr/local -xzf /tmp/go${VERSION}.${OS}-${ARCH}.tar.gz
ls 커맨드로 /usr/local 아래에 go가 설치되어 있는지 확인할 수 있다. 목록에 go가 있으면, 문제 없이 설치된 것이다.
ls /usr/local
다음으로 go 언어가 설치된 경로를 인식시키기 위한 환경 변수를 설정한다.
$ echo 'export GOPATH=${HOME}/go' >> ~/.bashrc && \
echo 'export PATH=/usr/local/go/bin:${PATH}:${GOPATH}/bin' >> ~/.bashrc && \
source ~/.bashrc
$ echo 'export PATH=/usr/local/go/bin:$PATH' >> ~/.bashrc && \
source ~/.bashrc
변경을 유효화가기 위해 source 커맨드로 /ect/profile을 읽어들인다.
$ source /etc/profile
echo 커맨드로 환경변수에 제대로 패스가 추가되었는지 확인하자.
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin
PATH에 /usr/local/go/bin가 추가되어 있으면 OK이다. 참고로 go version 커맨드로 지정한 go 버전이 설치되었는지 확인할 수 있다.
$ go version
4. Singularity 설치
먼저 필요한 라이브러리들을 설치한다.
$ sudo apt-get update && sudo apt-get install -y \
build-essential \
libssl-dev \
uuid-dev \
libgpgme11-dev \
squashfs-tools \
libseccomp-dev \
wget \
pkg-config \
git
설치를 원하는 폴더가 있다면 그 폴더로 이동하여 git clone 커맨드로 설치한다. 나는 Downloads 파일을 만들어뒀고 그 곳에 singularity를 설치했다.
$ cd Downloads/ #cd커맨드로 설치를 원하는 폴더로 이동
$ git clone https://github.com/sylabs/singularity.git && \
cd singularity && \
git checkout v3.6.0
설치가 완료되면 자동으로 /singularity폴더로 이동된 상태가 된다. 여기서 ./mconfig 를 실행시킨다.
$ ./mconfig
실행 중 unable to find the cryptsetup program, is the package cryptsetup-bin installed? 과 같이 특정 라이브러리가 존재하지 않는다고 안내문이 표시되기도 하는데, 그럼 sudo apt install 커맨드로 설치하면 된다.
$ sudo apt install cryptsetup
다시 ./mconfig 를 실행시킨다.
$ ./mconfig
$ ./mconfig 가 정상적으로 종료되면 아래의 커맨드를 실행시켜 builddir를 설치한다.
$ make -C builddir && \
sudo make -C builddir install
singurarity가 정상적으로 설치됐다면, singularity version 으로 버전을 확인했을 때 설치한 singularity 버전이 표시된다.
$ singularity version
3.6.0
5. NGC 컨테이너의 TensorFlow를 Singularity로 pull하기
NGC 컨테이너의 정보는 아래의 사이트에서 확인할 수 있다.
https://ngc.nvidia.com/catalog/containers/nvidia:tensorflow
아래의 커맨드로 nvcr.io/nvidia/tensorflow:20.03-tf2-py3 컨테이너를 pull한다. 참고로 현재있는 폴더 위치가 singularity여야 singularity 커맨드를 사용할 수 있는듯하다.
$ singularity pull docker://nvcr.io/nvidia/tensorflow:20.07-tf2-py3
pull이 완료되면 ls로 확인할 수 있다.
$ ls
tensorflow_20.07-tf2-py3.sif
6. pull한 NGC 컨테이너를 singularity에서 실행시키기
아래의 커맨드를 실행하면 Tensorflow를 실행할 수 있게 된다. 여기서 벗어나고 싶으면 exit()를 입력한 후 엔터를 치면된다.
$ singularity exec --nv tensorflow_20.07-tf2-py3.sif python
Usage example: change_mofed_version.sh 4.5-1.0.1
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import absolute_import, division, print_function, unicode_literals
>>>
tensorflow가 제대로 움직이는지 tensorflow 예제 코드로 확인해보자. tensorflow 공식 사이트의 mnist 예제인데, 이 코드를 실행시켜보고 문제 없이 결과가 출력되면 완료이다.
>>> import tensorflow as tf
>>> mnist = tf.keras.datasets.mnist
>>> (x_train, y_train), (x_test, y_test) = mnist.load_data()
>>> x_train, x_test = x_train / 255.0, x_test / 255.0
>>> model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
>>> model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
>>> model.fit(x_train, y_train, epochs=5)
>>> model.evaluate(x_test, y_test, verbose=2)
참고자료
'IT > 기초 지식' 카테고리의 다른 글
[Linux] 쉘 스크립트(Shell script) 기초 (4) | 2021.06.15 |
---|---|
[Linux] vi 기초 사용법 (0) | 2021.06.10 |
[Singularity] Singularity란? (0) | 2021.05.21 |
[Docker] Docker 이미지 튜토리얼 (0) | 2021.05.10 |
[Docker] Docker 기초(3) (0) | 2021.05.07 |