在 Bedrock 上微调 Claude 3 Haiku

在本笔记本中,我们将引导您完成在 Amazon Bedrock 上微调 Claude 3 Haiku 的过程。

您需要什么

安装依赖项

!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'])