BLOG

Apache MXNet용 모델 서버는 Gluon 모델을 지원합니다.
작성일: 2018-06-11

AWS는 Apache MXNet (MMS) v0.4용 Model Server를 출시했습니다. 이 서버에는 Gluon 모델 지원 기능이 추가되었습니다. Gluon은 MXNet 성능을 유지하면서 신속한 모델 개발을 가능하게 하는 MXNet의 필수적이고 역동적인 인터페이스입니다. 이 출시에서 MMS는 Gluon 모델을 대규모로 패키징하고 제공하는 기능을 추가합니다. 이 블로그 게시물에서 v0.4 출시에 대해 자세히 설명하고 Gluon 모델 제공 예제를 살펴 보겠습니다.

 

Apache MXNet (MMS)용 Model Server란 무엇입니까?

 

MMS는 오픈 소스 모델 제공 프레임워크로, 딥 러닝 모델을 대규모로 제공하는 작업을 단순화하도록 설계되었습니다. 다음은 MMS의 주요 장점들입니다.

 

  • MXNet, GluonONNX 신경망 모델을 제공하는 데 필요한 신경망 모델 아티팩트가 포함된 모델 아카이브를 생성하는 패키징 도구를 제공합니다.
  • 모델 아카이브에 패키지화된 사용자 정의 코드를 사용하여 유추 실행 파이프 라인의 모든 단계를 사용자 정의할 수있는 기능을 제공하므로 초기화, 사전 처리 및 사후 처리에 크게 신경쓰지 않아도 됩니다.
  • REST API 엔드 포인트 및 추론 엔진을 포함하여 사전 구성된 서비스 스택과 함께 제공됩니다.
  • 확장 가능한 모델 제공을 위해 미리 제작되고 최적화된 컨테이너 이미지를 제공합니다.
  • 서버 및 엔드 포인트를 모니터링하기 위한 실시간 운영 메트릭을 포함합니다.

 

Gluon이란 무엇입니까?

 

Gluon은 MXNet에 대한 명확하고 간결하며 간단한 Python 인터페이스입니다. 엔지니어는 상징적 구현의 성능상의 이점을 잃지 않고도 신경망을 구축할 수 있는 명령형 코드를 작성할 수 있습니다. Gluon은 명령형 구현에 기반하여 최적화된 기호 코드를 자동으로 생성할 수 있습니다.

 

MMS에서 Gluon 모델 제공하기

 

MMS로 Gluon 모델을 제공하는 예를 살펴 보겠습니다. 이 예에서는 Gluon을 사용하여 Xiang Zhang의 Character-Level Convolutional 신경망 네트워크 (char-CNN)를 기반으로 한 모델을 구현합니다. 모델을 패키지로 묶어 MMS와 함께 제공합니다. char-CNN은 어휘를 이해하고 텍스트를 분류하기 위해 RNN (회귀 신경망 네트워크) 대신 CNN을 사용합니다. 이를 통해 언어의 의미 또는 구문을 이해할 필요 없이 분류가 가능합니다. 이 방법론을 사용할 때 스펠링 오류와 같은 데이터 오류는 예측 성능에 영향을 조금 덜 미칩니다.

 

 

 

Figure 1. char-CNN 모델의 그림 (source)

 

이 이미지는 기본 char-CNN 모델 구조를 보여줍니다. 단어는 어휘 텐서로 변형된 다음 convolutional 레이어로 공급됩니다. 이러한 모델을 Crepe 모델이라고합니다. 다음 GluonCrepe 코드에서 Crepe 모델을 사용하여 제품 리뷰의 텍스트를 기반으로 제품 카테고리를 예측합니다. 모델이 훈련된 데이터셋은 Amazon 제품 데이터셋입니다. (모델 훈련 방법에 대한 자세한 내용은 Thomas Delteil이 제공한 자세한 자습서를 참조하십시오.)

모델 정의는 다음과 같습니다.

 

