使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务

该博客由 TruEra 的 Josh Reini、Shayak Sen 和 Anupam Datta 共同撰写

亚马逊SageMaker JumpStart 提供各种预训练的基础模型,例如 Llama-2 和 Mistal 7B,可以快速部署到端点。这些基础模型在生成任务中表现良好,从编写文本和摘要、回答问题到生成图像和视频。尽管这些模型具有很强的泛化能力,但在某些用例中,这些模型通常必须适应新的任务或领域。满足这一需求的一种方法是根据精选的地面实况数据集评估模型。在明确需要调整基础模型后,您可以使用一组技术来实现这一点。一种流行的方法是使用根据用例定制的数据集来微调模型。微调可以改进基础模型,并且可以根据地面实况数据集再次衡量其功效。这 笔记本 展示如何使用 SageMaker JumpStart 微调模型。

这种方法的一个挑战是创建精选的地面实况数据集的成本很高。在这篇文章中,我们通过使用可扩展的自动化评估框架增强此工作流程来应对这一挑战。我们从 SageMaker JumpStart 的基线基础模型开始,并使用 特鲁透镜,一个用于评估和跟踪大型语言模型 (LLM) 应用程序的开源库。在确定适应需求后,我们可以在 SageMaker JumpStart 中使用微调,并使用 TruLens 确认改进。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

TruLens 评估使用以下抽象: 反馈功能。这些功能可以通过多种方式实现,包括 BERT 风格的模型、适当提示的 LLM 等等。 TruLens 的集成 亚马逊基岩 允许您使用 Amazon Bedrock 提供的 LLM 运行评估。 Amazon Bedrock 基础设施的可靠性对于在开发和生产过程中执行评估特别有价值。

这篇文章既介绍了 TruEra 在现代 LLM 应用程序堆栈中的地位,又提供了使用的实践指南 亚马逊SageMaker真时代 部署、微调和迭代 LLM 应用程序。这是完整的 笔记本 包含代码示例以展示使用 TruLens 进行性能评估

LLM 应用程序堆栈中的 TruEra

TruEra 位于 LLM 应用程序的可观察层。尽管新组件已进入计算层(微调、提示工程、模型 API)和存储层(矢量数据库),但对可观察性的需求仍然存在。这种需求横跨从开发到生产,需要测试、调试和生产监控的互连能力,如下图所示。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

在开发中,您可以使用 开源 TruLens 在您的环境中快速评估、调试和迭代您的 LLM 应用程序。一套全面的评估指标,包括 TruLens 中提供的基于 LLM 的指标和传统指标,使您可以根据将应用程序转移到生产环境所需的标准来衡量您的应用程序。

在生产中,这些日志和评估指标可以通过 TruEra 生产监控进行大规模处理。通过将生产监控与测试和调试联系起来,可以识别和纠正幻觉、安全、保障等性能下降。

在 SageMaker 中部署基础模型

您只需两行 Python 代码即可在 SageMaker 中部署基础模型,例如 Llama-2:

from sagemaker.jumpstart.model import JumpStartModel
pretrained_model = JumpStartModel(model_id="meta-textgeneration-llama-2-7b")
pretrained_predictor = pretrained_model.deploy()

调用模型端点

部署后,您可以通过首先创建包含输入和模型参数的有效负载来调用已部署的模型端点:

payload = { "inputs": "I believe the meaning of life is", "parameters": { "max_new_tokens": 64, "top_p": 0.9, "temperature": 0.6, "return_full_text": False, },
}

然后,您可以简单地将此有效负载传递给端点的预测方法。请注意,每次调用模型时都必须传递该属性以接受最终用户许可协议:

response = pretrained_predictor.predict(payload, custom_attributes="accept_eula=true")

使用 TruLens 评估性能

现在您可以使用 TruLens 来设置您的评估。 TruLens 是一种可观察性工具,提供一组可扩展的反馈功能来跟踪和评估 LLM 支持的应用程序。反馈功能对于验证应用程序中是否存在幻觉至关重要。这些反馈功能是通过使用 Amazon Bedrock 等提供商的现成模型来实现的。 Amazon Bedrock 模型在这里具有优势,因为其经过验证的质量和可靠性。您可以通过以下代码使用 TruLens 设置提供商:

from trulens_eval import Bedrock
# Initialize AWS Bedrock feedback function collection class:
provider = Bedrock(model_id = "amazon.titan-tg1-large", region_name="us-east-1")

