BLOG
Ubuntu 및 Amazon Linux용 AWS Deep Learning AMI (DLAMI)는 이제 Open Neural Network Exchange (ONNX)로 사전 설치되고 완벽하게 구성되어 딥러닝 프레임워크에서 모델 이식성을 지원합니다. 이 글에서는 ONNX를 소개하고 프레임워크에서 모델을 이식하기 위해 DLAMI에서 ONNX를 사용하는 방법을 보여줍니다.
ONNX 란 무엇인가?
ONNX는 심층 학습 모델을 인코딩하고 디코딩하는 오픈 소스 라이브러리 및 직렬화 형식입니다. ONNX는 신경망 전산 그래프의 형식과 신경망 아키텍처에 사용되는 광범위한 연산자 목록을 정의합니다. ONNX는 이미 Apache MXNet, PyTorch, Chainer, Cognitive Toolkit, TensorRT 및 기타 유명 심층 학습 프레임워크에서 지원됩니다. 널리 사용되는 툴에서 ONNX에 대한 지원이 늘어남에 따라 기계 학습 개발자는 툴 간에 이동하여 당면한 작업에 적합한 툴을 고르고 선택합니다.
Chainer 모델을 ONNX로 내보내기
Chainer 모델을 ONNX 파일로 내보내는 단계를 살펴 보겠습니다.
Ubuntu 또는 Amazon Linux에서 DLAMI의 인스턴스를 런칭하는 것으로 시작하겠습니다. 이전에 이러한 작업을 수행하지 않았다면 DLAMI를 시작하는 방법을 보여주는 튜토리얼을 검토하십시오.
일단 SSH를 통해 DLAMI에 연결되면 DLAMI에 미리 설치되고 구성된 Chainer Python 3.6 Conda 환경을 활성화합니다. 이 환경은 이제 Chainer에 ONNX 지원을 추가하는 애드온 패키지인 ONNX 및 onnx-chainer로 사전 설치되고 구성됩니다.
$ source activate chainer_p36
다음으로 Python 셸(shell)을 시작하고 다음 명령을 실행하여 개체 인식을 위한 VGG-16 신경 네트워크를 로드하고 신경 네트워크를 ONNX 파일로 내보냅니다.
import numpy as np
import onnx_chainer
from chainercv.links import VGG16
# This will download a pre-trained model, and load it as a Chainer model
model = VGG16(pretrained_model=’imagenet’)
# Creating synthetic input and using it to export the model to ONNX
x = np.zeros((1, 3, 224, 224), dtype=np.float32)
out = onnx_chainer.export(model, x, filename=’vgg16.onnx’)
몇 줄의 코드만으로 Chainer 모델을 ONNX 형식으로 내보내고 현재 디렉토리에 파일을 저장했습니다.
ONNX 모델을 MXNet으로 가져오기
이제 Chainer 모델을 ONNX로 내보냈으므로 이 모델을 MXNet으로 가져와 추론을 수행하는 방법을 살펴 보겠습니다.
ONNX 및 MXNet 1.2.1과 함께 설치되는 DLAMI의 MXNet Python 3.6 Conda 환경을 활성화하여 시작할 것입니다. MXNet 1.2는 ONNX 모델을 MXNet으로 가져오는 데 사용할 ONNX import API를 도입했습니다.
$ source deactivate
$ source activate mxnet_p36
다음으로 Python 셸(shell)을 시작하고 다음 명령을 실행하여 Chainer에서 방금 내보낸 ONNX 모델을 로드하십시오.
from mxnet.contrib import onnx as onnx_mxnet
sym, arg_params, aux_params = onnx_mxnet.import_model(“vgg16.onnx”)
바로 그렇게 하면 됩니다! MXNet에 ONNX 모델을 로드하고 상징적인 그래프와 매개 변수를 사용할 수 있습니다. 새로이 로드된 모델을 계속 추측해 봅시다.
이미지를 다운로드하고 모델을 교육한 ImageNet 클래스 레이블을 다운로드하여 객체 인식 모델을 테스트 할 수 있습니다.
import mxnet as mx
mx.test_utils.download(‘https://s3.amazonaws.com/onnx-mxnet/dlami-blogpost/hare.jpg’)
mx.test_utils.download(‘http://data.mxnet.io/models/imagenet/synset.txt’)
with open(‘synset.txt’, ‘r’) as f:
labels = [l.rstrip() for l in f]
우리가 넣은 입력 이미지는 다음과 같이 보입니다
이제 이미지를 로드하고 입력 텐서(tensor) 모양에 맞는 텐서(tensor)로 사전 프로세스를 진행합니다.
import matplotlib.pyplot as plt
import numpy as np
from mxnet import nd
image = plt.imread(“hare.jpg”)
image = np.expand_dims(np.transpose(image, (2,0,1)),axis=0).astype(np.float32)
input = nd.array(image)
이제 MXNet 모듈을 초기화하고 바인딩할 준비가 되었습니다 :
# Input name is the model’s input node name, and is defined by the exporting library
input_name = sym.list_inputs()[0]
data_shapes = [(input_name, input.shape)]
# Initialize and bind the Module
mod = mx.mod.Module(symbol=sym, context=mx.cpu(), data_names=[input_name], label_names=None)
mod.bind(for_training=False, data_shapes=data_shapes, label_shapes=None)
mod.set_params(arg_params=arg_params, aux_params=aux_params)
그리고 마지막으로 유추를 실행하고 최고의 가능성(probability)와 클래스를 프린트 하십시오.
mod.forward(mx.io.DataBatch([input]))
probabilities = mod.get_outputs()[0].asnumpy()[0]
max_probability = np.max(probabilities)
max_class = labels[np.argmax(probabilities)]
print(‘Highest probability=%f, class=%s’ %(max_probability, max_class))
출력은 모델 예측을 보여줍니다. 이 모델은 이미지가 97.9 % 확률로 토끼라고 예측합니다!
Highest probability=0.979566, class=n02326432 hare
결론 및 딥 러닝 AMI 학습 시작하기
이 글에서 DLAMI에서 ONNX를 사용하여 프레임워크에서 모델을 이식하는 방법을 배웠습니다. ONNX로 이식성을 구현하면 새로운 모델을 교육하고, 사전 훈련된 모델을 미세 조정하고, 추론이나 모델링을 실행하는 등의 작업에 적합한 툴을 골라서 선택할 수 있습니다.
시작 자습서를 사용하여 AWS Deep Learning AMI를 빠르게 시작할 수 있습니다. DLAMI ONNX 튜토리얼과 개발자 가이드에서 튜토리얼, 리소스 및 릴리스 정보를 확인하세요. AWS 마켓 플레이스에서 최신 AMI를 사용할 수 있습니다. 또한 토론 포럼에 가입하여 새로운 출시에 대한 정보를 얻고 질문을 게시 할 수 있습니다.
원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/aws-deep-learning-amis-now-include-onnx-enabling-model-portability-across-deep-learning-frameworks/
** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.