Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[JAWS DAYS 2019] PythonとSageMakerで始めるMLチームのみで...

ababa831
February 23, 2019

[JAWS DAYS 2019] PythonとSageMakerで始めるMLチームのみで完結するAPIの構築事例

JAWS DAYS 2019 登壇資料です.
無 Bトラック #jd2019_b 10:10〜10:30

ababa831

February 23, 2019
Tweet

Other Decks in Programming

Transcript

  1. 自己紹介 Akihisa Takeda @ababa831 活動 • 2018年11月~ GVA TECH 正社員

    ◦ ML/NLPエンジニア(見習い) ▪ MLアルゴリズム研究開発~APIの構築まで ▪ AWSは入社後に触れ始める 修行中! • Kaggler (Competitions Expert) 3
  2. 内容 • ML API構築の課題 • 本講演の目的 • Amazon SageMakerについて •

    カスタムアルゴリズムによるAPIの実装 • APIの管理 • 得られた効果 Note: 研究開発(機械学習(ML),自然言語処理)の話はいたしません 4
  3. EC2を利用してAPIを構築する場合 • 初期環境設定(Linux, サーバ フレームワーク etc.)周りに手間がかかる & 作業する人によって設定の差分が発生しやすい • 運用管理(Kernel更新,脆弱性対応)に手間がかかる

    • APIをデプロイするための(インフラ, CI/CD)基盤を作るのがつらい • 負荷分散の対応が必要 インフラの構築・管理の知識やリソースが必要 10
  4. EC2を利用してAPIを構築する場合 • 初期環境設定(Linux, サーバ フレームワーク etc.)周りに手間がかかる & 作業する人によって設定の差分が発生しやすい • 運用管理(Kernel更新,脆弱性対応)に手間がかかる

    • APIをデプロイするための(インフラ, CI/CD)基盤を作るのがつらい • 負荷分散の対応が必要 インフラの構築・管理の知識やリソースが必要 データサイエンティスト・MLエンジニアが 本業に集中できず生産性が落ちる 11
  5. Amazon SageMaker フルマネージド型の機械学習サービス データサイエンスのワークフロー全体をカバー • 調査・分析 あらかじめ環境構築されたJupyter notebookで手軽に分析 • 開発・学習

    SageMaker Python SDKで簡単に学習可能 • デプロイ・運用 フルマネージドなのでEC2でAPIを構築・運用するときの問題を考えなくてよい 17
  6. Amazon SageMaker フルマネージド型の機械学習サービス データサイエンスのワークフロー全体をカバー • 調査・分析 あらかじめ環境構築されたJupyter notebookで手軽に分析 • 開発・学習

    SageMaker Python SDKで簡単に学習可能 • デプロイ・運用 フルマネージドなのでEC2でAPIを構築・運用するときの問題を考えなくてよい WEB・インフラに詳しくないデータサイエンティスト・MLエンジニア でも簡単にMLモデルのAPI化が可能 18
  7. 組み込みアルゴリズムの特徴 ⭕ 主要なMLフレームワーク(scikit-learn, TensorFlow, Chainer, etc.)に対応 ❌ 使用できるMLアルゴリズムは多くない ❌ 組み込みアルゴリズムの文法を覚える学習コストがかかる

    ❌ 検証で使ったMLコードを組み込みアルゴリズムに改変する工数がそれなりに かかる Note: script modeの登場で大分改変しやすくなったが,まだ対応アルゴリズムは多くない 20 ⭕: 長所, ❌: 短所
  8. 組み込みアルゴリズムの特徴 ⭕ 主要なMLフレームワーク(scikit-learn, TensorFlow, Chainer, etc.)に対応 ❌ 使用できるMLアルゴリズムは多くない ❌ 組み込みアルゴリズムの文法を覚える学習コストがかかる

    ❌ 検証で使ったMLコードを組み込みアルゴリズムに改変する工数がそれなりに かかる Note: script modeの登場で大分改変しやすくなったが,まだ対応アルゴリズムは多くない 検証の成果を素早くサービスに反映させたい データサイエンティスト・MLエンジニアのニーズにあわない 21 ⭕: 長所, ❌: 短所
  9. AWS構成 学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker

    API EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 25
  10. 学習済みモデルの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
  11. 学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker API

    EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 処理の流れ 27
  12. 学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker API

    EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 処理の流れ 28
  13. 学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker API

    EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 処理の流れ 29
  14. 学習済みモデルのUP 学習時に行われること Docker imageのpush時に行われること デプロイ時に行われること API利用時に行われること VPC ECR SageMaker API

    EC2 web/app リクエスト & レスポンス 学習済みモデル (S3に配置) Docker image のDL 開発したMLコードが入った Docker Imageをpush ローカル開発環境 モデルDL 処理の流れ 30
  15. ディレクトリ構成と各階層の役割 公式のリポジトリの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
  16. ディレクトリ構成と各階層の役割 • ./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
  17. ディレクトリ構成と各階層の役割 • ./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
  18. ディレクトリ構成と各階層の役割 • ./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
  19. ディレクトリ構成と各階層の役割 • ./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
  20. 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
  21. Flaskでルーティング 受信,推論,レスポンス処理 predictor.py(抜粋) apps .tmps s3_upload.py main.py 検証用MLコード custom_algorithm predictor.py

    具体的な推論処理はapps内で! アルゴリズム変更時に ここを変えなくて良い 推論結果 実装のポイント [推論用 API] 38 頻繁に変更
  22. デプロイ時に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
  23. デプロイ時に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
  24. デプロイ時に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
  25. 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
  26. 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
  27. • 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
  28. • SageMakerによって,API構築がMLチームで完結 ◦ EC2の初期環境設定の工数(数日)→ 不要 ◦ EC2のメンテナンス((不)定期 x 日/回)→ 不要

    →分析業務にリソースを割ける!APIの数が増えても平気! • 検証用コードの改変自由度が高く,(ほぼ)そのまま使える → 新version APIリリースが1日で! • フルマネージド+SageMaker APIの管理機能 ◦ リクエスト数が増えた時のスケールアウトを勝手にやってくれる ◦ 過去作成したエンドポイントへの切り替えが簡単 → WEB側もその切り替えのみで対応可能 得られた効果 52
  29. • SageMakerによって,API構築がMLチームで完結 ◦ EC2の初期環境設定の工数(数日)→ 不要 ◦ EC2のメンテナンス((不)定期 x 日/回)→ 不要

    →分析業務にリソースを割ける!APIの数が増えても平気! • 検証用コードの改変自由度が高く,(ほぼ)そのまま使える → 新version APIリリースが1日で! • フルマネージド+SageMaker APIの管理機能 ◦ リクエスト数が増えた時のスケールアウトを勝手にやってくれる ◦ 過去作成したエンドポイントへの切り替えが簡単 → WEB側もその切り替えのみで対応可能 得られた効果 53 検証の成果をプロダクトへ素早く反映できる体制が整った