在此示例中,我们使用三个反馈函数:答案相关性、上下文相关性和基础性。这些评估已迅速成为上下文问答应用程序中幻觉检测的标准,并且对于无监督应用程序尤其有用,这些应用程序涵盖了当今绝大多数法学硕士应用程序。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

让我们逐一了解这些反馈功能,了解它们如何使我们受益。

上下文相关性

上下文是影响应用程序响应质量的关键输入,以编程方式确保提供的上下文与输入查询相关非常有用。这一点至关重要,因为法学硕士将使用此上下文来形成答案,因此上下文中任何不相关的信息都可能会被编织成幻觉。 TruLens 使您能够使用序列化记录的结构来评估上下文相关性:

f_context_relevance = (Feedback(provider.relevance, name = "Context Relevance") .on(Select.Record.calls[0].args.args[0]) .on(Select.Record.calls[0].args.args[1]) )

由于提供给法学硕士的上下文是检索增强生成 (RAG) 流程中最重要的步骤,因此上下文相关性对于理解检索的质量至关重要。与跨行业的客户合作,我们发现使用此评估确定了各种故障模式,例如不完整的上下文、无关的不相关上下文,甚至缺乏足够的可用上下文。通过识别这些故障模式的性质,我们的用户能够调整他们的索引(例如嵌入模型和分块)和检索策略(例如句子窗口和自动合并)来缓解这些问题。

接地气

检索上下文后,LLM 将其形成答案。法学硕士通常容易偏离所提供的事实,夸大或扩展听起来正确的答案。为了验证应用程序的基础,您应该将响应分成单独的语句,并在检索到的上下文中独立搜索支持每个语句的证据。

grounded = Groundedness(groundedness_provider=provider) f_groundedness = (Feedback(grounded.groundedness_measure, name = "Groundedness") .on(Select.Record.calls[0].args.args[1]) .on_output() .aggregate(grounded.grounded_statements_aggregator) )

扎根性问题通常可能是上下文相关性的下游影响。当法学硕士缺乏足够的背景来形成基于证据的反应时,它更有可能在试图产生看似合理的反应时产生幻觉。即使提供了完整且相关的背景,法学硕士也可能陷入基础性问题。特别是,这种情况在法学硕士以特定风格做出回应或被用来完成其不太适合的任务的应用中出现。接地性评估允许 TruLens 用户逐个分解法学硕士的回答,以了解法学硕士最常产生幻觉的地方。事实证明,这样做对于通过模型端的更改(例如提示、模型选择和模型参数)来阐明消除幻觉的前进方向特别有用。

回答相关性

最后,回应仍然需要有助于回答原来的问题。您可以通过评估最终响应与用户输入的相关性来验证这一点:

f_answer_relevance = (Feedback(provider.relevance, name = "Answer Relevance") .on(Select.Record.calls[0].args.args[0]) .on_output() )

通过对这个三元组达成满意的评估,您可以对您的应用程序的正确性做出细致入微的声明;该应用程序经验证在其知识库的限制范围内不会产生幻觉。换句话说,如果矢量数据库只包含准确的信息,那么上下文问答应用程序提供的答案也是准确的。

地面实况评估

除了这些用于检测幻觉的反馈函数之外,我们还有一个测试数据集, DataBricks-Dolly-15k,这使我们能够添加真实相似度作为第四个评估指标。请看下面的代码:

from datasets import load_dataset dolly_dataset = load_dataset("databricks/databricks-dolly-15k", split="train") # To train for question answering/information extraction, you can replace the assertion in next line to example["category"] == "closed_qa"/"information_extraction".
summarization_dataset = dolly_dataset.filter(lambda example: example["category"] == "summarization")
summarization_dataset = summarization_dataset.remove_columns("category") # We split the dataset into two where test data is used to evaluate at the end.
train_and_test_dataset = summarization_dataset.train_test_split(test_size=0.1) # Rename columns
test_dataset = pd.DataFrame(test_dataset)
test_dataset.rename(columns={"instruction": "query"}, inplace=True) # Convert DataFrame to a list of dictionaries
golden_set = test_dataset[["query","response"]].to_dict(orient='records') # Create a Feedback object for ground truth similarity
ground_truth = GroundTruthAgreement(golden_set)
# Call the agreement measure on the instruction and output
f_groundtruth = (Feedback(ground_truth.agreement_measure, name = "Ground Truth Agreement") .on(Select.Record.calls[0].args.args[0]) .on_output() )

