

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 建立混合任務
<a name="braket-jobs-first"></a>

 本節說明如何使用 Python 指令碼建立混合任務。或者，若要從本機 Python 程式碼建立混合任務，例如您偏好的整合開發環境 (IDE) 或 Braket 筆記本，請參閱 [將本機程式碼作為混合任務執行](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/zh_tw/braket/latest/developerguide/images/braket-jobs-first-workflow.jpg)


首先，請考慮以下演算法指令碼的基本範例，該指令碼會建立五個鐘狀態並列印對應的測量結果。

```
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!")
```

在 Braket 筆記本或本機環境的目前工作目錄中，使用名稱 *algorithm\_script.py* 儲存此檔案。algorithm\_script.py 檔案具有 `start_here()`作為計劃的進入點。

接著，在與 algorithm\_script.py 檔案相同的目錄中建立 Python 檔案或 Python 筆記本。此指令碼會啟動混合任務，並處理任何非同步處理，例如列印我們感興趣的狀態或關鍵結果。此指令碼至少需要指定混合任務指令碼和主要裝置。

**注意**  
如需如何在與筆記本相同的目錄中建立 Braket 筆記本或上傳檔案的詳細資訊，例如 *algorithm\_script.py* 檔案，請參閱[使用 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、DM1、 SV1和 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 範例 Github 儲存](https://github.com/amazon-braket/amazon-braket-examples/tree/main)庫中混合任務資料夾中的 [Parallelize\_training\_for\_QML.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`。

![CloudWatch 日誌群組顯示日誌事件的清單，其中包含 Amazon Braket SDK Python 測試的檔案路徑和時間戳記。](http://docs.aws.amazon.com/zh_tw/braket/latest/developerguide/images/braket-jobs-first-cw-log.png)


您也可以在主控台中選取混合任務頁面，然後選擇**設定**，以檢視**混合任務**的狀態。

![Amazon Braket 混合任務詳細資訊，顯示摘要、事件時間、原始程式碼和執行個體組態，以及停止條件。](http://docs.aws.amazon.com/zh_tw/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 壓縮檔案中） 中使用這些結果。

輸出必須使用 JavaScript 物件標記法 (JSON) 格式儲存在檔案中。如果資料無法輕易序列化為文字，如同凹凸陣列的情況，您可以傳入 選項，以使用挑選的資料格式序列化。如需詳細資訊，請參閱 [braket.jobs.data\_persistence 模組。](https://amazon-braket-sdk-python.readthedocs.io/en/latest/_apidoc/braket.jobs.data_persistence.html#braket.jobs.data_persistence.save_job_result)

若要儲存混合任務的結果，請將以下以 \#ADD 註解的行新增至 algorithm\_script.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!")
```

然後，您可以透過附加加上 \#ADD ** `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>

您可以使用檢查點儲存混合任務的中繼反覆運算。在上一節的演算法指令碼範例中，您可以新增以下以 \#ADD 註解的行來建立檢查點檔案。

```
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\_file\_suffix* 必須符合先前在建立檢查點時指定的尾碼。

您的協同運作指令碼需要指定上一個混合任務`job-arn`的 ，並使用 \#ADD 加上註解的行。

```
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
    )
```