

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

# 自定义模型导入的代码示例
<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. 粘贴以下策略，{{${model-file-bucket}}}替换为您的存储桶名称，然后选择**下一步**。

------
#### [ 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}}并将以下策略粘贴到其中，{{${model-file-bucket}}}替换为您的存储桶名称。

------
#### [ 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 数据访问策略，请{{${model-file-bucket}}}替换为您的 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)请求，替换为返回{{${policy-arn}}}`Arn`的代码。

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

------

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

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

要提交自定义模型导入任务，请在终端的命令行中运行以下命令，{{${my-import-model-role-arn}}}替换为您设置的模型角色和模型文件的 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}}替换为您导入模型的区域，{{${my-import-model-role-arn}}}替换为您设置的 ARN{{MyImportModelRole}}，并{{${model-file-bucket}}}替换为您的 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}}'
            )
```

------