

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

# 独自のコンテナ (BYOC)
<a name="braket-jobs-byoc"></a>

Amazon Braket Hybrid Jobs には、さまざまな環境でコードを実行するための 3 つの構築済みコンテナが用意されています。これらのコンテナの 1 つがユースケースをサポートしている場合は、ハイブリッドジョブを作成するときにアルゴリズムスクリプトを指定するだけで済みます。`pip` を使用して `requirements.txt` ファイルから、またはアルゴリズムスクリプトから、欠落している小さな依存関係を追加できます。

これらのコンテナがユースケースをサポートしていない場合、またはそれらを拡張したい場合、Braket Hybrid Jobs は、独自のカスタム Docker コンテナイメージまたは独自のコンテナ (BYOC) を使用したハイブリッドジョブの実行をサポートします。それがユースケースに適した機能であることを確認してください。

**Topics**
+ [独自のコンテナは、どのような場合に適した選択肢となりますか?](#bring-own-container-decision)
+ [独自のコンテナのレシピ](bring-own-container-recipe.md)
+ [独自のコンテナでの Braket ハイブリッドジョブの実行](running-hybrid-jobs-in-own-container.md)

## 独自のコンテナは、どのような場合に適した選択肢となりますか?
<a name="bring-own-container-decision"></a>

Braket Hybrid Jobs で独自のコンテナ (BYOC) を使用すると、パッケージ化された環境に独自のソフトウェアをインストールして利用できる柔軟性が得られます。お客様のニーズによっては、同じ柔軟性を実現できる方法があります。そのような場合、「BYOC Docker を構築して Amazon ECR にアップロードし、カスタムイメージ URI を取得する」という完全なサイクルを経る必要がありません。

**注記**  
公開されている少数の Python パッケージ (通常は 10 未満) を追加する場合は、BYOC が適した選択肢にならない場合があります。例えば、PyPi を使用する場合です。

この場合、構築済みの Braket イメージのいずれかを使用し、ジョブ送信時にソースディレクトリに `requirements.txt` ファイルを含めることができます。このファイルが自動的に読み込まれ、`pip` により、パッケージが指定されたバージョンで正常にインストールされます。多数のパッケージをインストールする場合、ジョブの実行時間が大幅に長くなる可能性があります。Python を確認します。また、必要に応じて、ソフトウェアが動作するかどうかをテストするために使用する構築済みコンテナの CUDA バージョンを確認します。

BYOC が必要になるのは、ジョブスクリプトに Python 以外の言語 (C\$1\$1 や Rust など) を使用する場合や、Braket の構築済みコンテナでは利用できない Python バージョンを使用する場合です。BYOC は、次の場合にも適した選択肢です。
+ ソフトウェアをライセンスキーで使用するため、そのソフトウェアを実行するのにライセンスサーバーに対するそのキーの認証が必要となる場合。BYOC を使用を使用してライセンスキーを Docker イメージに埋め込むことで、ソフトウェアの認証コードを含めることができます。
+ 公開されていないソフトウェアを使用する場合。例えば、ソフトウェアが、アクセスするのに特定の SSH キーが必要なプライベートな GitLab または GitHub リポジトリでホストされている場合などです。
+ Braket が提供するコンテナにパッケージ化されていない大規模なソフトウェアスイートをインストールする必要がある場合。ソフトウェアのインストールによってハイブリッドジョブコンテナの起動時間が長くなるのを、BYOC の使用によって回避できます。

また、BYOC では、ソフトウェアを含んだ Docker コンテナを構築し、それを各ユーザーが利用できるようにすることで、カスタムの SDK またはアルゴリズムを各ユーザーが利用できるようにします。これを行うには、Amazon ECR で適切なアクセス許可を設定します。

**注記**  
該当するすべてのソフトウェアライセンスの条項を遵守する必要があります。

# 独自のコンテナのレシピ
<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 を持つ任意のユーザーにイメージのプルを許可しないでください。

# 独自のコンテナでの Braket ハイブリッドジョブの実行
<a name="running-hybrid-jobs-in-own-container"></a>

独自のコンテナでハイブリッドジョブを作成するには、指定された `image_uri` 引数を使用して、`AwsQuantumJob.create()` を呼び出します。QPU かオンデマンドシミュレーターを使用することも、Braket Hybrid Jobs で使用できる古典的プロセッサでコードをローカルに実行することもできます。実際の QPU で実行する前に、SV1、DM1、TN1 などのシミュレーターでコードをテストすることをお勧めします。

古典的プロセッサでコードを実行するには、`InstanceConfig` を更新して、`instanceType` および使用する `instanceCount` を指定します。`instance_count` > 1 を指定する場合は、コードが複数のホストで実行できることを確認しておく必要があります。選択できるインスタンスの数の上限は 5 です。例えば、次のようになります。

```
job = AwsQuantumJob.create(
    source_module="source_dir",
    entry_point="source_dir.algorithm_script:start_here",
    image_uri="111122223333.dkr.ecr.us-west-2.amazonaws.com/my-byoc-container:latest",
    instance_config=InstanceConfig(instanceType="ml.g4dn.xlarge", instanceCount=3),
    device="local:braket/braket.local.qubit",
    # ...)
```

**注記**  
デバイス ARN を使用して、ハイブリッドジョブメタデータとして使用したシミュレーターを追跡します。「`device = "local:<provider>/<simulator_name>"`」の形式に従った値が許容されます。`<provider>` および `<simulator_name>` は英字、数字、`_`、`-`、および `.` のみで構成する必要があります。文字列サイズは 256 文字に制限されています。  
BYOC を使用する予定で、Braket SDK を使用しないで量子タスクを作成する場合は、環境変数 `AMZN_BRAKET_JOB_TOKEN` の値を`CreateQuantumTask` リクエストの`jobToken` パラメータに渡す必要があります。そうしないと、量子タスクは優先されず、通常のスタンドアロン量子タスクとして請求されます。