独自のコンテナのレシピ - Amazon Braket

独自のコンテナのレシピ

このセクションでは、Braket Hybrid Jobs にbring your own container (BYOC)を持ち込むために必要なもの、つまりスクリプト、ファイル、および、それらを組み合わせてカスタム Docker イメージを起動して実行するための手順を順を追って説明します。2 つの代表的なケースに対するレシピ:

  1. Docker イメージに追加のソフトウェアをインストールし、ジョブ内で Python アルゴリズムスクリプトのみを使用するケース。

  2. Python 以外の言語で記述されたアルゴリズムスクリプトと Hybrid Jobs を使用するか、x86 以外の CPU アーキテクチャを使用するケース。

ケース 2 では、コンテナエントリスクリプトの定義がより複雑になります。

Braket は、ハイブリッドジョブを実行する際、リクエストされた数とタイプの Amazon EC2 インスタンスを起動し、それらのインスタンス上でジョブ作成へのイメージ URI 入力で指定された Docker イメージを実行します。BYOC 機能を使用する場合は、読み取りアクセス権があるプライベート Amazon ECR リポジトリでホストされているイメージ URI を指定します。Braket Hybrid Jobs は、当該のカスタムイメージを使用してジョブを実行します。

Hybrid Jobs で使用できる Docker イメージを構築するには、特定のコンポーネントが必要です。Dockerfiles の記述と構築に慣れていない場合は、「Dockerfile documentation」と「Amazon ECR CLI documentation」を参照してください。

Dockerfile のベースイメージ

Python を使用し、Braket が提供するコンテナにソフトウェアをインストールする場合、ベースイメージの選択肢としては、GitHub リポジトリと Amazon ECR でホストされている Braket コンテナイメージの 1 つがあります。イメージをプルしてその上に構築するには、Amazon ECR に対して認証する必要があります。例えば、BYOC Docker ファイルの最初の行は次のように指定できます: FROM [IMAGE_URI_HERE]

次に、Dockerfile の残りの部分に入力することで、コンテナに追加するソフトウェアをインストールして設定します。構築済みの Braket イメージには既に適切なコンテナエントリポイントスクリプトが含まれているため、あらためて含める必要はありません。

C++、Rust、Julia など Python 以外の言語を使用する場合、または ARM など x86 以外の CPU アーキテクチャ用のイメージを構築する場合は、ベアボーンパブリックイメージ上に構築する必要がある場合があります。このようなイメージを Amazon Elastic Container Registry Public Gallery で数多く見つけることができます。CPU アーキテクチャに適切 (であるとともに、必要に応じて使用する GPU にも適切) なイメージを必ず選択してください。

(オプション) 変更されたコンテナエントリポイントスクリプト

注記

構築済みの Braket イメージにソフトウェアを追加するだけの場合は、このセクションをスキップできます。

ハイブリッドジョブの一部として Python 以外のコードを実行するには、コンテナエントリポイントを定義する Python スクリプトを変更します。例として、braket_container.pyAmazon Braket Github の Python スクリプトを挙げます。このスクリプトは、Braket によって事前に構築されたイメージがアルゴリズムスクリプトを起動し、適切な環境変数を設定するために使用します。コンテナエントリポイントスクリプト自体は Python で記述される必要がありますが、Python 以外のスクリプトも起動できます。当該の構築済みの例では Python アルゴリズムスクリプトが Python サブプロセスまたはまったく新しいプロセスとして起動されていることが分かります。このロジックを変更することで、Python 以外のアルゴリズムスクリプトをエントリポイントスクリプトが起動できるようにすることができます。例えば、末尾に付いているファイル拡張子に応じて Rust プロセスを起動するように thekick_off_customer_script() 関数を変更できます。

まったく新しい braket_container.py を記述することもできます。その Python スクリプトでは、入力データ、ソースアーカイブ、その他の必要なファイルを Amazon S3 からコンテナにコピーし、適切な環境変数を定義する必要があります。

Dockerfile を使用して必要なソフトウェアとコンテナスクリプトをインストールする

注記

構築済みの Braket イメージを Docker ベースイメージとして使用する場合、コンテナスクリプトは既に存在しています。

直前のステップで、変更したコンテナスクリプトを作成した場合は、それをコンテナにコピーし、かつ環境変数 SAGEMAKER_PROGRAM を、braket_container.py か、新しいコンテナエントリポイントスクリプトに付けた名前に設定します。

以下は、GPU アクセラレーションジョブインスタンスで Julia を使用できるようにする Dockerfile の例です。

