TOP>コラム一覧>SageMakerによるカスタムイメージ構築とStudioへのコンテナ適用

SageMakerによるカスタムイメージ構築とStudioへのコンテナ適用

はじめに

こんにちは、伊藤忠テクノソリューションズ 阪本です。
皆さんは、Amazon SageMakerについてご存じでしょうか。Amazon SageMakerは、機械学習モデルの構築、トレーニング、デプロイを効率化するためのフルマネージドサービスです。SageMakerは多くの一般的な機械学習フレームワークを事前に設定したコンテナイメージを提供していますが、特定のユースケースや要件に合わせてカスタムコンテナイメージを使用したいケースもあります。

カスタムコンテナを使用することで、以下のようなメリットがあります:

  • 独自のライブラリやフレームワークを使用できる
  • 社内で開発した専用ツールを統合できる
  • セキュリティ要件に合わせた環境を構築できる

本記事では、SageMaker Studio内のJupyterLabから直接カスタムコンテナイメージを作成する方法と、作成したカスタムコンテナをSageMakerの環境として適応する方法を解説します。

1.全体概要

今回のシナリオの全体概要は以下のようになっています。SageMakerのJupyterLab内からコンテナイメージを作成し、ECRにイメージの保存を行います。その後、作成したコンテナイメージをSageMakerの環境としてアタッチします。

2.Amazon SageMakerとカスタムコンテナイメージの概要

SageMaker Studioは、PyTorch、TensorFlow、R、JupyterLabなど様々な環境に対応した標準イメージを提供しています。しかし、以下のような場合にはカスタムされたコンテナイメージが必要になる場合がございます:

  • 特定バージョンのライブラリやフレームワークが必要
  • 社内専用のパッケージやツールを利用したい
  • セキュリティ要件に基づいたコンテナ環境を設定したい

また、カスタムのコンテナイメージを作成することで、次のようなメリットが得られます:

  • チーム全体で統一された開発環境の提供
  • 環境構築の再現性と一貫性の確保
  • デプロイプロセスの簡素化

3.Sagemaker-studio-image-build

AWSコンテナイメージを作成する1つの方法として、CodeBuildからコンテナをビルドして、ECRにプッシュする方法があります。ただし、CodeBuildやECRでの作成に際して、詳細な設定やビルドとプッシュを処理するシェルスクリプトを用意する必要があります。

※上記の作成方法に関しては下記記事を参考にしてみてください。
https://www.ctc-g.co.jp/solutions/cloud/column/article/105.html

sagemaker-studio-image-buildは、SageMaker Studio用のカスタムコンテナイメージを簡単に構築・管理するAWS提供のCLIツールです。このツールには主に以下の特徴があります:

  • SageMaker Studio互換性の確保
  • イメージビルドとECRへのプッシュプロセスの自動化
  • IAMロールとの統合によるセキュアな操作

従来のDockerコマンドやCodeBuildを使用する方法と比較して、このツールはSageMaker特有の要件に対応し、プロセス全体を簡素化できます。

以下GitHubにてsagemaker-studio-image-buildについて公開されています。各コマンドのパラメータ設定やその他詳細については、以下をご参照ください。
https://github.com/aws-samples/sagemaker-studio-image-build-cli

4.Amazon SageMaker Studioセットアップ

まず、SageMaker Studioをセットアップします。こちらの記事に従って、セットアップしてみてください。
Amazon SageMakerについて調べてみた

SageMaker Studioをセットアップ後、SageMaker Studioに入り、JupyterLabのスペースを開いてください。

※スペースの作成方法はこちらを参照

すると、JupyterLabの画面に遷移し、ノートブックファイル(sample.ipynb)を作成できます。
また、今回カスタムイメージを使用するにあたって、sagemaker-studio-image-buildを使用します。カスタムイメージを作成する前に下記コマンドを入力し、sagemaker-studio-image-buildを環境にインストールしておきましょう。

!pip install sagemaker-studio-image-build

5.カスタムイメージの作成

カスタムイメージの作成は主に次の4ステップで進めます:

0. IAMロール設定
1. Dockerfileの作成
2. SageMaker内でのビルドとプッシュ
3. 作成コンテナイメージの確認

今回は、デフォルトのSageMaker環境に加えて、Dockerコマンドを扱えるJupyterLab環境の構築を目指し、コンテナイメージを作成していきます。これらのステップを順番に詳しく見ていきましょう。

⓪ IAMポリシー設定

sagemaker-studio-image-buildでは、ECR、CodeBuild、S3に関するIAM権限が必要となります。IAMポリシーについて以下を参照に作成してください。

https://github.com/aws-samples/sagemaker-studio-image-build-cli

ポリシーを作成後、SageMakerのユーザプロファイルに付与されているIAMロールに上記作成したIAMポリシーをアタッチします。

① Dockerfile作成

次に、JupyterLab上にDockerfileを作っていきます。本章の冒頭でも述べたように、デフォルトのSageMaker環境に加えて、Dockerコマンドを扱えるコンテナイメージの作成を目指します。今回、Dockerfileの設定は以下のようにしています。

FROM public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu
ARG NB_USER="sagemaker-user"
ARG NB_UID=1000
ARG NB_GID=100

ENV MAMBA_USER=$NB_USER

USER root

RUN apt-get update
RUN micromamba install sagemaker-inference --freeze-installed ¥
--yes --channel conda-forge --name base

