亚马逊Bedrock自定义模型导入现已正式可用 | 亚马逊网络服务

2024-10-21 19:31:33 英文原文

今天,我们很高兴宣布一般可用性(GA)发布亚马逊Bedrock自定义模型导入此功能使客户能够通过单一统一的API导入和使用自定义模型与现有的基础模型(FMs)一起使用。无论是利用经过微调的模型,如Meta Llama、Mistral Mixtral 和 IBM Granite,还是基于流行的开源架构开发专有模型,客户现在都可以在不管理基础设施或模型生命周期任务的情况下将自定义模型带入Amazon Bedrock。

亚马逊云科技BedrockAmazon Bedrock 是一项完全托管的服务,通过单一 API 提供来自领先 AI 公司(如 AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI 和 Amazon)的高性能大模型选择,并提供一系列功能来使用安全、隐私保护和负责任的人工智能构建生成式人工智能应用程序。Amazon Bedrock 提供无服务器体验,因此您可以快速开始私有定制化工作流程,使用自己的数据自定义大模型,并通过 AWS 工具将它们集成并部署到您的应用中而无需管理基础设施。

通过亚马逊Bedrock自定义模型导入,客户可以按需以无服务器的方式访问其导入的自定义模型,从而免去了他们自己部署和扩展模型的复杂性。他们能够加速生成式AI使用原生的Amazon Bedrock工具和功能(如知识库、护栏、代理等)进行应用程序开发——所有这些都通过统一且一致的开发者体验实现。

亚马逊Bedrock自定义模型导入的好处包括:

  1. 使用现有微调模型的灵活性客户可以通过将现有的自定义模型导入Amazon Bedrock来利用他们在模型定制方面的先前投资,而无需重新创建或重新训练这些模型。这种灵活性最大化了之前努力的价值,并加速了应用程序的开发。
  2. 与Amazon Bedrock功能集成导入的自定义模型可以与亚马逊Bedrock的原生工具和功能(如知识库、护栏、代理和模型评估)无缝集成。这种统一的体验使开发人员能够在基础FM和导入的自定义模型之间使用相同的工具和工作流程。
  3. 无服务器架构客户可以按需、无服务器的方式访问他们导入的自定义模型。这消除了管理或扩展底层基础设施的需求,因为Amazon Bedrock会处理所有这些方面。客户可以专注于开发生成式AI应用,而不必担心基础设施管理和可伸缩性问题。
  4. 支持流行的模型架构Amazon Bedrock 自定义模型导入支持多种流行的模型架构,包括 Meta Llama 3.2、Mistral 7B、Mixtral 8x7B 等。客户可以导入像 Hugging Face 格式的自定义权重格式。SafeTensorsfrom亚马逊SageMaker亚马逊S3这种广泛的兼容性允许客户使用最适合他们特定需求和用例的模型,从而在模型选择上提供更大的灵活性和选择余地。
  5. 利用Amazon Bedrock对话APIAmazon定制模型导入允许我们的客户使用他们支持的微调后的模型。亚马逊Bedrock对话API这简化并统一了对模型的访问。

开始使用自定义模型导入

我们的客户的一个关键需求是能够使用其专有数据自定义模型,同时保持对调整后的模型工件及其部署的完全所有权和控制权。自定义可以采取领域适应或指令微调的形式。客户有许多高效且经济地微调模型的选择。然而,托管模型也带来了一套独特的挑战。客户正在寻找一些关键方面,包括:

  • 利用现有的定制投资并进行精细的定制控制。
  • 通过亚马逊Bedrock的API访问自定义模型或基础模型时具有一致的开发人员体验。
  • 通过完全管理的无服务器服务轻松部署。
  • 使用按需推理来最小化其生成式AI工作负载的成本。
  • 由企业级安全和隐私工具支持。

亚马逊Bedrock自定义模型导入功能旨在解决这些问题。为了将您的自定义模型带入Amazon Bedrock生态系统,您需要运行一个导入作业。可以通过AWS管理控制台或通过API调用来触发导入作业。在此帖子中,我们将演示通过API运行导入模型过程的代码。在模型导入后,您可以使用该模型的Amazon资源名称(ARN)来调用该模型。

