2021년 7월 13일 화요일

Ubuntu 20.04, DOCKER, CUDA 11.0 기반 NVIDIA-DOCKER, 텐서플로우, 파이토치 설치 및 사용기

이 글은 우분투 20.04, 도커, CUDA 11.0 기반 NVIDIA-DOCKER, Tensorflow, Pytorch 설치 및 사용 방법을 간단히 설명한다. NVIDIA-DOCKER를 이용하면, 딥러닝 프레임웍 설치 시 많은 문제를 일으키는 패키지 의존 에러 없이, 미리 설치된 딥러닝 관련 패키지를 이용해 편리하게 딥러닝 모델을 개발할 수 있다. 또한, 아마존, 구글 같이 비싼 기계학습 딥러닝용 클라우드를 사용하지 않고도, 직접 여러사람이 네트워크로 접속할 수 있는 서버를 개발할 수 있다.

NVIDIA DOCKER 아키텍처 구조

여기서는 엔비디아 CUDA및 도커는 알고 있다는 전제하에 진행한다. 관련 내용은 다음 링크를 참고한다.

NVIDIA-DOCKER 설치

설치는 다음 링크를 참고한다.

다 설치한 후 다음 명령을 입력해 정상 출력되면 성공한 것이다.
sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

NVIDIA 도커 이용하기
다음과 같이 NVIDIA 이미지 내 명령을 실행한다.
sudo nvidia-docker run --rm hello-world

apt-cache madison nvidia-docker2 nvidia-container-runtime

sudo docker run -it nvidia/cuda:11.0-base

도커 텐서플로우 설치 및 실행
이제 다음 명령으로 도커 텐서플로우 이미지를 설치하고, 실행한다. 
sudo docker run -it --rm --gpus all tensorflow/tensorflow:latest-gpu python -c "import tensorflow as tf; tf.config.list_physical_devices('GPU')"

텐서플로우 이미지 내 우분투를 실행해 본다. 
sudo docker run -it tensorflow/tensorflow:latest-gpu
exit

텐서플로우 소스코드 예제를 다음과 같이 실행해 본다. 화면처럼 출력되면 성공한 것이다.
cd ~
git clone https://github.com/tensorflow/benchmarks
sudo docker run --gpus all -it --rm -v /home/ktw/benchmarks:/benchmarks tensorflow/tensorflow:latest-gpu python benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --num_gpus=1 --model resnet50 --batch_size 64

파치토치 도커 이미지 설치 및 실행
다음과 같이 파이토치 도커 이미지를 설치하고, 실행한다. 참고로, NVIDIA DRIVER가 서로 호환되지 않은 도커 이미지라면 드라이버 호환 에러가 발생한다. 이 경우, 여기 링크에 드라이버 버전을 확인하고, 해당 도커를 설치해 실행하기를 바란다.
sudo docker pull nvcr.io/nvidia/pytorch:21.02-py3
sudo docker run --gpus all -it -p 8888:8888 nvcr.io/nvidia/pytorch:21.02-py3

아래와 같이 파이썬 코드를 입력해 실행해 본다.
python
import torch
print(torch.cuda.device_count())
print(torch.cuda.current_device())
print(torch.cuda.get_device_name(torch.cuda.current_device()))
exit()

쥬피터 노트북 실행
다음과 같이 쥬피터 노트북을 도커에서 실행해 본다.
jupyter notebook

크롬을 실행하고, http://localhost:8888/ 주소를 입력한다.

노트북에 파이썬 모듈을 하나 생성하고 다음 코드를 입력해 실행한다.
Input the below code
import torch import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super(Net, self).__init__() # 1 input image channel, 6 output channels, 3x3 square convolution # kernel self.conv1 = nn.Conv2d(1, 6, 3) self.conv2 = nn.Conv2d(6, 16, 3) # an affine operation: y = Wx + b self.fc1 = nn.Linear(16 * 6 * 6, 120) # 6*6 from image dimension self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): # Max pooling over a (2, 2) window x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) # If the size is a square you can only specify a single number x = F.max_pool2d(F.relu(self.conv2(x)), 2) x = x.view(-1, self.num_flat_features(x)) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x def num_flat_features(self, x): size = x.size()[1:] # all dimensions except the batch dimension num_features = 1 for s in size: num_features *= s return num_features net = Net() print(net)

아래와 같이 출력되면 딥러닝 모델이 정상 실행된 것이다.

이제, 복잡한 딥러닝 패키지를 설치하고 설정할 필요없어, 도커 기반으로 딥러닝 모델을 손쉽게 개발할 수 있다.

참고

댓글 없음:

댓글 쓰기