×
Community Blog Alibaba Cloud AIACC로 K8S 환경에서의 TensorFlow 워크로드 가속화하기

Alibaba Cloud AIACC로 K8S 환경에서의 TensorFlow 워크로드 가속화하기

이 포스트는 Alibaba Cloud의 Cloud Native AI PD Team의 가이드를 기반으로 테스트를 경험한 내용으로 작성하였습니다. 본 데모를 통해 기업에서 ML 워크로드를 가속화할 수 있는 알리바바 클라우드의 서비스에 대해 알아볼수 있습니다.

이 블로그는 Alibaba Cloud의 Cloud Native AI PD Team의 가이드를 기반으로 테스트를 경험한 내용으로 작성하였습니다. 또한 블로그 편의상 존대를 사용하지 않았음을 양해 부탁드립니다.

1. 배경 설명

우리는 최근 뉴스를 보면 IT, 제조, 금융, 공공, 의료 등 분야를 가리지 않고 Machine Learning 기술이 활용되고 있음을 확인할 수 있다.

Machine Learning이라고 불리는 이 기술은 빅데이터를 이용하여 가장 적합한 해답을 찾아가는 과정을 지속적으로 반복 학습시키는 것을 의미한다.

실질적인 기술로 보면, CPU보다 단순 연산이 빠른 GPU를 이용하여 Tensorflow, Pythorch 등의 라이브러리로 다양한 형태의 데이터를 Machine에게 학습시킨다.

기업이 이 기술을 이용하기 위해 가장 중요한 수치는 속도, 정확도이다. 기업은 최소한의 리소스와 비용으로 최대한의 가치를 얻고자한다.

오늘 소개할 AIACC(AI Acceleration)라고 불리는 기술은 하드웨어 리소스가 아닌 소프트웨어 로직처리를 이용하여 Machine Learning을 가속화하는 기술이다.

이 블로그에서 AIACC를 사용하는 방법과 기존 환경 대비 얼마나 가속화되는지에 대한 수치를 확인할 수 있다. 특히 이번에 구현한 데모는 Instance Level이 아닌, Machine Learning 기술의 핫 트렌드인 Kubernetes 환경에서 테스트를 진행할 것이다.

2. Solution Overview

AIACC는 저비용, 고성능, 고효율의 AI 가속기다. Apsara AIACC는 안정적이고 사용이 편리한 알리바바 클라우드 리소스에 기반한다. FastGPU와 함께 교육 작업을 구축해 리소스를 만들고 구성하는 시간을 단축시키며 GPU 리소스 활용도를 향상시켜 비용을 절감한다. Apsara AIACC는 다양한 프레임워크에 대한 통합 가속을 지원해 보다 적은 적응 워크로드를 제공하고 훈련 및 추론 성능을 향상시킵니다.

  • 통합적인 가속
    TensorFlow, Caffe, MXNet 및 PyTorch에서 다양한 AI 프레임워크의 통합 가속을 제공
  • 심층적인 성능 최적화
    GPU, CPU, 네트워크, I/O 등 Alibaba Cloud의 기본 IaaS 리소스를 기반으로 심층적인 성능 최적화를 제공
  • 자동 스케일링
    기본 IaaS 리소스를 기반으로 빠른 구축 및 자동 확장을 지원
  • 오픈 소스 프레임워크와의 호환성
    가볍고 편리하며 오픈 소스 프레임워크와 호환. 오픈 소스 프레임워크를 기반으로 작성하는 알고리즘 코드 또는 모델 코드는 수정이 불필요

1

3. 사전 준비

4. Main Steps

4.1 Prepare Data

이 단계에서는 Imagenet에서 학습시킬 이미지 데이터를 가져와 NAS Volume에 삽입하고 학습 가능한 형태로 파일 형태를 변경하는 작업을 수행한다.

먼저, 우리는 데이터를 저장할 NAS와 마운트할 인스턴스인 ECS를 배포한다.

4.1.1 ECS 배포

ECS Console - Create instance에서 다음과 같이 만든다.

2
3

4.1.2 NAS 배포 및 Mount

NAS Console - Create a General Purpose NAS File System을 눌러 NAS를 배포한다.

4
5

NAS Mount를 위해 생성된 NAS를 클릭하고 Mount Target을 우리의 VPC group으로 지정한다.

6
7

4.1.1 단계에서 생성한 인스턴스에 Volume을 마운트하기 위해 아래 설명서를 참조할 수 있다.

8

4.1.3 Training data와 Valuation data를 Imagenet에서 다운로드

데이터를 다운로드하기 위해 ImageNet에 가입하고 이미지 다운로드를 준비한다.

9
10

"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

11

4.1.4 Tranfer data tool download