RUN apt-get install ca-certificates curl -y
RUN install -m 0755 -d /etc/apt/keyrings
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg ¥
-o /etc/apt/keyrings/docker.asc
RUN chmod a+r /etc/apt/keyrings/docker.asc
RUN echo ¥
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu ¥
    $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | ¥
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt-get update
RUN apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y --allow-downgrades
USER $MAMBA_USER

ENTRYPOINT ["jupyter-lab"]
CMD ["--ServerApp.ip=0.0.0.0", "--ServerApp.port=8888", "--ServerApp.allow_origin=*", "--ServerApp.token=''", "--ServerApp.base_url=/jupyterlab/default"]    

また、上記のDockerfileの設定について、詳細を知りたい方は以下をご参照ください。

参照ページ:
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/studio-byoi-specs.html
https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/ubuntu/

② SageMaker内でのビルドとプッシュ

ここで本題となるSageMakerからコンテナイメージのビルドとプッシュを行います。最初に②で作成したDockerfileをNotebookファイルと同じ階層パスに作成してください。そして、sagemaker-studio-image-buildをpipしたNotebookファイルを再度開きます。

sagemaker-studio-image-buildのbuildコマンドは、CodeBuildによるコンテナのビルド→ECRへのプッシュを一度に行ってくれます。

Sagemaker-studio-image-buildのbuildを実行するサンプルコードは以下となります。

import boto3
import io

account_id = boto3.client('sts').get_caller_identity().get('Account')
region = boto3.Session().region_name
ecr_repository = 'sagemaker-dockerxx-container' #保存するECRコンテナイメージの名前を定義
tag = ':ctc' #ECRコンテナイメージのタグを定義
processing_repository_uri = ¥
    '{}.dkr.ecr.{}.amazonaws.com/{}'.format(account_id, region, ecr_repository + tag)

#コンテナのビルドとイメージのプッシュ 
!sm-docker build . ¥
    --repository $ecr_repository$tag ¥
    --vpc-id vpc-xxxxxxxxxx ¥
    --subnet-ids subnet-xxxxxxxx,subnet-xxxxxxxxxx ¥
    --security-group-ids sg-xxxxxxxxxxxx    

※上記のbuildコマンドのVPC関連パラメータは任意で、CodeBuildの閉域化に関する設定でございます。詳細は下記ページをご参照ください。
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/vpc-support.html

実際に実行した例の一部が以下となります。

③ CodeBuildとECRの確認

Notebookファイルの実行が完了した後、コンテナのビルドとイメージのプッシュが行われているかの確認を行いましょう。まずは、コンテナのビルドを行うCodeBuildから見ていきましょう。CodeBuildのコンソール画面に移動し、「ビルド履歴」が最新のプロジェクトを確認します。すると、ステータスをみると「成功」となっていますので、コンテナのビルドができていることが確認できます。

次に、ECRにコンテナイメージがプッシュできているか確認します。ECRのコンソール画面に移動し、「Repositories」から作成したリポジトリ名を選択します。

そのリポジトリ名を選択し、「イメージタグ」や「プッシュされた日時」が記載されていることが見て取れますので、コンテナイメージのプッシュができていることが確認できます。

6.SageMaker環境へのカスタムイメージ適用

では、最後に前章で作成したカスタムイメージをSageMaker内のJupyterLab環境として使用できるようにします。
まず、SageMakerのコンソール画面に移動し、「ドメイン」から4.でセットアップしたSageMakerドメインの設定画面に移動してください。

そして、「環境」タブから、「パーソナルStudioアプリ用のカスタムイメージ」にある「イメージをアタッチ」をクリックします。

そして、設定画面から「新しいイメージ」を選択し、ECRイメージURIに先ほど作成したカスタムコンテナイメージのURIをECRからコピー&ペーストします。

さらに、イメージのプロパティで任意のイメージ名・表示名やIAMロールを選択し、イメージタイプを「JupyterLabイメージ」にして送信します。

すると、ドメインの環境設定画面に戻り、イメージがアタッチされていることが確認できます。

最後に、SageMaker StudioのJupyterLabにおける作成済み(もしくは新たに作成した)スペースで「Image」を確認してみましょう。先ほどアタッチしたコンテナイメージが「Custom images」としてあり、選択できるようになっています。

実際に作成したイメージでJupyterLabを開き、dockerコマンドをJupyterLabのターミナル上で実行すると、dockerコマンドが実行できているようになっています。

※もし、dockerコマンドが実行できない場合、ドメインのアプリケーション設定でDockerが有効化されているか確認してください。

7.まとめ

いかがでしたでしょうか。今回、カスタムイメージの構築からSageMaker環境への適用まで行いました。今回はDockerコマンドを使うことを目標にカスタムイメージを構築しましたが、構築したい環境によって、Dockerfileやファイル構成について色々アレンジが可能です。重要なのは、どんな環境が必要か想定を立て、それを把握してその環境をどう使用するかまで考えて環境を構築できるかだと思います。

CTCは、AWSのビジネス利活用に向けて、お客様のステージに合わせた幅広い構築・運用支援サービスを提供しています。
経験豊富なエンジニアが、ワンストップかつ柔軟にご支援します。
ぜひ、お気軽にお問い合わせください。

お問い合わせ

【著者プロフィール】

阪本 翔紀(さかもと しょうき)

伊藤忠テクノソリューションズ株式会社 機械学習エンジニア

データ活用支援プロジェクトや機械学習を用いたモデル開発を経験し、AIやデータ分析における業務を中心に担当。
AWSを用いた分析環境構築や社内サービス開発においても、積極的に活動中。

山下 大貴(やました だいき)

TOP>コラム一覧>SageMakerによるカスタムイメージ構築とStudioへのコンテナ適用

pagetop