

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 API 和 Hybrid Jobs 配合使用
<a name="braket-jobs-api"></a>

您可以直接使用 API Amazon Braket Hybrid Jobs 访问并与之交互。但是，直接使用 API 时，默认方法和便捷方法不可用。

**注意**  
强烈建议您使用 [Amazon Braket Python SDK](https://github.com/aws/amazon-braket-sdk-python) 与 Amazon Braket Hybrid Jobs 互动。它提供便捷的默认设置和保护功能，可帮助您的混合作业成功运行。

本主题涵盖了关于使用 API 的基础知识。如果您选择使用 API，请记住这种方法可能更为复杂，并且需要为几次迭代做好准备，以使您的混合作业得以运行。

要使用 API，您的账户应具有 `AmazonBraketFullAccess` 托管式策略的角色。

**注意**  
有关如何使用 `AmazonBraketFullAccess` 托管式策略获取角色的更多信息，请参阅[启用 Amazon Braket 页面](braket-enable-overview.md)。

此外，您还需要一个**执行角色**。此角色将被传递给服务。您可以使用 **Amazon Braket 控制台**来创建角色。使用“**权限和设置**”页面上的“**执行角色**”选项卡为混合作业创建默认角色。

`CreateJob` API 要求您为混合作业指定所有必需的参数。要使用 Python，请将算法脚本文件压缩为 tar 包，如 input.tar.gz 文件，然后运行以下脚本。更新尖括号 (`<>`) 内的代码部分，以匹配您的账户信息和指定混合作业开始路径、文件和方法的入口点。

```
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') Amazon Resource Name 调用 `CancelJob` API。

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

您可以使用 `checkpointConfig` 参数将检查点指定为 `createJob` API 的一部分。

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

**注意**  
`checkpointConfig` 的 localPath 不能以下列任何保留路径开头：`/opt/ml`、`/opt/braket`、`/tmp` 或 `/usr/local/nvidia`。