构建应用程序

设置评估器后,您可以构建应用程序。在此示例中,我们使用支持上下文的 QA 应用程序。在此应用程序中,向完成引擎提供指令和上下文:

def base_llm(instruction, context): # For instruction fine-tuning, we insert a special key between input and output input_output_demarkation_key = "nn### Response:n" payload = { "inputs": template["prompt"].format( instruction=instruction, context=context ) + input_output_demarkation_key, "parameters": {"max_new_tokens": 200}, } return pretrained_predictor.predict( payload, custom_attributes="accept_eula=true" )[0]["generation"]

创建应用程序和反馈功能后,可以轻松使用 TruLens 创建打包的应用程序。这个包装的应用程序(我们将其命名为 base_recorder)将在每次调用该应用程序时记录并评估该应用程序:

base_recorder = TruBasicApp(base_llm, app_id="Base LLM", feedbacks=[f_groundtruth, f_answer_relevance, f_context_relevance, f_groundedness]) for i in range(len(test_dataset)): with base_recorder as recording: base_recorder.app(test_dataset["query"][i], test_dataset["context"][i])

基础 Llama-2 的结果

在测试数据集中的每条记录上运行应用程序后,您可以使用以下命令在 SageMaker 笔记本中查看结果 tru.get_leaderboard()。下面的截图显示了评估结果。答案相关性低得惊人,这表明该模型正在努力始终遵循所提供的说明。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

使用 SageMaker Jumpstart 微调 Llama-2

本文档还提供了使用 SageMaker Jumpstart 微调 Llama-2 模型的步骤 笔记本.

要进行微调,您首先需要下载训练集并设置说明模板

# Dumping the training data to a local file to be used for training.
train_and_test_dataset["train"].to_json("train.jsonl") import json template = { "prompt": "Below is an instruction that describes a task, paired with an input that provides further context. " "Write a response that appropriately completes the request.nn" "### Instruction:n{instruction}nn### Input:n{context}nn", "completion": " {response}",
}
with open("template.json", "w") as f: json.dump(template, f)

然后,将数据集和指令上传到 亚马逊简单存储服务 (Amazon S3) 用于训练的存储桶:

from sagemaker.s3 import S3Uploader
import sagemaker
import random output_bucket = sagemaker.Session().default_bucket()
local_data_file = "train.jsonl"
train_data_location = f"s3://{output_bucket}/dolly_dataset"
S3Uploader.upload(local_data_file, train_data_location)
S3Uploader.upload("template.json", train_data_location)
print(f"Training data: {train_data_location}")

要在 SageMaker 中进行微调,您可以使用 SageMaker JumpStart Estimator。我们在这里主要使用默认的超参数,除非我们将指令调整设置为 true:

from sagemaker.jumpstart.estimator import JumpStartEstimator estimator = JumpStartEstimator( model_id=model_id, environment={"accept_eula": "true"}, disable_output_compression=True, # For Llama-2-70b, add instance_type = "ml.g5.48xlarge"
)
# By default, instruction tuning is set to false. Thus, to use instruction tuning dataset you use
estimator.set_hyperparameters(instruction_tuned="True", epoch="5", max_input_length="1024")
estimator.fit({"training": train_data_location})

训练模型后,您可以像以前一样部署它并创建应用程序:

finetuned_predictor = estimator.deploy() def finetuned_llm(instruction, context): # For instruction fine-tuning, we insert a special key between input and output input_output_demarkation_key = "nn### Response:n" payload = { "inputs": template["prompt"].format( instruction=instruction, context=context ) + input_output_demarkation_key, "parameters": {"max_new_tokens": 200}, } return finetuned_predictor.predict( payload, custom_attributes="accept_eula=true" )[0]["generation"] finetuned_recorder = TruBasicApp(finetuned_llm, app_id="Finetuned LLM", feedbacks=[f_groundtruth, f_answer_relevance, f_context_relevance, f_groundedness])

评估微调模型

您可以在测试集上再次运行该模型并查看结果,这次与基础 Llama-2 进行比较:

for i in range(len(test_dataset)): with finetuned_recorder as recording: finetuned_recorder.app(test_dataset["query"][i], test_dataset["context"][i]) tru.get_leaderboard(app_ids=[‘Base LLM’,‘Finetuned LLM’])

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

新的、经过微调的 Llama-2 模型在答案相关性和基础性以及与地面真实测试集的相似性方面有了巨大的改进。质量的大幅提升是以延迟略有增加为代价的。延迟的增加是微调增加模型大小的直接结果。