class GluonCrepe(HybridBlock):

  “””

  Hybrid Block gluon Crepe model

  “””

  def __init__(self, classes=7, **kwargs):

      super(GluonCrepe, self).__init__(**kwargs)

      self.NUM_FILTERS = 256 # number of convolutional filters per convolutional layer

      self.NUM_OUTPUTS = classes # number of classes

      self.FULLY_CONNECTED = 1024 # number of unit in the fully connected dense layer

      self.features = nn.HybridSequential()

      with self.name_scope():

          self.features.add(

              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=7, activation=’relu’),

              nn.MaxPool1D(pool_size=3, strides=3),

              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=7, activation=’relu’),

              nn.MaxPool1D(pool_size=3, strides=3),

              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=3, activation=’relu’),

              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=3, activation=’relu’),

              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=3, activation=’relu’),

              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=3, activation=’relu’),

              nn.MaxPool1D(pool_size=3, strides=3),

              nn.Flatten(),

              nn.Dense(self.FULLY_CONNECTED, activation=’relu’),

              nn.Dense(self.FULLY_CONNECTED, activation=’relu’),

          )

          self.output = nn.Dense(self.NUM_OUTPUTS)

 

MMS에서 모델을 서비스로 실행하려면 다음 파일이 필요합니다.

 

  1. 맞춤 서비스 Python 파일 – 사전 프로세스, 추론 및 사후 프로세스 단계를 정의합니다. 또한 사전 훈련된 가중치를 로드하는 데 사용됩니다.
  2. 서명 JSON 파일 – 모델의 예상 입력 및 출력 모양을 정의합니다.
  3. 모델 파일 – 이것은 일반 MXNet 모델 파일용 JSON 파일입니다. 그러나 Gluon 모델의 경우 서비스 Python 파일 내에 클래스 정의가 있습니다.
  4. 매개 변수 파일 – 사전 훈련된 모델의 가중치를 저장합니다.
  5. synset 텍스트 파일 – 분류 모델에 고유한 이 파일에는 출력 클래스에 대한 레이블이 들어 있습니다.

 

모델에 대한 추론을 실행하려면 숙련된 모델 가중치가 필요합니다. 사전 훈련된 가중치를 다운로드하세요. MMS는 맞춤 서비스 클래스 유도를 사용하여 사전 프로세스, 추론 및 사후 프로세스 기능을 정의합니다. 맞춤 서비스는 모델에 따라 다릅니다. 이 예인 Crepe 모델의 경우 다음과 같이 서비스를 정의합니다.

 

class CharacterCNNService(GluonImperativeBaseService):

  “””

  Gluon Character-level Convolution Service

  “””

  def __init__(self, model_name, model_dir, manifest, gpu=None):

      net = GluonCrepe()

      super(CharacterCNNService, self).__init__(model_name, model_dir, manifest,net, gpu)

      # The 69 characters as specified in the paper

      self.ALPHABET = list(“abcdefghijklmnopqrstuvwxyz0123456789-,;.!?:’\”/\\|_@#$%^&*~`+ =<>()[]{}”)

      # Map Alphabets to index

      self.ALPHABET_INDEX = {letter: index for index, letter in enumerate(self.ALPHABET)}

      # max-length in characters for one document

      self.FEATURE_LEN = 1014

      # Hybridize imperative model for best performance

      self.net.hybridize()

      

  def _preprocess(self, data):

      # build the text from the request

      text = ‘{}|{}’.format(data[0][0][‘review_title’], data[0][0][‘review’])

      

      encoded = np.zeros([len(self.ALPHABET), self.FEATURE_LEN], dtype=’float32′)

      review = text.lower()[:self.FEATURE_LEN-1:-1]

      i = 0

      for letter in text:

          if i >= self.FEATURE_LEN:

              break;

          if letter in self.ALPHABET_INDEX:

              encoded[self.ALPHABET_INDEX[letter]][i] = 1

          i += 1

      return nd.array([encoded], ctx=self.ctx)

      

  def _inference(self, data):

      # Call forward/hybrid_forward

      output = self.net(data)

      return output.softmax()

      

  def _postprocess(self, data):

      # Post process and output the most likely category

      predicted = self.labels[np.argmax(data[0].asnumpy())]

      return [{‘category’: predicted}]

 

사전 처리 섹션에서 입력 텍스트는 잘리고 인코딩됩니다. 인코딩은 종이에 정의된 69자를 기준으로 수행됩니다.

 

다음으로 서명 JSON 파일을 정의하여 MMS에 입력 및 출력 모양과 해당 데이터 유형을 알립니다.

 

“inputs”: [{ 

    “data_name”: “data”, 

    “data_shape”: [1, 1014] 

}], “input_type”: “application/json”, “outputs”: [{ 

    “data_name”: “softmax”, 

    “data_shape”: [0, 7] 

}], “output_type”: “application/json” 

}

 

