Amazon Web Services 한국 블로그

Amazon Elastic Inference 출시 – GPU 기반 딥러닝 추론 가속 서비스 (서울 리전 포함)

최근 인공 지능과 딥러닝이 발전한 이유 중 하나로 GPU(그래픽 처리 장치)의 환상적인 컴퓨팅 성능을 꼽을 수 있습니다. 약 10년 전 연구자들은 기계 학습과 고성능 컴퓨팅에 대규모 하드웨어 병렬 처리를 활용하는 방법을 찾아냈습니다. 관심 있는 분들은 2009년 스탠포드 대학이 발표한 논문(PDF)을 살펴보시기 바랍니다.

현재 GPU는 개발자와 데이터 과학자들이 의료 영상 분석이나 자율 주행을 구현하기 위해 복잡한 모델에 방대한 데이터 세트를 훈련시키는 데 도움을 줍니다. 예를 들어 Amazon EC2 P3 제품군에서는 최대 8개의 NVIDIA V100 GPU를 동일한 인스턴스에 사용하여 최대 1PetaFLOP의 혼합 정밀도 성능을 실현할 수 있습니다. 이는 불과 10년 전 당시로서는 역사상 가장 빠른 슈퍼컴퓨터의 성능과 같은 수준입니다.

물론 모델을 학습시키기만 한다고 끝나는 것은 아닙니다. 즉, 모델을 작업에 투입하고 새로운 데이터 샘플의 결과를 예측하는 방법도 찾아야 합니다. 불행히도 개발자들은 인스턴스 유형과 크기를 선택할 때 어려움을 겪는 경우가 많습니다. 실제로 대규모 모델의 경우 CPU의 추론 지연 시간이 온라인 애플리케이션의 요구 사항을 충족하지 못하는데 최고 사양의 GPU 비용은 터무니 없이 높을 수 있습니다. 또한 RAM 및 CPU 같은 리소스가 원시 추론 속도보다 애플리케이션의 전반적인 성능을 높이는 데 더 중요할 수 있습니다.

예를 들어 c5.9xlarge 인스턴스(us-east-1에서 시간당 1.53 USD)가 필요한 성능 집약적 애플리케이션이 있다고 가정해 보겠습니다. SSD 모델과의 단일 추론 호출에 400밀리초 가까이 걸리는데, 실시간 상호 작용을 구현하기에는 확실히 너무 느립니다. 애플리케이션을 p2.xlarge 인스턴스(요금이 시간당 0.90 USD로 us-east-1에서 가장 저렴한 범용 GPU 인스턴스)로 이동하면 추론 성능이 180밀리초 미만으로 향상됩니다. p2.xlarge는 vCPU와 RAM이 더 적기 때문에 이 경우 애플리케이션 성능에 영향을 미칩니다.

더 이상 이 같은 성능 저하를 감수할 필요가 없습니다. 오늘 모든 Amazon EC2 인스턴스에 필요한 양의 GPU 기반 추론 가속을 추가할 수 있는 새로운 서비스인 Amazon Elastic Inference을 발표합니다. 이 서비스는 Amazon SageMaker 노트북 인스턴스 및 엔드포인트에서도 이용 가능하며, 기본 제공 알고리즘과 딥러닝 환경에 가속화 기능을 제공합니다.

애플리케이션에 가장 적합한 CPU 인스턴스 유형을 선택하고 적절한 양의 GPU 가속을 연결한 후 두 가지 이점을 모두 누리십시오. 물론 EC2 Auto Scaling을 사용하여 필요할 때마다 가속화된 인스턴스를 추가하고 제거할 수 있습니다.

Amazon Elastic Inference 소개

Amazon Elastic Inference는 널리 사용되는 기계 학습 프레임워크인 TensorFlow, Apache MXNet 및 ONNX(MXNet을 통해 적용됨)를 지원합니다. 기존 코드는 거의 변경할 필요가 없지만, AWS에 최적화된 빌드를 사용하여 인스턴스에 연결된 엑셀러레이터를 자동으로 검색하고, 인증된 액세스만 허용되는지 확인하고, 모든 로컬 CPU 리소스와 연결된 엑셀러레이터에 걸쳐 계산 부하를 분산해야 합니다. 이러한 빌드는 Amazon S3의 AWS Deep Learning AMI에서 이용할 수 있으므로 자체 이미지 또는 컨테이너에 구축할 수 있으며 Amazon SageMaker를 사용할 때 자동으로 제공됩니다.

