在 Amazon SageMaker JumpStart 上微调 Code Llama 机器学习博客

在 Amazon SageMaker JumpStart 上微调 Code Llama

作者: Xin Huang、Ashish Khetan、Vishaal Yalamanchali、Meenakshisundaram Thandavarayan发表日期: 2024年3月18日来源: Amazon SageMaker Amazon SageMaker JumpStart 公告 人工智能 永久链接

在 Amazon SageMaker JumpStart 上微调 Code Llama 机器学习博客

主要重点

今天,我们很高兴宣布可以通过 Amazon SageMaker JumpStart 对 Meta 的 Code Llama 模型进行微调。Code Llama 系列大型语言模型 (LLMs) 是一组预训练和微调的代码生成模型,其参数范围从 70 亿到 700 亿不等。经过微调的 Code Llama 模型在准确性和解释性上优于基本的 Code Llama 模型,这在其对 HumanEval 和 MBPP 数据集的测试中得到了证实。您可以使用 Amazon SageMaker Studio UI 进行几次点击或使用 SageMaker Python SDK 对 Code Llama 模型进行微调和部署。Llama 模型的微调基于 Meta 提供的 llamarecipes GitHub 仓库 中的脚本,使用了 PyTorch FSDP、PEFT/LoRA 和 Int8 量化技术。

本文将介绍如何通过 SageMaker JumpStart 以一键式 UI 和 SDK 体验微调 Code Llama 预训练模型,相关内容可以参考以下的 GitHub 仓库。

什么是 SageMaker JumpStart

使用 SageMaker JumpStart,机器学习ML从业者可以从广泛可用的基础模型中进行选择。ML 从业者可以从网络隔离的环境中将基础模型部署到专用的 Amazon SageMaker 实例,并使用 SageMaker 进行模型训练和部署的自定义。

什么是 Code Llama

Code Llama 是 Llama 2 的代码专用版本,通过对 Llama 2 在其代码特定数据集上的进一步训练和从相同数据集中抽样更多数据来创建。Code Llama 具有增强的编程能力。它可以生成代码和关于代码的自然语言,支持多种当前流行的编程语言,包括 Python、C、Java、PHP、Typescript (JavaScript)、C#、Bash 等。

为什么要微调 Code Llama 模型

Meta 在 HumanEval 和 MBPP 上发布了 Code Llama 性能基准,涵盖了 Python、Java 和 JavaScript 等常见编程语言。Code Llama Python 模型在 HumanEval 上的表现显示,其不同编程语言和任务的表现存在差异,从 7B Python 模型的 38 到 70B Python 模型的 57。此外,针对 SQL 程式语言的微调 Code Llama 模型也显示出更好的结果。这些已发表的基准突显了微调 Code Llama 模型的潜在好处,使其能在特定的编程领域和任务中表现更好。

通过 SageMaker Studio UI 进行无代码微调

要开始使用 SageMaker Studio 微调 Llama 模型,请完成以下步骤:

在 SageMaker Studio 控制台中,选择导航窗格中的 JumpStart。

您将会看到超过 350 个模型的列表,范围从开源到专有模型。

搜索 Code Llama 模型。

如果您看不到 Code Llama 模型,可以通过关闭并重新启动来更新您的 SageMaker Studio 版本。有关版本更新的更多信息,请参见 关闭和更新 Studio 应用程序。您还可以通过选择 探索所有代码生成模型 或在搜索框中搜索 Code Llama 来找到其他模型变体。

SageMaker JumpStart 目前支持 Code Llama 模型的指令微调。以下屏幕截图显示了 Code Llama 2 70B 模型的微调页面。

在 训练数据集位置 中,您可以指向包含微调所需训练和验证数据集的 Amazon S3 桶。设定您的部署配置、超参数和安全设置以进行微调。选择 训练 以启动在 SageMaker ML 实例上的微调作业。

我们将在下一部分讨论您需要准备的数据集格式,以进行指令微调。

在模型微调完成后,您可以通过 SageMaker JumpStart 上的模型页面进行部署。

当微调完成时,将出现部署微调模型的选项,如下所示:

通过 SageMaker Python SDK 进行微调

在本节中,我们将演示如何使用 SageMaker Python SDK 在指令格式的数据集上微调 Code Llama 模型。具体来说,该模型的微调针对一组使用指令描述的自然语言处理 (NLP) 任务进行。这有助于改进模型针对未知任务的零样本提示性能。

完成微调作业的以下步骤。您可以从 GitHub 仓库 获取完整的微调代码。

首先,让我们看看指令微调所需的数据集格式。训练数据应以 JSON lines (jsonl) 格式进行格式化,其中每行是一个字典,表示一个数据样本。所有训练数据必须位于一个资料夹中,但可以保存在多个 jsonl 文件中。以下是 JSON lines 格式的示例:

