亚马逊AWS官方博客

通过微调和持续预训练,使用您自己的数据在 Amazon Bedrock 中自定义模型



今天,我很高兴地与大家分享,您现在可以在 Amazon Bedrock 中使用自己的数据以私有和安全的方式自定义基础模型(FM),构建特定于您的域、组织和用例的应用程序。借助自定义模型,您可以创建反映公司风格、声音和服务的独特用户体验。

借助微调,您可以提供自己的任务特定标记训练数据集,来提高模型的准确性,并进一步实现 FM 的专业化。借助持续预训练,您可以在安全的托管环境中利用客户管理的密钥,以使用未标记的数据训练模型。持续预训练通过在原始训练之外积累更强大的知识和适应性,从而使模型更加针对特定的域。

下面我快速介绍一下这两个模型自定义选项。您可以使用 Amazon Bedrock 控制台或 API 创建微调和持续预训练作业。在控制台中,导航到 Amazon Bedrock,然后选择自定义模型

Amazon Bedrock - 自定义模型

微调 Meta Llama 2、Cohere Command Light 和 Amazon Titan FM
Amazon Bedrock 现在支持对 Meta Llama 2Cohere Command Light 以及 Amazon Titan 模型进行微调。要在控制台中创建微调作业,请选择自定义模型,然后选择创建微调作业

Amazon Bedrock - 自定义模型

下面是使用适用于 Python 的 Amazon SDK(Boto3)的快速演示。让我们对 Cohere Command Light 进行微调,以总结对话。出于演示目的,我使用的是公共 dialogsum 数据集,但也可以使用您公司的特定数据。

为了准备在 Amazon Bedrock 上进行微调,我将数据集转换为 JSON Lines 格式,并将其上传到 Amazon S3。每行 JSON 都要有一个提示和完成字段。您最多可以指定 1 万条训练数据记录,但只需几百个示例,您就可以看到模型性能的提升。

