

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

# 自定义模型导入的代码示例
<a name="custom-model-import-code-samples"></a>

以下代码示例展示了如何设置权限、创建自定义模型导入任务、查看导入任务和导入模型的详细信息以及如何删除导入的模型。这些代码示例适用于Mistral AI、Llama、Qwen、FlanGPTBigCode、和Mixtral架构。

## 重要：模型架构 Support
<a name="model-architecture-support"></a>

**GPT-OSS型号限制：**
+ **不支持 Converse API：**GPT-OSS基于自定义模型的导入模型不支持 Converse API 或 ConverseStream API。
+ **改用 InvokeModel API：**客户在使用GPT-OSS基于自定义模型时必须使用 [InvokeModel](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html)API。
+ **API 架构要求：**GPT-OSS模型需要兼容 OpenAI 的 API 架构：
  + 完成请求的完成格式
  + ChatCompletion 聊天请求的格式
  + 响应格式遵循 OpenAI API 规范
+ **Converse API 支持的模型：**Converse API 仅支持Mistral AILlama、Qwen、、FlanGPTBigCode、和Mixtral架构。

有关使用 [InvokeModel](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html)API 的GPT-OSS模型使用示例，请参阅 OpenAI API 架构文档。 request/response 

1. 准备要导入的模型文件

   1. 如果要从 Amazon S3 存储桶导入，您需要提供 Hugging Face 权重格式的模型文件。有关更多信息，请参阅[从 Amazon S3 导入模型源](model-customization-import-model.md#model-customization-import-model-source)。

   1. 为模型文件创建一个 Amazon S3 存储桶（名称必须是唯一的）。

   1. 将模型文件上传到该存储桶。

1. 创建用于访问模型文件的策略，并将其附加到具有 Amazon Bedrock 信任关系的 IAM 角色。选择与您的首选方法对应的选项卡，然后按照以下步骤操作：

------
#### [ Console ]

   1. 创建 Amazon S3 策略以访问包含模型文件的 Amazon S3 存储桶

      1. 导航到 [https://console.aws.amazon.com/iam 上的 IAM](https://console.aws.amazon.com/iam) 控制台，然后从左侧导航窗格中选择**策略**。

      1. 选择**创建策略**，然后选择 **JSON** 打开**策略编辑器**。

      1. 粘贴以下策略，*\$1\$1model-file-bucket\$1*替换为您的存储桶名称，然后选择**下一步**。

------
#### [ JSON ]

****  

         ```
         {
             "Version":"2012-10-17",		 	 	 
             "Statement": [
                 {
                     "Effect": "Allow",
                     "Action": [
                         "s3:GetObject",
                         "s3:ListBucket"
                     ],
                     "Resource": [
                         "arn:aws:s3:::${model-file-bucket}",
                         "arn:aws:s3:::${model-file-bucket}/*"
                     ]
                   }
                 ]
               }
         ```

------

      1. 为策略命名*S3BucketPolicy*并选择**创建策略**。

   1. 创建 IAM 角色并附加此策略。

      1. 从左侧导航窗格中选择**角色**，然后选择**创建角色**。

      1. 选择**自定义信任策略**，粘贴以下策略，然后选择**下一步**。

------
#### [ JSON ]

****  

         ```
         {
             "Version":"2012-10-17",		 	 	 
             "Statement": [
                 {
                     "Effect": "Allow",
                     "Principal": {
                         "Service": "bedrock.amazonaws.com"
                     },
                     "Action": "sts:AssumeRole"
                 }
             ] 
         }
         ```

------

      1. 搜索您创建的*S3BucketPolicy*策略，选中该复选框，然后选择**下一步**。

      1. 为角色命名*MyImportModelRole*并选择*Create role*。

------
#### [ CLI ]

   1. 创建一个名为的文件*BedrockTrust.json*并将以下策略粘贴到其中。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "bedrock.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
              }
          ] 
      }
      ```

------

   1. 创建另一个名为的文件*S3BucketPolicy.json*并将以下策略粘贴到其中，*\$1\$1model-file-bucket\$1*替换为您的存储桶名称。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "s3:GetObject",
                      "s3:ListBucket"
                  ],
                  "Resource": [
                      "arn:aws:s3:::${model-file-bucket}",
                      "arn:aws:s3:::${model-file-bucket}/*"
                  ]
              }
           ]
      }
      ```