Amazon Elastic Inference는 세 가지 크기로 제공되므로 컴퓨터 비전, 자연어 처리 및 음성 인식을 비롯한 광범위한 추론 모델에 효율적으로 활용할 수 있습니다.

  • eia1.medium: 8TeraFLOP의 혼합 정밀도 성능
  • eia1.large: 16TeraFLOP의 혼합 정밀도 성능
  • eia1.xlarge: 32TeraFLOP의 혼합 정밀도 성능

따라서 애플리케이션에 가장 적합한 가격 대비 성능의 솔루션을 선택할 수 있습니다. 예를 들어 eia1.medium 가속을 사용하여 구성된 c5.large 인스턴스의 요금은 시간당 0.22 USD(us-east-1)입니다. 이 조합은 전용 NVIDIA K80 GPU를 호스팅하는 p2.xlarge 인스턴스보다 10~15%밖에 느리지 않고 비용은 시간당 0.90 USD(us-east-1)입니다. 요점은 75% 더 낮은 비용으로 동일한 수준의 GPU 성능을 얻을 수 있고 애플리케이션에 가장 적합한 인스턴스 유형을 선택할 수 있다는 것입니다.

이제 Amazon EC2 인스턴스의 Apache MXNet 및 TensorFlow 예를 살펴보겠습니다.

Amazon Elastic Inference 설정

다음은 Amazon EC2 인스턴스에서 이 서비스를 사용하기 위해 수행해야 할 개략적인 단계입니다.

  1. 인스턴스에 대해, 수신되는 SSH 트래픽만 허용하는 보안 그룹을 생성합니다.
  2. 인스턴스에 대해 IAM 역할을 생성하고 해당 역할이 Amazon Elastic Inference 서비스에 액세스하도록 허용합니다.
  3. 인스턴스를 실행할 VPC에 Amazon Elastic Inference의 VPC 엔드포인트를 생성하고 인스턴스에서 수신되는 HTTPS 트래픽만 허용하는 보안 그룹을 연결합니다. 이 설정은 VPC당 한 번만 구성하면 되고 엔드포인트 요금이 엑셀러레이터 비용에 포함되어 있습니다.

VPC 엔드포인트

추론 가속용 인스턴스 생성하기

이제 엔드포인트가 준비되었으므로 AWS CLI를 통해 AWS Deep Learning AMI를 사용한 c5.large 인스턴스를 실행해 보겠습니다.

aws ec2 run-instances --image-id $AMI_ID \
--key-name $KEYPAIR_NAME --security-group-ids $SG_ID \
--subnet-id $SUBNET_ID --instance-type c5.large \
--elastic-inference-accelerator Type=eia1.large

이것으로 완료되었습니다! 새로운 API를 익히지 않아도 Amazon Elastic Inference를 이용하는 데 아무 문제가 없습니다. 엑셀러레이터 유형을 설명하는 추가 파라미터를 전달하기만 하면 되니까요. 몇 분만 지나면 인스턴스가 작동하고 연결할 수 있게 됩니다.

Apache MXNet 추론 가속하기

이 전통적인 예에서는 사전 학습된 대규모 합성곱 신경망을 Amazon Elastic Inference Accelerator에 로드합니다. 사전 학습된 모델에 대해 잘 모르는 분은 이 주제를 다룬 이전 게시물을 참조하시기 바랍니다. 구체적으로 말하면, ImageNet 데이터 세트를 학습한 ResNet-152 네트워크를 사용합니다.

그런 다음 Amazon Elastic Inference 엑셀러레이터에서 간단히 이미지를 분류합니다.

import mxnet as mx
import numpy as np
from collections import namedtuple
Batch = namedtuple('Batch', ['data'])

# 모델(ResNet-152 trained on ImageNet) 및 ImageNet 범주 다운로드
path='http://data.mxnet.io/models/imagenet/'
[mx.test_utils.download(path+'resnet/152-layers/resnet-152-0000.params'),
 mx.test_utils.download(path+'resnet/152-layers/resnet-152-symbol.json'),
 mx.test_utils.download(path+'synset.txt')]