FROM nvidia/cuda:12.2.0-devel-ubuntu22.04 ARG DEBIAN_FRONTEND=noninteractive ARG JULIA_RELEASE=1.8 ARG JULIA_VERSION=1.8.3 ARG PYTHON=python3.11 ARG PYTHON_PIP=python3-pip ARG PIP=pip ARG JULIA_URL = https://julialang-s3.julialang.org/bin/linux/x64/${JULIA_RELEASE}/ ARG TAR_NAME = julia-${JULIA_VERSION}-linux-x86_64.tar.gz ARG PYTHON_PKGS = # list your Python packages and versions here RUN curl -s -L ${JULIA_URL}/${TAR_NAME} | tar -C /usr/local -x -z --strip-components=1 -f - RUN apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ tzdata \ openssh-client \ openssh-server \ ca-certificates \ curl \ git \ libtemplate-perl \ libssl1.1 \ openssl \ unzip \ wget \ zlib1g-dev \ ${PYTHON_PIP} \ ${PYTHON}-dev \ RUN ${PIP} install --no-cache --upgrade ${PYTHON_PKGS} RUN ${PIP} install --no-cache --upgrade sagemaker-training==4.1.3 # Add EFA and SMDDP to LD library path ENV LD_LIBRARY_PATH="/opt/conda/lib/python${PYTHON_SHORT_VERSION}/site-packages/smdistributed/dataparallel/lib:$LD_LIBRARY_PATH" ENV LD_LIBRARY_PATH=/opt/amazon/efa/lib/:$LD_LIBRARY_PATH # Julia specific installation instructions COPY Project.toml /usr/local/share/julia/environments/v${JULIA_RELEASE}/ RUN JULIA_DEPOT_PATH=/usr/local/share/julia \ julia -e 'using Pkg; Pkg.instantiate(); Pkg.API.precompile()' # generate the device runtime library for all known and supported devices RUN JULIA_DEPOT_PATH=/usr/local/share/julia \ julia -e 'using CUDA; CUDA.precompile_runtime()' # Open source compliance scripts RUN HOME_DIR=/root \ && curl -o ${HOME_DIR}/oss_compliance.zip https://aws-dlinfra-utilities.s3.amazonaws.com/oss_compliance.zip \ && unzip ${HOME_DIR}/oss_compliance.zip -d ${HOME_DIR}/ \ && cp ${HOME_DIR}/oss_compliance/test/testOSSCompliance /usr/local/bin/testOSSCompliance \ && chmod +x /usr/local/bin/testOSSCompliance \ && chmod +x ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh \ && ${HOME_DIR}/oss_compliance/generate_oss_compliance.sh ${HOME_DIR} ${PYTHON} \ && rm -rf ${HOME_DIR}/oss_compliance* # Copying the container entry point script COPY braket_container.py /opt/ml/code/braket_container.py ENV SAGEMAKER_PROGRAM braket_container.py

この例では、関連するすべてのオープンソースライセンス条項を必ず遵守するために、AWS が提供するスクリプトをダウンロードして実行しています。この遵守は例えば、MIT license が適用されるインストール済みコードに対し、適切な帰属表現を行う、といった方法によって行われます。

プライベートな GitHub または GitLab のリポジトリでホストされているコードなど、公開されていないコードを含める必要がある場合は、そういったコードにアクセスするための SSH キーを Docker イメージに埋め込まないでください。代わりに、構築時に Docker Compose を使用することで、構築のベースとするホストマシン上の SSH へのアクセスを Docker に許可します。詳細については、ガイド「Securely using SSH keys in Docker to access private Github repositories」を参照してください。

Docker イメージを構築し、アップロードする

Dockerfile を適切に定義できたため、プライベート Amazon ECR リポジトリ (がまだ存在しない場合に、それ) を作成する手順を実行する準備が整いました。また、コンテナイメージの構築、タグ付け、リポジトリへのアップロードも行うことができます。

イメージを構築、タグ付け、プッシュする準備ができたとします。docker build のオプションの完全な説明といくつかの例については、「Docker build documentation」を参照してください。

上記のサンプルファイルの場合は、以下を実行できます。

aws ecr get-login-password --region ${your_region} | docker login --username AWS --password-stdin ${aws_account_id}.dkr.ecr.${your_region}.amazonaws.com docker build -t braket-julia . docker tag braket-julia:latest ${aws_account_id}.dkr.ecr.${your_region}.amazonaws.com/braket-julia:latest docker push ${aws_account_id}.dkr.ecr.${your_region}.amazonaws.com/braket-julia:latest

適切な Amazon ECR アクセス許可を割り当てる

Braket Hybrid Jobs Docker イメージは、プライベートな Amazon ECR リポジトリでホストされている必要があります。デフォルトでは、プライベート Amazon ECR リポジトリは、Braket Hybrid Jobs IAM role への読み取りアクセスや、共同作業者や学生などイメージの使用を希望する他のユーザーへの読み取りアクセスを提供しません。適切なアクセス許可を付与するリポジトリポリシーを設定する必要があります。一般に、イメージにアクセスしてもらう必要がある特定のユーザーおよび IAM ロールにのみアクセス許可を付与し、当該の image URI を持つ任意のユーザーにイメージのプルを許可しないでください。