AWS를 통한 분산 딥러닝(Deep Learning) 구성하기
기계 학습(Machine Learning) 분야는 명시적인 프로그래밍이 없더라도 컴퓨터를 통해 학습을 할 수 있도록 도와주는 전산 분야입니다. 알고리즘을 통해 스스로 배워서 데이터로 부터 예측을 할 수 있습니다.
최근에는 기계 학습의 분류로 딥러닝(Deep Learning)이라 불리는 방식으로 전통적인 기법보다 더 정확하고 성공적으로 음성 인식, 이미지 인식 및 비디오 분석 등의 분야에서 서비스를 제공할 수 있게 되었습니다. 하지만, 많은 컴퓨팅 용량이 필요하기 때문에 학습 모델의 비용에 크다는 단점이 있었습니다.
클라우드 컴퓨팅이 제공하는 가용성을 통해 이러한 작업을 더 빠르게 진행할 수 있습니다. 인공 지능 기반 뉴럴 네트워크 훈련에는 시간이 많이 소요되고 ResidualNet 같은 네트워크 방식으로 가장 최신의 GPU 하드웨어를 사용하더라도 몇 일에서 몇 주간이 필요합니다. 이 때문에 스케일-아웃(Scale-out) 확장은 필수적이라 하겠습니다.
학습 속도를 빠르게 하면 다음과 같은 장점이 있습니다.
- 더 빠르게 여러번 실험 및 연구를 할 수 있어서 컴퓨터 비전 또는 음성 인식 분야의 현재 상태를 개선 할 수 있게 됩니다.
- 인공 지능 애플리케이션의 시장이 원하는 시점에 AI 서비스를 빠르게 만들어서 배포하고 새롭게 개선할 수 있습니다.
- 새로운 데이터를 더 빠르게 흡수하고 학습 모델을 개선할 수 있습니다.
AWS CloudFormation를 통해 AWS 자원을 손쉽게 만들고 운영할 수 있는 방식을 통해 딥러닝 클러스터를 만들 수 있는 새로운 템플릿을 소개합니다. 이 템플릿을 이용하여 Amazon Deep Learning AMI (MXNet, TensorFlow, Caffe, Theano, Torch, CNTK 프레임웍 지원)을 Amazon EC2의 신규 GPU P2 인스턴스에 구성하여, 자동 스케일링을 지원하는 분산 딥러닝 클러스터를 만들어 운영할 수 있게 됩니다.
딥러닝용 EC2 클러스터 아키텍처 구성
본 딥러닝용 CF 템플릿은 아래의 AWS 리소스를 생성하게 됩니다.
- 고객 계정에 VPC 설정
- 고객이 원하는 숫자의 인스턴스를 VPC 내에 자동 스케일링 그룹 에 사설망에 생성
- 마스터 인스턴스를 자동 인스턴스 그룹에 별도로 생성하여 SSH로 접속할 수 있게 생성
- 마스터 인스턴스에 SSH 접근이 가능하도록 보안 그룹 설정
- 두 개의 보안 그룹 포트 설정을 통해 마스터 인스턴스와 워커 인스턴스 사이의 통신 제공
- IAM 역할을 설정하여 자동 스케일링 그룹과 사설망 내 EC2 인스턴스 조회 기능 제공
- 외부에서 접근할 수 있도록 VPC 내에 NAT 게이트웨이 설정
실행 스크립트는 모든 호스트에 대해 SSH를 지원합니다. MXNet 같은 프레임웍을 사용하기 때문에 SSH 사용이 필수적이며, 이를 통해 분산 학습 동안 워커 인스턴스와 마스터 사이의 통신을 합니다. 스크립트를 실행하면 스택 내의 모든 호스트에 대한 사설 IP를 조회하고 이를 /etc/hosts에 추가한 후 , /opt/deeplearning/workers에 워커 인스턴스 목록을 작성합니다.
실행 스크립트는 아래와 같은 환경 변수를 가집니다.
$DEEPLEARNING_WORKERS_PATH:
워커 목록을 가진 파일 경로$DEEPLEARNING_WORKERS_COUNT:
총 워커 인스턴스 수$DEEPLEARNING_WORKER_GPU_COUNT:
인스턴스 내 GPU 수
딥러닝용 EC2 클러스터 실전 운영
원하는 인스턴스 숫자를 사용하려면, 기술 지원 센터에 기본 제한 숫자 증가를 요청하시기 바랍니다.
- MXNet GitHub repo에서 딥러닝용 CF 템플릿을 다운로드 합니다.
- CloudFormation 콘솔을 열고, Create New Stack을 선택합니다.
- Choose File을 눌러 다운로드한 템플릿을 업로드 한 후, Next를 누릅니다
- For Stack name 원하는 이름을 입력합니다.
- GPU InstanceType을 선택합니다. 예) P2.16xlarge.
- KeyName에는 자신의 EC2 key pair를 입력합니다.
- SSHLocation에는 SSH에 접근 하려는 CIDR IP 주소를 입력합니다.
- Worker Count에는 스택에서 사용할 초기 인스턴스 숫자를 입력합니다. 그리고 Next를 누릅니다.
- (선택 사항) Tags에는 여러분이 생성하는 자원에 대한 이름과 명칭을 Key 및 Value에 넣으시면 좋습니다. Permissions에는 CloudFormation이 사용할 IAM 역할을 적당하게 선택하신 후 Next를 선택합니다.
- Capabilities에는 CloudFormation이 생성하고자 하는 IAM 역할을 선택합니다. 스택에 맞는 IAM 역할을 선택하셔야 합니다.
- 마지막으로 Create를 누릅니다.
- To see the status of your stack, choose Events. If stack creation fails, for example, because of an access issue or an unsupported number of workers, troubleshoot the issue. For information about troubleshooting the creation of stacks, see Troubleshooting AWS CloudFormation. The event log records the reason for failure.
- (선택 사항) Tags에는 여러분이 생성하는 자원에 대한 이름과 명칭을 Key 및 Value에 넣으시면 좋습니다. Permissions에는 CloudFormation이 사용할 IAM 역할을 적당하게 선택하신 후 Next를 선택합니다.
마스터 인스턴스 접속하기
SSH 에이전트를 통해 사설망 내 VPC 내부 인스턴스에 안전하게 접속하기 위해서는 Securely Connect to Linux Instances Running in a Private Amazon VPC. 문서를 참고하시기 바랍니다.
- 먼저 마스터 인스턴스의 공개 DNS/IP를 찾습니다. 생성한 CloudFormation 스택의 output 탭을 보시면 마스터 인스턴스 정보가 있습니다. 자동 스케일링 그룹 아이디는 MasterAutoScalingGroup입니다.
- Amazon EC2 콘솔을 엽니다.
- 왼쪽 네비게이션 패널에서 Auto Scaling를 클릭하고, Auto Scaling Groups을 선택합니다.
- Auto Scaling 페이지에서 그룹 ID를 찾아 선택합니다.
- Instances 탭에서 마스터 인스턴스 ID를 선택합니다.
- 마스터 인스턴스의 공개 DNS/IP를 찾아 접속합니다.
- SSH 에이전트 포워딩을 시작: 사설망 내에 모든 인스턴스와 통신을 할 수 있습니다. 단계 1의 DNS/IP 주소를 통해 아래 Bash의 SSH 설정을 변경합니다.
Bash
Host IP/DNS-from-above ForwardAgent yes
- MXNet 분산학습 시작하기: 아래 예제는 병렬 데이터 처리를 위해 MNIST 실행 방법입니다. 환경 변수 중
DEEPLEARNING_*
를 사용합니다.Bash#terminate all running Python processes across workers while read -u 10 host; do ssh $host "pkill -f python" ; done 10<$DEEPLEARNING_WORKERS_PATH #navigate to the mnist image-classification example directory cd ~/src/mxnet/example/image-classification #run the MNIST distributed training example ../../tools/launch.py -n $DEEPLEARNING_WORKERS_COUNT -H $DEEPLEARNING_WORKERS_PATH python train_mnist.py --gpus $(seq -s , 0 1 $(($DEEPLEARNING_WORKER_GPU_COUNT - 1))) --network lenet --kv-store dist_sync
좀 더 자세한 학습 훈련 방법을 알아보시려면 Run MXNet on Multiple Devices를 참고하시기 바랍니다.
자주 묻는 질문
1. 마스터 인스턴스의 SSH 접속 IP 주소를 어떻게 바꾸나요? CloudFormation 스택 Output에는 마스터 인스턴스에 SSH 접근하는 IP 주소를 관리하는 보안 그룹이 있습니다. 이 보안 그룹에서 인바운드 IP 주소 변경이 가능합니다.
2. 인스턴스가 바뀔때 IP 주소의 설정이 변경되나요? 아니요. 수동으로 바꾸어야 합니다.
3. 마스터 인스턴스도 학습에 사용되나요? 네. 딥러닝 학습에는 GPU가 사용되므로 학습 및 검증 작업에 함께 사용됩니다.
4. 왜 자동 스케일링 기능을 사용하나요? 자동 스케일링 그룹은 기존 인스턴스에 문제가 생기더라도 원하는 인스턴스 갯수를 항상 맞추는 기능을 제공합니다. 여기에는 두 개의 그룹이 필요한데, 하나는 마스터에 대한 것 그리고 워커에 대한 것입니다. 마스터는 공개 접근 경로를 가지고 있고 학습 작업에 대한 제어가 가능합니다.
5. 새 워커 인스턴스가 추가되거나 기존 인스턴스가 교체되면 마스터 인스턴스 IP주소를 업데이트하나요? 아니오. 이 템플릿은 대체 IP주소를 자동으로 업데이트할 수 있는 기능이 없습니다.
이 글은 Distributed Deep Learning Made Easy의 한국어 번역입니다.