

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

# Code samples for model customization
<a name="model-customization-code-samples"></a>

次のコードサンプルは、基本的なデータセットの準備、アクセス許可の設定、カスタムモデルの作成、出力ファイルの表示、モデルのスループットの購入、モデルの推論の実行の方法を示しています。これらのコードスニペットは、特定のユースケースに変更できます。

1. トレーニングデータセットを準備します。

   1. 次の 1 行を含むトレーニングデータセットファイルを作成し、そのファイルに *train.jsonl *という名前を付けます。

      ```
      {"prompt": "what is AWS", "completion": "it's Amazon Web Services"}
      ```

   1. トレーニングデータ用に S3 バケットを作成し、出力データ用に別のバケットを作成します (名前は一意である必要があります)。

   1. *train.jsonl* をトレーニングデータバケットにアップロードします。

1. トレーニングにアクセスするためのポリシーを作成し、Amazon Bedrock の信頼関係を持つ IAM ロールにアタッチします。任意の方法のタブを選択し、その手順に従います。

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

   1. S3 ポリシーを作成します。

      1. IAM コンソール ([https://console.aws.amazon.com/iam](https://console.aws.amazon.com/iam)) に移動し、左側のナビゲーションペインで **[ポリシー]** を選択します。

      1. **[ポリシーの作成]** を選択し、**[JSON]** を選択して **[ポリシーエディタ]** を開きます。

      1. 次のポリシーを貼り付け、*\$1\$1training-bucket\$1* および *\$1\$1output-bucket\$1* をバケット名に置き換えたら、**[次へ]** を選択します。

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

****  

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

------

      1. ポリシーに *MyFineTuningDataAccess* と名前を付け、**[ポリシーを作成]** を選択します。

   1. IAM ロールを作成して、ポリシーをアタッチします。

      1. 左側のナビゲーションペインで **[ロール]** > **[ロールの作成]** の順に選択します。

      1. **[カスタム信頼ポリシー]** を選択し、以下のポリシーを貼り付けて、**[次へ]** を選択します。

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

****  

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

------

      1. 作成した *MyFineTuningDataAccess* ポリシーを検索し、チェックボックスをオンにして、**[次へ]** を選択します。

      1. *MyCustomizationRole* ロールに名前を付け、*[ロールを作成]* を選択します。

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

   1. *BedrockTrust.json* というファイルを作成し、次のポリシーをそのファイルに貼り付けます。

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

****  

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

------

   1. *MyFineTuningDataAccess.json* という別のファイルを作成し、次のポリシーをそのファイルに貼り付け、*\$1\$1training-bucket\$1* と *\$1\$1output-bucket\$1* をバケット名に置き換えます。

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

****  

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

------

   1. ターミナルで、作成したポリシーを含むフォルダに移動します。

   1. [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) リクエストを実行して *MyCustomizationRole* という名前の IAM ロールを作成し、作成した *BedrockTrust.json* 信頼ポリシーをアタッチします。

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

   1. [CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html) リクエストを実行して、作成した *MyFineTuningDataAccess.json* ファイルを使用して S3 データアクセスポリシーを作成します。レスポンスは、ポリシーの `Arn` を返します。

      ```
      aws iam create-policy \
          --policy-name MyFineTuningDataAccess \
          --policy-document file://myFineTuningDataAccess.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 MyCustomizationRole \
          --policy-arn ${policy-arn}
      ```

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

   1. 以下のコードを実行し [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) リクエストを実行して *MyCustomizationRole* という IAM ロールを作成します。次に、[CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html) リクエストを実行して *MyFineTuningDataAccess* という S3 データアクセスポリシーを作成します。S3 データアクセスポリシーでは、*\$1\$1training-bucket\$1* と *\$1\$1output-bucket\$1* を S3 バケット名に置き換えます。

      ```
      import boto3
      import json
      
      iam = boto3.client("iam")
      
      iam.create_role(
          RoleName="MyCustomizationRole",
          AssumeRolePolicyDocument=json.dumps({
              "Version": "2012-10-17",		 	 	 
              "Statement": [
                  {
                      "Effect": "Allow",
                      "Principal": {
                          "Service": "bedrock.amazonaws.com"
                      },
                      "Action": "sts:AssumeRole"
                  }
              ] 
          })
      )
      
      iam.create_policy(
          PolicyName="MyFineTuningDataAccess",
          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}/*"
                      ]
                  },
                  {
                      "Effect": "Allow",
                      "Action": [
                          "s3:GetObject",
                          "s3:PutObject",
                          "s3:ListBucket"
                      ],
                      "Resource": [
                          "arn:aws:s3:::${output-bucket}",
                          "arn:aws:s3:::${output-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="MyCustomizationRole",
          PolicyArn="${policy-arn}"
      )
      ```

------

1. 言語を選択すると、model customization API オペレーションを呼び出すコードサンプルが表示されます。

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

まず、*FineTuningData.json* という名前のテキストファイルを作成します。以下から JSON コードをテキストファイルにコピーし、*\$1\$1training-bucket\$1* と *\$1\$1output-bucket\$1* を S3 バケット名に置き換えます。

```
{
    "trainingDataConfig": {
        "s3Uri": "s3://${training-bucket}/train.jsonl"
    },
    "outputDataConfig": {
        "s3Uri": "s3://${output-bucket}"
    }
}
```

モデルカスタムジョブを送信するには、ターミナルで *FineTuningData.json* を含むフォルダに移動し、コマンドラインで次のコマンドを実行し、*\$1\$1your-customization-role-arn\$1* を設定したモデルカスタマイズロールに置き換えます。

```
aws bedrock create-model-customization-job \
    --customization-type FINE_TUNING \
    --base-model-identifier arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1 \
    --role-arn ${your-customization-role-arn} \
    --job-name MyFineTuningJob \
    --custom-model-name MyCustomModel \
    --hyper-parameters epochCount=1,batchSize=1,learningRate=.0001,learningRateWarmupSteps=0 \
    --cli-input-json file://FineTuningData.json
```

レスポンスは *jobArn* を返します。ジョブが完了するまで待機します。次のコマンドを使用して、状態を確認します。

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

`status` が`COMPLETE` の場合、レスポンスに `trainingMetrics` が表示されます。次のコマンドを実行して、*aet.et-bucket * を出力バケット名に置き換え、*jobId* をカスタムジョブの ID (`jobArn` の最後のスラッシュの後のシーケンス) に置き換えることで、アーティファクトを現在のフォルダにダウンロードできます。

```
aws s3 cp s3://${output-bucket}/model-customization-job-jobId . --recursive
```

次のコマンドを使用して、カスタムモデルのコミットなしのプロビジョンドスループットを購入します。

**注記**  
この購入は時間単位で課金されます。コンソールを使用して、さまざまなオプションの料金見積りを表示します。

```
aws bedrock create-provisioned-model-throughput \
    --model-id MyCustomModel \
    --provisioned-model-name MyProvisionedCustomModel \
    --model-units 1
```

レスポンスは `provisionedModelArn` を返します。プロビジョンドスループットが作成されるまで待機します。状態を確認するには、次のコマンドで、プロビジョニングされたモデルの名前または ARN を `provisioned-model-id` として指定します。

```
aws bedrock get-provisioned-model-throughput \
    --provisioned-model-id ${provisioned-model-arn}
```

`status` が `InService` の場合、次のコマンドを使用すると、カスタムモデルで推論を実行できます。プロビジョニングされたモデルの ARN を `model-id` として指定する必要があります。出力は、現在のフォルダの *output.txt* という名前のファイルに書き込まれます。

```
aws bedrock-runtime invoke-model \
    --model-id ${provisioned-model-arn} \
    --body '{"inputText": "What is AWS?", "textGenerationConfig": {"temperature": 0.5}}' \
    --cli-binary-format raw-in-base64-out \
    output.txt
```

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

次のコードスニペットを実行して、ファインチューニングジョブを送信します。*\$1\$1your-customization-role-arn\$1* をセットアップした *MyCustomizationRole* の ARN に置き換え、*\$1\$1training-bucket\$1* と *\$1\$1output-bucket\$1* を S3 バケット名に置き換えます。

```
import boto3

bedrock = boto3.client(service_name='bedrock')
    
# Set parameters
customizationType = "FINE_TUNING"
baseModelIdentifier = "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1"
roleArn = "${your-customization-role-arn}"
jobName = "MyFineTuningJob"
customModelName = "MyCustomModel"
hyperParameters = {
        "epochCount": "1",
        "batchSize": "1",
        "learningRate": ".0001",
        "learningRateWarmupSteps": "0"
    }
trainingDataConfig = {"s3Uri": "s3://${training-bucket}/myInputData/train.jsonl"}
outputDataConfig = {"s3Uri": "s3://${output-bucket}/myOutputData"}

# Create job
response_ft = bedrock.create_model_customization_job(
    jobName=jobName, 
    customModelName=customModelName,
    roleArn=roleArn,
    baseModelIdentifier=baseModelIdentifier,
    hyperParameters=hyperParameters,
    trainingDataConfig=trainingDataConfig,
    outputDataConfig=outputDataConfig
)

jobArn = response_ft.get('jobArn')
```

レスポンスは *jobArn* を返します。ジョブが完了するまで待機します。次のコマンドを使用して、状態を確認します。

```
bedrock.get_model_customization_job(jobIdentifier=jobArn).get('status')
```

`status` が`COMPLETE` の場合、[GetModelCustomizationJob](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_GetModelCustomizationJob.html) レスポンスに `trainingMetrics` が表示されます。「[オブジェクトのダウンロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html)」の手順を実行しても、メトリクスをダウンロードできます。

次のコマンドを使用して、カスタムモデルのコミットなしのプロビジョンドスループットを購入します。

```
response_pt = bedrock.create_provisioned_model_throughput(
    modelId="MyCustomModel",
    provisionedModelName="MyProvisionedCustomModel",
    modelUnits="1"
)

provisionedModelArn = response_pt.get('provisionedModelArn')
```

レスポンスは `provisionedModelArn` を返します。プロビジョンドスループットが作成されるまで待機します。状態を確認するには、次のコマンドで、プロビジョニングされたモデルの名前または ARN を `provisionedModelId` として指定します。

```
bedrock.get_provisioned_model_throughput(provisionedModelId=provisionedModelArn)
```

`status` が `InService` の場合、次のコマンドを使用すると、カスタムモデルで推論を実行できます。プロビジョニングされたモデルの ARN を `modelId` として指定する必要があります。

```
import json
import logging
import boto3

from botocore.exceptions import ClientError


class ImageError(Exception):
    "Custom exception for errors returned by the model"

    def __init__(self, message):
        self.message = message


logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)


def generate_text(model_id, body):
    """
    Generate text using your provisioned custom model.
    Args:
        model_id (str): The model ID to use.
        body (str) : The request body to use.
    Returns:
        response (json): The response from the model.
    """

    logger.info(
        "Generating text with your provisioned custom model %s", model_id)

    brt = boto3.client(service_name='bedrock-runtime')

    accept = "application/json"
    content_type = "application/json"

    response = brt.invoke_model(
        body=body, modelId=model_id, accept=accept, contentType=content_type
    )
    response_body = json.loads(response.get("body").read())

    finish_reason = response_body.get("error")

    if finish_reason is not None:
        raise ImageError(f"Text generation error. Error is {finish_reason}")

    logger.info(
        "Successfully generated text with provisioned custom model %s", model_id)

    return response_body


def main():
    """
    Entrypoint for example.
    """
    try:
        logging.basicConfig(level=logging.INFO,
                            format="%(levelname)s: %(message)s")

        model_id = provisionedModelArn

        body = json.dumps({
            "inputText": "what is AWS?"
        })

        response_body = generate_text(model_id, body)
        print(f"Input token count: {response_body['inputTextTokenCount']}")

        for result in response_body['results']:
            print(f"Token count: {result['tokenCount']}")
            print(f"Output text: {result['outputText']}")
            print(f"Completion reason: {result['completionReason']}")

    except ClientError as err:
        message = err.response["Error"]["Message"]
        logger.error("A client error occurred: %s", message)
        print("A client error occured: " +
              format(message))
    except ImageError as err:
        logger.error(err.message)
        print(err.message)

    else:
        print(
            f"Finished generating text with your provisioned custom model {model_id}.")


if __name__ == "__main__":
    main()
```

------