위에서 받은 파일은 tensorflow framework에서 사용할 수 없는 파일이다. 우리는 트레이닝을 위해 이 파일을 TFRecords로 바꿀 필요가 있다.

먼저, 데이터 변환을 위한 툴을 아래 링크에서 다운받고 압축을 해제한다
https://code.aliyun.com/best-practice/013/blob/master/imagenet-dp.tgz

4.1.5 “Validation images” 데이터 변환

검증된 이미지를 트레이닝에 활용하기위해 데이터를 변환한다.

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

4.1.6 “Bound boxes” 데이터 변환

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

12

4.1.7 “Training images (Task 1 & 2)” 데이터 변환

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

13

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

4.1.8 tensorflow-imagenet 수행을 위한 소스코드 Clone

다음 단계에서 진행할 arena test를 수행하기 위한 스크립트가 저장되어있는 소스코드를 github에서 clone한다.

git clone https://github.com/Jason-Jongjin-Lim/tensorflow-imagenet.git

4.2 Kubernetes 클러스터 배포 및 Cloud-Native AI Component 세트 설치(AIACC with k8s / Arena)

Cloud Native AI Suite는 GPU 활용 모니터링, 데이터 액세스 성능 가속화 등의 기능을 지원하는 AIOps 기능을 제공한다. 이러한 기능은 Professional Managed Kubernetes Cluster에 있으므로 이번 데모에서는 모두 Professional Managed Kubernetes Cluster를 사용할 것이다.

4.2.1 ACK 배포

ACK 콘솔 > Select Cluster Template > Heterogeneous Compution Cluster 선택

14

ACK 클러스터 배포를 위한 설정을 할 때, 정확한 테스트를 위해 4개의 GPU를 가진 인스턴스 4개의 노드를 배포한다.

15

  • K8s version : 1.18.8-aliyun.1 (21년 10월 기준 K8S 1.18만 AIACC native workload를 지원한다)
  • Instance type : ecs.gn6e-c12g1.12xlarge 48 vCPU 368 GiB (4x * NVIDIA V100)
  • Instance Quantity : 4

배포를 하게되면 K8S 풀 세트를 구성하기 위한 Progress를 콘솔에서 확인할 수 있다.

16

ACK 클러스터가 배포되면 Application > Ai Acceleration 메뉴에서 AIACC를 클러스터에 설치한다.

17

4.2.2 클러스터에 Arena 설치

우리는 Tensorflow를 이용해 학습시키기 위한 툴로 Arena를 이용할 것이다. 아래 링크에서 서버에 구성할 아레나 설치 방법을 확인할 수 있다.

https://www.alibabacloud.com/help/doc-detail/212117.htm

ACK 콘솔 > Clusters > More > Manage System Components 선택

18

항목 중 ack-arena를 설치한다.

19

테스트하는 날짜에 따라 업데이트가 되어 이미 설치가 되어있을 수 있다.

4.2.3 Arena client 설치

서버에 설치된 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 접속

20

  • Public Access의 접속 configuration을 복사
vi $HOME/.kube/config
(복사된 configuration을 붙여넣기)
Kubectl get namespaces

21

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"

22

Submit된 Job을 확인하기 위해 아래 커맨드를 수행한다.

Arena get firstjob

23

  • Status가 Runinng이고, Node가 정상적으로 Attach 되었다면 서버연결 설정이 완료된 것이다.

4.3 Kubernetes 클러스터에 NAS PV, PVC Attach

4.3.1 PV 생성

먼저, NAS Console에 접속해서, 위 단계에서 사용한 NAS의 ID를 확인한다.

24

ACK 콘솔 > Volumes > Persistent Volume > Create PV 선택

25

  • PV Type : NAS
  • Volume Name : imagenet-data
  • Volume Plug-in : CSI
  • Capacity : 1Pi (NAS에 배속된 용량을 정확히 기입)
  • Access Mode : ReadWriteMany
  • Mount target Domain Names : 위에서 확인한 NAS ID 선택

4.3.1 PVC 생성

ACK 콘솔 > Volumes > Persistent Volume Claim > Create PVC 선택

26

  • PVC Type : NAS
  • Name : imagenet-data
  • Allocation Mode : Existing Volumes
  • Existing Volumes : imagenet-data, 1Pi 선택
  • Capacity : 1 Pi

4.4 Arena 커맨드를 이용한 Imagenet 데이터 학습

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

27

시간이 조금 지나면 아래같이 상태가 변경된다.

28

Status가 모두 Running이고 Node모든 인스턴스가 붙었다면 정상적으로 트레이닝이 수행중인 것이다.

시간이 지나고, 아래 커맨드를 수행한다.

arena logs imagenet-tensorflow

29