------

   1. 在终端中，导航到包含您创建的策略的文件夹。

   1. [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)请求创建名为的 IAM 角色*MyImportModelRole*并附加您创建的*BedrockTrust.json*信任策略。

      ```
      aws iam create-role \
          --role-name MyImportModelRole \
          --assume-role-policy-document file://BedrockTrust.json
      ```

   1. [CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html)请求使用您创建*S3BucketPolicy.json*的文件创建 S3 数据访问策略。响应会为该策略返回一个 `Arn`。

      ```
      aws iam create-policy \
          --policy-name S3BucketPolicy \
          --policy-document file://S3BucketPolicy.json
      ```

   1. [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)请求将 S3 数据访问策略附加到您的角色，将`policy-arn`替换为上一步响应中的 ARN：

      ```
      aws iam attach-role-policy \
          --role-name MyImportModelRole \
          --policy-arn ${policy-arn}
      ```

------
#### [ Python ]

   1. 运行以下代码，[CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)请求创建名为的 IAM 角色*MyImportModel*并[CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html)请求创建名为的 S3 数据访问策略*S3BucketPolicy*。对于 S3 数据访问策略，请*\$1\$1model-file-bucket\$1*替换为您的 S3 存储桶名称。

      ```
      import boto3
      import json
      
      iam = boto3.client("iam")
      
      iam.create_role(
          RoleName="MyImportModelRole",
          AssumeRolePolicyDocument=json.dumps({
              "Version": "2012-10-17",		 	 	 
              "Statement": [
                  {
                      "Effect": "Allow",
                      "Principal": {
                          "Service": "bedrock.amazonaws.com"
                      },
                      "Action": "sts:AssumeRole"
                  }
              ] 
          })
      )
      
      iam.create_policy(
          PolicyName="S3BucketPolicy",
          PolicyDocument=json.dumps({
              "Version": "2012-10-17",		 	 	 
              "Statement": [
                  {
                      "Effect": "Allow",
                      "Action": [
                          "s3:GetObject",
                          "s3:ListBucket"
                      ],
                      "Resource": [
                          "arn:aws:s3:::${training-bucket}",
                          "arn:aws:s3:::${training-bucket}/*"
                      ]
                  }
                ]
             })
           )
      ```

   1. 响应会返回一个 `Arn`。运行以下代码片段发出[AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)请求，替换为返回*\$1\$1policy-arn\$1*`Arn`的代码。

      ```
      iam.attach_role_policy(
          RoleName="MyImportModelRole",
          PolicyArn="${policy-arn}"
      )
      ```

------

1. 选择一种语言，查看调用自定义模型导入 API 操作的代码示例。

------
#### [ CLI ]

要提交自定义模型导入任务，请在终端的命令行中运行以下命令，*\$1\$1my-import-model-role-arn\$1*替换为您设置的模型角色和模型文件的 S3 存储桶路径。*s3-bucket-path*

```
aws bedrock create-model-import-job 
    --job-name MyImportedModelJobName
    --imported-model-name MyImportedModelName
    --role-arn ${my-import-model-role-arn}  
    --model-data-source '{"s3DataSource": {"s3Uri": s3-bucket-path }}
```

响应会返回一个 *jobArn*。自定义导入任务需要一些时间才能完成。您可以使用 `jobArn` 和以下命令检查导入作业的状态。

以下字段是可选字段：
+ 要添加 VPC 配置，请在上述命令中添加以下参数以指定安全组和子网：

  ```
     -\\-vpc-config '{securityGroupIds": ["sg-xx"], "subnetIds": ["subnet-yy", "subnet-zz"]}'
  ```
+ 要使用 KMS 密钥为模型加密，请在上述命令中添加以下参数，替换这些值以指定要用来为模型加密的密钥。

  ```
     -\\-customModelKmsKeyId 'arn:aws:kms:region:account-id:key/key-id'
  ```
+ 要添加标签，请在上述命令中添加以下参数，将键和值替换为要附加到任务 and/or 输出模型的标签，并确保使用空格分隔 key/value 成对值：

  ```
     -\\-tags key=key1,value=value1 key=key2,value=value2
  ```

响应会返回一个 *jobArn*。自定义导入任务需要一些时间才能完成。您可以使用 `jobArn` 和以下命令检查导入作业的状态。

```
aws bedrock get-model-import-job \
    --job-identifier "jobArn"
```

响应类似于以下内容：

```
{
    "jobArn": ${job-arn} ,
    "jobName": MyImportedModelJobName,
    "importedModelName": MyImportedModelName,
    "roleArn": ${my-role-arn},
    "modelDataSource": {
        "s3DataSource": {
            "s3Uri": "${S3Uri}"
        }
    },
    "status": "Complete",
    "creationTime": "2024-08-13T23:38:42.457Z",
    "lastModifiedTime": "2024-08-13T23:39:25.158Z"
```