{"completion": "Mr. Smith's getting a check-up, and Doctor Haw...", "prompt": Summarize the following conversation.\n\n#Pers..."}
{"completion": "Mrs Parker takes Ricky for his vaccines.Dr.P...", "prompt": "Summarize the following conversation.\n\n#Pers..."}
{"completion": "#Person1#'s looking for a set of keys and asks...", "prompt": "Summarize the following conversation.\n\n#Pers..."} 

为了简洁起见,我编辑了提示和完成字段。

您可以使用以下命令列出支持微调的可用基础模型:

import boto3 
bedrock = boto3.client(service_name="bedrock")
bedrock_runtime = boto3.client(service_name="bedrock-runtime")

for model in bedrock.list_foundation_models(
    byCustomizationType="FINE_TUNING")["modelSummaries"]:
    for key, value in model.items():
        print(key, ":", value)
    print("-----\n")

接下来,我将创建一个模型自定义作业。我指定了支持微调的 Cohere Command Light 模型 ID,将自定义类型设置为 FINE_TUNING,并指向训练数据的 Amazon S3 位置。如果需要,您还可以调整超参数以进行微调。

# Select the foundation model you want to customize
base_model_id = "cohere.command-light-text-v14:7:4k"

bedrock.create_model_customization_job(
    customizationType="FINE_TUNING",
    jobName=job_name,
    customModelName=model_name,
    roleArn=role,
    baseModelIdentifier=base_model_id,
    hyperParameters = {
        "epochCount": "1",
        "batchSize": "8",
        "learningRate": "0.00001",
    },
    trainingDataConfig={"s3Uri": "s3://path/to/train-summarization.jsonl"},
    outputDataConfig={"s3Uri": "s3://path/to/output"},
)

# Check for the job status
status = bedrock.get_model_customization_job(jobIdentifier=job_name)["status"]

作业完成后,您将收到自定义模型的唯一模型 ID。您的微调模型由 Amazon Bedrock 安全存储。要测试和部署模型,您需要购买预置吞吐量

我们来看看结果。我从数据集中选择一个示例,在微调之前询问基础模型,在微调之后询问自定义模型,总结出以下对话:

prompt = """Summarize the following conversation.\\n\\n
#Person1#: Hello.My name is John Sandals, and I've got a reservation.\\n
#Person2#: May I see some identification, sir, please?\\n
#Person1#: Sure.Here you are.\\n
#Person2#: Thank you so much.Have you got a credit card, Mr. Sandals?\\n
#Person1#: I sure do.How about American Express?\\n
#Person2#: Unfortunately, at the present time we take only MasterCard or VISA.\\n
#Person1#: No American Express? Okay, here's my VISA.\\n
#Person2#: Thank you, sir.You'll be in room 507, nonsmoking, with a queen-size bed.Do you approve, sir?\\n
#Person1#: Yeah, that'll be fine.\\n
#Person2#: That's great.This is your key, sir.If you need anything at all, anytime, just dial zero.\\n\\n
Summary: """

使用 Amazon Bedrock InvokeModel API 查询模型。

body = {
    "prompt": prompt,
    "temperature": 0.5,
    "p": 0.9,
    "max_tokens": 512,
}

response = bedrock_runtime.invoke_model(
	# Use on-demand inference model ID for response before fine-tuning
    # modelId="cohere.command-light-text-v14",
	# Use ARN of your deployed custom model for response after fine-tuning
	modelId=provisioned_custom_model_arn,
    modelId=base_model_id,
    body=json.dumps(body)
)

以下是微调之前的基础模型响应:

#Person2# 帮助 John Sandals 预订房间。John 提供了他的信用卡信息,#Person2# 确认他们只接受 MasterCard 和 VISA。John 将住在 507 房间,如果他需要任何东西,#Person2# 会接待他。

以下是微调之后的响应,更为简短,切中要点:

John Sandals 已预订并入住酒店。#Person2# 拿走他的信用卡,然后给他一把钥匙。

Amazon Titan Text 的持续预训练(预览版)
Amazon Bedrock 上的持续预训练已于今日在 Amazon Titan Text 模型(包括 Titan Text Express 和 Titan Text Lite)的公开预览版中推出。要在控制台中创建持续预训练作业,请选择自定义模型,然后选择创建持续预训练作业

Amazon Bedrock - 自定义模型

下面是另一个使用 boto3 的快速演示。假设您在一家投资公司工作,希望使用财务和分析报告对模型进行持续预训练,使其更加熟悉金融行业术语。出于演示目的,我选择了一批 Amazon 股东信件作为训练数据。

为了准备持续预训练,我再次将数据集转换为 JSON Lines 格式,并将其上传到 Amazon S3。因为我处理的是未标记数据,所以每行 JSON 只需要有提示字段。您最多可以指定 10 万条训练数据记录,通常在提供至少 10 亿个令牌后会看到积极的效果。

{"input": "Dear shareholders: As I sit down to..."}
{"input": "Over the last several months, we to..."}
{"input": "work came from optimizing the conne..."}
{"input": "of the Amazon shopping experience f..."}

为了简洁起见,我编辑了输入字段。

然后,创建一个指向数据的模型自定义作业,其自定义类型为 CONTINUED_PRE_TRAINING。如果需要,您还可以调整超参数以进行持续预训练。

# Select the foundation model you want to customize
base_model_id = "amazon.titan-text-express-v1"

bedrock.create_model_customization_job(
    customizationType="CONTINUED_PRE_TRAINING",
    jobName=job_name,
    customModelName=model_name,
    roleArn=role,
    baseModelIdentifier=base_model_id,
    hyperParameters = {
        "epochCount": "10",
        "batchSize": "8",
        "learningRate": "0.00001",
    },
    trainingDataConfig={"s3Uri": "s3://path/to/train-continued-pretraining.jsonl"},
    outputDataConfig={"s3Uri": "s3://path/to/output"},
)

作业完成后,您将收到另一个唯一模型 ID。Amazon Bedrock 会再次安全存储您的自定义模型。与微调一样,您需要购买预置吞吐量来测试和部署模型。

注意事项
这里需要牢记以下几点:

数据隐私和网络安全 – 借助 Amazon Bedrock,您可以控制自己的数据,并且您的所有输入和自定义内容都是 AWS 账户私有的。您的数据(比如提示、完成情况、自定义模型以及用于微调或持续预训练的数据)不会用于改进服务,也不会与第三方模型提供商共享。您的数据将保留在处理 API 调用的 AWS 区域。所有数据在传输中和静态时都会加密。您可以使用 AWS PrivateLink 在您的 VPC 和 Amazon Bedrock 之间创建私有连接。

账单 – Amazon Bedrock 对模型自定义、存储和推理收取费用。模型自定义按处理的令牌收费。即训练数据集中的令牌数乘以训练纪元数。纪元是自定义期间对训练数据的一次完整遍历。模型存储按模型按月收费。按小时对使用预置吞吐量的模型单位收取推理费。有关详细定价信息,请参阅 Amazon Bedrock 定价

自定义模型和预置吞吐量 – Amazon Bedrock 允许您通过购买预置吞吐量对自定义模型进行推理。这保证了一致的吞吐量水平,以换取长期承诺。您可以指定满足应用程序性能需求所需的模型单位数。对于最初评估自定义模型,您可以按小时购买预置吞吐量,无需长期承诺。在没有承诺的情况下,每个预置吞吐量有一个模型单位的配额。每个账户最多可以创建两个预置吞吐量。

可用性
现已在美国东部(弗吉尼亚州北部)和美国西部(俄勒冈州)的 AWS 区域推出对 Meta Llama 2、Cohere Command Light 和 Amazon Titan Text FM 的微调支持。持续预训练现已在如下 AWS 区域推出公开预览版:美国东部(弗吉尼亚州北部)和美国西部(俄勒冈州)。要了解更多信息,请访问 Amazon Bedrock 开发人员体验网页并查看用户指南

立即使用 Amazon Bedrock 自定义 FM!

— Antje