ローカルコードをハイブリッドジョブとして実行する - Amazon Braket

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

ローカルコードをハイブリッドジョブとして実行する

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

ローカル Python コードからハイブリッドジョブを作成する

ローカル Python コードを Amazon Braket Hybrid Job として実行できます。これを行うには、次のコード例に示すように、コードをデ@hybrid_jobコレータで注釈付けします。カスタム環境では、Amazon Elastic Container Registry () のカスタムコンテナを使用できますECR。

注記

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

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

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で使用されるデバイスがデコレータで指定されたデバイスと一致することを確認する必要があります。便宜上、ヘルパー関数を使用してget_job_device_arn()、 でARN宣言されたデバイスをキャプチャできます@hybrid_job

注記

各ハイブリッドジョブは、Amazon にコンテナ化された環境を作成してから、少なくとも 1 分間の起動時間がありますEC2。したがって、1 つの回路や複数の回路などの非常に短いワークロードでは、量子タスクを使用するだけで十分です。

ハイパーパラメータ

run_hybrid_job() 関数は 引数num_tasksを使用して、作成された量子タスクの数を制御します。ハイブリッドジョブは、これをハイパーパラメータ として自動的にキャプチャします。

注記

ハイパーパラメータは、2500 文字に制限された文字列として Braket コンソールに表示されます。

メトリクスとログ記録

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

結果の取得

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

@hybrid_job(device=Devices.Amazon.SV1) def passing(): np_array = np.random.rand(5) return np_array # serializable @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

ローカルモード

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

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

他のハイブリッドジョブオプションはすべてサポートされています。オプションのリストについては、braket.jobs.quantum_job_creation モジュール を参照してください。

追加の Python パッケージとソースコードをインストールする

ランタイム環境をカスタマイズして、任意の Python パッケージを使用できます。requirements.txt ファイル、パッケージ名のリスト、独自のコンテナ (BYOC) のいずれかを使用できます。requirements.txt ファイルを使用してランタイム環境をカスタマイズするには、次のコード例を参照してください。

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

例えば、requirements.txtファイルにはインストールする他のパッケージが含まれている場合があります。

qiskit pennylane >= 0.31 mitiq == 0.29

または、次のようにパッケージ名を 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 ...

ハイブリッドジョブインスタンスにデータを保存してロードする

入力トレーニングデータの指定

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

@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()ヘルパー関数を使用する必要があります。

s3_path = "s3://amazon-braket-us-west-1-961591465522/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 URIsまたはローカルパスのディクショナリを指定することで、複数の入力データソースを指定できます。

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 への結果の保存

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

@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() でダウンロードするか、Brainpt 管理コンソールのハイブリッドジョブページから結果フォルダに移動することでダウンロードできます。

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

長時間実行されるハイブリッドジョブの場合、アルゴリズムの中間状態を定期的に保存することをお勧めします。組み込み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。このコードは、「チェックポイント」と呼ばれるサブフォルダの下に、ハイブリッドジョブアーティファクト<jobname>.jsonにデフォルト名を持つチェックポイントファイルを作成して上書きします。

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

ハイブリッドジョブデコレータのベストプラクティス

非同期性を受け入れる

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

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

ハイブリッドジョブは、反復量子-古典アルゴリズムを実行するツールを提供します。純粋な量子の問題には、量子タスク または量子タスクのバッチ を使用します。特定の への優先アクセスQPUsは、その間のクラシック処理QPUsで への複数の反復呼び出しを必要とする長時間実行のバリエーションアルゴリズムに最も有益です。

ローカルモードを使用したデバッグ

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

Bring your own container (BYOC) による再現性の向上

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

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

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

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

ハイブリッドジョブから送信するパラメトリック回路は、アルゴリズムの実行時間を向上させるためにパラメトリックコンパイルQPUsを使用して、特定の で自動的にコンパイルされます。

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

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

その他の例、ユースケース、ベストプラクティスについては、Amazon Braket の例 GitHub」を参照してください。