모델 사용자 지정을 위한 코드 샘플 - Amazon Bedrock

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

모델 사용자 지정을 위한 코드 샘플

다음 코드 샘플은 기본 데이터세트를 준비하고, 권한을 설정하고, 사용자 지정 모델을 만들고, 출력 파일을 확인하고, 모델에 대한 구매 처리량을 확인하고, 모델에 대한 추론을 실행하는 방법을 보여줍니다. 특정 사용 사례에 대해 이러한 코드 스니펫을 수정할 수 있습니다.

  1. 훈련 데이터세트를 준비합니다.

    1. 다음 한 줄이 포함된 훈련 데이터 세트 파일을 생성하고 이름을 로 지정합니다train.jsonl.

      {"prompt": "what is AWS", "completion": "it's Amazon Web Services"}
    2. 훈련 데이터에 대한 S3 버킷과 출력 데이터에 대한 또 다른 버킷을 만듭니다(이름은 고유해야 함).

    3. 훈련 데이터 버킷train.jsonl에 업로드합니다.

  2. 훈련에 액세스하고 Amazon Bedrock 신뢰 관계가 있는 IAM 역할에 연결하는 정책을 생성합니다. 원하는 메서드의 탭을 선택한 다음 다음 단계를 따릅니다.

    Console
    1. S3 정책을 만듭니다.

      1. https://console.aws.amazon.com/iam에서 IAM 콘솔로 이동하여 왼쪽 탐색 창에서 정책을 선택합니다.

      2. 정책 생성을 선택한 다음 JSON를 선택하여 정책 편집기를 엽니다.

      3. ${training-bucket} 및를 ${output-bucket} 버킷 이름으로 바꾸고 다음 정책을 붙여넣은 다음 다음을 선택합니다.

        { "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}/*" ] } ] }
      4. 정책의 이름을 지정MyFineTuningDataAccess하고 정책 생성을 선택합니다.

    2. IAM 역할을 생성하고 정책을 연결합니다.

      1. 왼쪽 탐색 창에서 역할을 선택한 후 역할 생성을 선택합니다.

      2. 사용자 지정 신뢰 정책 을 선택하고 다음 정책을 붙여넣은 후 다음을 선택합니다.

        { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "bedrock.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
      3. 생성한 MyFineTuningDataAccess 정책을 검색하고 확인란을 선택한 다음 다음을 선택합니다.

      4. 역할의 이름을 지정MyCustomizationRole하고를 선택합니다Create role.

    CLI
    1. 라는 파일을 생성하고 다음 정책을 여기에 BedrockTrust.json 붙여 넣습니다.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "bedrock.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. 라는 다른 파일을 생성하고 다음 정책을 버킷 이름으로 바꾸${training-bucket}${output-bucket}MyFineTuningDataAccess.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}/*" ] } ] }
    3. 터미널에서, 앞서 만든 정책이 포함된 폴더로 이동합니다.

    4. 라는 IAM 역할을 생성하도록 CreateRole 요청MyCustomizationRole하고 생성한 BedrockTrust.json 신뢰 정책을 연결합니다.

      aws iam create-role \ --role-name MyCustomizationRole \ --assume-role-policy-document file://BedrockTrust.json
    5. 생성한 MyFineTuningDataAccess.json 파일로 S3 데이터 액세스 정책을 생성하도록 CreatePolicy 요청합니다. 응답은 정책에 대해 Arn을 반환합니다.

      aws iam create-policy \ --policy-name MyFineTuningDataAccess \ --policy-document file://myFineTuningDataAccess.json
    6. S3 데이터 액세스 정책을 역할에 연결하도록 AttachRolePolicy 요청하고 이전 단계의 응답ARN에서를 policy-arn로 바꿉니다.

      aws iam attach-role-policy \ --role-name MyCustomizationRole \ --policy-arn ${policy-arn}
    Python
    1. 다음 코드를 실행하여 라는 IAM 역할을 생성하도록 CreateRole 요청MyCustomizationRole하고 라는 S3 데이터 액세스 정책을 생성하도록 CreatePolicy 요청합니다MyFineTuningDataAccess. S3 데이터 액세스 정책의 경우 ${training-bucket}${output-bucket}를 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}/*" ] } ] }) )
    2. 응답에서 Arn이 반환됩니다. 다음 코드 조각을 실행하여 AttachRolePolicy 요청을 하고를 반환된 ${policy-arn}로 바꿉니다Arn.

      iam.attach_role_policy( RoleName="MyCustomizationRole", PolicyArn="${policy-arn}" )
  3. 모델 사용자 지정 API 작업을 호출하는 코드 샘플을 보려면 언어를 선택합니다.

CLI

먼저 라는 텍스트 파일을 생성합니다FineTuningData.json. JSON 아래에서 코드를 텍스트 파일에 복사하여 ${training-bucket} 및를 S3 버킷 이름으로 바꿉${output-bucket}니다.

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

모델 사용자 지정 작업을 제출하려면 터미널에 FineTuningData.json가 포함된 폴더로 이동하여 명령줄에서 다음 명령을 실행하고를 설정한 모델 사용자 지정 역할${your-customization-role-arn}로 바꿉니다.

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=.0005,learningRateWarmupSteps=0 \ --cli-input-json file://FineTuningData.json

응답은 jobArn을 반환합니다. 작업이 완료될 때까지 잠시 기다립니다. 다음 명령을 실행하여 상태를 확인할 수 있습니다.

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

statusCOMPLETE이면 응답에서 trainingMetrics를 확인할 수 있습니다. 다음 명령을 실행하여 아티팩트를 현재 폴더에 다운로드하고 aet.et-bucket를 출력 버킷 이름으로 바꾸고를 사용자 지정 작업의 ID(의 마지막 슬래시 뒤에 오는 시퀀스)jobId로 바꿀 수 있습니다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을 반환합니다. 프로비저닝된 처리량이 만들어지는 동안 잠시 기다립니다. 상태를 확인하려면 다음 명령provisioned-model-id에서 프로비저닝된 모델의 이름 또는 ARN를 로 입력합니다.

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

statusInService이면 다음 명령을 사용하여 사용자 지정 모델로 추론을 실행할 수 있습니다. 프로비저닝된 모델의 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

다음 코드 스니펫을 실행하여 미세 조정 작업을 제출합니다. ${your-customization-role-arn}를 설정하여 교체MyCustomizationRole하는 ARN의 ${output-bucket}로 바꾸${training-bucket}고 및를 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": ".0005", "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가 이면 GetModelCustomizationJob 응답trainingMetrics에서를 볼 COMPLETE수 있습니다. 객체 다운로드의 단계에 따라 지표를 다운로드할 수도 있습니다.

다음 명령을 사용하여 사용자 지정 모델의 프로비저닝된 처리량을 무약정으로 구매합니다.

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)

statusInService이면 다음 명령을 사용하여 사용자 지정 모델로 추론을 실행할 수 있습니다. 프로비저닝된 모델의 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()