

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 独自のコンテナのレシピ
<a name="bring-own-container-recipe"></a>

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

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

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

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

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

Hybrid Jobs で使用できる Docker イメージを構築するには、特定のコンポーネントが必要です。`Dockerfiles` の記述と構築に慣れていない場合は、「[Dockerfile documentation](https://docs.docker.com/reference/dockerfile/)」と「[Amazon ECR CLI documentation](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html)」を参照してください。

**Topics**
+ [Dockerfile のベースイメージ](#base-image-dockerfile)
+ [(オプション) 変更されたコンテナエントリポイントスクリプト](#modified-container-entry-point)
+ [`Dockerfile` を使用して必要なソフトウェアとコンテナスクリプトをインストールする](#install-docketfile)

## Dockerfile のベースイメージ
<a name="base-image-dockerfile"></a>

Python を使用し、Braket が提供するコンテナにソフトウェアをインストールする場合、ベースイメージの選択肢としては、[GitHub リポジトリ](https://github.com/amazon-braket/amazon-braket-containers)と Amazon ECR でホストされている Braket コンテナイメージの 1 つがあります。イメージをプルしてその上に構築するには、[Amazon ECR に対して認証](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-authenticate-registry)する必要があります。例えば、BYOC Docker ファイルの最初の行は次のように指定できます: `FROM [IMAGE_URI_HERE]`。

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

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

## (オプション) 変更されたコンテナエントリポイントスクリプト
<a name="modified-container-entry-point"></a>

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

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

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

## `Dockerfile` を使用して必要なソフトウェアとコンテナスクリプトをインストールする
<a name="install-docketfile"></a>

**注記**  
構築済みの 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](https://www.fastruby.io/blog/docker/docker-ssh-keys.html)」を参照してください。

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

`Dockerfile` を適切に定義できたため、[プライベート Amazon ECR リポジトリ (がまだ存在しない場合に、それ) を作成する](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)手順を実行する準備が整いました。また、コンテナイメージの構築、タグ付け、リポジトリへのアップロードも行うことができます。

イメージを構築、タグ付け、プッシュする準備ができたとします。`docker build` のオプションの完全な説明といくつかの例については、「[Docker build documentation](https://docs.docker.com/reference/cli/docker/buildx/build/)」を参照してください。

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

```
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 への読み取りアクセスや、共同作業者や学生などイメージの使用を希望する他のユーザーへの読み取りアクセスを提供**しません**。適切なアクセス許可を付与する[リポジトリポリシーを設定する](https://docs.aws.amazon.com/AmazonECR/latest/userguide/set-repository-policy.html)必要があります。一般に、イメージにアクセスしてもらう必要がある特定のユーザーおよび IAM ロールにのみアクセス許可を付与し、当該の image URI を持つ任意のユーザーにイメージのプルを許可しないでください。