在 Bedrock 上微调 Claude 3 Haiku
在本笔记本中,我们将引导您完成在 Amazon Bedrock 上微调 Claude 3 Haiku 的过程。
您需要什么
- 一个拥有 Bedrock 访问权限的 AWS 账户
- 一个数据集(或者您可以使用此处提供的示例数据集)
- 一个有权访问您存储训练数据的 S3 存储桶的服务角色
安装依赖项
!pip install boto3
import boto3
准备数据集
您的 Bedrock 微调数据集需要是 JSONL 文件(即每行一个 JSON 对象的文件)。
JSONL 文件中的每一行都应该是一个具有以下结构的 JSON 对象:
{
"system": "<可选的系统消息>",
"messages": [
{"role": "user", "content": "用户消息"},
{"role": "assistant", "content": "助手响应"},
...
]
}
system
字段是可选的。- 必须至少有两条消息。
- 第一条消息必须来自“用户”。
- 最后一条消息必须来自“助手”。
- 用户和助手消息必须交替出现。
- 不允许有任何无关的键。
示例数据集 - JSON 模式
我们包含了一个示例数据集,用于教会模型以 JSON 格式响应所有问题。该数据集如下所示:
import json
sample_dataset = []
dataset_path = 'datasets/json_mode_dataset.jsonl'
with open(dataset_path, 'r') as f:
for line in f:
sample_dataset.append(json.loads(line))
print(json.dumps(sample_dataset[0], indent=2))
将数据集上传到 S3
您的微调数据集应在 S3 中可用;在本演示中,我们将示例数据集写入您控制的 S3 存储桶。
bucket_name = "YOUR_BUCKET_NAME"
s3_path = "json_mode_dataset.jsonl"
s3 = boto3.client('s3')
s3.upload_file(dataset_path, bucket_name, s3_path)
启动 Bedrock 微调作业
现在您的数据集已准备就绪,您可以使用 boto3
启动微调作业。首先,我们将为作业配置一些参数:
# 配置
job_name = "anthropic-finetuning-cookbook-training"
custom_model_name = "anthropic_finetuning_cookbook"
role = "YOUR_AWS_SERVICE_ROLE_ARN"
output_path = f"s3://{bucket_name}/finetuning_example_results/"
base_model_id = "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:200k"
# 超参数
epoch_count = 5
batch_size = 4
learning_rate_multiplier = 1.0
然后,我们可以使用 boto3
启动作业。
bedrock = boto3.client(service_name="bedrock")
bedrock_runtime = boto3.client(service_name="bedrock-runtime")
bedrock.create_model_customization_job(
customizationType="FINE_TUNING",
jobName=job_name,
customModelName=custom_model_name,
roleArn=role,
baseModelIdentifier=base_model_id,
hyperParameters = {
"epochCount": f"{epoch_count}",
"batchSize": f"{batch_size}",
"learningRateMultiplier": f"{learning_rate_multiplier}",
},
trainingDataConfig={"s3Uri": f"s3://{bucket_name}/{s3_path}"},
outputDataConfig={"s3Uri": output_path},
)
您可以使用此命令检查作业的训练状态:
# 检查作业状态
status = bedrock.get_model_customization_job(jobIdentifier=job_name)["status"]
使用您的微调模型!
要使用您的微调模型,您需要使用 Amazon Bedrock 中的 Provisioned Throughput 来托管它。一旦您的模型准备好并配置了 Provisioned Throughput,您就可以通过 Bedrock API 调用您的模型。
provisioned_throughput_arn = "YOUR_PROVISIONED_THROUGHPUT_ARN"
bedrock = boto3.client('bedrock-runtime', region_name = "us-east-1")
body = json.dumps(
{
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1000,
"system": "JSON Mode: Enabled",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text":"What is a large language model?"
}
]
}
]
}
)
response = bedrock_runtime.invoke_model(
modelId=provisioned_throughput_arn,
body=body
)
body = json.loads(response['body'].read().decode('utf-8'))
print(body['content'][0]['text'])