截至撰写之时,当前支持的模型架构包括Meta Llama(版本2、3、3.1和3.2)、Mistral 7B、Mixtral 8x7B、Flan以及IBM Granite系列模型如Granite 3B-Code、8B-Code、20B-Code和34B-Code。

导入模型时需要注意的几点:

  • 模型必须以Safetensors格式进行序列化。
  • 如果你有不同格式的数据,你可以尝试使用 llama转换脚本或者梅斯特尔转换脚本将您的模型转换为支持的格式。
  • 导入过程至少期望以下文件:.safetensors, json, tokenizer_config.json, tokenizer.json,和令牌化模型.
  • 模型权重支持的精度是FP32、FP16和BF16。
  • 创建适配器之类的微调作业中LoRA-PEFT适配器的导入过程期望将适配器合并到主基础模型权重中,如所述描述的。模型合并.

使用Amazon Bedrock控制台导入模型

  1. 前往Amazon Bedrock控制台并选择基础模型然后导入的模型从左侧的导航窗格进入以到达模型
  2. 点击导入模型配置导入过程。
  3. 配置模型。
    1. 输入您的模型权重的位置。这些可以位于Amazon S3或指向SageMaker中的位置。模型ARN对象.
    2. 请输入一个工作名称我们建议在这个后面加上模型的版本号。截至现在,你需要管理此功能之外的生成式AI操作方面。
    3. 配置您的Amazon Web Services 密钥管理服务 (AWS KMS)加密密钥。默认情况下,这将使用由AWS拥有和管理的密钥。
    4. 服务访问角色。您可以创建一个新的角色或使用已存在的角色,该角色必须具有运行导入过程所需的权限。如果通过S3指定模型权重,则权限必须包括访问您的Amazon S3的权限。
  1. 导入模型任务完成后,您将看到模型及其模型ARN。记下ARN以备后用。
  2. 使用按需功能测试模型文本播放器如同你为任何基础模型所做的一样。

导入过程通过读取模型配置来验证该模型是否符合指定的架构。config.json文件并验证模型架构值,如最大序列长度和其他相关细节。它还检查模型权重是否为Safetensors格式。此验证确保导入的模型符合必要要求并与系统兼容。

在SageMaker上微调Meta Llama模型

元数据Llama 3.2提供多模态视觉和轻量级模型,代表了Meta在大型语言模型(LLM)领域的最新进展。这些新模型提供了增强的功能和更广泛的应用场景。以负责任的创新和系统级安全为重点,Llama 3.2模型在广泛的行业基准上展示了最先进的性能,并引入了帮助您构建新一代AI体验的功能。

SageMaker.jump启动(说明:此名称“SageMaker JumpStart”是一个专有名词,在保持其原意的基础上进行了适当的中文表述)通过两个主要接口提供功能模型(FMs):SageMaker Studio和SageMaker Python SDK。这为你提供了多种选项来发现和使用数百种适用于你用例的模型。

在本节中,我们将向您展示如何使用SageMaker JumpStart对Llama 3.2 3B Instruct模型进行微调。我们还将分享SageMaker JumpStart中可用的Llama 3.2模型支持的实例类型和上下文信息。虽然本文未突出显示,但您也可以找到其他可以使用SageMaker JumpStart进行微调的Llama 3.2模型变体。

指令微调

文本生成模型可以在任何格式正确的文本数据上进行指令微调。经过指令微调的模型可以进一步部署以进行推理。训练数据必须采用JSON Lines(.jsonl)格式,每一行是一个字典,表示一个单独的数据样本。所有训练数据必须位于单个文件夹中,但可以保存在多个JSON Lines 文件中。训练文件夹还可以包含一个template.json描述输入和输出格式的文件。

合成数据集

对于这个用例,我们将使用一个名为的合成生成的数据集amazon10Ksynth.jsonl以指令微调格式。该数据集包含大约200条条目,旨在用于金融领域的大型语言模型的训练和微调。

以下是一个数据格式的例子:

{
    "question": "亚马逊的实体店扩张计划是什么,这将如何影响其整体收入?",
    "context": "10-K报告提到,亚马逊正在继续扩展其实体店网络,在2022年底时包括611家北美门店和32家国际门店。预计这种实体店面的扩张将有助于增加产品销售并推动总体收入增长。",
    "answer": "亚马逊正在扩大其实体店铺规模,在2022年底时包括了611家北美门店和32家国际门店。预计实体店面的扩张将有助于增加产品销售并推动整体收入的增长。"
}

