👨‍💻

sagemaker studioでdocker-compose使えるようにした

に公開

概要

SageMakerでdocker buildしたい場合には、下記のような方法がqiitaの記事やAWSの公式でサポートされています。

https://qiita.com/kazuneet/items/ecfd40c67d4ad83f4855

https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-local.html#studio-updated-local-enable

しかしながら、docker composeでbuildしてECRへプッシュするような方法は、ネットでは見つけることができませんでした。実際はnetworkの設定をするだけなのですが、今回はsagemaker studioでもdocker-composeを利用するための方法について解説したいと思います。

docker環境のインストール

# docker
sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
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
sudo apt-get update
sudo apt-get install docker-ce=5:20.10.24~3-0~ubuntu-jammy docker-ce-cli=5:20.10.24~3-0~ubuntu-jammy -y --allow-downgrades

# docker-compose
sudo apt install -y docker-compose-plugin

環境変数の設定

.envファイルを作成して、下記を設定してください。

AWS_ACCOUNT_ID=hogehoge
AWS_REGION=fugafuga

docker-compose.ymlの書き方

下記のように書くだけで完結します。要は、sagemaker側で提供されてるネットワークを使うだけです。

version: "3.9"
services:
  app:
    image: ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/image-demo:latest    # ECRのIMAGE_URLを指定する
    env_file:
      - .env
    build:
      context: .
      network: sagemaker                  # ← これをつける
    networks:
      - sagemaker                         # 実行時も同じネットワークを使うなら付ける

networks:
  sagemaker:      # SageMaker が提供済みのネットワークを再利用する
    external: true

使い方

事前にECRでリポジトリを作成してください。今回は「image-demo」というリポジトリを作成してる設定で進めていますが、好きな名前で大丈夫です。

実行手順は簡単で、ECRにログインした後に下記の二つのコマンドで通ります。

# ECRにログイン
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

# ビルド
docker compose build

# ECRへプッシュ
docker compose push

別にdockerでECRでブラウザで表示される手順に沿ってやれば良いと思うかもしれませんが、例えばMLOpsでパイプラインを構築する際に、プロセスごとにdocker環境が異なり、それらをまとめてビルド&プッシュしたいケースがあります。その場合には二つのコマンドで完結するので、一つ一つのプロセスをECRへプッシュしたりシェルを書くよりも使いやすいと個人的には思います。

pipelines
├── components
│   ├── configs
│   │   └── パラメータの設定ファイルを置く
│   ├── preprocess
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   └── 必要な機能を実装する
│   ├── training
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   └── 必要な機能を実装する
│   ├── evaluation
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   └── 必要な機能を実装する
    └── docker-compose.yml  # 一括管理する
...

まとめ

今回はdocker-composeをsagemaker studioで運用する方法が記事や公式で明示的に書かれてなかったので、備忘録として残してみました。

vertex-aiのワークベンチは割とdockerとかすんなり使えるんですけど、sagemaker studioだと地味に面倒臭いですよね(愚痴)

Discussion