json{ systemprompt 一个聊天 question 请专注于这个问题的效率并提供 Python 代码n给定两个字符串 s 和 t,仅由小写英文字母组成。nn返回 需要附加到 s 末尾的最小字符数 使得 t 成为 s 的 子序列。nn一个 子序列 是可以通过删除某些或没有字符而不改变剩余字符的顺序而从另一个字符串中派生出来的字符串。nn示例 1nn输入 s = coaching t = coding n输出 4n说明 附加字符 ding 到 s 的末尾使得 s = coachingding 。n现在,t 是 s 的子序列 ( coachingding )。n可以证明附加任何 3 个字符到 s 的末尾永远不会使 t 成为子序列。nn示例 2nn输入 s = abcde t = a n输出 0n说明 t 已经是 s 的子序列 ( abcde )。nn示例 3nn输入 s = z t = abcde n输出 5n说明 附加字符 abcde 到 s 的末尾使得 s = zabcde 。n现在,t 是 s 的子序列 ( zabcde )。n可以证明附加任何 4 个字符到 s 的末尾永远不会使 t 成为子序列。nn约束条件nn 1 lt= slength tlength lt= 105n s 和 t 仅由小写英文字母组成。 response ### 解释n算法维护两个指针 i 和 j,以迭代给定字符串 s 和 t。指针 i 遍历字符串 s,而指针 j 遍历字符串 t。在遍历 s 的过程中,如果发现与 t 中当前字符匹配的字符,则增加 j 指针。因为匹配的字符可以是我们正在寻找的子序列的一部分。当 i 到达 s 的尾端或 j 到达 t 的尾端时,迭代停止。nn最后,我们将索引 j 从 t 的长度中减去。这给出我们所需附加到 s 末尾的最小字符数,使得 t 成为 s 的子序列。nn### 伪代码:nnMINADDITION(s t)n slen = LENGTH(s)n tlen = LENGTH(t)n i = 1n j = 1n WHILE i lt= slen AND j lt= tlenn IF s[i] == t[j]n j = j 1n ENDIFn i = i 1n ENDWHILEn RETURN tlen j 1nENDMINADDITIONnnn### 代码npythonndef minaddition(s str t str) gt intn slen = len(s)n tlen = len(t)n i j = 0 0n while i lt slen and j lt tlenn if s[i] == t[j]n j = 1n i = 1n return tlen jnn}

训练资料夹可以包含一个名为 templatejson 的文件,用于描述输入和输出格式。以下是模板的示例如下:

json{ prompt {systemprompt} ### 输入 {question} completion {response}}

为了匹配模板,JSON lines 文件中的每个样本必须包含 systemprompt、question 和 response 字段。在这次演示中,我们使用了来自 Hugging Face 的 Dolphin Coder 数据集。

在您准备好数据集并将其上传到 S3 桶后,您可以使用以下代码开始微调:

pythonfrom sagemakerjumpstartestimator import JumpStartEstimator

modelid = metatextgenerationllamacodellama7b modelversion = traindatalocation = fs3//{yourownbuckethostingtrainingdata}/ # training data in s3 bucket

estimator = JumpStartEstimator( modelid=modelid modelversion=modelversion hyperparameters=hyperparameters environment={ accepteula false } # please change accepteula to be true to accept EULA)

estimatorfit({training traindatalocation})

您可以从估算器直接部署经过微调的模型,如下所示。详细内容请参见 GitHub 仓库。

pythonfinetunedpredictor = estimatordeploy()

微调技术

语言模型如 Llama 的大小超过 10 GB,甚至 100 GB。微调这些大型模型需要具有高 CUDA 内存的实例。此外,由于模型的大小,训练这些模型可能非常慢。因此,为了有效微调,我们使用以下优化技术:

低秩自适应 (LoRA) 这是一种针对大型模型进行高效微调的参数效率微调 (PEFT) 方法。通过此方法,您固定整个模型,只将一小组可调参数或层加入模型中。例如,您可以微调不到 1 的参数,而不必训练所有 70 亿个参数。这大大减少了内存需求,因为您只需存储 1 参数的梯度、优化器状态和其他训练相关信息。此方法还能缩短训练时间及降低成本。欲了解更多详细信息,请参见 LoRA LowRank Adaptation of Large Language Models。

Int8 量化 即使使用 LoRA 等优化方法,像 Llama 70B 这样的模型仍然太大而无法训练。为了减少训练过程中的内存占用,您可以在训练过程中使用 Int8 量化。量化通常会降低浮点数据类型的精度。尽管这减少了存储模型权重所需的内存,但可能会因信息丢失而降低性能。Int8 量化仅使用四分之一的精度,但不会因为仅仅丢弃位元而造成性能降级。它将数据从一个类型四舍五入到另一个类型。要了解 Int8 量化的详细信息,请参见 LLMint8() 8bit Matrix Multiplication for Transformers at Scale。

完全分片数据并行(FSDP) 这是一种数据并行训练算法,将模型的参数分片到数据并行工作器上,并可以选择将部分训练计算卸载到 CPUs。尽管参数在不同的 GPU 之间进行分片,但每个微批次的计算都是本地于 GPU 工作器。它更均匀地将参数进行片段化,并在训练过程中通过通信和计算重叠来实现最佳性能。

以下表格总结了不同设置下每个模型的详细信息。

蓝快加速器ios模型默认设置LORA FSDPLORA 无 FSDPInt8 量化 LORA 无 FSDPCode Llama 2 7BLORA FSDP是是是Code Llama 2 13BLORA FSDP是是是Code Llama
使用 CIDR 地图可视化企业 IP 地址管理和规划 网络与内容交付
使用 CIDR 地图可视化企业 IP 地址管理和规划 网络与内容交付

使用CIDR地图可视化企业IP地址管理与规划关键要点随着企业云业务的扩展,IP地址管理与规划变得愈发复杂。缺乏对企业内IP资源的清晰理解可能导致网络管理任务变得繁琐且耗时。使用通过Amazon VPC提供的CIDR地图,可以直观地展示整个IPv4和IPv6网络拓扑,从而简化复杂性,支持业务的快速增长...

基因组学工作流程,第6部分:成本预测 架构博客
基因组学工作流程,第6部分:成本预测 架构博客

基因组学工作流程第六部分:成本预测关键要点:在基因组学工作流程中,成本预测对科学家决策至关重要。本篇文章介绍了如何通过历史数据训练机器学习ML模型,以预测未来工作流程的成本。通过此解决方案,团队可以在应用程序使用上提高成本意识并支持企业资源规划,且有助于避免预算超支。基因组学工作流程运行于大量计算资...