Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[JAWS DAYS 2019] PythonとSageMakerで始めるMLチームのみで...
Search
ababa831
February 23, 2019
Programming
7
4.2k
[JAWS DAYS 2019] PythonとSageMakerで始めるMLチームのみで完結するAPIの構築事例
JAWS DAYS 2019 登壇資料です.
無 Bトラック #jd2019_b 10:10〜10:30
ababa831
February 23, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
Haze - Real time background blurring
chrisbanes
1
510
Go の GC の不得意な部分を克服したい
taiyow
3
790
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
7
1.3k
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
120
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
3
290
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
create_tableをしただけなのに〜囚われのuuid編〜
daisukeshinoku
0
260
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
CQRS+ES の力を使って効果を感じる / Feel the effects of using the power of CQRS+ES
seike460
PRO
0
140
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
810
今年一番支援させていただいたのは認証系サービスでした
satoshi256kbyte
1
260
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
500
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Unsuck your backbone
ammeep
669
57k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Making Projects Easy
brettharned
116
5.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Building an army of robots
kneath
302
44k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
A Philosophy of Restraint
colly
203
16k
Transcript
JAWS DAYS 2019 Engineer Akihisa Takeda [AI/ML] PythonとSageMakerで始める MLチームのみで完結するAPIの構築事例 1
事業紹介 弁護士によって行われる契約書のレビュー*を 機械学習によって行う あなたのためのリーガルサービス(The Legal Service For You)を提供 2 ※「レビュー」…条項別のリスク判定/修正案の提案/修正意図の提案など
自己紹介 Akihisa Takeda @ababa831 活動 • 2018年11月~ GVA TECH 正社員
◦ ML/NLPエンジニア(見習い) ▪ MLアルゴリズム研究開発~APIの構築まで ▪ AWSは入社後に触れ始める 修行中! • Kaggler (Competitions Expert) 3
内容 • ML API構築の課題 • 本講演の目的 • Amazon SageMakerについて •
カスタムアルゴリズムによるAPIの実装 • APIの管理 • 得られた効果 Note: 研究開発(機械学習(ML),自然言語処理)の話はいたしません 4
ML API構築の課題 5
データ分析・ML開発業務で求められること 検証結果をAPI化し,プロダクトに反映して, 初めてユーザに体感してもらえ,サービスの価値が生まれる 検証〜プロダクト反映までのスピードが 会社の利益に直結 分析・検証 学習・ モデル変換 APIのデプロイ アルゴリズム
開発 プロダクト に反映 ユーザに初めて届く 6
データ分析・ML開発業務で求められること 検証結果をAPI化し,プロダクトに反映して, 初めてユーザに体感してもらえ,サービスの価値が生まれる 検証〜プロダクト反映までのスピードが 会社の利益に直結 分析・検証 学習・ モデル変換 APIのデプロイ アルゴリズム
開発 プロダクト に反映 ユーザに初めて届く この流れをできる限り高速化したい! 7
検証〜プロダクト反映の高速化を阻む課題 ⭕ 左半分までは普段の業務でカバー可能 ❌ APIの構築に関しては,普段の業務では扱わない別種のスキルセットが必要 分析・検証 学習・ モデル変換 APIのデプロイ アルゴリズム
開発 プロダクト に反映 別種のスキルセット 普段の業務範囲 MLチームにとって,APIの構築が大きな壁となる 8
EC2を利用してAPIを構築する場合 • 初期環境設定(Linux, サーバ フレームワーク etc.)周りに手間がかかる & 作業する人によって設定の差分が発生しやすい • 運用管理(Kernel更新,脆弱性対応)に手間がかかる
• APIをデプロイするための(インフラ, CI/CD)基盤を作るのがつらい • 負荷分散の対応が必要 9
EC2を利用してAPIを構築する場合 • 初期環境設定(Linux, サーバ フレームワーク etc.)周りに手間がかかる & 作業する人によって設定の差分が発生しやすい • 運用管理(Kernel更新,脆弱性対応)に手間がかかる
• APIをデプロイするための(インフラ, CI/CD)基盤を作るのがつらい • 負荷分散の対応が必要 インフラの構築・管理の知識やリソースが必要 10
EC2を利用してAPIを構築する場合 • 初期環境設定(Linux, サーバ フレームワーク etc.)周りに手間がかかる & 作業する人によって設定の差分が発生しやすい • 運用管理(Kernel更新,脆弱性対応)に手間がかかる
• APIをデプロイするための(インフラ, CI/CD)基盤を作るのがつらい • 負荷分散の対応が必要 インフラの構築・管理の知識やリソースが必要 データサイエンティスト・MLエンジニアが 本業に集中できず生産性が落ちる 11
WEB・インフラチームがAPIの構築を担当する場合 • WEB,インフラエンジニアの人的コストがかかる • データサイエンティスト・MLエンジニアが作成した コードを読むスキルがWEB側に要求される (MLの知識,やんちゃなコードの解読) 12
WEB・インフラチームがAPIの構築を担当する場合 • WEB,インフラエンジニアの人的コストがかかる • データサイエンティスト・MLエンジニアが作成した コードを読むスキルがWEB側に要求される (MLの知識,やんちゃなコードの解読) 高速化の代わりにコスト面が犠牲に 連携がうまく行かず,あまり高速化できない 13
本講演の目的 14
本講演の目的 Amazon SageMaker + 検証・モデリングに使ったコードをそのまま利用 MLチームだけでAPIの構築・運用して, 検証〜API化までを高速化した事例を紹介 15
Amazon SageMakerについて 16
Amazon SageMaker フルマネージド型の機械学習サービス データサイエンスのワークフロー全体をカバー • 調査・分析 あらかじめ環境構築されたJupyter notebookで手軽に分析 • 開発・学習
SageMaker Python SDKで簡単に学習可能 • デプロイ・運用 フルマネージドなのでEC2でAPIを構築・運用するときの問題を考えなくてよい 17
Amazon SageMaker フルマネージド型の機械学習サービス データサイエンスのワークフロー全体をカバー • 調査・分析 あらかじめ環境構築されたJupyter notebookで手軽に分析 • 開発・学習
SageMaker Python SDKで簡単に学習可能 • デプロイ・運用 フルマネージドなのでEC2でAPIを構築・運用するときの問題を考えなくてよい WEB・インフラに詳しくないデータサイエンティスト・MLエンジニア でも簡単にMLモデルのAPI化が可能 18
SageMakerで使用できるアルゴリズムの選択肢 • 組み込みアルゴリズム SageMakerで標準的に実装されている標準的なアルゴリズム MLアルゴリズムの選択,パラメータ値の設定だけで 簡単に学習・推論可能 • カスタムアルゴリズム 自分で用意したMLのアルゴリズムをSageMakerで使えるようにしたも の
SageMakerで動く学習・推論用のDockerコンテナをカスタマイズ 19
組み込みアルゴリズムの特徴 ⭕ 主要なMLフレームワーク(scikit-learn, TensorFlow, Chainer, etc.)に対応 ❌ 使用できるMLアルゴリズムは多くない ❌ 組み込みアルゴリズムの文法を覚える学習コストがかかる
❌ 検証で使ったMLコードを組み込みアルゴリズムに改変する工数がそれなりに かかる Note: script modeの登場で大分改変しやすくなったが,まだ対応アルゴリズムは多くない 20 ⭕: 長所, ❌: 短所
組み込みアルゴリズムの特徴 ⭕ 主要なMLフレームワーク(scikit-learn, TensorFlow, Chainer, etc.)に対応 ❌ 使用できるMLアルゴリズムは多くない ❌ 組み込みアルゴリズムの文法を覚える学習コストがかかる
❌ 検証で使ったMLコードを組み込みアルゴリズムに改変する工数がそれなりに かかる Note: script modeの登場で大分改変しやすくなったが,まだ対応アルゴリズムは多くない 検証の成果を素早くサービスに反映させたい データサイエンティスト・MLエンジニアのニーズにあわない 21 ⭕: 長所, ❌: 短所
カスタムアルゴリズムの特徴 ⭕ 手元のMLコードをほとんど改変せずにSageMaker用のコンテナ化できる ❌ 自分でコンテナを作成する必要がある →DockerfileとECR(Elastic Container Registry)にコンテナイメージを pushするスクリプトを初回用意して, SageMakerコンテナ内のコードを少し改変するだけ
22 ⭕: 長所, ❌: 短所
カスタムアルゴリズムの特徴 ⭕ 手元のMLコードをほとんど改変せずにSageMaker用のコンテナ化できる ❌ 自分でコンテナを作成する必要がある →DockerfileとECR(Elastic Container Registry)にコンテナイメージを pushするスクリプトを初回用意して, SageMakerコンテナ内のコードを少し改変するだけ
検証に使ったMLコードを生かして素早くAPI化したいので, カスタムアルゴリズムを利用する 23 ⭕: 長所, ❌: 短所
カスタムアルゴリズムによるAPIの実装 24
AWS構成 学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker
API EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 25
学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker API
EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL フルマネージドなため • ALB • API GateWay が不要 AWS構成 26
学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker API
EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 処理の流れ 27
学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker API
EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 処理の流れ 28
学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker API
EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 処理の流れ 29
学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker API
EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 処理の流れ 30
ディレクトリ構成と各階層の役割 公式のリポジトリのscikit-learn用 サンプルコード*をベースにカスタマイズ * 「scikit_bring_your_own」で検索 . ├── container │ ├──
Dockerfile │ ├── build_and_push.sh │ └── custom_algorithm │ ├── apps │ │ ├── .temps/ │ │ ├── 検証・学習用コード群 │ │ ├── main.py │ │ └── s3_upload.py │ ├── predictor.py │ ├── debug_api.py │ ├── test_api.py │ ├── train │ ├── serve │ ├── nginx.conf │ └── wsgi.py ├── dummy_data ├── generate_endpoint.py └── test_endpoint.py https://github.com/awslabs/amazon-sagemaker-examples/tree/master/advanced_functionality/scikit_bring_your_own 31
ディレクトリ構成と各階層の役割 • ./container/custom_algorithm/apps 検証・学習用コードを利用して S3に学習済みモデルをupload . ├── container │ ├──
Dockerfile │ ├── build_and_push.sh │ └── custom_algorithm │ ├── apps │ │ ├── .temps/ │ │ ├── 検証・学習用コード群 │ │ ├── main.py │ │ └── s3_upload.py │ ├── predictor.py │ ├── debug_api.py │ ├── test_api.py │ ├── train │ ├── serve │ ├── nginx.conf │ └── wsgi.py ├── dummy_data ├── generate_endpoint.py └── test_endpoint.py 32
ディレクトリ構成と各階層の役割 • ./container/custom_algorithm/apps 検証・学習用コードを利用して S3に学習済みモデルをupload • ./container/custom_algorithm SageMakerで動かすAPIサーバ(Flask), デバッグ用ローカルAPIサーバ(Flask), 学習済みモデルをSageMakerでDLするスクリプト
. ├── container │ ├── Dockerfile │ ├── build_and_push.sh │ └── custom_algorithm │ ├── apps │ │ ├── .temps/ │ │ ├── 検証・学習用コード群 │ │ ├── main.py │ │ └── s3_upload.py │ ├── predictor.py │ ├── debug_api.py │ ├── test_api.py │ ├── train │ ├── serve │ ├── nginx.conf │ └── wsgi.py ├── dummy_data ├── generate_endpoint.py └── test_endpoint.py サンプルを そのまま利用 33
ディレクトリ構成と各階層の役割 • ./container/custom_algorithm/apps 検証・学習用コードを利用して S3に学習済みモデルをupload • ./container/custom_algorithm SageMakerで動かすAPIサーバ(Flask), デバッグ用ローカルAPIサーバ(Flask), 学習済みモデルをSageMakerでDLするスクリプト
• ./container カスタムアルゴリズムを入れたSageMaker用 Docker imageをECRにpushする . ├── container │ ├── Dockerfile │ ├── build_and_push.sh │ └── custom_algorithm │ ├── apps │ │ ├── .temps/ │ │ ├── 検証・学習用コード群 │ │ ├── main.py │ │ └── s3_upload.py │ ├── predictor.py │ ├── debug_api.py │ ├── test_api.py │ ├── train │ ├── serve │ ├── nginx.conf │ └── wsgi.py ├── dummy_data ├── generate_endpoint.py └── test_endpoint.py 34
ディレクトリ構成と各階層の役割 • ./container/custom_algorithm/apps 検証・学習用コードを利用して S3に学習済みモデルをupload • ./container/custom_algorithm SageMakerで動かすAPIサーバ(Flask), デバッグ用ローカルAPIサーバ(Flask), 学習済みモデルをSageMakerでDLするスクリプト
• ./container カスタムアルゴリズムを入れたSageMaker用 Docker imageをECRにpushする • . エンドポイントの作成とAPIの動作確認 . ├── container │ ├── Dockerfile │ ├── build_and_push.sh │ └── custom_algorithm │ ├── apps │ │ ├── .temps/ │ │ ├── 検証・学習用コード群 │ │ ├── main.py │ │ └── s3_upload.py │ ├── predictor.py │ ├── debug_api.py │ ├── test_api.py │ ├── train │ ├── serve │ ├── nginx.conf │ └── wsgi.py ├── dummy_data ├── generate_endpoint.py └── test_endpoint.py 35
PC(ローカル)上に次を用意 • 手元の検証用 MLコード • 一時的に保存したモデルをS3に Uploadするコード main.pyの実行 1. モデルの学習
2. 学習済みモデルをローカルに 一時的に保存 3. モデルをS3にUpload apps 検証用MLコード .tmps そのまま利用 s3_upload.py main.py main.py py 検証用ML コード .tmps 学習 UP S3 Bucket py 実装のポイント [学習 & モデルのUpload] 36
Flaskでルーティング 受信,推論,レスポンス処理 predictor.py(抜粋) apps .tmps s3_upload.py main.py 検証用MLコード custom_algorithm predictor.py
実装のポイント [推論用 API] 37
Flaskでルーティング 受信,推論,レスポンス処理 predictor.py(抜粋) apps .tmps s3_upload.py main.py 検証用MLコード custom_algorithm predictor.py
具体的な推論処理はapps内で! アルゴリズム変更時に ここを変えなくて良い 推論結果 実装のポイント [推論用 API] 38 頻繁に変更
デプロイ時にtrainスクリプトが走る →このとき,boto3でS3からSageMaker用コンテナにDLされるようにコードを作成 custom_algorithm predictor.py apps train # (省略) model_path =
'/opt/ml/model' class Train(object): def train(self): # (省略) self.download_from_s3(model_s3_path, dst_filename) # (省略) def download_from_s3(self, obj_s3_path, dst_filename): # (省略) dst = os.path.join(model_path, dst_filename) with open(dst, 'wb') as data: s3.download_fileobj(bucket_name, obj_s3_path, data) デプロイ時に走る 実装のポイント [デプロイ時にSageMaker用コンテナにモデルをDL] 39
デプロイ時にtrainスクリプトが走る →このとき,boto3でS3からSageMaker用コンテナにDLされるようにコードを作成 custom_algorithm predictor.py apps train # (省略) model_path =
'/opt/ml/model' class Train(object): def train(self): # (省略) self.download_from_s3(model_s3_path, dst_filename) # (省略) def download_from_s3(self, obj_s3_path, dst_filename): # (省略) dst = os.path.join(model_path, dst_filename) with open(dst, 'wb') as data: s3.download_fileobj(bucket_name, obj_s3_path, data) SageMakerが想定するモデルの配置先 実装のポイント [デプロイ時にSageMaker用コンテナにモデルをDL] 40
デプロイ時にtrainスクリプトが走る →このとき,boto3でS3からSageMaker用コンテナにDLされるようにコードを作成 custom_algorithm predictor.py apps train # (省略) model_path =
'/opt/ml/model' class Train(object): def train(self): # (省略) self.download_from_s3(model_s3_path, dst_filename) # (省略) def download_from_s3(self, obj_s3_path, dst_filename): # (省略) dst = os.path.join(model_path, dst_filename) with open(dst, 'wb') as data: s3.download_fileobj(bucket_name, obj_s3_path, data) Trainクラス > trainメソッドに S3からモデルをDL 実装のポイント [デプロイ時にSageMaker用コンテナにモデルをDL] 41
1. ローカル上でAPIの動作確認をできるように,次のコードを用意 • local_api.py predictor.pyに,Flaskのdebugモードを追記 • test_api.py urllib.requestを用いて,適当なデータを送信し,結果を取得 custom_algorithm predictor.py
apps train local_api.py test_api.py 実装のポイント [ローカルでAPIのdebug] 42
2. ECRにpushするDocker imageを使い,ローカル上でコンテナを起動 • APIサーバ側 • クライアント側 a. `docker ps`で起動中コンテナIDを確認
b. `docker exec`でAPIを叩く 実装のポイント [ローカルでAPIのdebug] 43
カスタムアルゴリズム入りDocker imageをつくるため,ローカルの `custom_algorithm`ディレクトリをコンテナにコピペするコードをDockerfileに記述 COPY custom_algorithm /opt/program WORKDIR /opt/program Dockerfile(抜粋) custom_algorithm
コピー custom_algorithm container Dockerfile build_and_push.sh 実装のポイント [Dockerfile] 44
Docker image作成して,ECRにpushするシェルスクリプトをつくる # ECRリポジトリの確認 aws ecr describe-repositories --repository-names "${image}" >
/dev/null 2>&1 # 該当するリポジトリが一覧になければ,新規作成 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${image}" > /dev/null fi # ECRにログイン $(aws ecr get-login --profile ${profile} --region ${region} --no-include-email) # Docker image 作成→ECRへpush docker build -t ${image} . docker tag ${image} ${fullname} docker push ${fullname} build_and_push.sh(公式リポジトリ*引用, Dockerfileと同ディレクトリ) 実装のポイント [Docker imageのpush用コード] 45 https://github.com/awslabs/amazon-sagemaker-examples/blob/master/advanced_functionality/scikit_bring_your_own/container/build_and_push.sh
AWS上でIAM, VPC周りを設定した後, APIをデプロイしてエンドポイント作成 APIをデプロイするためには SageMaker SDK+組み込みアルゴリズム を介す必要あり # 学習用ダミーデータセットをS3に配置 data_location
= session.upload_data( './dummy_data.pkl', key_prefix=s3_prefix) # (中略) # SageMaker SDKの学習器を設定 clf = sagemaker.estimator.Estimator( training_image, arn_iam_role, train_instance_count=1, train_instance_type='ml.m4.xlarge', sagemaker_session=session, subnets=subnets, security_group_ids=secur_group_ids) # 空学習 clf.fit(data_location) 実際の学習済みモデルは,デプロイ中に前述のtrain スクリプトが走り,S3からSageMakerコンテナにDL 実装のポイント [エンドポイントの作成] ダミー組み込みアルゴリズムを空学習 46
• boto3で確認 • AWS CLIで確認 SageMaker側のログはCloudWatchで確認できる runtime_client = boto3.client('runtime.sagemaker') response
= runtime_client.invoke_endpoint( EndpointName=sagemaker_endpoint_path, ContentType='application/json', # リクエストのMIMEタイプ Body=test_serialized, # 送るデータの中身 Accept='application/json' # レスポンスのMIMEタイプ ) $ aws sagemaker-runtime invoke-endpoint --endpoint-name 'hoge' ¥ > --body '{"input": 1}' --content-type 'application/json' output.txt 実装のポイント [APIの動作確認] 47
APIの管理 48
APIのモニタリング(負荷,scaling)エンドポイントの管理(確認,削除)機能 AWSコンソール > Amazon SageMaker APIの管理 49
APIのモニタリング(負荷,scaling)エンドポイントの管理(確認,削除)機能 AWSコンソール > Amazon SageMaker APIの管理 API運用に関する知見の少ない データサイエンティスト・MLエンジニアにとっても扱いやすい 50
得られた効果 51
• SageMakerによって,API構築がMLチームで完結 ◦ EC2の初期環境設定の工数(数日)→ 不要 ◦ EC2のメンテナンス((不)定期 x 日/回)→ 不要
→分析業務にリソースを割ける!APIの数が増えても平気! • 検証用コードの改変自由度が高く,(ほぼ)そのまま使える → 新version APIリリースが1日で! • フルマネージド+SageMaker APIの管理機能 ◦ リクエスト数が増えた時のスケールアウトを勝手にやってくれる ◦ 過去作成したエンドポイントへの切り替えが簡単 → WEB側もその切り替えのみで対応可能 得られた効果 52
• SageMakerによって,API構築がMLチームで完結 ◦ EC2の初期環境設定の工数(数日)→ 不要 ◦ EC2のメンテナンス((不)定期 x 日/回)→ 不要
→分析業務にリソースを割ける!APIの数が増えても平気! • 検証用コードの改変自由度が高く,(ほぼ)そのまま使える → 新version APIリリースが1日で! • フルマネージド+SageMaker APIの管理機能 ◦ リクエスト数が増えた時のスケールアウトを勝手にやってくれる ◦ 過去作成したエンドポイントへの切り替えが簡単 → WEB側もその切り替えのみで対応可能 得られた効果 53 検証の成果をプロダクトへ素早く反映できる体制が整った
最後に... We're Hiring! 54 Wantedly GVA TECH