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

CyberAgent AI事業本部2024年度MLOps研修応用編 / mlops-handson

CyberAgent AI事業本部2024年度MLOps研修応用編 / mlops-handson

CybagerAgent AI事業本部 2024年度新卒研修 MLOps 応用編で使用したスライドです。
ハンズオンで使用したGitHub Repository: https://github.com/Tyaba/aws-mlops-handson

同年度のMLOps研修資料はこちらです。
(1/4) CyberAgent AI事業本部2024年度MLOps研修Container編: https://speakerdeck.com/szma5a/container-for-mlops
(2/4) CyberAgent AI事業本部2024年度MLOps研修基礎編: https://speakerdeck.com/nsakki55/mlops-basic
(3/4) CyberAgent AI事業本部2024年度MLOps研修応用編: https://speakerdeck.com/tyaba/mlops-handson
(4/4) CyberAgent AI事業本部2024年度MLOps研修実践編: https://speakerdeck.com/hosimesi11/mlops-practice

Yoshino Teppei

May 30, 2024
Tweet

Other Decks in Technology

Transcript

  1. ©2024 CyberAgent Inc. Distribution prohibited 本講義のゴール (本音) Amazon Elastic Container

    Service (ECS) はフルマネージドのコンテナオー ケストレーションサービスであり、コン テナ化されたアプリケーションをより効 率的にデプロイ、管理、スケールするの に役立ちます。AWS 環境と深く統合さ れ、Amazon ECS Anywhere を使用した 高度なセキュリティ機能を備えた、クラ ウドとオンプレミスでコンテナワーク ロードを実行するための使いやすいソ リューションを提供します。 ECS ECS これDockerコンテナ動かすのに 使ったやつだ! ※AWS公式の ECSのページを引用 5
  2. ©2024 CyberAgent Inc. Distribution prohibited 本日皆さんが触れる技術スタック 6 ML SGDClassifier Feature

    Hashing Python静的解析 isort black flake8 mypy pytest CI/CD Docker GitHub Actions ECS ECR Fargate S3 StepFunctions Event Bridge Auto Scaling ALB AWS
  3. ©2024 CyberAgent Inc. Distribution prohibited 目次 7 1. 前準備 2.

    ローカルでML基盤を開発 3. CI/CD 4. MLパイプラインをAWS上で実行する 5. 推論サーバーをAWS上に立てる
  4. ©2024 CyberAgent Inc. Distribution prohibited 目次 8 1. 前準備 2.

    ローカルでML基盤を開発 3. CI/CD 4. MLパイプラインをAWS上で実行する 5. 推論サーバーをAWS上に立てる
  5. ©2024 CyberAgent Inc. Distribution prohibited ハンズオンレポジトリ 9 $ git clone

    https://github.com/Tyaba/aws-mlops-handson.git ハンズオンレポジトリをクローン
  6. ©2024 CyberAgent Inc. Distribution prohibited 環境変数の設定 11 direnvの設定 $ cp

    .env.example .env $ vi .env USER_NAME=****** AWS_ACCOUNT_ID=****** AWS_ALB_DNS= AWS_BUCKET=${USER_NAME}-mlops-handson AWS_REGION=ap-northeast-1 AWS_PROFILE=ai24-mlops VERSION=2024-05-14 MODEL=sgd_classifier_ctr_model $ direnv allow . USER_NAME your-name フルネームハイフン区切り(ex. yoshino-teppei) AWS_ACCOUNT_ID 123412341234 アカウント IDをコピーして貼り付け
  7. ©2024 CyberAgent Inc. Distribution prohibited 環境変数の設定 12 direnvの設定 $ echo

    $AWS_BUCKET yoshino-teppei-mlops-handson $ eval "$(direnv hook zsh)" >> ~/.zshrc 環境変数が設定できているか確認 設定できていない場合 $ eval "$(direnv hook bash)" >> ~/.bashrc bashを使っている場合 zshを使っている場合
  8. ©2024 CyberAgent Inc. Distribution prohibited terraformの準備 ネットワーク・権限作成 $ cd infra/training

    $ terraform init 作成リソースの事前確認 .terraformと.terraform.lock.hclができる $ terraform plan 意図していないリソースを生成していないか確認 リソースの作成 $ terraform apply terraformのinstall $ brew install terraform 13
  9. ©2024 CyberAgent Inc. Distribution prohibited S3 15 Simple Storage Service

    オブジェクトストレージサービス 非構造化データを低コストで保存できる
  10. ©2024 CyberAgent Inc. Distribution prohibited 目次 21 1. 前準備 2.

    ローカルでML基盤を開発 3. CI/CD 4. MLパイプラインをAWS上で実行する 5. 推論サーバーをAWS上に立てる
  11. ©2024 CyberAgent Inc. Distribution prohibited モデリングを行う 23 jupyter notebookで分析 $

    cd aws-mlops-handson $ poetry run jupyter notebook jupyter notebookに限らず、 vscode等 ipynbを開ける好きなeditorで aws-mlops-handsonを開いても良いです
  12. ©2024 CyberAgent Inc. Distribution prohibited MLパイプラインをローカル実行する 25 コマンド確認 $ make

    help $ make build-ml MLパイプラインのimage build MLパイプラインの実行 $ make run-ml ※Docker Desktopを起動してから 5分程かかります
  13. ©2024 CyberAgent Inc. Distribution prohibited Dockerfileでx86_64を指定してしまっているのでローカルで走らない。下記の 通り一時的に修正する FROM --platform=linux/x86_64 python:3.11.7-slim

    as ml ↓ FROM --platform=linux/arm64 python:3.11.7-slim as ml 以上を編集したあと、 $ make build-ml $ make run-ml してgrid searchが走ればOKです (macの方向け)make run-mlでこける問題
  14. ©2024 CyberAgent Inc. Distribution prohibited デプロイ方法 1. モデルビルドパターン a. Dockerのビルド時にモデルを含めてしまう

    2. モデルロードパターン a. 外部ストレージから実行時に取得 $ make logs predict-api | 2024-05-08 07:16:44 ml.aws.controller INFO: Start downloading model file: sgd_classifier_ctr_model/2024-05-14/model, file_path: files/sgd_classifier_ctr_model/2024-05-14/model predict-api | 2024-05-08 07:16:45 ml.aws.controller INFO: Completely downloaded model file: sgd_classifier_ctr_model/2024-05-14/model, file_path: files/sgd_classifier_ctr_model/2024-05-14/model predict-api | 2024-05-08 07:16:45 ml.model.sgd_classifier_ctr_model INFO: Load sgd_classifier_ctr_model as files/sgd_classifier_ctr_model/2024-05-14/model. 29
  15. ©2024 CyberAgent Inc. Distribution prohibited ローカル開発を体験する 31 ハイパラチューニングを行うモデルを追加する /aws-mlops-handson └

    ml └ model - - - - - - - - - MLモデル ├ sgd_classifier_ctr_model.py └ sgd_classifier_ctr_optuna_model.py MLパイプライン・推論サーバーに追加
  16. ©2024 CyberAgent Inc. Distribution prohibited ローカル開発を体験する 33 実装 /aws-mlops-handson/ml/model/models.py from

    ml.model import BaseModel, SGDClassifierCTRModel, SGDClassifierCTROptunaModel class MODELS(Enum): sgd_classifier_ctr_model = Model( …. ) sgd_classifier_ctr_optuna_model = Model( name="sgd_classifier_ctr_optuna_model", model=SGDClassifierCTROptunaModel, preprocessor=CTRModelPreprocessor, ) オレンジ線の実装を追加
  17. ©2024 CyberAgent Inc. Distribution prohibited ローカル開発を体験する 34 静的解析チェック $ make

    lint pysenによって以下のチェックが実行されます ・isort - - - -import文チェック ・black - - - -コードスタイル整形 ・flake8 - - - コード品質チェック ・mypy - - - - 静的型チェック $ make format エラーが出た場合は... isort・blackによるコード整形が自動で行われます
  18. ©2024 CyberAgent Inc. Distribution prohibited ローカル開発を体験する 35 テストの追加 $ make

    test FAILED tests/ml/model/test_models.py::test_all_models_are_tested - AssertionError: assert ['sgd_classifier_ctr_model'] == ['sgd_classif...optuna_model'] 追加したモデルのテストがないエラーがでます テストを実行
  19. ©2024 CyberAgent Inc. Distribution prohibited ローカル開発を体験する 36 テストの追加 from ml.model

    import SGDClassifierCTRModel, SGDClassifierCTROptunaModel params = { "sgd_classifier_ctr_model": ("sgd_classifier_ctr_model", SGDClassifierCTRModel, CTRModelPreprocessor), "sgd_classifier_ctr_optuna_model": ("sgd_classifier_ctr_optuna_model", SGDClassifierCTROptunaModel, CTRModelPreprocessor), } /aws-mlops-handson/tests/ml/model/test_models.py $ make test テストが通るか確認 オレンジ線の実装を追加
  20. ©2024 CyberAgent Inc. Distribution prohibited ローカル開発を体験する 37 追加したモデルの学習を実行する $ make

    build-ml $ vi .env $ make run-ml AWS_BUCKET=yoshino-teppei-mlops-handson AWS_ACCOUNT_ID=123412341234 AWS_PROFILE=ai24-mlops AWS_ALB_DNS= USER_NAME=yoshino-teppei VERSION=2024-04-01 MODEL=sgd_classifier_ctr_optuna_model 追加したモデル名 optunaによって学習率αが調整される様子が見られます $ echo $MODEL > sgd_classifier_ctr_optuna_model
  21. ©2024 CyberAgent Inc. Distribution prohibited ローカル開発を体験する 38 推論サーバーに複数モデルを乗せる model_candidates =

    ["sgd_classifier_ctr_model", "sgd_classifier_ctr_optuna_model"] model_preprocessor_list = [ get_model_preprocessor(bucket=BUCKET, model_name=model_name, version=VERSION) for model_name in model_candidates ] /aws-mlops-handson/predictor/routers.pyオレンジ線の実装を追加
  22. ©2024 CyberAgent Inc. Distribution prohibited ローカル開発を体験する 39 推論サーバーに複数モデルを乗せる $ make

    up 推論サーバーを起動 $ make predict {"prediction":0.016878810159428242,"model":"sgd_classifier_ctr_optuna_model"} 推論リクエスト 複数のモデルの予測値を返す →ABテストが可能
  23. ©2024 CyberAgent Inc. Distribution prohibited 目次 41 1. 前準備 2.

    ローカルでML基盤を開発 3. CI/CD 4. MLパイプラインをAWS上で実行する 5. 推論サーバーをAWS上に立てる
  24. ©2024 CyberAgent Inc. Distribution prohibited CI/CD 42 静的解析・テストがない場合 バグの混入 可読性の低下

    誰も触れないMLシステム リリース自動化がない場合 手作業によるリリース MLシステムの属人化
  25. ©2024 CyberAgent Inc. Distribution prohibited CI/CD 43 GitHub Actionsの活用 ・静的解析チェック

    ・テスト実行 ・image build/push コードの品質管理・リリースの自動化
  26. ©2024 CyberAgent Inc. Distribution prohibited name: Run tests and linters

    on: push: branches: [main] jobs: tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python 3.11 uses: actions/setup-python@v2 with: python-version: 3.11 - name: Install dependencies run: | pip install --upgrade pip pip install poetry=="1.4.2" poetry install - name: Run pysen lint run: | poetry run pysen run lint - name: Run tests run: | poetry run pytest コード品質管理の自動化 44 /aws-mlops-handson/.github/workflows/test-mlops-handson.yaml 実行環境の設定 pysen, pytestの実行
  27. ©2024 CyberAgent Inc. Distribution prohibited リリースの自動化 45 /aws-mlops-handson/.github/workflows/deploy-mlops-handson.yaml 実行環境の設定 image

    build/push name: deploy-mlops-handson on: push: branches: [main] paths: ['3-mlops-handson/**'] jobs: build: runs-on: ubuntu-latest permissions: id-token: write contents: read defaults: run: working-directory: ./3-mlops-handson steps: - uses: actions/checkout@v3 - uses: aws-actions/configure-aws-credentials@v2 with: role-to-assume: arn:aws:iam::123412341234:role/iam_role_for_github_actions aws-region: ap-northeast-1 - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 - name: Build, tag, and push image to Amazon ECR for ml-pipeline env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPOSITORY: mlops-handson/ml-pipeline run: | IMAGE_TAG=$(git rev-parse --short "$GITHUB_SHA") docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG --target ml . docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG && docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest - name: Build, tag, and push image to Amazon ECR for predict-api env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPOSITORY: mlops-handson/predict-api run: | IMAGE_TAG=$(git rev-parse --short "$GITHUB_SHA") docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG --target predictor ./ docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG && docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
  28. ©2024 CyberAgent Inc. Distribution prohibited 目次 47 1. 前準備 2.

    ローカルでML基盤を開発 3. CI/CD 4. MLパイプラインをAWS上で実行する 5. 推論サーバーをAWS上に立てる
  29. ©2024 CyberAgent Inc. Distribution prohibited 技術選定 49 ・チームにML/DSは1人 ・既存システムのサーバーはECSでホスティング ・既存システムのオフライン処理をECS

    Taskで実行してる ・既存システムのワークフローツールにStepFunctionsを使用してる 前提状況 → 他メンバーの協力が得られるように、既存システムに乗っかる → SageMakerよりチームナレッジがあるECSを優先する → 最初はシンプルに、コンテナを実行するだけの構成にする → チームで面倒をみるワークフローツールは1つにする
  30. ©2024 CyberAgent Inc. Distribution prohibited ECR 55 Elastic Container Registory

    Docker コンテナイメージを管理する マネージドサービス
  31. ©2024 CyberAgent Inc. Distribution prohibited ECS 62 Elastic Container Service

    Docker コンテナを実行する マネージド型のコンテナ オーケストレーションサービス
  32. ©2024 CyberAgent Inc. Distribution prohibited ECS Task定義を作成 69 環境変数 -

    VERSION 2024-05-14 - MODEL sgd_classifier_ctr_model - AWS_BUCKET {name}-mlops-handson
  33. ©2024 CyberAgent Inc. Distribution prohibited ECS Taskを実行 75 VPC {name}-mlops-handson

    サブネット mlops-handson-private-subnet-1a セキュリティグループ mlops-handson-ml-pipeline-sg パブリックIP オフに変更
  34. ©2024 CyberAgent Inc. Distribution prohibited StepFunctionsを作成 85 { "LaunchType": "FARGATE",

    "Cluster": "arn:aws:ecs:ap-northeast-1:123412341234:cluster/yoshino-teppei-mlops-handson-ecs", "TaskDefinition": "arn:aws:ecs:ap-northeast-1:123412341234:task-definition/yoshino-ml-pipeline:5", "NetworkConfiguration": { "AwsvpcConfiguration": { "AssignPublicIp": "DISABLED", "SecurityGroups": [ "sg-0047823863c206f2f" ], "Subnets": [ "subnet-05ba3c551f4ebc52f" ] } } } APIパラメータ 作成した自分の ClusterのARNに変更 ECS Task定義のARNに変更 セキュリティグループ {name}-mlops-handson-ml-pipeline-sgのID サブネット mlops-handson-private-subnet-1aのID (Amazon ECS > クラスター > {name}-mlops-handson-ecs) (Amazon ECS > タスク定義 > {name}-ml-pipeline) (VPC > セキュリティグループ) (VPC > サブネット)
  35. ©2024 CyberAgent Inc. Distribution prohibited EventBridgeを作成 92 頻度 定期的なスケジュール スケジュールの種類

    cronベースのスケジュール cron式 */2 * * * ? * フレックスタイムウィンドウ オフ
  36. ©2024 CyberAgent Inc. Distribution prohibited EventBridgeを作成 93 ターゲットAPI AWS StepFunctions

    StartExecution ステートマシン 作成した自分のステートマシンを選択 {name}-ml-pipeline
  37. ©2024 CyberAgent Inc. Distribution prohibited 目次 96 1. 前準備 2.

    ローカルでML基盤を開発 3. CI/CD 4. MLパイプラインをAWS上で実行する 5. 推論サーバーをAWS上に立てる
  38. ©2024 CyberAgent Inc. Distribution prohibited ECRにimageを保存 104 推論サーバーのimageをECRにpush $ make

    build-predictor $ make push-predictor ECRにimageが保存されていることを確認
  39. ©2024 CyberAgent Inc. Distribution prohibited ALB 114 Application Load Balancer

    アプリケーションレイヤーで負荷分散を 行うマネージドサービス
  40. ©2024 CyberAgent Inc. Distribution prohibited ターゲットグループの作成 116 ターゲットタイプの選択 IP addresses

    ターゲットグループ名 {name}-mlops-handson-tg プロトコル:ポート HTTP : 8080
  41. ©2024 CyberAgent Inc. Distribution prohibited ターゲットグループの作成 117 VPC {name}-mlops-handson ヘルスチェックパス

    /healthcheck 他の設定は変更せず 「次へ」「ターゲットグループの作成」をクリック
  42. ©2024 CyberAgent Inc. Distribution prohibited Load Balancerの作成 121 VPC {name}-mlops-handson

    ネットワークマッピング ap-northeast-1a → mlops-handson-public-subnet-1a ap-northeast-1c → mlops-handson-public-subnet-1c ※右記の警告が出ている人はprivateサブ ネットを選んでいる。publicに変更する
  43. ©2024 CyberAgent Inc. Distribution prohibited Load Balancerの作成 122 セキュリティグループ {name}-mlops-handson-alb-sg

    リスナーとルーティング プロトコル: HTTP ポート: 8080 デフォルトアクション: 作成した自分のtaget group {name}-mlops-handson-tg 他の設定は変更せず 「ロードバランサーの作成」 をクリック
  44. ©2024 CyberAgent Inc. Distribution prohibited ECS Serviceの作成 125 アプリケーションタイプ サービス

    ファミリー 作成した自分のECS Task定義 {name}-predict-api サービス名 {name}-predict-api-service 必要タスク 2
  45. ©2024 CyberAgent Inc. Distribution prohibited ECS Serviceの作成 126 VPC {name}-mlops-handson

    サブネット {name}-mlops-handson-private-subnet-1a {name}-mlops-handson-private-subnet-1c セキュリティグループ {name}-mlops-handson-predict-api-sg パブリックIP オフ
  46. ©2024 CyberAgent Inc. Distribution prohibited ECS Serviceの作成 127 ロードバランサーの種類 Application

    Load Balancer ロードバランサー 作成した自分のALB {name}-mlops-handson-alb
  47. ©2024 CyberAgent Inc. Distribution prohibited ECS Serviceの作成 リスナー 既存のリスナーを使用 >

    8080:HTTP ターゲットグループ 既存のターゲットグループを使用 >{name}-mlops-handson-tg 128
  48. ©2024 CyberAgent Inc. Distribution prohibited ECS Serviceの作成 129 サービスの自動スケーリングを使用 ONに変更

    タスクの最小数 2 タスクの最大数 6 ポリシー名 {name}-auto-scaling-policy ECSサービスメトリクス ALBRequestCountPerTarget ターゲット値 50 スケールアウトクールダウン期間 30 スケールインクールダウン期間 30 「作成」をクリック
  49. ©2024 CyberAgent Inc. Distribution prohibited 推論リクエストを送る 132 $ vi .env

    USER_NAME=yoshino-teppei AWS_ACCOUNT_ID=123412341234 AWS_ALB_DNS=yoshino-teppei-mlops-handson-alb-1312358109.ap-northeast-1.elb.amazonaws.com AWS_BUCKET=${USER_NAME}-mlops-handson AWS_REGION=ap-northeast-1 AWS_PROFILE=ai24-mlops VERSION=2024-05-14 MODEL=sgd_classifier_ctr_optuna_model ローカルからECS Serviceにリクエストを送る ALBのDNS名 $ make predict-ecs
  50. ©2024 CyberAgent Inc. Distribution prohibited オートスケーリングを確認する 133 $ cd aws-mlops-handson/bin

    heyでリクエストを送る $ sh test-scale.sh http://$AWS_ALB_DNS:8080/healthcheck hey: https://github.com/rakyll/hey
  51. ©2024 CyberAgent Inc. Distribution prohibited • S3 • ECR •

    ECS (cluster) • step functions • event bridge (schedule) • ALB • EC2 target group • terraformリソース 削除するもの一覧 $ cd infra/training $ terraform destroy 137 MLOps応用編は以上です おつかれさまでした