アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

Amazon sagemakerで機械学習基盤(MLops)のベース環境構築手順・使い方まとめ

機械学習基盤(MLops)をkubernetesで構築してたけど、amazon sagemakerを使ったら、kubernetesよりかなり簡単に構築できた。

今回は、外部で学習したモデルでエンドポイント作成までやってみた。だいたい、MLopsをAmazon sagemakerで構築する前段階くらい。それでもかなりエラーでハマったので、その手順とかしっかりまとめてく。

目次
1.Amazon sageMakerについて

2.AWSコマンドの設定からECRにDockerイメージpush

3. ノートブックインスタンスでデプロイとエンドポイント削除まで

4.外部の訓練済みモデルのエンドポイントの作成

5.最後に & sagemakerいじってて気づいたことメモ


1.Amazon sageMakerについて

Amazon sageMakerは「開発、学習、デプロイ」の3つのフェーズに分かれてる。


それぞれのフェーズで、用途に特化した専用インスタンスを利用し、従来の開発環境より、MLopsをかなり簡単に構築できる。


開発フェーズ →Notebookインスタンス
最初にノートブックインスタンスはプライマリリソースと呼ばれ、ノートブックインスタンスを作成したアカウントに権限が与えられるっぽい

学習フェーズ → trainingインスタンス
外部学習モデルのデプロイにはいらないと思ってたら、必要だった。

デプロイフェーズ → Hostingインスタンス

これも実はトレーニングジョブでやる必要があって、デプロイフェーズが終わった後に、外部で学習したモデルのエンドポイントを作成できる。

まず、ノートブックインスタンスを作成、そのjupyter上でデプロイ、エンドポイントの削除までする。それで最終的に学習済みモデルのエンドポイントを作成。

文字だとややこしいので、順にやってくみた。



2.AWSコマンドの設定からECRにDockerイメージpush

まずはサイト通りにコンソールで定番のAWS CLI(AWSコマンド)を利用できるようにする。

$ aws configure


で「アクセスキー、シークレットアクセスキー、リージョン、json」を設定。

次はAWSのホーム画面からECRを選び、ECR画面上でレポジトリを作成。
ECRのリージョンはオハイオ(us-east-2)。
今回はGUIで「image」という名前のレポジトリを作成



1.dockerのインストール

まずdockerにログインコマンドを発行する。

そのためにdockerコマンド(docker)をインストール。公式サイト通りにdockerをインストール。

$ docker version

で色々出てくればOK

$ docker version
Client: Docker Engine - Community
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:47:43 2018
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:55:00 2018
  OS/Arch:          linux/amd64
  Experimental:     false



2.dockerイメージ作成&ECRにpush

下記手順でECRにアクセス。dockerイメージを作成して、ECRへpush

$ docker build -t <イメージ名> . (今回はイメージ名=pred)
# コンテナを起動して、Exitしないことを確認
$ docker run --rm -itd pred


# ECRへログイン(権限が付与されてれば、クソ長いdocker loginコマンドが出てくるので、それをコピペして、コンソールで実行。)
$ aws ecr get-login --no-include-email --region us-east-2
$ docker login -u AWS -p= https://802052389487.dkr.ecr.us-east-2.amazonaws.com


# タグ付け & レポジトリへpush
$ docker tag pred <レポジトリURL>
$ docker push <レポジトリURL>


リージョン名はSageMaker と同じリージョン(ここではオハイオ)にしないとだめ。つまり、sagemakerとECRのリージョンは同じ必要がある。


ちなみにDockerfileの中身はこんな感じ。tensorflow用のdockerfileを参考にしてある。
デプロイ用コードはもちろん、学習済みモデルも入れてある。

FROM ubuntu:18.04
WORKDIR /app 
COPY *.py /app/ 
COPY grids.txt /app/ 
COPY inception.h5 /app/inception.h5  # 学習済みモデル
RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
        curl \
        libfreetype6-dev \
        libhdf5-serial-dev \
        libpng-dev \
        libzmq3-dev \
        pkg-config \
        python \
        python-dev \
        rsync \
        software-properties-common \
        unzip \
        && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN curl -O https://bootstrap.pypa.io/get-pip.py && \
    python get-pip.py && \
    rm get-pip.py
RUN pip install --upgrade pip
RUN pip install -U numpy flask scikit-image 
ENTRYPOINT ["python", "app.py"] 
EXPOSE 8080


今回はあくまでベース基盤の構築方法なので、学習済みモデルと基本的なコードのみ。


3. ノートブックインスタンスでデプロイとエンドポイント削除まで

