Bedrock 模型微调
在 AWS Bedrock 上微调 Claude
🌐 查看英文原文 | 源码 Notebook
在 Bedrock 上微调 Claude 3 Haiku
在本教程中,我们将带你了解在 Amazon Bedrock 上微调 Claude 3 Haiku 的完整流程
你需要准备什么
- 一个可访问 Bedrock 的 AWS 账户
- 一个数据集(你也可以使用此处提供的示例数据集)
- 一个能够访问你保存训练数据的 s3 存储桶的服务角色
安装依赖
!pip install boto3import boto3准备数据集
用于 Bedrock 微调的数据集需要是 JSONL 文件(即每行包含一个 JSON 对象的文件)。
JSONL 文件中的每一行都应该是一个具有以下结构的 JSON 对象:
{
"system": "<optional_system_message>",
"messages": [
{"role": "user", "content": "user message"},
{"role": "assistant", "content": "assistant response"},
...
]
}
system字段是可选的。- 必须至少包含两条消息。
- 第一条消息必须来自”user”。
- 最后一条消息必须来自”assistant”。
- user 和 assistant 消息必须交替出现。
- 不允许包含多余的键。
示例数据集 - JSON 模式
我们提供了一个示例数据集,用于训练模型以 JSON 格式回答所有问题。以下是该数据集的样子:
import json
sample_dataset = []
dataset_path = "datasets/json_mode_dataset.jsonl"
with open(dataset_path) 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 启动微调任务了。首先,我们需要为任务配置一些参数:
# Configuration
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-haiku-4-5-20251001-v1:0:200k"
)
# Hyperparameters
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},
)你可以使用以下代码来检查任务在训练过程中的状态:
# Check for the job status
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"])
Tip
中文读者提示:本章节的代码和输出为英文原文。如需理解具体实现细节,可参考上方中文导读和代码注释。如有疑问,欢迎在 GitHub Issues 讨论。