기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
모델 사용자 지정을 위한 코드 샘플
다음 코드 샘플은 기본 데이터세트를 준비하고, 권한을 설정하고, 사용자 지정 모델을 만들고, 출력 파일을 확인하고, 모델에 대한 구매 처리량을 확인하고, 모델에 대한 추론을 실행하는 방법을 보여줍니다. 특정 사용 사례에 대해 이러한 코드 스니펫을 수정할 수 있습니다.
-
훈련 데이터세트를 준비합니다.
-
다음 한 줄이 포함된 훈련 데이터세트 파일을 만들고 이름을
train.jsonl
로 지정합니다.{"prompt": "what is AWS", "completion": "it's Amazon Web Services"}
-
훈련 데이터에 대한 S3 버킷과 출력 데이터에 대한 또 다른 버킷을 만듭니다(이름은 고유해야 함).
-
훈련 데이터 버킷에
train.jsonl
을 업로드합니다.
-
-
훈련에 액세스할 수 있는 정책을 만들고, 이를 Amazon Bedrock 신뢰 관계가 있는 IAM 역할에 연결합니다. 원하는 방법의 탭을 선택한 다음 다음 단계를 따릅니다.
- Console
-
-
S3 정책을 만듭니다.
-
https://console.aws.amazon.com/iam
에서 IAM 콘솔로 이동하여 왼쪽 탐색 창에서 정책을 선택합니다. -
정책 생성을 선택한 다음 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}
/*" ] } ] } -
정책 이름을
MyFineTuningDataAccess
로 지정하고 정책 생성을 선택합니다.
-
-
IAM 역할을 만들고 여기에 정책을 연결합니다.
-
왼쪽 탐색 창에서 역할을 선택한 후 역할 생성을 선택합니다.
-
사용자 지정 신뢰 정책 을 선택하고 다음 정책을 붙여넣은 후 다음을 선택합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "bedrock.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
앞에서 만든
MyFineTuningDataAccess
정책을 검색하고 확인란을 선택한 후 다음을 선택합니다. -
MyCustomizationRole
역할의 이름을 지정하고역할 생성
을 선택합니다.
-
-
- CLI
-
-
BedrockTrust.json
이라는 파일을 만들고 다음 정책을 붙여 넣습니다.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "bedrock.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
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}
/*" ] } ] } -
터미널에서, 앞서 만든 정책이 포함된 폴더로 이동합니다.
-
CreateRole 요청으로
MyCustomizationRole
이라는 IAM 역할을 만들고 앞서 만든BedrockTrust.json
신뢰 정책을 연결합니다.aws iam create-role \ --role-name MyCustomizationRole \ --assume-role-policy-document file://BedrockTrust.json
-
만들어 둔
MyFineTuningDataAccess.json
파일을 사용하여 S3 데이터 액세스 정책을 만드는 CreatePolicy 요청을 수행합니다. 응답은 정책에 대해Arn
을 반환합니다.aws iam create-policy \ --policy-name MyFineTuningDataAccess \ --policy-document file://myFineTuningDataAccess.json
-
AttachRolePolicy 요청으로 S3 데이터 액세스 정책을 역할에 연결하고, 이전 단계의 응답에서
policy-arn
을 ARN으로 바꿉니다.aws iam attach-role-policy \ --role-name MyCustomizationRole \ --policy-arn
${policy-arn}
-
- Python
-
-
다음 코드를 실행하여 CreateRole 요청으로
MyCustomizationRole
이라는 IAM 역할을 만들고, CreatePolicy 요청으로MyFineTuningDataAccess
라는 S3 데이터 액세스 정책을 만듭니다. 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}
/*" ] } ] }) ) -
응답에서
Arn
이 반환됩니다. 다음 코드 스니펫을 실행하여 AttachRolePolicy 요청을 수행하고${policy-arn}
을 반환된Arn
으로 바꿉니다.iam.attach_role_policy( RoleName="MyCustomizationRole", PolicyArn="
${policy-arn}
" )
-
-
언어를 선택하여 모델 사용자 지정 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=.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
-
다음 코드 스니펫을 실행하여 미세 조정 작업을 제출합니다.
${your-customization-role-arn}
을 설정한MyCustomizationRole
의 ARN으로 바꾸고,${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": ".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 응답에서trainingMetrics
를 확인할 수 있습니다. 객체 다운로드의 단계에 따라 지표를 다운로드할 수도 있습니다.다음 명령을 사용하여 사용자 지정 모델의 프로비저닝된 처리량을 무약정으로 구매합니다.
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()