이 블로그는 Alibaba Cloud의 Cloud Native AI PD Team의 가이드를 기반으로 테스트를 경험한 내용으로 작성하였습니다. 또한 블로그 편의상 존대를 사용하지 않았음을 양해 부탁드립니다.
우리는 최근 뉴스를 보면 IT, 제조, 금융, 공공, 의료 등 분야를 가리지 않고 Machine Learning 기술이 활용되고 있음을 확인할 수 있다.
Machine Learning이라고 불리는 이 기술은 빅데이터를 이용하여 가장 적합한 해답을 찾아가는 과정을 지속적으로 반복 학습시키는 것을 의미한다.
실질적인 기술로 보면, CPU보다 단순 연산이 빠른 GPU를 이용하여 Tensorflow, Pythorch 등의 라이브러리로 다양한 형태의 데이터를 Machine에게 학습시킨다.
기업이 이 기술을 이용하기 위해 가장 중요한 수치는 속도, 정확도이다. 기업은 최소한의 리소스와 비용으로 최대한의 가치를 얻고자한다.
오늘 소개할 AIACC(AI Acceleration)라고 불리는 기술은 하드웨어 리소스가 아닌 소프트웨어 로직처리를 이용하여 Machine Learning을 가속화하는 기술이다.
이 블로그에서 AIACC를 사용하는 방법과 기존 환경 대비 얼마나 가속화되는지에 대한 수치를 확인할 수 있다. 특히 이번에 구현한 데모는 Instance Level이 아닌, Machine Learning 기술의 핫 트렌드인 Kubernetes 환경에서 테스트를 진행할 것이다.
AIACC는 저비용, 고성능, 고효율의 AI 가속기다. Apsara AIACC는 안정적이고 사용이 편리한 알리바바 클라우드 리소스에 기반한다. FastGPU와 함께 교육 작업을 구축해 리소스를 만들고 구성하는 시간을 단축시키며 GPU 리소스 활용도를 향상시켜 비용을 절감한다. Apsara AIACC는 다양한 프레임워크에 대한 통합 가속을 지원해 보다 적은 적응 워크로드를 제공하고 훈련 및 추론 성능을 향상시킵니다.
이 단계에서는 Imagenet에서 학습시킬 이미지 데이터를 가져와 NAS Volume에 삽입하고 학습 가능한 형태로 파일 형태를 변경하는 작업을 수행한다.
먼저, 우리는 데이터를 저장할 NAS와 마운트할 인스턴스인 ECS를 배포한다.
ECS Console - Create instance에서 다음과 같이 만든다.
NAS Console - Create a General Purpose NAS File System을 눌러 NAS를 배포한다.
NAS Mount를 위해 생성된 NAS를 클릭하고 Mount Target을 우리의 VPC group으로 지정한다.
4.1.1 단계에서 생성한 인스턴스에 Volume을 마운트하기 위해 아래 설명서를 참조할 수 있다.
데이터를 다운로드하기 위해 ImageNet에 가입하고 이미지 다운로드를 준비한다.
"Training images (Task 1 & 2), Training images (Task3), Validation images (all tasks)" 와 “Training bounding box annotations (Task1 & 2 only)”를 NAS에 다운받는다. 보통, NAS는 ECS의 /mnt 에 마운트되어있다.
큰 파일은 커넥션 끊김을 방지하기 위해 nohup을 이용한다.
cd /mnt
nohup wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar
wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train_t3.tar
nohup wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar
wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_bbox_train_v2.tar.gz
위에서 받은 파일은 tensorflow framework에서 사용할 수 없는 파일이다. 우리는 트레이닝을 위해 이 파일을 TFRecords로 바꿀 필요가 있다.
먼저, 데이터 변환을 위한 툴을 아래 링크에서 다운받고 압축을 해제한다
https://code.aliyun.com/best-practice/013/blob/master/imagenet-dp.tgz
검증된 이미지를 트레이닝에 활용하기위해 데이터를 변환한다.
a) Unzip ILSVRC2012_img_val.tar
cd /mnt
mkdir -p /mnt/val
tar xvf ILSVRC2012_img_val.tar -C val
ls /mnt/val
ILSVRC2012_val_00000001.JPEG ILSVRC2012_val_00016668.JPEG ILSVRC2012_val_00033335.JPEG
꽤 오랜 시간이 걸리니 시간을 감안해야한다.
b) 데이터 변환
cd /mnt/imagenet-dp
python3 preprocess_imagenet_validation_data.py /mnt/val imagenet_2012_validation_synset_labels.txt
ls /mnt/val
n01440764 n01860187 n02097474 n02165105 n02669723 n03042490
a) Unzip bbox
mkdir -p /mnt/bbox
tar xzvf ILSVRC2012_bbox_train_v2.tar.gz -C bbox
이 또한 매우 오랜 시간이 걸린다
b) 데이터 변환
python3 process_bounding_boxes.py /mnt/bbox imagenet_lsvrc_2015_synsets.txt |sort >bbox.csv
a) Unzip ILSVRC2012_img_train.tar
cd /mnt
mkdir -p /mnt/train
tar xvf ILSVRC2012_img_train.tar -C train
ls /mnt/train
b) 한번 더 unzip을 해준다.
cd /mnt/train
vim unzip.sh
아래 코드를 unzip.sh에 입력한다.
/bin/bash
for file in `ls *.tar`; do
subdir=${file:0:9}
mkdir -p ${subdir}
tar -C ${subdir} -xvf ${file} &
done
입력한 코드를 실행하고 압축파일을 지운다.
chmod +x unzip.sh
./unzip.sh
rm -rf *.tar
c) 데이터를 변환한다.
cd /mnt
mkdir -p /mnt/imagenet/imagenet_data/
cd /mnt/imagenet-dp
python3 build_imagenet_data.py --train_directory=/mnt/train/ \
--validation_directory=/mnt/val \
--output_directory=/mnt/imagenet/imagenet_data/ \
--imagenet_metadata_file=imagenet_metadata.txt \
--labels_file=imagenet_lsvrc_2015_synsets.txt \
--bounding_box_file=bbox.csv
d) 모든 변환 데이터는 /mnt/imagenet/imagenet_data에 있다. 이 곳에 포함되는 파일은 train을 위한 "train-0xxxx-of-01024"와 validation을 위한 "validation-00xxx-of-00128"이 있다.
e) 모든 train 파일과 validation 파일을 train 폴더로 옮긴다.
mkdir train
mv train*01024 train
mv validation*00128 train
다음 단계에서 진행할 arena test를 수행하기 위한 스크립트가 저장되어있는 소스코드를 github에서 clone한다.
git clone https://github.com/Jason-Jongjin-Lim/tensorflow-imagenet.git
Cloud Native AI Suite는 GPU 활용 모니터링, 데이터 액세스 성능 가속화 등의 기능을 지원하는 AIOps 기능을 제공한다. 이러한 기능은 Professional Managed Kubernetes Cluster에 있으므로 이번 데모에서는 모두 Professional Managed Kubernetes Cluster를 사용할 것이다.
ACK 콘솔 > Select Cluster Template > Heterogeneous Compution Cluster 선택
ACK 클러스터 배포를 위한 설정을 할 때, 정확한 테스트를 위해 4개의 GPU를 가진 인스턴스 4개의 노드를 배포한다.
배포를 하게되면 K8S 풀 세트를 구성하기 위한 Progress를 콘솔에서 확인할 수 있다.
ACK 클러스터가 배포되면 Application > Ai Acceleration 메뉴에서 AIACC를 클러스터에 설치한다.
우리는 Tensorflow를 이용해 학습시키기 위한 툴로 Arena를 이용할 것이다. 아래 링크에서 서버에 구성할 아레나 설치 방법을 확인할 수 있다.
https://www.alibabacloud.com/help/doc-detail/212117.htm
ACK 콘솔 > Clusters > More > Manage System Components 선택
항목 중 ack-arena를 설치한다.
테스트하는 날짜에 따라 업데이트가 되어 이미 설치가 되어있을 수 있다.
서버에 설치된 Arena와 연결하기 위해 클라이언트 인스턴스에 Areana 클라이언트를 설치해야한다.
본 데모에서는 클라이언트 인스턴스로 맥북을 사용했다.
a) 클라이언트 kubectl 설치
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
sudo chown root: /usr/local/bin/kubectl
kubectl version --client
b) 배포된 ACK 클러스터와 연결하기 위해 kubeconfig 수정
ACK 콘솔 > 클러스터 선택 > Cluster information > Connection information > Public Access 접속
vi $HOME/.kube/config
(복사된 configuration을 붙여넣기)
Kubectl get namespaces
c) Arena client 다운로드 및 설치
arena client를 아래 링크에서 다운받는다.
download the package for MAC: https://kubeflow.oss-cn-beijing.aliyuncs.com/arena-installer-0.8.8-d06b92d-darwin-amd64.tar.gz
or for linux: https://kubeflow.oss-cn-beijing.aliyuncs.com/arena-installer-0.8.8-d06b92d-linux-amd64.tar.gz
다운받은 패키지의 압축을 해제한다.
cd arena-installer
bash install.sh --only-binary
d) Arena client 테스트
설치가 완료되면, 서버와 정상적으로 연결되었는지 확인하기 위해 GPU resoruce를 사용하기 위한 test query를 사용해본다.
arena submit tf \
--name=firstjob \
--gpus=1 \
--image=registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/tf-mnist-standalone:gpu \
"python /app/main.py"
Submit된 Job을 확인하기 위해 아래 커맨드를 수행한다.
Arena get firstjob
먼저, NAS Console에 접속해서, 위 단계에서 사용한 NAS의 ID를 확인한다.
ACK 콘솔 > Volumes > Persistent Volume > Create PV 선택
ACK 콘솔 > Volumes > Persistent Volume Claim > Create PVC 선택
AIACC가 설치된 Kubernetes 클러스터의 GPU를 이용하기 위해 Arena 커맨드를 수행한다.
arena submit mpi \
--name imagenet-tensorflow \
--gpus=4 \
--workers=4 \
--data=imagenet-data:/data \
--working-dir=/data \
--mounts-on-launcher=true \
--image=cuda11-registry.cn-beijing.cr.aliyuncs.com/aiacc/cuda11:v3.0 "sh /data/tensorflow-imagenet/launch_arena.sh"
imagenet-tensorflow 워크로드가 정상적으로 실행이 되고 있는지 확인하기 위하여 아래 커맨드를 입력한다.
arena get imagenet-tensorflow --type mpijob
시간이 조금 지나면 아래같이 상태가 변경된다.
Status가 모두 Running이고 Node에 모든 인스턴스가 붙었다면 정상적으로 트레이닝이 수행중인 것이다.
시간이 지나고, 아래 커맨드를 수행한다.
arena logs imagenet-tensorflow
Done with training 문구를 확인하였다면 정상적으로 트레이닝이 완료된 것이다.
이번 단계에서는 똑같은 리소스를 가진 Kubernetes 클러스터를 구현하고 똑같은 데이터로 똑같은 training 워크로드를 수행한다. 그 결과로 얼마나 AIACC가 학습을 가속화 할 수 있는지 확인할 수 있다.
위 단계에서 만든 클러스터와 같은 인스턴스/인스턴스 갯수를 사용하는 클러스터를 만든다
위 테스트와 공평한 프로세스를 사용하기 위하여 같은 NAS 데이터를 바라보도록 같은 형태의 PV/PVC를 만든다.
구현된 서버에는 AI Acceleration을 설치하지 않고, arena만을 사용하기 위해 arena plug-in을 설치해준다.
여기서, 새로운 K8S 클러스터와 연결하기 위해 새로운 클라이언트를 셋팅한다
클라이언트 셋팅 방법은 4.2.3의 가이드를 참조할 수 있다.
이번 단계에서는 아래 명령어를 이용하여 AIACC가 설치되어있지 않은 환경에서 imagenet 데이터를 학습시킨다.
arena submit mpi \
--name imagenet-tensorflow \
--gpus=4 \
--workers=4 \
--data=imagenet-data:/data \
--working-dir=/data \
--mounts-on-launcher=true \ --image=cuda11-registry.cn-beijing.cr.aliyuncs.com/aiacc/cuda11:v3.0 "sh /data/tensorflow-imagenet/launch_arena.sh"
그 이후 아래 커맨드로 결과를 확인한다.
arena logs imagenet-tensorflow
위 테스트에서 사용한 두개의 클러스터의 결과를 살펴보겠다.
With AIACC Cluster
Without AIACC Cluster
여기서 보이는 수치는 1500개의 이미지를 표본으로 학습할 때 초당 학습할 수 있는 이미지의 갯수를 의미한다.
결과적으로, 본 테스트에서 사용한 Without AIACC Cluster에 비해서, With AIACC Cluster의 퍼포먼스가 12% 이상 증가한 수치를 확인할 수 있다.
또한 알리바바 클라우드에서 자체적으로 테스트한 아래 차트를 살펴보면 리소스/데이터가 크면 클수록 이 퍼포먼스 가속화는 더욱더 효율이 큰 것을 확인할 수 있다.
ModuleNotFoundError : No module named “numpy”
NAS를 마운트한 Instance에 numpy가 설치되어있지 않은 것으로, 아래 명령어로 설치할 수 있다.
Pip3 intall numpy
ModuleNotFoundError : No module named "tensorflow"
NAS를 마운트한 Instance에 tensorflow가 설치되어있지 않은 것으로, 아래 명령어로 설치할 수 있다.
Pip3 install tensorflow==1.13.1
Could not load dynamic library ‘libcudart.so.11.0’; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
NAS를 마운트한 Instance에 CUDA driver가 설치되어있지 않은 것으로, 아래 명령어로 설치할 수 있다.
wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda-repo-rhel8-11-0-local-11.0.2_450.51.05-1.x86_64.rpm
sudo rpm -i cuda-repo-rhel8-11-0-local-11.0.2_450.51.05-1.x86_64.rpm
sudo dnf clean all
sudo dnf -y module install nvidia-driver:latest-dkms
sudo dnf -y install cuda
submit 커맨드를 실행하고 arena get에서 아래와 같은 Node를 참조하지 못하는 상황일 때,
아래 Submit 명령어에서 지정한 GPU와 Worker의 갯수가 배포한 클러스터에 동작시킬 수 있는지 리소스를 확인한다.
Launcher에서 mount가 안될때 (arena v0.8.6에서 발생하는 버그)
기본적으로, 이 버그는 v0.8.8에서는 수정되었다. 업그레이드된 버전에서는 –mounts-on-launche=true 옵션을 추가하면 문제가 해결된다.
v0.8.6을 그대로 사용하고자 한다면 아래 2가지 Config를 고쳐야한다.
결과에서 나온 12% 수치가 적다고 생각될 수 있지만, 실제 기업의 ML 워크로드는 짧은 시간이 아닌 길게는 몇 일 단위의 학습을 시키는 것이 보통이다.
이런 관점에서 보면, 이 12%의 수치는 AIACC라는 알고리즘 적용만으로 기업의 시간/인력/비용적인 리소스가 대폭 절감될 수 있음을 암시한다.
이렇게 우리는 이 데모를 통해 최근 핫 트렌드인 ML을 가속화할 수 있는 간단한 방법에 대해서 알아보았다. 만약 대량의 데이터를 비싼 리소스에서 사용을 하고 있는 기업에 속해있다면, 충분히 AIACC를 고려해보는 것이 좋을 것이라고 생각한다.
이 테스트를 진행하는데 도움을 주신 Li Shan(shuwei.yin@alibaba-inc.com), Frey(frey.yjf@alibaba-inc.com), 张尉东(灵丹)(lingdan.zwd@alibaba-inc.com) 세분에게 감사의 말씀을 전합니다.
Alibaba Cloud DevOps Flow를 이용하여 Alibaba Cloud에 최적화된 DevOps(CI/CD) 환경 구현하기
JJ Lim - December 3, 2021
JJ Lim - April 13, 2023
JJ Lim - December 29, 2023
JJ Lim - December 31, 2021
JJ Lim - September 14, 2021
JJ Lim - November 10, 2021
A platform that provides enterprise-level data modeling services based on machine learning algorithms to quickly meet your needs for data-driven operations.
Learn MoreAlibaba Cloud Container Service for Kubernetes is a fully managed cloud container management service that supports native Kubernetes and integrates with other Alibaba Cloud products.
Learn MoreApply the latest Reinforcement Learning AI technology to your Field Service Management (FSM) to obtain real-time AI-informed decision support.
Learn MoreThis technology can be used to predict the spread of COVID-19 and help decision makers evaluate the impact of various prevention and control measures on the development of the epidemic.
Learn MoreMore Posts by JJ Lim