# Elastic Inference Accelerator에 컴퓨팅 컨텍스트 설정
# ctx = mx.gpu(0) # GPU에서 예측하는 방식
ctx = mx.eia()    # EI 엑셀러레이터에서 예측하는 방식

# 사전 학습된 모델 로드
sym, arg_params, aux_params = mx.model.load_checkpoint('resnet-152', 0)
mod = mx.mod.Module(symbol=sym, context=ctx, label_names=None)
mod.bind(for_training=False, data_shapes=[('data', (1,3,224,224))],
         label_shapes=mod._label_shapes)
mod.set_params(arg_params, aux_params, allow_missing=True)

# ImageNet 범주 레이블 로드
with open('synset.txt', 'r') as f:
    labels = [l.rstrip() for l in f]

# 테스트 이미지 다운로드 및 로드
fname = mx.test_utils.download('https://github.com/dmlc/web-data/blob/master/mxnet/doc/tutorials/python/predict_image/dog.jpg?raw=true')
img = mx.image.imread(fname)

# 이미지를 (batch=1, channels=3, width, height)로 변환 및 형상 변경
img = mx.image.imresize(img, 224, 224) # Resize to training settings
img = img.transpose((2, 0, 1)) # 채널 
img = img.expand_dims(axis=0)  # 배치 크기
# img = img.as_in_context(ctx) # 필요 없음: EIA로 데이터가 자동 로드됨

# 이미지 예측
mod.forward(Batch([img]))
prob = mod.get_outputs()[0].asnumpy()

# 상위 3개 클래스 인쇄
prob = np.squeeze(prob)
a = np.argsort(prob)[::-1]
for i in a[0:3]:
    print('probability=%f, class=%s' %(prob[i], labels[i]))

보다시피 몇 가지 차이밖에 없습니다.

  • 컴퓨팅 컨텍스트를 mx.eia()로 설정합니다. Amazon EC2 인스턴스에는 Amazon Elastic Infinence 엑셀러레이터를 하나만 연결할 수 있으므로 번호를 지정할 필요가 없습니다.
  • GPU를 사용할 때와는 달리 Amazon Elastic Infence 엑셀러레이터에 명시적으로 이미지를 로드하지 않았습니다. 이미지가 자동으로 로드되기 때문입니다.

이 샘플을 실행한 결과는 다음과 같습니다.

probability=0.979113, class=n02110958 pug, pug-dog
probability=0.003781, class=n02108422 bull mastiff
probability=0.003718, class=n02112706 Brabancon griffon

성능은 어떨까요? c5.large에서, 이 예측은 CPU에서 약 0.23초가 걸리지만 eia1.large 엑셀러레이터에서는 0.031초밖에 걸리지 않습니다. 비교를 위해 알아보자면, 최고 사양의 NVIDIA V100 GPU가 장착된 p3.2xlarge 인스턴스에서는 약 0.015초가 걸립니다. eia1.medium 엑셀러레이터를 대신 사용하면 0.046초가 걸리며 이는 p2.xlarge(0.042초)만큼 빠르지만 비용은 75% 더 낮습니다.

TensorFlow 추론 가속하기

TensorFlow Serving을 사용하여 가속 예측을 처리할 수 있습니다. 이 서버는 저장된 모델을 로드하고 REST API 및 gRPC를 통해 고성능 예측을 제공하는 모델 서버입니다.

Amazon Elastic Infance에는 TensorFlow Serving의 가속 버전이 포함되어 있습니다. 이 버전은 다음과 같이 사용할 수 있습니다.

$ ei_tensorflow_model_server --model_name=resnet --model_base_path=$MODEL_PATH --port=9000
$ python resnet_client.py --server=localhost:9000

지금 이용 가능

이 게시물에서 유용한 정보를 얻으셨습니까? Amazon Elastic Inference는 현재 미국 동부(버지니아 북부 및 오하이오), 미국 서부(오레곤), EU(아일랜드) 및 아시아 태평양(서울 및 도쿄)에서 이용할 수 있습니다. 지금 바로 이 서비스를 활용해 애플리케이션을 만들어보시기 바랍니다.

Julien;