NVIDIA GPU Cloud를 통한 딥러닝(Deep Learning) Docker를 이용한 Caffe2 트레이닝(Training) 먼저 딥러닝이 무엇인지 그 개념조차 생소하신 분들도 계실 텐데요. 관련 내용은 과거 퀘이사존에서 진행한 NVIDIA TITAN X (Pascal) 벤치마크의 별도 페이지에서 다룬 바 있습니다. 궁금하신 분은 아래 링크를 참고해주시기 바랍니다. ※ 참고: 딥러닝(Deep Learning)이란?: https://goo.gl/pFYixt ▲ 엔비디아 공식 유튜브 채널에 등록된 딥러닝 소개 영상 본 페이지에서는 NVIDIA GPU Cloud Docker 컨테이너(Container)를 사용하여 우분투(Ubuntu) 16.04 LTS 운영체제에 Caffe2를 설치하고, 또 어떻게 딥러닝 벤치마크를 설정하는지를 일종의 가이드 형태로 설명해보도록 하겠습니다. Caffe2 Caffe2는 Facebook Research에서 개발한 오픈소스 딥러닝(Deep Learning) 프레임워크(framework)로 Convolutional Network와 Recurrent Network를 모두 지원합니다. ImageNet의 데이터세트로 트레이닝(Training)을 수행하며, 여기서는 ResNet-50을 예로 들어 설명하겠습니다. 테스트를 위해 엔비디아에서 가이드로 제시한 추천 시스템 요구 사양은 아래와 같습니다.
CPU와 메모리 그리고 SSD 등의 요소에서 상당한 고사양을 요구함을 알 수 있는데요. 중요한 지점은 리눅스 커널 기반의 OS, 우분투 데스크톱(Ubuntu Desktop) 16.04 LTS 버전을 요구한다는 것입니다. 또한, SSD의 경우 1 테라(TB) 급의 용량이 요구되는데요. 이것은 트레이닝을 위해 ImageNet에서 다운로드해야 하는 이미지가 방대한 용량을 자랑하는 까닭입니다.
우분투의 다운로드 및 설치는 아래 링크를 참고해주시기 바랍니다. ※ 우분투 설치 튜토리얼: https://goo.gl/mgYbk6 NVIDIA 드라이버 설치 우분투를 설치하고 가장 먼저 해야 할 작업은 바로 NVIDIA 드라이버를 설치하는 것입니다. Ctrl+Alt+F1 키로 콘솔을 열어 아래와 같은 순서로 명령어를 입력해줍시다. sudo service lightdm stop sudo apt purge nvidia-* sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update sudo apt install nvidia-xxx sudo service lightdm start 현시점에서 최신 버전은 387 버전으로 위 명령어의 nvidia-xxx를 nvidia-387로 입력하시면 됩니다. 여기까지 드라이버 설치 과정이었고요. 이상이 없으면, Ctrl+Alt+F7을 눌러 다시 데스크톱 환경으로 돌아오도록 합시다. Docker 설치 Docker는 리눅스용 오픈소스 컨테이너 플랫폼입니다. Docker 컨테이너는 리눅스 응용 프로그램을 모든 라이브러리, 데이터 파일과 환경 설정을 패키지로 묶어 동일한 실행 환경이 가능하도록 유지하는 메커니즘입니다. Ctrl+Alt+T 키로 터미널을 열어, 아래와 같이 명령어를 입력하면 Docker CE를 설치할 수 있습니다. sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install docker-ce NVIDIA Docker 2.0 설치 다음 순서는 NVIDIA Docker를 설치하는 것입니다. 역시 터미널을 열어 아래와 같이 명령어를 입력해주도록 합시다. curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install nvidia-docker2 sudo pkill -SIGHUP dockerd NVIDIA GPU Cloud 가입 NVIDIA GPU Cloud(이하 NGC)는 딥러닝에 최적화된 GPU 가속 클라우드(Cloud) 플랫폼입니다. NGC는 NVIDIA GPU를 최대한 활용할 수 있도록 딥러닝 프레임워크(framework) 컨테이너를 통합하여 최적화된 설루션을 제공해줍니다.
이러한 프레임워크 컨테이너는 CUDA 런타임, NVIDIA 라이브러리 및 운영체제와 같은 모든 필요한 요소를 포함하여 사용자 입장에서 간편하게 실행될 수 있도록 만들어졌는데요. NGC에 대한 추가 정보는 아래 링크에서 확인하실 수 있습니다. ※ NVIDIA GPU CLOUD DEEP LEARNING FRAMEWORKS(PDF): https://goo.gl/NKopQY NGC에 가입하기 위해서는 https://ngc.nvidia.com로 이동하여 가입을 클릭하고 계정을 생성해야 합니다. 로그인 후 Get API Key 버튼을 클릭하여 키를 생성하시면 됩니다. 해당 키는 Docker에 로그인할 때마다 사용됩니다. Docker 로그인 그 후 아래 명령을 실행하여 Docker에 로그인하고 사용자명은 $oauthtoken을 입력하시면 됩니다. password는 앞서 언급한 생성된 API Key를 입력하시고요. sudo docker login nvcr.io Username: $oauthtoken Password: 생성된 API Key 입력 Caffe2 컨테이너 실행 최신 Caffe2 컨테이너를 가져오기 위해 아래 명령어를 입력해주세요. (xx.xx 변수는 컨테이너 버전으로 입력하시면 됩니다. 예 17.12) sudo docker pull nvcr.io/nvidia/caffe2:xx.xx Caffe2 인터렉티브 인스턴스(Interactive Instance) 실행 sudo docker images sudo nvidia-docker run –it nvcr.io/nvidia/caffe2:xx.xx 여기까지 입력하여 컨테이너의 작업 영역(workspace)을 탐색할 수 있으며, 탐색 후에는 exit를 입력하여 종료할 수 있습니다. 또한, 현재 Docker 컨테이너의 인스턴스 상태를 보려면 아래 명령을 입력합니다.(알파벳순 나열) sudo docker ps -a 실행 중인 컨테이너를 들어내려면 아래와 같이 docker rm 명령어를 사용하면 됩니다.(container_name에는 docker ps -a 명령어를 통해 출력되는 컨테이너 명 입력) sudo docker rm container_name Caffe2 작동 테스트 Caffe2는 workspace/nvidia_examples/imagenet/ 경로의 컨테이너에 Python nv_convnet_benchmarks.py 스크립트를 사용하여 테스트할 수 있습니다. 아래 예시로 명령어를 보여드릴 텐데요. 해당 명령어에 포함된 매개변수를 변경하여 다른 배치 사이즈나 신경망을 테스트할 수 있습니다. sudo nvidia-docker run --rm nvcr.io/nvidia/caffe2:17.12 python nvidia-examples/imagenet/nv_convnet_benchmarks.py --batch_size 16 --model resnet_50 --cudnn_ws 6000 --iterations 50 --batch_size: 배치 사이즈를 조절합니다. --model: 명령어에 적용할 신경망(neural network) 모델을 선택할 수 있습니다. --cudnn_ws: cuDNN(NVIDIA CUDA Deep Neural Network)에 할당할 메모리 양을 조절합니다. --iterations: 신경망 시뮬레이션의 반복 횟수를 조절합니다. 이미지넷(ImageNet) 설정
▲ 분류 작업의 예시 이미지, 출처: http://karpathy.github.io 이미지넷(ImageNet)은 2007년에 등장했으며, 인공지능 기술 발전을 논함에 있어 중대한 역학을 수행한 대규모 이미지 데이터베이스입니다. 데이터베이스를 이루고 있는 이미지들은 시각적 대상 인식 연구에 사용하기 위한 것으로 WordNet 계층 구조로 구성되어 있는 각 노드(node)가 수백 가지의 이미지 예제로 표현됩니다. 1400만 개 이상의 이미지를 가지고 있으며, 본 페이지에서도 이미지넷의 데이터베이스를 활용하여 벤치마크 테스트를 진행합니다. 이미지넷 데이터베이스 얻기 이미지넷은 http://image-net.org/download-images에서 다운로드할 수 있습니다(참고로 계정 생생 시, 학교나 관계 기관의 이메일 계정으로 설정해야 승인이 잘 됩니다)
링크로 이동하면 하단에 'ILSVRC2012 이미지 데이터로 연결되는 링크를 클릭하여 다운로드가 가능합니다.(상단 이미지 참고) 파일 용량이 상당히 크기 때문에 긴 시간이 소요됩니다. 다운로드한 트레이닝 및 검증(Validation) 이미지는 아래 경로로 저장해주세요. ~/Downloads/imagenet12/train/ ~/Downloads/imagenet12/val_unsorted/ 아래 명령어를 사용하여 이미지넷 루트 경로에 추가 데이터를 받을 수 있습니다. cd ~/Downloads/imagenet12/ wget http://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gz tar -xvf caffe_ilsvrc12.tar.gz 이미지넷을 LMDB 형식으로 저장 Caffe2 프레임워크에서 트레이닝을 수행하기 위해서는 이미지넷의 이미지를 LMDB 형식으로 저장해야 합니다. 또한, 이것을 Caffe2에 포함된 make_image_db로 작업 수행이 가능한데요. 해당 작업을 수행하기 위해서는 먼저 이미지넷 다운로드를 Caffe2 Docker 컨테이너에 탑재해야 합니다. ※ 주의: 이 단계의 작업은 저장매체에 큰 부하를 가하기 때문에, 적지 않은 시간이 소요됩니다. 또한 별도의 진행률을 보여주는 그래프가 나타나지 않으며, 작업이 이루어지는 동안 남은 저장매체 용량은 빠르게 줄어듭니다. 시스템 요구 사양에서 1TB의 SSD를 요구했던 까닭이 바로 여기에 있습니다. 아래는 train LMDB를 생성하는 명령어입니다. sudo nvidia-docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 -v ~/Downloads/imagenet12:/imagenet12 --rm -w /opt/caffe2/bin nvcr.io/nvidia/caffe2:17.12 make_image_db -shuffle -db lmdb -input_folder /imagenet12/train/ -list_file /imagenet12/train.txt -output_db_name /imagenet12/Train_LMDB 다음은 val LMDB를 생성하는 명령어입니다. sudo nvidia-docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 -v ~/Downloads/imagenet12:/imagenet12 --rm -w /opt/caffe2/bin nvcr.io/nvidia/caffe2:17.12 make_image_db -shuffle -db lmdb -input_folder /imagenet12/val_unsorted/ -list_file /imagenet12/val.txt -output_db_name /imagenet12/Val_LMDB
명령어를 입력하여 작업을 수행하면, 위와 같이 LMDB가 생성되었음을 확인할 수 있습니다. ResNet-50을 사용한 트레이닝 Caffe2는 Docker 컨테이너의 /workspace/nvidia-examples/imagenet/ 경로에 포함된 train_resnet .py 스크립트로 ResNet-50 네트워크의 트레이닝을 수행할 수 있습니다. 예제 명령과 매개 변수는 아래 내용을 참고해주시기 바랍니다. 트레이닝 과정에서는 신경망을 통해 어떠한 물체(object), 동물 등 이미지의 특징을 학습하고, 또 어떤 특징이 중요한지를 결정하게 됩니다. 또한, 신경망은 주기적으로 트레이닝의 정확성에 영향을 주는 손실(loss)을 결정하기 위해 설정된 테스트(val)에 대해 자체적인 테스트를 수행합니다. 또한, 이것은 반복 수행을 통해 정확도를 높일 수 있습니다.(또는 epochs 수치를 높이는 방법도 있습니다) 아래는 train_resnet.py 스크립트에 사용되는 매개 변수에 대한 설명입니다 --depth: 망(Network) 계층(Layer)의 깊이를 조절합니다.(ResNet-50은 50을 사용) --train-lmdb: train LMDB 저장 경로를 입력합니다. --test-lmdb: val LMDB 저장 경로를 입력합니다. --num_gpus: 트레이닝에 사용될 GPU 수를 결정합니다. 또는 특정 GPU를 할당할 수도 있는데요. –gpus 매개변수를 쉼표(예: 0,1,2,3)로 구분하여 지정하는 것도 가능합니다. --batch-size: 한 번의 iteration에서 망 트레이닝을 진행하는데 사용할 이미지넷의 샘플 이미지 수를 결정합니다. 해당 매개변수의 숫자를 키우면 트레이닝 성능이 향상됩니다. --epochs: 전체 트레이닝 데이터세트를 통과하는 횟수입니다. --skip-test: 테스트 단계를 건너 뜁니다. --dtype float 16: FP16 정밀도(반정도)를 사용합니다.(Volta GPU) --enable-tensor-core: 텐서 코어를 활성화시킵니다.(Volta GPU) 트레이닝 명령어 예시 TITAN V를 기준으로 ResNet-50 모델을 사용하여 배치 사이즈 64와 FP16 연산을 활용하는 명령어 예시입니다.(텐서 코어 활성화 명령어 포함) sudo nvidia-docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 -v ~/Downloads/imagenet12:/imagenet12 --rm -w /workspace/nvidia-examples/imagenet nvcr.io/nvidia/caffe2:17.12 python ./train_resnet.py --depth 50 --train-lmdb /imagenet12/Train_LMDB \ --test-lmdb /imagenet12/Val_LMDB --num-gpus 1 --batch-size 64 --num-iterations 500 --skip-test --dtype float16 --enable-tensor-core
트레이닝 과정에서는 위와 같은 화면을 관측할 수 있습니다. 초당 이미지의 현재 시점, 반복, 트레이닝 속도, 손실 및 트레이닝 성능을 보여줍니다.
트레이닝이 진행되는 동안 터미널에서는 nvidia-smi 유틸리티를 실행하여 GPU 현황과 사용률을 확인하실 수 있습니다. 이제 해당 명령어를 사용하여 트레이닝 성능 테스트 결과를 살펴볼 차례인데요. 명령어에 포함된 d--type 매개변수(parameter)를 변경하여 FP32(float) 모드와 FP16(float16) 모드에서 TITAN 세대별 성능은 어떻게 달라지는지 확인해보았습니다. ResNet-50 FP32 트레이닝 성능 벤치마크
TITAN V가 가장 높은 성능을 기록하긴 했지만, TITAN Xp와의 성능 차이가 그리 크지 않습니다. 배치 사이즈 48 기준으로 약 1.19배의 성능인데요. TITAN V의 가격을 생각한다면 상당히 실망스러우실 겁니다. 하지만 TITAN V의 진정한 성능은 텐서 코어를 활용한 FP16 연산에서 나온다는 사실을 잊지 말아야겠죠. 매개변수 FP16을 적용하여 트레이닝을 수행했을 때의 결과를 살펴보도록 합시다. ResNet-50 FP16 트레이닝 성능 벤치마크
FP16 모드의 트레이닝 성능 테스트 결과입니다. TITAN V의 성능이 이제서야 제대로 발휘되네요. 딥러닝을 위한 전용 텐서 코어를 활성화했을 때의 성능은 가히 막강한 수준입니다. TITAN Xp와 비교 시, 최대 약 1.8배에 달하는 성능을 보여주기 때문이죠.
이와 같은 성능 특성은 딥러닝 알고리즘에 최적화된 텐서 코어 덕분입니다. 상단의 슬라이드 이미지를 참고하면, D[FP32] = A[FP16] x B[FP16] + C[FP32]로 이루어진 기본 연산 수칙에서 FP16 모드라 하더라도 실상은 Mixed 방식임을 알 수 있습니다.
▲ 참고: NVIDIA Tesla V100 16GB HBM2 결국 TITAN V는 딥러닝 트레이닝을 위한 최고의 그래픽카드임을 확인시켜 주었습니다. 그러나 TITAN V는 어디까지나 딥러닝을 공부하고자 하는 학생, 개인 연구가에게 적합한 설루션이고, 기업적 차원에서 대규모 병렬 시스템을 구축하고자 한다면 테슬라(Tesla) V100이 더 적합하다고 볼 수 있습니다. 무엇보다 TITAN V는 NVLink 활용이 불가능하고 테슬라 V100과 비교하여 메모리 용량(16 GB vs. 12 GB)과 대역폭(900.1 GB/s vs. 652.8 GB/s) 모두 열세를 보이고 있기 때문에 배치 사이즈가 더 커지면 트레이닝이 불가능한 경우도 생기겠죠.
자료를 좀 찾아봤는데 테슬라 V100의 경우 P100(파스칼 아키텍처)과 비교하여 더 높은 성능 차이를 보여준다고 합니다. 엔비디아 공식 자료이기 때문에 제가 직접 테스트하고 검증해본다면 더 할 나위 없이 좋겠지만 테슬라 V100을 구하기가 너무 어렵더군요. :) |