提示模板

接下来,我们为训练任务创建一个以指令输入格式使用数据的提示模板(因为我们在这个示例中对模型进行指令微调),以及用于部署端点的推理。

导入 json

提示模板 = {
  "提示": "问题: {问题} 上下文: {上下文}",
  "完成": "{答案}"
}

with open("prompt_template.json", "w") as f:
    json.dump(提示模板, f)

创建提示模板后,将用于微调的准备好的数据集上传到Amazon S3。

from sagemaker.s3 import S3Uploader
import sagemaker
output_bucket = sagemaker.Session().default_bucket()
local_data_file = "amazon10Ksynth.jsonl"
train_data_location = f"s3://{output_bucket}/amazon10Ksynth_dataset"
S3Uploader.upload(local_data_file, train_data_location)
S3Uploader.upload("prompt_template.json", train_data_location)
print(f"训练数据: {train_data_location}")

微调Meta Llama 3.2 3B模型

现在,我们将对Llama 3.2 3B模型进行金融数据集的微调。微调脚本基于Llama微调仓库提供的脚本。

从sagemaker.jumpstart.estimator导入JumpStartEstimator

估计器 = JumpStartEstimator(
    model_id=model_id,
    model_version=model_version,
    environment={"accept_eula": "true"},
    disable_output_compression=True,
    instance_type="ml.g5.12xlarge",
)

# 设置用于指令微调的超参数
估计器.set_hyperparameters(
    instruction_tuned="True", epoch="5", max_input_length="1024"
)

# 在训练数据上拟合模型
估计器.fit({"training": train_data_location})

从SageMaker导入自定义模型到Amazon Bedrock

在本节中,我们将使用一个Python SDK来创建一个模型导入任务,获取到导入的模型ID最后生成推理。您可以参考控制台截图中的 내용이 주어진 텍스트에 없어서 원문을 그대로 반환합니다. 如果您是要翻译 "and finally generate inferences. You can refer to the console screenshots in the" 这部分内容的话,以下是准确的中文翻译: 最终生成推断。您可以在其中参见控制台截图。 earlier section如何使用Amazon Bedrock控制台导入模型。

参数和辅助函数设置

首先,我们将创建一些辅助函数并设置参数以创建导入作业。The导入任务负责从SageMaker收集和部署模型到Amazon Bedrock。这是通过使用来完成的:创建模型导入任务函数。

存储的safetensors文件需要格式化,以便Amazon S3位置成为顶级文件夹。配置文件和safetensors将如以下图示所示进行存储。

import json
import boto3
from botocore.exceptions import ClientError
bedrock = boto3.client('bedrock', region_name='us-east-1')
job_name = 'fine-tuned-model-import-demo'
sagemaker_model_name = 'meta-textgeneration-llama-3-2-3b-2024-10-12-23-29-57-373'
model_url = {'s3DataSource':
                 {'s3Uri':
                      "s3://sagemaker-{REGION}-{AWS_ACCOUNT}/meta-textgeneration-llama-3-2-3b-2024-10-12-23-19-53-906/output/model/"
                  }
             }

检查状态并从响应中获取作业ARN:

几分钟后,模型将被导入,可以通过检查任务的状态来确认这一点。获取模型导入作业然后使用作业ARN获取导入的模型ARN,我们将使用它来生成推理结果。

def 获取导入模型的任务(job名称):
    response = bedrock.get_model_import_job(jobIdentifier=job名称)
    return response['importedModelArn']

任务ARN = response['jobArn']
导入模型ARN = 获取导入模型的任务(任务ARN)

使用导入的自定义模型生成推理

模型可以通过使用来调用调用模型以及对话; converse 这个词根据上下文可以有不同的含义,此处没有具体语境,默认提供常用意义“对话”或“闲谈”。若指代鞋类品牌,则为“ converse(匡威)”。由于未指定具体情境,请给出最通用的翻译。如需特定领域翻译,请补充信息。原文要求直接翻译且无上下文时,输出:converseAPI。以下是一个支持函数,将用于调用并从整体输出中提取生成的文本。