Done with training 문구를 확인하였다면 정상적으로 트레이닝이 완료된 것이다.

4.5 AIACC가 설치되지 않은 Kubernetes 클러스터에서 같은 워크로드 트레이닝

이번 단계에서는 똑같은 리소스를 가진 Kubernetes 클러스터를 구현하고 똑같은 데이터로 똑같은 training 워크로드를 수행한다. 그 결과로 얼마나 AIACC가 학습을 가속화 할 수 있는지 확인할 수 있다.

4.5.1 ACK 클러스터 만들기

위 단계에서 만든 클러스터와 같은 인스턴스/인스턴스 갯수를 사용하는 클러스터를 만든다

30

4.5.2 PV/PVC 만들기

위 테스트와 공평한 프로세스를 사용하기 위하여 같은 NAS 데이터를 바라보도록 같은 형태의 PV/PVC를 만든다.

31
32

구현된 서버에는 AI Acceleration을 설치하지 않고, arena만을 사용하기 위해 arena plug-in을 설치해준다.

33

4.5.2 without AIACC 클러스터와 연결하기 위한 클라이언트 생성 및 테스트

여기서, 새로운 K8S 클러스터와 연결하기 위해 새로운 클라이언트를 셋팅한다

클라이언트 셋팅 방법은 4.2.3의 가이드를 참조할 수 있다.

4.5.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

34

5. 결과

위 테스트에서 사용한 두개의 클러스터의 결과를 살펴보겠다.

With AIACC Cluster

35

Without AIACC Cluster

36

여기서 보이는 수치는 1500개의 이미지를 표본으로 학습할 때 초당 학습할 수 있는 이미지의 갯수를 의미한다.

결과적으로, 본 테스트에서 사용한 Without AIACC Cluster에 비해서, With AIACC Cluster의 퍼포먼스가 12% 이상 증가한 수치를 확인할 수 있다.

또한 알리바바 클라우드에서 자체적으로 테스트한 아래 차트를 살펴보면 리소스/데이터가 크면 클수록 이 퍼포먼스 가속화는 더욱더 효율이 큰 것을 확인할 수 있다.

37

6. Trouble shooting

6.1 (4.1.5-b) 에서 데이터를 변환할때의 에러 상황

ModuleNotFoundError : No module named “numpy”

38

NAS를 마운트한 Instance에 numpy가 설치되어있지 않은 것으로, 아래 명령어로 설치할 수 있다.

Pip3 intall numpy

ModuleNotFoundError : No module named "tensorflow"

39

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

6.1 (4.2.3-d) 의 arena submit을 수행할 때의 에러 상황

submit 커맨드를 실행하고 arena get에서 아래와 같은 Node를 참조하지 못하는 상황일 때,

40

아래 Submit 명령어에서 지정한 GPU와 Worker의 갯수가 배포한 클러스터에 동작시킬 수 있는지 리소스를 확인한다.

41

Launcher에서 mount가 안될때 (arena v0.8.6에서 발생하는 버그)

기본적으로, 이 버그는 v0.8.8에서는 수정되었다. 업그레이드된 버전에서는 –mounts-on-launche=true 옵션을 추가하면 문제가 해결된다.

v0.8.6을 그대로 사용하고자 한다면 아래 2가지 Config를 고쳐야한다.

  • ~/charts/mpijob/values.yaml : "mountsOnLauncher: false"를 true로 변경
  • ~/charts/mpijob/templates/mpijob.yaml: "mountsOnLauncher: false"를 true로 변경

7. 마치며

결과에서 나온 12% 수치가 적다고 생각될 수 있지만, 실제 기업의 ML 워크로드는 짧은 시간이 아닌 길게는 몇 일 단위의 학습을 시키는 것이 보통이다.

이런 관점에서 보면, 이 12%의 수치는 AIACC라는 알고리즘 적용만으로 기업의 시간/인력/비용적인 리소스가 대폭 절감될 수 있음을 암시한다.

이렇게 우리는 이 데모를 통해 최근 핫 트렌드인 ML을 가속화할 수 있는 간단한 방법에 대해서 알아보았다. 만약 대량의 데이터를 비싼 리소스에서 사용을 하고 있는 기업에 속해있다면, 충분히 AIACC를 고려해보는 것이 좋을 것이라고 생각한다.

이 테스트를 진행하는데 도움을 주신 Li Shan(shuwei.yin@alibaba-inc.com), Frey(frey.yjf@alibaba-inc.com), 张尉东(灵丹)(lingdan.zwd@alibaba-inc.com) 세분에게 감사의 말씀을 전합니다.

0 0 0
Share on

JJ Lim

21 posts | 4 followers

You may also like

Comments

JJ Lim

21 posts | 4 followers

Related Products