

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Sampel kode untuk kustomisasi model
<a name="model-customization-code-samples"></a>

Contoh kode berikut menunjukkan cara menyiapkan kumpulan data dasar, mengatur izin, membuat model khusus, melihat file keluaran, membeli throughput untuk model, dan menjalankan inferensi pada model. Anda dapat memodifikasi cuplikan kode ini ke kasus penggunaan khusus Anda.

1. Siapkan dataset pelatihan.

   1. Buat file dataset pelatihan yang berisi satu baris berikut dan beri nama. *train.jsonl*

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

   1. Buat bucket S3 untuk data latihan Anda dan satu lagi untuk data keluaran Anda (nama harus unik).

   1. Unggah *train.jsonl* ke dalam bucket data pelatihan.

1. Buat kebijakan untuk mengakses pelatihan Anda dan lampirkan ke peran IAM dengan hubungan kepercayaan Amazon Bedrock. Pilih tab untuk metode pilihan Anda, lalu ikuti langkah-langkahnya:

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

   1. Buat kebijakan S3.

      1. Arahkan ke konsol IAM di [https://console.aws.amazon.com/iam](https://console.aws.amazon.com/iam) dan pilih **Kebijakan dari panel** navigasi kiri.

      1. Pilih **Buat kebijakan** dan kemudian pilih **JSON** untuk membuka **editor Kebijakan**.

      1. Rekatkan kebijakan berikut, ganti *\$1\$1training-bucket\$1* dan *\$1\$1output-bucket\$1* dengan nama bucket Anda, lalu pilih **Berikutnya**.

------
#### [ 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. Beri nama kebijakan *MyFineTuningDataAccess* dan pilih **Buat kebijakan**.

   1. Buat peran IAM dan lampirkan kebijakan.

      1. Dari panel navigasi kiri, pilih **Peran**, lalu pilih **Buat peran**.

      1. Pilih **Kebijakan kepercayaan khusus**, tempel kebijakan berikut, dan pilih **Berikutnya**.

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

****  

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

------

      1. Cari *MyFineTuningDataAccess* kebijakan yang Anda buat, pilih kotak centang, dan pilih **Berikutnya**.

      1. Beri nama peran *MyCustomizationRole* dan pilih*Create role*.

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

   1. Buat file bernama *BedrockTrust.json* dan tempel kebijakan berikut ke dalamnya.

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

****  

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

------

   1. Buat file lain yang dipanggil *MyFineTuningDataAccess.json* dan tempelkan kebijakan berikut ke dalamnya, ganti *\$1\$1training-bucket\$1* dan *\$1\$1output-bucket\$1* dengan nama bucket Anda.

------
#### [ 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. Di terminal, arahkan ke folder yang berisi kebijakan yang Anda buat.

   1. Buat [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)permintaan untuk membuat peran IAM yang disebut *MyCustomizationRole* dan lampirkan kebijakan *BedrockTrust.json* kepercayaan yang Anda buat.

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

   1. Buat [CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html)permintaan untuk membuat kebijakan akses data S3 dengan *MyFineTuningDataAccess.json* file yang Anda buat. Respons mengembalikan `Arn` untuk kebijakan.

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

   1. Buat [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)permintaan untuk melampirkan kebijakan akses data S3 ke peran Anda, ganti `policy-arn` dengan ARN dalam respons dari langkah sebelumnya:

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

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

   1. Jalankan kode berikut untuk membuat [CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)permintaan untuk membuat peran IAM dipanggil *MyCustomizationRole* dan untuk membuat [CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html)permintaan untuk membuat kebijakan akses data S3 dipanggil. *MyFineTuningDataAccess* Untuk kebijakan akses data S3, ganti *\$1\$1training-bucket\$1* dan *\$1\$1output-bucket\$1* dengan nama bucket S3 Anda.

      ```
      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. An `Arn` dikembalikan sebagai tanggapan. Jalankan cuplikan kode berikut untuk membuat [AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)permintaan, ganti *\$1\$1policy-arn\$1* dengan yang dikembalikan. `Arn`

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

------

1. Pilih bahasa untuk melihat contoh kode untuk memanggil operasi API kustomisasi model.

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

Pertama, buat file teks bernama*FineTuningData.json*. Salin kode JSON dari bawah ke dalam file teks, ganti *\$1\$1training-bucket\$1* dan *\$1\$1output-bucket\$1* dengan nama bucket S3 Anda.

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

Untuk mengirimkan pekerjaan penyesuaian model, navigasikan ke folder yang berisi *FineTuningData.json* terminal dan jalankan perintah berikut di baris perintah, ganti *\$1\$1your-customization-role-arn\$1* dengan peran penyesuaian model yang Anda siapkan.

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

Respons mengembalikan a*jobArn*. Biarkan pekerjaan beberapa waktu untuk diselesaikan. Anda dapat memeriksa statusnya dengan perintah berikut.

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

Ketika `status` ada`COMPLETE`, Anda dapat melihat `trainingMetrics` dalam respon. Anda dapat mengunduh artefak ke folder saat ini dengan menjalankan perintah berikut, menggantinya *aet.et-bucket* dengan nama bucket keluaran Anda dan *jobId* dengan ID pekerjaan penyesuaian (urutan mengikuti garis miring terakhir di`jobArn`).

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

Beli Throughput Penyediaan tanpa komitmen untuk model kustom Anda dengan perintah berikut.

**catatan**  
Anda akan dikenakan biaya per jam untuk pembelian ini. Gunakan konsol untuk melihat perkiraan harga untuk berbagai opsi.

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

Respons mengembalikan a`provisionedModelArn`. Memungkinkan Provisioned Throughput beberapa waktu untuk dibuat. Untuk memeriksa statusnya, berikan nama atau ARN dari model yang disediakan seperti `provisioned-model-id` pada perintah berikut.

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

Saat `status` ada`InService`, Anda dapat menjalankan inferensi dengan model kustom Anda dengan perintah berikut. Anda harus memberikan ARN dari model yang disediakan sebagai. `model-id` Output ditulis ke file bernama *output.txt* di folder Anda saat ini.

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

Jalankan cuplikan kode berikut untuk mengirimkan pekerjaan fine-tuning. Ganti *\$1\$1your-customization-role-arn\$1* dengan ARN *MyCustomizationRole* yang Anda atur dan ganti *\$1\$1training-bucket\$1* dan *\$1\$1output-bucket\$1* dengan nama bucket S3 Anda.

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

Respons mengembalikan a*jobArn*. Biarkan pekerjaan beberapa waktu untuk diselesaikan. Anda dapat memeriksa statusnya dengan perintah berikut.

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

Ketika `status` ada`COMPLETE`, Anda dapat melihat `trainingMetrics` dalam [GetModelCustomizationJob](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_GetModelCustomizationJob.html)respon. Anda juga dapat mengikuti langkah-langkah di [Mengunduh objek](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html) untuk mengunduh metrik.

Beli Throughput Penyediaan tanpa komitmen untuk model kustom Anda dengan perintah berikut.

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

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

Respons mengembalikan a`provisionedModelArn`. Memungkinkan Provisioned Throughput beberapa waktu untuk dibuat. Untuk memeriksa statusnya, berikan nama atau ARN dari model yang disediakan seperti `provisionedModelId` pada perintah berikut.

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

Saat `status` ada`InService`, Anda dapat menjalankan inferensi dengan model kustom Anda dengan perintah berikut. Anda harus memberikan ARN dari model yang disediakan sebagai. `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()
```

------