从 botocore.exceptions 导入 ClientError

client = boto3.client('bedrock-runtime', region_name='us-east-1')

def 生成与导入模型的对话(native_request, model_id):
    request = json.dumps(native_request)
    try:
        # 使用请求调用模型。
        response = client.invoke_model(modelId=model_id, body=request)
        model_response = json.loads(response["body"].read())

        response_text = model_response["outputs"][0]["text"]
        print(response_text)
    except (ClientError, Exception) as e:
        print(f"ERROR: 无法调用 '{model_id}'。原因:{e}")
        exit(1)

上下文设置和模型响应

最后,我们可以使用自定义模型。首先,我们将查询格式化以匹配微调后的提示结构。这将确保生成的响应与微调阶段使用的格式相似,并且更符合我们的需求。为此,我们使用了用于格式化微调数据的模板。上下文将来自您的RAG解决方案,例如Amazon Bedrock知识库。在这个示例中,我们将采用一个样本上下文以演示这一概念:

input_output_demarkation_key = "\n\n### 回复:\n"

question = "告诉我现金流的改善流入值是多少?"

context = "亚马逊的自由现金流量减去融资租赁和融资义务的本金偿还,在截至2023年3月31日之前的十二个月里,从流出101亿美元改善为流入461亿美元。"

payload = {
    "prompt": template[0]["prompt"].format(
                                    question=question, # 用户查询
                                    context=context 
                                       + input_output_demarkation_key # rag上下文
                                        ),
    "max_tokens": 100, 
    "temperature": 0.01 
}
generate_conversation_with_imported_model(payload, import_model_arn)

输出将类似于:

在对模型进行微调并导入到Amazon Bedrock后,你可以通过发送不同的输入问题和上下文来实验,以生成响应,如下例所示:

问题:亚马逊的国际业务部门在2022年第四季度的运营收入与去年同期相比有何变化?
上下文:亚马逊的国际业务部门在2022年第四季度报告了11亿美元的运营亏损,相较于2021年同期17亿美元的运营亏损有所改善。

需要注意的几点

本文中的示例旨在演示自定义模型导入功能,而不设计用于生产环境。因为该模型仅在200个合成生成的数据样本上进行了训练,所以它仅适用于测试目的。理想情况下,您应该拥有更多样化的数据集和额外的样本,并通过使用超参数调整进行持续实验来针对您的具体用例进行操作,从而引导模型产生更理想的输出。对于本文,请确保该模型温度参数设置为0以及最大令牌数运行时参数设置为较低的值,例如100到150个令牌,以生成简洁的回答。您可以尝试其他参数以获得期望的结果。见亚马逊Bedrock食谱 GitHub参见更多示例。

最佳实践值得考虑:

此功能为高效托管您的微调模型带来了显著优势。随着我们继续开发此功能以满足客户的需求,有几点需要注意:

  • 在开始之前定义你的测试套件和接受标准。自动化这些过程将有助于节省时间和精力。
  • 目前,模型权重需要包含全部内容,包括适配器权重。合并模型有多种方法,我们建议通过实验来确定合适的方法论。自定义模型导入功能允许您按需测试您的模型。
  • 在创建导入任务时,在任务名称中添加版本号以帮助快速跟踪您的模型。目前,我们不提供模型版本控制功能,因此每个导入任务都是一个独特的作业,并且会生成一个独特的模型。
  • 模型权重支持的精度为FP32、FP16和BF16。运行测试以验证这些是否适用于您的用例。
  • 每个模型在每个账号下的最大并发数为16。更高的并发请求将导致服务扩容并增加模型副本的数量。
  • 任何时刻活跃的模型副本数量将可通过查询获得。亚马逊云WATCH将自定义模型导入Amazon Bedrock更多信息请参阅。
  • 截至撰写本文时,我们仅在美国东部(俄亥俄)和美国西部(俄勒冈)AWS区域发布此功能。我们将继续在其他区域推出。请关注模型支持的AWS区域更新通知
  • 每个账户的默认导入配额为三个模型。如果您需要更多模型以满足您的使用需求,请与您的账号团队合作增加账号配额。
  • 此功能对于每个账户的默认节流限制为每秒100次调用。
  • 你可以使用这个样本笔记本为了测试通过此功能导入的模型的性能。该笔记本仅作参考,并非旨在进行全面测试。我们始终建议您运行自己的全面性能测试,包括从头到尾的功能和评估测试。

