Bedrock 模型微调

在 AWS Bedrock 上微调 Claude

🌐 查看英文原文 | 源码 Notebook


在 Bedrock 上微调 Claude 3 Haiku

在本教程中,我们将带你了解在 Amazon Bedrock 上微调 Claude 3 Haiku 的完整流程

你需要准备什么

安装依赖

!pip install boto3
import 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 讨论。