当 `status` 为 `Complete` 时，表明导入作业完成。

要在新导入的模型上运行推理，您必须提供导入模型的 ARN 作为 `model-id`。获取导入模型的 ARN。

```
aws bedrock list-imported-models              
```

响应包含模型名称和模型 ARN。使用模型 ARN 可调用导入的模型。有关更多信息，请参阅 [使用以下命令提交单个提示 InvokeModel](inference-invoke.md)。

```
{
    "modelSummaries": [
        {
            "modelArn": model-arn,
            "modelName": "MyImportedModelName",
            "modelArchitecture":model-architecture,
            "instructSupported":Y,
            "creationTime": "2024-08-13T19:20:14.058Z"
            
        }
    ]
}
```

要删除导入的模型，请在终端中使用要删除的导入模型的模型名称或模型 ARN 在命令行中运行以下命令。

```
aws bedrock delete-imported-model 
                --model-identifier MyImportedModelName
```

------
#### [ Python ]

运行以下代码片段提交自定义模型导入任务。*my-region*替换为您导入模型的区域，*\$1\$1my-import-model-role-arn\$1*替换为您设置的 ARN*MyImportModelRole*，并*\$1\$1model-file-bucket\$1*替换为您的 S3 存储桶名称。

```
import boto3
import json

REGION_NAME = my-region
bedrock = boto3.client(service_name='bedrock',
                       region_name=REGION_NAME)

JOB_NAME = MyImportedModelJobName 
ROLE_ARN = ${my-import-model-role-arn}
IMPORTED_MODEL_NAME = ImportedModelName
S3_URI = ${S3Uri}

# createModelImportJob API
create_job_response = bedrock.create_model_import_job(
    jobName=JOB_NAME,
    importedModelName=IMPORTED_MODEL_NAME,
    roleArn=ROLE_ARN,
    modelDataSource={
        "s3DataSource": {
            "s3Uri": S3_URI
        }
    },
)
job_arn = create_job_response.get("jobArn")
```

以下字段是可选字段。
+ 要添加 VPC 配置，请在上述命令中添加以下参数以指定安全组和子网：

  ```
     vpc-config = {'securityGroupIds: ["sg-xx".], 'subnetIds': [subnet-yy, 'subnet-zz']}'
  ```
+ 要使用 KMS 密钥为模型加密，请在上述命令中添加以下参数，替换这些值以指定要用来为模型加密的密钥。

  ```
     importedModelKmsKeyId = 'arn:aws:kms:region:account-id:key/key-id'
  ```
+ 要添加标签，请在上述命令中添加以下参数，将键和值替换为要附加到任务 and/or 输出模型的标签，并确保使用空格分隔 key/value 成对值：

  ```
     jobTags key=key1,value=value1 key=key2,value=value2
  ```

响应会返回一个 jobArn

```
               job_arn = create_job_response.get("jobArn")
```

自定义导入任务需要一些时间才能完成。您可以使用 `jobArn` 和以下命令检查导入作业的状态。

```
bedrock.get_model_import_job(jobIdentifier=jobArn)
```

当 `status` 为 `Completed` 时，表明导入作业完成。

要在新导入的模型上运行推理，您必须提供导入模型的 ARN 作为 `model-id`。获取导入模型的 ARN。

```
response_pt = bedrock.list_imported_models(
    creationTimeBefore=datetime (2015,1,1,
    creationTimeAfter= datetime (2015,1,1,
    nameContains = 'MyImportedModelName,
    maxresults = 123
    nextToken = 'none',
    sortBy = 'creationTime',
    sortOrder = 'Ascending'
```

响应会返回 `modelArn` 以及导入的模型的其他详细信息。

```
{
    'nextToken': '',
    'modelSummaries': [
        {
            'modelArn': 'your-model-arn',
            'modelName': 'MyImportedModelName',
            'modelArchitecture':model-architecture,
            'instructSupported':Y,
            'creationTime': datetime(2015, 1, 1)
        },
    ]
```

使用模型 ARN 可调用导入的模型。有关更多信息，请参阅 [使用以下命令提交单个提示 InvokeModel](inference-invoke.md)。

要删除导入的模型，请使用要删除的导入模型的模型名称或模型 ARN 运行以下命令。

```
response = client.delete_imported_model(
    modelIdentifier='MyImportedModelName'
            )
```

------