现已推出

亚马逊Bedrock自定义模型导入现已在美国东部1(弗吉尼亚北部)和美国西部2(俄勒冈)的Amazon Bedrock中全面可用。AWS 区域见以下事项:完整的区域列表未来更新。如需了解更多信息,请参阅自定义模型导入产品页面和定价页面.

试一试自定义模型导入功能在亚马逊Bedrock控制台今天并发送反馈至Amazon Bedrock 的 AWS re:Post或者通过您通常联系的AWS支持渠道。


关于作者

帕拉斯·梅hra帕拉斯是AWS的高级产品经理,专注于帮助构建Amazon SageMaker训练和处理功能。在业余时间,帕拉斯喜欢与家人共度时光,并在旧金山湾区骑行公路自行车。

杰伊·皮莱是亚马逊网络服务(Amazon Web Services)的首席解决方案架构师。在这个角色中,他担任首席架构师,帮助合作伙伴构思、构建和发布合作伙伴解决方案。作为一名信息技术领导者,Jay 专注于人工智能、生成式 AI、数据集成、商业智能和用户界面领域。他在供应链、法律技术、房地产、金融服务、保险、支付和市场研究等行业拥有23年的丰富经验。

Shikhar Kwatra是亚马逊网络服务(Amazon Web Services)的一名高级合作伙伴解决方案架构师,与领先的全球系统集成商合作。他获得了印度最年轻的主发明人之一的称号,在人工智能/机器学习和物联网领域拥有超过500项专利。Shikhar协助设计、构建和维护组织的成本效益高且可扩展的云环境,并支持GSI合作伙伴在AWS上建立战略行业解决方案。

克劳迪奥·马佐尼是一位在AWS工作的高级生成式人工智能专家解决方案架构师,致力于开发世界级的应用程序,指导客户实现其生成式人工智能的实施,以达成目标并提升业务成果。业余时间,Claudio喜欢与家人共度时光,在花园里劳作以及烹饪乌拉圭美食。

张艳艳是亚马逊网络服务的高级生成式人工智能数据科学家,在那里她作为一名生成式人工智能专家,一直在从事前沿的AI/ML技术工作,帮助客户利用GenAI实现他们的预期目标。 Yan Yan 毕业于德克萨斯A&M大学,获得电气工程博士学位。在业余时间,她喜欢旅行、锻炼和探索新事物。

西蒙·扎马林Simon是一位专注于帮助客户从其数据资产中提取价值的AI/ML解决方案架构师。业余时间,Simon喜欢与家人共度时光、阅读科幻小说以及从事各种家庭DIY项目。

若此人名为Rupinder Grewal,且要求直译,则: 卢品达·古拉尔 请根据具体语境调整名字的汉化形式。如果这个名字出现在正式文档或官方介绍中,请使用“露宾德·古瑞瓦尔”或其他更符合中文习惯的翻译方式。原文:Rupinder Grewal是一位高级AI/机器学习专家解决方案架构师,专注于亚马逊SageMaker上的模型服务和MLOps。在此之前,他担任机器学习工程师职位,负责构建和托管模型。业余时间,他喜欢打网球和在山间小路上骑自行车。

关于《亚马逊Bedrock自定义模型导入现已正式可用 | 亚马逊网络服务》
暂无评论

摘要

今天,我们很高兴地宣布亚马逊Bedrock自定义模型导入功能现已正式可用。此功能使客户能够通过单一统一的API将他们的定制化模型与现有的基础模型(FMs)一起导入和使用。对于创建类似LoRA-PEFT适配器等微调任务,导入过程期望这些适配器按照模型合并中描述的方式合并到主基模型权重中。 打印(instruction_sample) 提示模板 接下来,我们为训练作业创建一个以指令输入格式使用的数据的提示模板(因为我们在这个示例中对模型进行指令微调),以及用于推理部署端点的提示。Simon Zamarin 是一名AI/ML解决方案架构师,主要帮助客户从其数据资产中提取价值。