您不仅可以在笔记本中查看这些结果,还可以通过运行 tru.run_dashboard() 在 TruLens UI 中探索结果。这样做可以在排行榜页面上提供相同的聚合结果,而且还使您能够更深入地研究有问题的记录并识别应用程序的故障模式。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

要以创纪录的水平了解应用程序的改进,您可以转到评估页面并更详细地检查反馈分数。

例如,如果您向基础法学硕士询问“最强大的保时捷六缸发动机是什么”的问题,模型会产生以下幻觉。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

此外,您可以检查此记录的编程评估,以根据您定义的每个反馈功能了解应用程序的性能。通过检查 TruLens 中的接地性反馈结果,您可以查看支持法学硕士提出的每项主张的可用证据的详细分类。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

如果您在 TruLens 中为经过微调的 LLM 导出相同的记录,您可以看到使用 SageMaker JumpStart 进行的微调极大地提高了响应的基础性。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

通过使用 TruLens 的自动评估工作流程,您可以通过更广泛的指标来衡量您的应用程序,以更好地了解其性能。重要的是,您现在可以动态地了解任何用例的性能,即使是那些您尚未收集真实情况的用例。

TruLens 的工作原理

在对 LLM 应用程序进行原型设计后,您可以集成 TruLens(如前所示)来检测其调用堆栈。检测调用堆栈后,可以将每次运行记录到您环境中的日志数据库中。

除了仪器和记录功能之外,评估也是 TruLens 用户价值的核心组成部分。这些评估是在 TruLens 中通过反馈函数实现的,这些反馈函数在您的检测调用堆栈之上运行,然后调用外部模型提供程序来生成反馈本身。

反馈推理后,反馈结果将写入日志数据库,您可以从中运行 TruLens 仪表板。在您的环境中运行的 TruLens 仪表板允许您探索、迭代和调试您的 LLM 应用程序。

大规模地,这些日志和评估可以推送到 TruEra 生产可观察性 每分钟可以处理数百万个观察结果。通过使用 TruEra Observability Platform,您可以快速检测幻觉和其他性能问题,并通过集成诊断在几秒钟内放大到单个记录。转向诊断观点可以让您轻松识别和减轻 LLM 应用程序的故障模式,例如幻觉、检索质量差、安全问题等。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

评估诚实、无害且有帮助的回应

通过对这个三元组达成满意的评估,您可以对其提供的响应的真实性产生更高的信心。除了真实性之外,TruLens 还为了解您的法学硕士在“诚实、无害和乐于助人”的轴心上的表现所需的评估提供了广泛的支持。我们的用户不仅能够识别我们之前讨论的幻觉,还能识别安全、安保、语言匹配、连贯性等问题,从中受益匪浅。这些都是 LLM 应用程序开发人员面临的混乱的现实问题,并且可以通过 TruLens 立即识别。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

结论

这篇文章讨论了如何加速人工智能应用程序的生产并在组织中使用基础模型。借助 SageMaker JumpStart、Amazon Bedrock 和 TruEra,您可以部署、微调和迭代 LLM 应用程序的基础模型。结账这个 链接 了解有关 TruEra 的更多信息并尝试  笔记本 你自己。


关于作者

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。乔什·雷尼 是开源 TruLens 的核心贡献者,也是 TruEra 的创始开发者关系数据科学家,负责教育计划和培育蓬勃发展的人工智能质量从业者社区。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。沙亚克·森 是 TruEra 的首席技术官兼联合创始人。 Shayak 专注于构建系统和领导研究,以使机器学习系统更加可解释、符合隐私且公平。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。阿努帕姆达塔 是 TruEra 的联合创始人、总裁兼首席科学家。在 TruEra 之前,他在卡内基梅隆大学任教 15 年(2007-22 年),最近担任电气与计算机工程和计算机科学终身教授。

使用 Amazon SageMaker 部署基础模型,使用 TruEra 进行迭代和监控 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。维韦克甘加萨尼 是 AWS 生成式 AI 初创公司的 AI/ML 初创公司解决方案架构师。 他帮助新兴的 GenAI 初创公司使用 AWS 服务和加速计算构建创新解决方案。 目前,他专注于开发微调和优化大型语言模型推理性能的策略。 在空闲时间,Vivek 喜欢徒步旅行、看电影和尝试不同的美食。

时间戳记:

更多来自 AWS机器学习