입력과 출력은 모두 텍스트이며 JSON 형식으로 전달됩니다. [1,1014]의 입력 크기는 종이의 권장 사항이며 Amazon 제품 데이터셋은 7 개의 출력 클래스를 가지고 있습니다. synset 텍스트 파일은 Amazon 제품 데이터셋의 7 가지 출력 클래스를 저장합니다.

 

이러한 모든 파일은 MMS 내보내기 도구를 사용하여 단일 보관 파일로 패키지화 할 수 있습니다. 아카이브를 구축하려면 완전한 사용자 정의 서비스 파일 아티팩트가 필요합니다. MMS를 설치하고 모델 아티팩트를 같은 폴더에 배치하십시오.

 

$ mxnet-model-export –model-name=”character_cnn” –model-path=”/path/to/model/folder” –service-file-path=”/path/to/model/folder/service_file.py”

 

사전 패키지된 모델 을 다운로드할 수도 있습니다.

 

다음과 같은 명령어로 모델을 제공할 수도 있습니다.

 

$ pip install mxnet-model-server

$ mxnet-model-server –models crepe=character_cnn.model

 

이 명령은 http://127.0.0.1:8080에 모델 제공을 시작합니다. MMS 서버 및 내보내기 명령 행 옵션에 대한 자세한 내용은 MMS 설명서를 참조하십시오.

 

서버에서 예측을 얻으려면 새 터미널 창을 열고 다음 명령을 실행하십시오.

 

$ curl -X POST http://127.0.0.1:8080/crepe/predict -F “data=[{‘review_title’:’Inception is the best’,’review’: ‘great direction and story’}]”

 

서버의 출력은 다음과 같습니다.

 

{“prediction”:[{“category”:“Movies_and_TV”}]}

 

이제 다른 예를 봅시다.

 

$ curl -X POST http://127.0.0.1:8080/crepe/predict -F “data=[{‘review_title’:’fantastic quality’,’review’: ‘quality sound playback’}]”

 

요청에 대한 응답은 아래와 같습니다.

 

{“prediction”:[{“category”:“CDs_and_Vinyl”}]}

 

확장 가능한 프로덕션 사용 케이스의 경우 컨테이너를 사용하는 것이 좋습니다. 소스에서 MMS 컨테이너를 만들 수 있으며 MMS DockerHub 저장소에서 필요한 이미지를 가져올 수 있습니다.

 

더 배우고 기여하세요!

MMS에 대한 자세한 내용은 Single Shot Multi Object Detection (SSD) 자습서에서 시작하십시오.이 자습서에서는 SSD 모델을 전달하고 제공하는 과정을 안내합니다. 또한 저장소의 모델 zoo문서 폴더에서 더 많은 예제와 문서를 찾을 수 있습니다.

 

우리는 MMS를 지속적으로 개발함에 따라 질문, 요청 및 기고문으로 제출된 커뮤니티 참여를 환영합니다. 본격적으로 시작하려면 awslabs/mxnet-model-server 로 가보세요.

 

 

원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/model-server-for-apache-mxnet-adds-support-for-serving-gluon-models/

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.