機械学習基盤(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をかなり簡単に構築できる。
最初にノートブックインスタンスはプライマリリソースと呼ばれ、ノートブックインスタンスを作成したアカウントに権限が与えられるっぽい
・学習フェーズ → 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
cifar10.pyのはこのコード
これでノートブックインスタンスから、エンドポイントの設定までできてる。
あとは外部で訓練したモデルのエンドポイントを作成するだけ。
4.外部の訓練済みモデルのエンドポイントの作成
左の「トレーニングジョブ」で作成したジョブを選択し、上の「アクション」から「モデルの作成」をクリック。
モデル名を入れ、「モデルアーティファクトと推論イメージの場所を指定」を選択。
外部トレーニングしたモデルやコードを含んだDockerイメージのURLを「推論コードイメージの場所」に入力。
ちなみにオプションの「アーティファクトの場所」は指定しない。
そのあと作成したモデルから「エンドポイントの作成」を選択。
「エンドポイント名」入力後(今回は’inception’とつけた)、「既存のエンドポイント設定の使用」から、さっき作ったやつを指定して、エンドポイントの作成。
下のようにエンドポイントが「InService」になってれば、エンドポイント完成。
構築したモデルの本番環境はAmazon sagemaker上でデプロイできる。
参考サイトではテスト環境のための、postmanというツールをダウンロードして、デプロイしてた。
Postmanは、認証、テスト、ドキュメント作成、バージョン管理とかテスト環境用のデプロイ向けらしい。
本番環境は、Amazon sagemakerとEC2でChalice と AWS 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>