모델 커스터마이징을 위한 코드 샘플 - Amazon Bedrock

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

모델 커스터마이징을 위한 코드 샘플

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

  1. 교육 데이터세트를 준비하세요.

    1. 다음 한 줄을 포함하는 교육 데이터세트 파일을 만들고 이름을 지정합니다.train.jsonl.

      {"prompt": "what is AWS", "completion": "it's Amazon Web Services"}
    2. 훈련 데이터용 S3 버킷과 출력 데이터용 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. 왼쪽 탐색 창에서 [Roles] 를 선택한 다음 [Create role] 을 선택합니다.

      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. 라는 또 다른 파일을 생성하십시오.MyFineTuningDataAccess.json 다음 정책을 여기에 붙여넣고 다음을 대체합니다.${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}/*" ] } ] }
    3. 터미널에서 생성한 정책이 들어 있는 폴더로 이동합니다.

    4. 라는 IAM 역할을 생성해 CreateRole달라고 요청하십시오.MyCustomizationRole 그리고 첨부하세요 BedrockTrust.json 직접 만든 신뢰 정책

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

      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 An이 반환됩니다. 다음 코드 스니펫을 실행하여 AttachRolePolicy요청하고 다음을 대체합니다.${policy-arn} 반환된 값과 함께 Arn

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

CLI

먼저, 라는 텍스트 파일을 생성합니다.FineTuningData.json. 아래 JSON 코드를 텍스트 파일에 복사하여 바꾸십시오.${training-bucket} 그리고 ${output-bucket} S3 버킷 이름을 사용하세요.

{ "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

응답은 a를 반환합니다.jobArn. 작업이 완료될 때까지 잠시 기다려 주세요. 다음 명령으로 상태를 확인할 수 있습니다.

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

statusCOMPLETE인 경우 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

응답은 a를 반환합니다provisionedModelArn. 프로비저닝된 처리량이 생성될 때까지 잠시 기다려 주십시오. 상태를 확인하려면 다음 명령과 같이 프로비저닝된 ARN 모델의 이름 또는 이름을 입력합니다. provisioned-model-id

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

다음 코드 스니펫을 실행하여 미세 조정 작업을 제출하십시오. Replace ${your-customization-role-arn} 다음과 같이 ARN MyCustomizationRole 설치하고 교체한 ${training-bucket} 그리고 ${output-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')

응답은 a를 반환합니다.jobArn. 작업이 완료될 때까지 잠시 기다려 주세요. 다음 명령으로 상태를 확인할 수 있습니다.

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

statusCOMPLETE인 경우 trainingMetrics GetModelCustomizationJob응답에서 를 확인할 수 있습니다. 객체 다운로드의 단계에 따라 지표를 다운로드할 수도 있습니다.

다음 명령어를 사용하여 사용자 지정 모델용 프로비저닝 처리량을 약정 없이 구매하세요.

response_pt = bedrock.create_provisioned_model_throughput( modelId="MyCustomModel", provisionedModelName="MyProvisionedCustomModel", modelUnits="1" ) provisionedModelArn = response_pt.get('provisionedModelArn')

응답은 a를 반환합니다. 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()