IT/기초 지식

[Singularity] Ubuntu 18.04에 Singularity 설치해 NGC 컨테이너 사용하기

개발자 두더지 2021. 6. 10. 00:45
728x90

 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)

참고자료

https://qiita.com/fleming_tone/items/fc03570ac5b8de1cf027

https://server-gear.com/shop/index.php/blog/singularity/

728x90

'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