AWSのホーム画面からAmazon sagemakerへ移動し、左の「ノートブックインスタンス」を選択し、作成。

適当なs3バケットを指定すると専用のIAMロールが作成される。
juputerを開いて、外部で公開されてるコードでfit(), deploy()メソッドでデプロイとエンドポイントの削除まで。

ちなみにjupyterノートブック上でも、コンソール同様にpipでのinstallができた。

# 前準備
import os
import boto3
import sagemaker
from sagemaker.mxnet import MXNet
from mxnet import gluon
from sagemaker import get_execution_role
sagemaker_session = sagemaker.Session()
role = get_execution_role()
# pipでインストール
%%sh 
pip install mxnet

# データセット用意
from cifar10_utils import download_training_data
download_training_data()
#  'sagemaker-us-east-2-947675573067'というバケット作ったあと実行
inputs = sagemaker_session.upload_data(path='data', key_prefix='data/gluon-cifar10')
print('input spec (in this case, just an S3 path): {}’.format(inputs))
!cat ‘cifar10.py’  
m = MXNet("cifar10.py", 
          role=role, 
          train_instance_count=1, 
          train_instance_type="ml.p2.8xlarge",
          hyperparameters={'batch_size': 128, 
                           'epochs': 50, 
                           'learning_rate': 0.1, 
                           'momentum': 0.9})

# train
m.fit(inputs)

# デプロイ
predictor = m.deploy(initial_instance_count=1, instance_type=‘ml.m4.xlarge')

# エンドポイント削除
sagemaker.Session().delete_endpoint(predictor.endpoint)


ちなみにコードはこのサイトのやつを参考にした。
qiita.com

github.com


cifar10.pyのはこのコード



これでノートブックインスタンスから、エンドポイントの設定までできてる。

あとは外部で訓練したモデルのエンドポイントを作成するだけ。



4.外部の訓練済みモデルのエンドポイントの作成


左の「トレーニングジョブ」で作成したジョブを選択し、上の「アクション」から「モデルの作成」をクリック。


モデル名を入れ、「モデルアーティファクトと推論イメージの場所を指定」を選択。

外部トレーニングしたモデルやコードを含んだDockerイメージのURLを「推論コードイメージの場所」に入力。


ちなみにオプションの「アーティファクトの場所」は指定しない。

そのあと作成したモデルから「エンドポイントの作成」を選択。

「エンドポイント名」入力後(今回は’inception’とつけた)、「既存のエンドポイント設定の使用」から、さっき作ったやつを指定して、エンドポイントの作成。

下のようにエンドポイントが「InService」になってれば、エンドポイント完成。


構築したモデルの本番環境はAmazon sagemaker上でデプロイできる。

参考サイトではテスト環境のための、postmanというツールをダウンロードして、デプロイしてた。

Postmanは、認証、テスト、ドキュメント作成、バージョン管理とかテスト環境用のデプロイ向けらしい。


本番環境は、Amazon sagemakerとEC2でChaliceAWS SDK for Python (Boto3)を使ってデプロイできるらしい



5.最後に

これで、外部で訓練したモデルのエンドポイントを作成できた。MLopsのベース基盤構築にかなり近づいた感がすごい。

あとはflaskあたりでアプリケーション作って本格的にデプロイしたいけど、まだできてないのでそこらへんはまた次の機会にまとめたい。



sagemakerいじってて気づいたことメモ

・「Amazon Elastic Inference」とは
GPU をSageMaker のエンドポイントにアタッチ(使用)し、高速化する

・ARNはノートブックインスタンスからエンドポイントまで同じ
ARNについて

・ノートブックインスタンスはプライマリリソースで初めに必ず作成する
→作成したアカウントに管理権限があるっぽい。他はサブリソース。

・ECR とsagemakerとs3のリージョンは同じ必要あり

・EC2のアクセスキーの作り方

1.キーペア発行

2.移動
$ cd Downloads

3.EC2へコピー
$ cp sagemaker.pem.txt ~/.ssh/<任意のname(sagemaker_ops)>

4.アクセス許可付与
$chmod 400 ~/.ssh/sagemaker_ops

5.試しにroot@でログイン(リージョン=オハイオで、linuxインスタンス)
$ ssh -i ~/.ssh/sagemaker_ops root@<EC2のiPv4パブリックIP>
>>> Please login as the user "ec2-user" rather than the user “root”.

6.アクセス
$ ssh -i ~/.ssh/sagemaker_ops ec2-user@<EC2のiPv4パブリックIP>

参考サイト:Amazon SageMakerを使った学習済みモデルの流用〜ここどこサーチのデプロイまで