

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

# ハイブリッドジョブの作成
<a name="braket-jobs-first"></a>

 このセクションでは、Python スクリプトを使用してハイブリッドジョブを作成する方法を示します。または、ハイブリッドジョブを作成する別の方法として任意の統合開発環境 (IDE) や Braket ノートブックなどのローカル Python コードを使用する手順については、「[ローカルコードをハイブリッドジョブとして実行する](braket-hybrid-job-decorator.md)」を参照してください。

**Topics**
+ [作成して実行](#braket-jobs-first-create)
+ [結果をモニタリングする](#braket-jobs-first-monitor-results)
+ [結果を保存する](#braket-jobs-save-results)
+ [チェックポイントの使用](#braket-jobs-checkpoints)
+ [ローカルコードをハイブリッドジョブとして実行する](braket-hybrid-job-decorator.md)
+ [ハイブリッドジョブでの API の使用方法](braket-jobs-api.md)
+ [ローカルモードでのハイブリッドジョブの作成およびデバッグ](braket-jobs-local-mode.md)

## 作成して実行
<a name="braket-jobs-first-create"></a>

ハイブリッドジョブを実行する権限を持つロールを取得したら、次に進む準備が整ったことになります。最初の Braket ハイブリッドジョブの重要部分は、*アルゴリズムスクリプト*です。実行するアルゴリズムを定義し、アルゴリズムの一部である古典的な論理と量子タスクが含まれています。アルゴリズムスクリプトに加えて、他の依存関係ファイルを指定することもできます。アルゴリズムスクリプトとその依存関係は、*ソースモジュール*と呼ばれます。*エントリポイント*は、ハイブリッドジョブの開始時にソースモジュールで実行される最初のファイルまたは関数を定義します。

![\[コンソールまたはノートブックを使用して量子ジョブを作成し、量子デバイスでアルゴリズムスクリプトを実行し、結果を分析するワークフローを示した図。\]](http://docs.aws.amazon.com/ja_jp/braket/latest/developerguide/images/braket-jobs-first-workflow.jpg)


まず、5 つのベル状態を作成し、対応する測定結果を出力するアルゴリズムスクリプトの基本的な例を考えてみましょう。

```
import os

from braket.aws import AwsDevice
from braket.circuits import Circuit


def start_here():

    print("Test job started!")

    # Use the device declared in the job script
    device = AwsDevice(os.environ["AMZN_BRAKET_DEVICE_ARN"])

    bell = Circuit().h(0).cnot(0, 1)
    for count in range(5):
        task = device.run(bell, shots=100)
        print(task.result().measurement_counts)

    print("Test job completed!")
```

このファイルを*algorithm\$1script.py* という名前で、Braket ノートブックまたはローカル環境の現在の作業ディレクトリに保存します。algorithm\$1script.py ファイルには計画されたエントリーポイントとして `start_here()` が含まれます。

次に、algorithm\$1script.py ファイルと同じディレクトリに Python ファイルまたは Python ノートブックを作成します。このスクリプトは、ハイブリッドジョブを開始し、必要なステータスや主要な結果の出力などの非同期処理を扱っています。このスクリプトでは、少なくともハイブリッドジョブスクリプトとプライマリデバイスを指定する必要があります。

**注記**  
Braket ノートブックを作成する方法、または *algorithm\$1script.py* ファイルなどのファイルをノートブックと同じディレクトリにアップロードする方法の詳細については、「[Run your first circuit using the Amazon Braket Python SDK](braket-get-started-run-circuit.md)」を参照してください。

この基本的な最初のケースでは、シミュレーターをターゲットにします。ターゲットとする量子デバイス、シミュレーター、または実際の量子処理装置 (QPU) のいずれのタイプであっても、次のスクリプトでは、`device` でハイブリッドジョブをスケジュールするために使用され、アルゴリズムスクリプトで環境変数 `AMZN_BRAKET_DEVICE_ARN` として使用できます。

**注記**  
ハイブリッドジョブ AWS リージョン の で使用できるデバイスのみを使用できます。Amazon Braket SDK はこの AWS リージョンを自動的に選択します。例えば、us-east-1 のハイブリッドジョブでは、IonQ、SV1、DM1、および TN1 デバイスを使用できますが、Rigetti デバイスは使用できません。

シミュレーターの代わりに量子コンピュータを選択した場合、Braket は優先アクセスですべての量子タスクを実行するようにハイブリッドジョブをスケジュールします。

```
from braket.aws import AwsQuantumJob
from braket.devices import Devices

job = AwsQuantumJob.create(
    Devices.Amazon.SV1,
    source_module="algorithm_script.py",
    entry_point="algorithm_script:start_here",
    wait_until_complete=True
)
```

パラメータ `wait_until_complete=True` は、冗長モードを設定して、ジョブが実行中に実際のジョブからの出力を出力するようにします。以下の例のような出力が表示されます。

```
Initializing Braket Job: arn:aws:braket:us-west-2:111122223333:job/braket-job-default-123456789012
Job queue position: 1
Job queue position: 1
Job queue position: 1
..............
.
.
.
Beginning Setup
Checking for Additional Requirements
Additional Requirements Check Finished
Running Code As Process
Test job started!
Counter({'00': 58, '11': 42})
Counter({'00': 55, '11': 45})
Counter({'11': 51, '00': 49})
Counter({'00': 56, '11': 44})
Counter({'11': 56, '00': 44})
Test job completed!
Code Run Finished
2025-09-24 23:13:40,962 sagemaker-training-toolkit INFO     Reporting training SUCCESS
```

**注記**  
[AwsQuantumJob.create](https://amazon-braket-sdk-python.readthedocs.io/en/latest/_apidoc/braket.aws.aws_quantum_job.html#braket.aws.aws_quantum_job.AwsQuantumJob.create) メソッドを使用してカスタムメイドのモジュールを実行するには、その場所 (ローカルディレクトリまたはファイルへのパス、または tar.gz ファイルの S3 URI) を渡します。実例については、「[Amazon Braket examples](https://github.com/amazon-braket/amazon-braket-examples/tree/main)」Github リポジトリの hybrid jobs フォルダにある [Parallelize\$1training\$1for\$1QML.ipynb](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML.ipynb) ファイルを参照してください。

## 結果をモニタリングする
<a name="braket-jobs-first-monitor-results"></a>

または、Amazon CloudWatch からのログ出力にアクセスすることもできます。これを行うには､ジョブ詳細ページの左側のメニューにある **[ロググループ]** タブに移動し、ロググループ `aws/braket/jobs` をクリックして、ジョブ名を含むログストリームを選択します。これは、上記の例では `braket-job-default-1631915042705/algo-1-1631915190` です。

![\[Amazon Braket SDK Python テストのファイルパスとタイムスタンプを含むログイベントのリストを示す CloudWatch ロググループ。\]](http://docs.aws.amazon.com/ja_jp/braket/latest/developerguide/images/braket-jobs-first-cw-log.png)


また、コンソールでハイブリッドジョブのステータスを表示するには、**[ハイブリッドジョブ]** ページを選択して **[設定]** を選択します。

![\[要約、イベント時間、ソースコードとインスタンスの設定、停止条件が表示されている、Amazon Braket ハイブリッドジョブの詳細。\]](http://docs.aws.amazon.com/ja_jp/braket/latest/developerguide/images/braket-jobs-first-console-status.png)


ハイブリッドジョブが実行されている間、Amazon S3 にアーティファクトがいくつか生成されます。デフォルトの S3 バケット名は `amazon-braket-<region>-<accountid>` で、コンテンツは `jobs/<jobname>/<timestamp>` ディレクトリにあります。Braket Python SDK でハイブリッドジョブを作成する際、別の `code_location` を指定することで、これらのアーティファクトが保存される S3 の場所を設定できます。

**注記**  
この S3 バケットは、ジョブスクリプト AWS リージョン と同じ に配置する必要があります。

`jobs/<jobname>/<timestamp>` ディレクトリには、`model.tar.gz` ファイル内のエントリポイントスクリプトからの出力を含むサブフォルダが含まれています。`script` というディレクトリもあり、この中にある `source.tar.gz` ファイルにはアルゴリズムスクリプトのアーティファクトが含まれています。実際の量子タスクの結果は、`jobs/<jobname>/tasks` という名前のディレクトリにあります。

## 結果を保存する
<a name="braket-jobs-save-results"></a>

アルゴリズムスクリプトによって生成された結果を保存することで、ハイブリッドジョブスクリプトのハイブリッドジョブオブジェクトと Amazon S3 の出力フォルダ (model.tar.gz という名前の tar zip ファイル内) からそれらを使用できるようにすることができます。

出力は JavaScript Object Notation (JSON) 形式を使用してファイルに保存する必要があります。numpy 配列の場合のように、データをテキストに簡単にシリアル化できない場合は、ピクル化データ形式を使用してシリアル化するオプションを入力として渡すことができます。詳細については、「[braket.jobs.data\$1persistence module](https://amazon-braket-sdk-python.readthedocs.io/en/latest/_apidoc/braket.jobs.data_persistence.html#braket.jobs.data_persistence.save_job_result)」を参照してください。

ハイブリッドジョブの結果を保存するには、\$1ADD でコメントされた次の行を algorithm\$1script.py ファイルに追加します。

```
import os

from braket.aws import AwsDevice
from braket.circuits import Circuit
from braket.jobs import save_job_result  # ADD


def start_here():

    print("Test job started!")

    device = AwsDevice(os.environ['AMZN_BRAKET_DEVICE_ARN'])

    results = []  # ADD

    bell = Circuit().h(0).cnot(0, 1)
    for count in range(5):
        task = device.run(bell, shots=100)
        print(task.result().measurement_counts)
        results.append(task.result().measurement_counts)  # ADD

        save_job_result({"measurement_counts": results})  # ADD

    print("Test job completed!")
```

次に、\$1ADD でコメントされた行 ** `print(job.result())` ** を追加することで、ジョブスクリプトのジョブの結果を表示できます。

```
import time
from braket.aws import AwsQuantumJob

job = AwsQuantumJob.create(
    source_module="algorithm_script.py",
    entry_point="algorithm_script:start_here",
    device="arn:aws:braket:::device/quantum-simulator/amazon/sv1",
)

print(job.arn)
while job.state() not in AwsQuantumJob.TERMINAL_STATES:
    print(job.state())
    time.sleep(10)

print(job.state())
print(job.result())   # ADD
```

この例では、`wait_until_complete=True` を削除して冗長出力を抑制します。デバッグ用に再度追加できます。このハイブリッドジョブを実行すると、識別子と `job-arn` が出力され、その後、10 秒ごとにハイブリッドジョブの状態が出力されて、ハイブリッドジョブが `COMPLETED` になったら、ベル回路の結果が示されます。次の例を参照してください。

```
arn:aws:braket:us-west-2:111122223333:job/braket-job-default-123456789012
INITIALIZED
RUNNING
RUNNING
RUNNING
RUNNING
RUNNING
RUNNING
RUNNING
RUNNING
RUNNING
RUNNING
...
RUNNING
RUNNING
COMPLETED
{'measurement_counts': [{'11': 53, '00': 47},..., {'00': 51, '11': 49}]}
```

## チェックポイントの使用
<a name="braket-jobs-checkpoints"></a>

チェックポイントを使用して、ハイブリッドジョブの中間イテレーションを保存できます。前のセクションのアルゴリズムスクリプトの例では、\$1ADD でコメントされた次の行を追加して、チェックポイントファイルを作成します。

```
from braket.aws import AwsDevice
from braket.circuits import Circuit
from braket.jobs import save_job_checkpoint  # ADD
import os


def start_here():

    print("Test job starts!")

    device = AwsDevice(os.environ["AMZN_BRAKET_DEVICE_ARN"])

    # ADD the following code
    job_name = os.environ["AMZN_BRAKET_JOB_NAME"]
    save_job_checkpoint(checkpoint_data={"data": f"data for checkpoint from {job_name}"}, checkpoint_file_suffix="checkpoint-1")  # End of ADD

    bell = Circuit().h(0).cnot(0, 1)
    for count in range(5):
        task = device.run(bell, shots=100)
        print(task.result().measurement_counts)

    print("Test hybrid job completed!")
```

ハイブリッドジョブを実行すると、デフォルトの `/opt/jobs/checkpoints` パスを使用して、チェックポイントディレクトリのハイブリッドジョブアーティファクトにファイル *<jobname>-checkpoint-1.json* が作成されます。このデフォルトパスを変更しない限り、ハイブリッドジョブスクリプトは変更されません。

前のハイブリッドジョブによって生成されたチェックポイントからハイブリッドジョブをロードする場合、アルゴリズムスクリプトは `from braket.jobs import load_job_checkpoint` を使用します。アルゴリズムスクリプトにロードするロジックは次のとおりです。

```
from braket.jobs import load_job_checkpoint

checkpoint_1 = load_job_checkpoint(
    "previous_job_name",
    checkpoint_file_suffix="checkpoint-1",
)
```

このチェックポイントをロードした後、`checkpoint-1` にロードされたコンテンツに基づいてロジックを続行できます。

**注記**  
*checkpoint\$1file\$1suffix* は、チェックポイントの作成時に以前に指定した接尾辞と一致する必要があります。

オーケストレーションスクリプトでは、前のハイブリッドジョブ `job-arn` を、\$1ADD でコメントされた行で指定する必要があります。

```
from braket.aws import AwsQuantumJob

job = AwsQuantumJob.create(
    source_module="source_dir",
    entry_point="source_dir.algorithm_script:start_here",
    device="arn:aws:braket:::device/quantum-simulator/amazon/sv1",
    copy_checkpoints_from_job="<previous-job-ARN>", #ADD
    )
```

# ローカルコードをハイブリッドジョブとして実行する
<a name="braket-hybrid-job-decorator"></a>

Amazon Braket Hybrid Jobs は、ハイブリッド量子古典アルゴリズムのフルマネージドオーケストレーションを提供し、Amazon EC2 コンピューティングリソースと Amazon Braket 量子処理ユニット (QPU) アクセスを統合します。ハイブリッドジョブで作成された量子タスクは、個々の量子タスクよりも優先的にキューイングされるため、量子タスクキュー内の変動によってアルゴリズムが中断されることはありません。各 QPU は独自のハイブリッドジョブキューを維持することで、ハイブリッドジョブを一度に 1 つだけ実行するようにします。

**Topics**
+ [ローカル Python コードからハイブリッドジョブを作成する](#create-hybrid-job-from-local-python-code)
+ [追加の Python パッケージとソースコードをインストールする](#install-python-packages-and-code)
+ [ハイブリッドジョブインスタンスにおいてデータをロードしたり保存したりする](#save-load-data-into-instance)
+ [ハイブリッドジョブデコレータに関するベストプラクティス](#best-practices)

## ローカル Python コードからハイブリッドジョブを作成する
<a name="create-hybrid-job-from-local-python-code"></a>

ローカル Python コードを Amazon Braket Hybrid Jobs として実行できます。これは、次のコードサンプルに示すように、コードに `@hybrid_job` デコレータで注釈を付けることで実現できます。カスタム環境では、Amazon Elastic Container Registry (ECR) の[カスタムコンテナの使用](braket-jobs-byoc.md)を選択できます。

**注記**  
デフォルトでは、Python 3.12 のみがサポートされています。

 `@hybrid_job` デコレータを使用して関数に注釈を付けることができます。Braket は、デコレータ内のコードを Braket ハイブリッドジョブの[アルゴリズムスクリプト](braket-jobs-first.md)に変換します。次に、ハイブリッドジョブは Amazon EC2 インスタンス上で被デコレート関数を呼び出します。ジョブの進行状況は、`job.state()` または Braket コンソールでモニタリングできます。次のコード例は、State Vector Simulator (SV1) device で 5 つの状態のシーケンスを実行する方法を示しています。

```
from braket.aws import AwsDevice
from braket.circuits import Circuit, FreeParameter, Observable
from braket.devices import Devices
from braket.jobs.hybrid_job import hybrid_job
from braket.jobs.metrics import log_metric

device_arn = Devices.Amazon.SV1


@hybrid_job(device=device_arn)  # Choose priority device
def run_hybrid_job(num_tasks=1):
    device = AwsDevice(device_arn)  # Declare AwsDevice within the hybrid job

    # Create a parametric circuit
    circ = Circuit()
    circ.rx(0, FreeParameter("theta"))
    circ.cnot(0, 1)
    circ.expectation(observable=Observable.X(), target=0)

    theta = 0.0  # Initial parameter

    for i in range(num_tasks):
        task = device.run(circ, shots=100, inputs={"theta": theta})  # Input parameters
        exp_val = task.result().values[0]

        theta += exp_val  # Modify the parameter (possibly gradient descent)

        log_metric(metric_name="exp_val", value=exp_val, iteration_number=i)

    return {"final_theta": theta, "final_exp_val": exp_val}
```

ハイブリッドジョブを作成するには、通常の Python 関数と同様に被デコレート関数を呼び出します。ただし、デコレータ関数は、被デコレート関数の結果ではなくハイブリッドジョブのハンドルを返します。ジョブの完了後に結果を取得するには、`job.result()` を使用します。

```
job = run_hybrid_job(num_tasks=1)
result = job.result()
```

`@hybrid_job` デコレータのデバイス引数には、ハイブリッドジョブが優先アクセス権を持つデバイスを指定します。この場合はシミュレーター SV1 です。QPU の優先順位を取得するには、デコレータで指定されたものと一致するデバイス ARN を被デコレート関数内で使用する必要があります。`@hybrid_job` で宣言されたデバイス ARN をキャプチャするには、ヘルパー関数 `get_job_device_arn()` を使用するという便利な方法もあります。

**注記**  
各ハイブリッドジョブが Amazon EC2 上にコンテナ化された環境を作成してから起動するまでに、1 分以上かかります。このため、単一の回路や回路のバッチなど、非常に短いワークロードでは、量子タスクを使用するだけで十分です。

**ハイパーパラメータ** 

`run_hybrid_job()` 関数が取る引数として、作成される量子タスクの数を制御できる `num_tasks` があります。ハイブリッドジョブは、この引数を[ハイパーパラメータ](braket-jobs-hyperparameters.md)として自動的にキャプチャします。

**注記**  
ハイパーパラメータは、文字列として Braket コンソールに表示されますが、2500 文字の制限があります。

**メトリクスとログ記録** 

`run_hybrid_job()` 関数内では、反復アルゴリズムからのメトリクスが `log_metrics` を使用して記録されます。メトリクスは、Braket コンソールページのハイブリッドジョブタブに自動的にプロットされます。[Braket コストトラッカー](braket-pricing.md)を使用することで、ハイブリッドジョブ実行中の量子タスクのコストをほぼリアルタイムで追跡できます。上記の例では、[結果タイプ](braket-result-types.md)における最初の確率を記録するメトリクス名「probability」(確率) を使用しています。

**結果を取得する** 

ハイブリッドジョブが完了したら、 `job.result()` を使用することで、ハイブリッドジョブの結果を取得できます。return ステートメントに記述したすべてのオブジェクトが、Braket によって自動的にキャプチャされます。関数が返すオブジェクトは、各要素がシリアル化可能なタプルである必要があります。例えば、次のコードは成功している例と失敗している例を示しています。

```
import numpy as np


# Working example
@hybrid_job(device=Devices.Amazon.SV1)
def passing():
    np_array = np.random.rand(5)
    return np_array  # Serializable

# # Failing example
# @hybrid_job(device=Devices.Amazon.SV1)
# def failing():
#     return MyObject() # Not serializable
```

**ジョブ名** 

デフォルトでは、このハイブリッドジョブの名前は関数名を使用して提案されます。また、50 文字までの長さのカスタム名を指定することもできます。例えば、次のコードでは、ジョブ名は「my-job-name」です。

```
@hybrid_job(device=Devices.Amazon.SV1, job_name="my-job-name")
def function():
    pass
```

**ローカルモード** 

[ローカルジョブ](braket-jobs-local-mode.md)は、デコレータに引数 `local=True` を追加することで作成されます。これにより、ラップトップなどのローカルコンピューティング環境のコンテナ化された環境でハイブリッドジョブが実行されます。ローカルジョブでは、量子タスクに対して優先的なキューイングが行われることは**ありません**。マルチノードや MPI などの高度なケースでは、ローカルジョブが、必要な Braket 環境変数にアクセスできる場合があります。次のコードは、SV1 シミュレーターをデバイスとして使用してローカルハイブリッドジョブを作成しています。

```
@hybrid_job(device=Devices.Amazon.SV1, local=True)
def run_hybrid_job(num_tasks=1):
    return ...
```

この他にも、あらゆるハイブリッドジョブオプションがサポートされています。オプションのリストについては、「[braket.jobs.quantum\$1job\$1creation module](https://amazon-braket-sdk-python.readthedocs.io/en/stable/_apidoc/braket.jobs.quantum_job_creation.html)」を参照してください。

## 追加の Python パッケージとソースコードをインストールする
<a name="install-python-packages-and-code"></a>

希望の Python パッケージを使用できるようにランタイム環境をカスタマイズできます。パッケージ名のリストである `requirements.txt` ファイルか、[独自のコンテナ (BYOC)](braket-jobs-byoc.md) のいずれかを使用できます。例えば、`requirements.txt` ファイルには、インストールが必要な他のパッケージを含めることができます。

```
qiskit 
pennylane >= 0.31
mitiq == 0.29
```

`requirements.txt` ファイルを使用してランタイム環境をカスタマイズするには、以下のコード例を参照してください。

```
@hybrid_job(device=Devices.Amazon.SV1, dependencies="requirements.txt")
def run_hybrid_job(num_tasks=1):
    return ...
```

または、次のようにパッケージ名を Python リストとして指定することもできます。

```
@hybrid_job(device=Devices.Amazon.SV1, dependencies=["qiskit", "pennylane>=0.31", "mitiq==0.29"])
def run_hybrid_job(num_tasks=1):
    return ...
```

追加のソースコードは、モジュールのリストとして指定することも、次のコード例のように単一のモジュールとして指定することもできます。

```
@hybrid_job(device=Devices.Amazon.SV1, include_modules=["my_module1", "my_module2"])
def run_hybrid_job(num_tasks=1):
    return ...
```

## ハイブリッドジョブインスタンスにおいてデータをロードしたり保存したりする
<a name="save-load-data-into-instance"></a>

**入力トレーニングデータを指定する**

ハイブリッドジョブを作成する場合は、Amazon Simple Storage Service (Amazon S3) バケットを指定して入力トレーニングデータセットを提供できます。また、ローカルパスを指定すれば、データが Braket によって Amazon S3 の `s3://<default_bucket_name>/jobs/<job_name>/<timestamp>/data/<channel_name>` に自動的にアップロードされます。ローカルパスを指定した場合、チャネル名はデフォルトで「input」になります。次のコードは、ローカルパス `data/file.npy` からアップロードされた numpy ファイルを示しています。

```
import numpy as np


@hybrid_job(device=Devices.Amazon.SV1, input_data="data/file.npy")
def run_hybrid_job(num_tasks=1):
    data = np.load("data/file.npy")
    return ...
```

S3 の場合は、`get_input_data_dir()` ヘルパー関数を使用する必要があります。

```
import numpy as np
from braket.jobs import get_input_data_dir

s3_path = "s3://amazon-braket-us-east-1-123456789012/job-data/file.npy"


@hybrid_job(device=None, input_data=s3_path)
def job_s3_input():
    np.load(get_input_data_dir() + "/file.npy")


@hybrid_job(device=None, input_data={"channel": s3_path})
def job_s3_input_channel():
    np.load(get_input_data_dir("channel") + "/file.npy")
```

チャネル値と S3 URI またはローカルパスで構成されるディクショナリを提供することで、複数の入力データソースを指定できます。

```
import numpy as np
from braket.jobs import get_input_data_dir

input_data = {
    "input": "data/file.npy",
    "input_2": "s3://amzn-s3-demo-bucket/data.json"
}


@hybrid_job(device=None, input_data=input_data)
def multiple_input_job():
    np.load(get_input_data_dir("input") + "/file.npy")
    np.load(get_input_data_dir("input_2") + "/data.json")
```

**注記**  
入力データが大きい (>1GB) 場合、ハイブリッドジョブが作成されるまでの待機時間が長くなります。これは、ローカル入力データが最初に S3 バケットにアップロードされた時点で S3 パスがジョブリクエストに追加されるためです。つまり、ジョブリクエストが Braket サービスに送信されのが最後であるためです。

**結果を S3 に保存する**

被デコレート関数の return ステートメントに指定されていない結果を保存するには、すべてのファイル書き込みオペレーションに正しいディレクトリを追加する必要があります。次の例は、numpy 配列と matplotlib 図の保存を示しています。

```
import matplotlib.pyplot as plt
import numpy as np


@hybrid_job(device=Devices.Amazon.SV1)
def run_hybrid_job(num_tasks=1):
    result = np.random.rand(5)

    # Save a numpy array
    np.save("result.npy", result)

    # Save a matplotlib figure
    plt.plot(result)
    plt.savefig("fig.png")
    return ...
```

すべての結果は `model.tar.gz` という名前のファイルに圧縮されます。この結果をダウンロードするには、Python 関数 `job.result()` を使用するか、または Braket マネジメントコンソールのハイブリッドジョブページにある結果フォルダに移動します。

**チェックポイントからの保存と再開**

長時間実行されるハイブリッドジョブの場合、アルゴリズムの中間状態を定期的に保存することをお勧めします。組み込みの `save_job_checkpoint()` ヘルパー関数を使用するか、ファイルを `AMZN_BRAKET_JOB_RESULTS_DIR` パスに保存できます。後者のパスはヘルパー関数 `get_job_results_dir()` で使用できます。

以下は、最小限の作業によって、ハイブリッドジョブデコレータを使用してチェックポイントを保存およびロードする例です。

```
from braket.jobs import save_job_checkpoint, load_job_checkpoint, hybrid_job


@hybrid_job(device=None, wait_until_complete=True)
def function():
    save_job_checkpoint({"a": 1})


job = function()
job_name = job.name
job_arn = job.arn


@hybrid_job(device=None, wait_until_complete=True, copy_checkpoints_from_job=job_arn)
def continued_function():
    load_job_checkpoint(job_name)


continued_job = continued_function()
```

最初のハイブリッドジョブでは、 `save_job_checkpoint()` が、保存するデータを含むディクショナリを指定して呼び出されています。デフォルトでは、すべての値がテキストとしてシリアル化されます。numpy 配列など、より複雑な Python オブジェクトのチェックポイントファイルを作成するには、`data_format = PersistedJobDataFormat.PICKLED_V4` を設定します。このコードは、「checkpoints」というサブフォルダにあるハイブリッドジョブアーティファクトに、デフォルト名 `<jobname>.json` を持つチェックポイントファイルを作成および上書きします。

チェックポイントから再開する新しいハイブリッドジョブを作成するには、`copy_checkpoints_from_job=job_arn` を渡す必要があります。ここで、`job_arn` は直前のジョブのハイブリッドジョブ ARN です。次に、`load_job_checkpoint(job_name)` を使用してチェックポイントの内容をロードします。

## ハイブリッドジョブデコレータに関するベストプラクティス
<a name="best-practices"></a>

**非同期性を採用する**

デコレータ注釈を使用して作成されたハイブリッドジョブは、古典的リソースと量子リソースが利用可能になると実行され、非同期です。アルゴリズムの進行状況をモニタリングするには、Braket Management Console または Amazon CloudWatch を使用します。実行すべきアルゴリズムを送信すると、Braket により、スケーラブルなコンテナ化された環境で実行され、完了すると結果が取得されます。

**反復変分アルゴリズムを実行する**

ハイブリッドジョブでは、反復量子古典アルゴリズムを実行するツールを使用できます。純粋に量子力学的な問題には、[量子タスク](braket-submit-tasks.md)または[量子タスクのバッチ](braket-batching-tasks.md)を使用します。特定の QPU への優先的なアクセスは、古典的な処理で QPU への複数の反復呼び出しを断続的に必要とする、長時間実行される変分アルゴリズムに最も有益です。

**ローカルモードを使用してデバッグする**

QPU でハイブリッドジョブを実行する場合は、まずシミュレーター SV1 で実行して、期待どおりに実行されるかを確認することをお勧めします。小規模なテストでは、ローカルモードで実行することで迅速な反復実行とデバッグを行うことができます。

[独自のコンテナ (BYOC)](braket-jobs-byoc.md) により再現性を向上する

コンテナ化された環境内にソフトウェアとその依存関係をカプセル化することで、再現可能な実験を作成します。すべてのコード、依存関係、設定をコンテナにパッケージ化することで、潜在的な競合やバージョニングの問題を回避できます。

**マルチインスタンス分散シミュレーター**

多数の回路を実行するには、組み込みの MPI サポートを使用して、単一のハイブリッドジョブにおいて、複数のインスタンスでローカルシミュレーターを実行することを検討してください。詳細については、「[embedded simulators](pennylane-embedded-simulators.md)」を参照してください。

**パラメトリック回路を使用する**

ハイブリッドジョブから送信したパラメトリック回路は、[パラメトリックコンパイル](braket-jobs-parametric-compilation.md)を使用して特定の QPU で自動的にコンパイルされるため、アルゴリズムの実行時間が短縮されます。

**定期的にチェックポイントを作成する**

長時間実行されるハイブリッドジョブの場合、アルゴリズムの中間状態を定期的に保存することをお勧めします。

**その他の例、ユースケース、ベストプラクティスについては、GitHub の「[Amazon Braket examples](https://github.com/amazon-braket/amazon-braket-examples)」を参照してください。**

# ハイブリッドジョブでの API の使用方法
<a name="braket-jobs-api"></a>

API を直接使用することで、Amazon Braket Hybrid Jobs にアクセスして操作できます。ただし、API を直接使用する場合にはデフォルトおよび便利なメソッドは使用できなくなります。

**注記**  
Amazon Braket Hybrid Jobs の操作には [Amazon Braket Python SDK](https://github.com/aws/amazon-braket-sdk-python) を使用することを強くお勧めします。ハイブリッドジョブが正常に実行されるようにする便利なデフォルトと保護が提供されているためです。

このトピックでは、API の基本的な使用方法について説明します。API を使用するというアプローチは、SDK を使用する場合よりも複雑になることに注意してください。ハイブリッドジョブを実行できるようになるまでに、何度も試行錯誤する覚悟が必要です。

API を使用するには、アカウントに、`AmazonBraketFullAccess` マネージドポリシーを持つロールが必要です。

**注記**  
`AmazonBraketFullAccess` マネージドポリシーでロールを取得する方法の詳細については、「[Amazon Braket を有効にする](braket-enable-overview.md)」ページを参照してください。

また、**実行ロール**も必要です。このロールはサービスに渡されます。このロールを作成するには、**Amazon Braket コンソール**を使用します。**[アクセス許可と設定]** ページの **[実行ロール]** タブを使用して、ハイブリッドジョブのデフォルトロールを作成できます。

`CreateJob` API では、ハイブリッドジョブに必要なパラメータをすべて指定する必要があります。Python を使用するには、input.tar.gz ファイルなどのアルゴリズムスクリプトファイルを tar バンドルに圧縮し、次のスクリプトを実行します。コードのうち山括弧 (`<>`) で囲まれた部分を更新して、ハイブリッドジョブを開始するパス、ファイル、メソッドを指定するアカウント情報およびエントリポイントに一致させます。

```
from braket.aws import AwsDevice, AwsSession
import boto3
from datetime import datetime

s3_client = boto3.client("s3")
client = boto3.client("braket")

project_name = "job-test"
job_name = project_name + "-" + datetime.strftime(datetime.now(), "%Y%m%d%H%M%S")
bucket = "amazon-braket-<your_bucket>"
s3_prefix = job_name

job_script = "input.tar.gz"
job_object = f"{s3_prefix}/script/{job_script}"
s3_client.upload_file(job_script, bucket, job_object)

input_data = "inputdata.csv"
input_object = f"{s3_prefix}/input/{input_data}"
s3_client.upload_file(input_data, bucket, input_object)

job = client.create_job(
    jobName=job_name,
    roleArn="arn:aws:iam::<your_account>:role/service-role/AmazonBraketJobsExecutionRole",  # https://docs.aws.amazon.com/braket/latest/developerguide/braket-manage-access.html#about-amazonbraketjobsexecution
    algorithmSpecification={
        "scriptModeConfig": {
            "entryPoint": "<your_execution_module>:<your_execution_method>",
            "containerImage": {"uri": "292282985366.dkr.ecr.us-west-1.amazonaws.com/amazon-braket-base-jobs:1.0-cpu-py37-ubuntu18.04"},   # Change to the specific region you are using
            "s3Uri": f"s3://{bucket}/{job_object}",
            "compressionType": "GZIP"
        }
    },
    inputDataConfig=[
        {
            "channelName": "hellothere",
            "compressionType": "NONE",
            "dataSource": {
                "s3DataSource": {
                    "s3Uri": f"s3://{bucket}/{s3_prefix}/input",
                    "s3DataType": "S3_PREFIX"
                }
            }
        }
    ],
    outputDataConfig={
        "s3Path": f"s3://{bucket}/{s3_prefix}/output"
    },
    instanceConfig={
        "instanceType": "ml.m5.large",
        "instanceCount": 1,
        "volumeSizeInGb": 1
    },
    checkpointConfig={
        "s3Uri":  f"s3://{bucket}/{s3_prefix}/checkpoints",
        "localPath": "/opt/omega/checkpoints"
    },
    deviceConfig={
        "priorityAccess": {
            "devices": [
                "arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-3"
            ]
        }
    },
    hyperParameters={
        "hyperparameter key you wish to pass": "<hyperparameter value you wish to pass>",
    },
    stoppingCondition={
        "maxRuntimeInSeconds": 1200,
        "maximumTaskLimit": 10
    },
)
```

ハイブリッドジョブの作成後に、ハイブリッドジョブの詳細にアクセスするには、`GetJob` API またはコンソールを使用します。直前の例のように `createJob` コードを実行した Python セッションからハイブリッドジョブの詳細を取得するには、次の Python コマンドを使用します。

```
getJob = client.get_job(jobArn=job["jobArn"])
```

ハイブリッドジョブをキャンセルするには、ジョブ ('JobArn') の <noloc>Amazon リソースネーム</noloc>を指定して `CancelJob` API を呼び出します。

```
cancelJob = client.cancel_job(jobArn=job["jobArn"])
```

チェックポイントを指定するには、`createJob` API の一部として `checkpointConfig` パラメータを使用します。

```
    checkpointConfig = {
        "localPath" : "/opt/omega/checkpoints",
        "s3Uri": f"s3://{bucket}/{s3_prefix}/checkpoints"
    },
```

**注記**  
`checkpointConfig` のローカルパスの先頭を、予約済みパスである `/opt/ml`、`/opt/braket`、`/tmp`、または `/usr/local/nvidia` のいずれかにすることはできません。

# ローカルモードでのハイブリッドジョブの作成およびデバッグ
<a name="braket-jobs-local-mode"></a>

新しいハイブリッドアルゴリズムを構築する際、ローカルモードはアルゴリズムスクリプトのデバッグとテストに役立ちます。ローカルモードは、Amazon Braket Hybrid Jobs で使用する予定のコードを実行できる機能ですが、Braket がハイブリッドジョブを実行するためのインフラストラクチャを管理する必要はありません。代わりに、Amazon Braket ノートインスタンスまたはノートブックパソコンやデスクトップコンピュータなどの優先クライアントでハイブリッドジョブをローカルで実行します。

ローカルモードでは、量子タスクを実際のデバイスに送信することはできますが、ローカルモードで実際の量子処理ユニット (QPU) に対して実行すると、パフォーマンス上の利点は得られません。

ローカルモードを使用するには、プログラム内で AwsQuantumJob が使用されている箇所で、`AwsQuantumJob` を `LocalQuantumJob` に変更します。例えば、「[最初のジョブを作成する](braket-jobs-first.md)」に記載されている例を実行するには、コード内のハイブリッドジョブスクリプトを次のように編集します。

```
from braket.jobs.local import LocalQuantumJob

job = LocalQuantumJob.create(
    device="arn:aws:braket:::device/quantum-simulator/amazon/sv1",
    source_module="algorithm_script.py",
    entry_point="algorithm_script:start_here",
)
```

**注記**  
この機能を使用するには、Amazon Braket ノートブックに既にプリインストールされている Docker をローカル環境にインストールする必要があります。Docker のインストール手順については、「[Get Docker](https://docs.docker.com/get-started/get-docker/)」ページを参照してください。また、ローカルモードではすべてのパラメータがサポートされているわけではありません。