Llama2是目前最强大、最广泛微调的大型语言模型 (LLM) 之一,具有许可证,可用于商业用途。Meta 发布了一系列Llama2预训练和微调的生成文本模型,参数范围从 7、13 和 700 亿不等。与之前的Llama1版本相比,Llama2中的这些预训练模型有了显著的增强,训练数据增加了40%的Token,支持4k上下文长度,以及各种其他改进。此外,Llama2-chat中的微调模型已通过人类反馈强化学习 (RLHF) 针对对话应用进行了精心优化。这种优化使它们与众不同,使它们在对话生成方面优于大多数开放模型。
近几个月来LLM微调领域取得了重大进展,为企业应用提供了有效的解决方案,其中最突出的方法之一是参数高效微调(PEFT)流程。虽然高效的通用语言模型提供了强大的功能,但它们往往无法满足众多应用程序的特定需求。例如,如果希望使用LLM来完成一个特定的任务,则无需使用那些能够编写莎士比亚的精致散文的大的通用模型,此时部署非常大的语言模型就有点类似于“用航天飞机进行短途跨城镇的通勤”,使用这些模型可能非常昂贵,而且通常出于数据安全考虑,客户更愿意控制模型优化,希望通过使用较小的LLM来降低微调和部署的成本,并基于一系列专门的工作任务上进行调整。
在OCI Data Science上微调 Llama 2
在本文中,我们使用Oracle Cloud Infrastructure (OCI) 数据科学服务在多 GPU (Nvidia A10)多节点基础设施上对Llama2模型进行无缝微调的过程。对于微调操作,一块A10 GPU(24GB显存)是不够的。因此,我们调度了多台VM.GPU.A10.2实例和多块A10 GPU,使用 PyTorch FSDP完成任务,从我们的 GitHub 代码仓库访问完整的脚本和教程。
运行分布式微调过程的主要挑战是同时同步和利用多台计算机,通常必须以特定的配置启动,有时必须以特定顺序启动,具体取决于所使用的框架。在我们的示例中,我们使用 Meta在其Llama 2代码仓库上描述的微调过程。我们实现了多节点进程的无缝运行,无需添加任何基于 OCI Data Science和Accelerated Data Science(ADS) 库的专有代码。您可以直接利用代码仓库中的示例进行 PEFT、Fully Sharded Data Parallel(FSDP) 和 PEFT+FSDP 训练,而无需修改代码。
图1 OCI数据科学作业在 OCI ADS 库的帮助下运行用于微调的分布式训练
先决条件
我们的 GitHub 示例存储库描述了一些关键的先决条件。有关详细信息,请参阅 Llama 2 分布式训练并查看先决条件部分。
微调Llama 2模型
我们使用的实例是 OCI.VM.GPU.A10.2,因为微调所需GPU的显存必须至少是模型全精度大小的四倍,我们的实验表明,当考虑优化器状态、梯度、前向激活等消耗时,实际显存消耗最终会更大。我们使用了四块 A10(两台 VM.GPU.A10.2实例)用于7b模型和 12 块A10(六台VM.GPU.A10.2)用于 13b 模型。单块 A10 GPU具有 24GB显存。Hugging Face 提供了一个模型内存计算器,您还可以查看 Eleuther 对这个主题的精彩文章,该文章解释了Transformers内存使用背后的基本数学原理。
您可以通过以下两种方式之一进行微调:直接使用 ADS Python API,或者使用所需的配置来创建 YAML 文件,然后使用 ADS OPCTL CLI 运行该文件。让我们先从 YAML 方法开始。
YAML
准备描述基础设施和作业参数的 YAML 文件,使用以下模板,并对基础设施下的资源 ID 进行自定义,提供实例的shape name应该是A10或者A100的实例。
以下 YAML 是 meta-llama/Llama-2-13b-hf 微调的示例。具有六个 VM.GPU.A10.2 节点,13b Llama2 参数模型大约需要 2.5 小时才能完成三次epoch,将 YAML 文件另存为 llama2-13b-hf-ft-job.yaml:
将compartmentId、logGroupId 和 logId 等变量替换为 OCI 租户中的变量。outputUri 应指向存储微调模型的 OCI 对象存储bucket。同时将替换为您的令牌,以从HuggingFace访问Llama2模型。
在此示例中,我们设置了 OCI_METRICS_NAMESPACE参数,该参数使用 OCI monitor service监控GPU 利用率。Replicas参数指定使用的实例数,在本例中为 6 * VM.GPU.A10.2,就是使用12块A10 GPU。我们直接使用了Meta Llama2代码仓库提供的finetuning.py 示例,没有其他配置。因此,代码库中的所有微调示例都无需修改即可工作。
要启动分布式微调,请在 OCI Data Science notebook中打开terminal,安装并激活具有最新 Oracle ADS 库的 Conda 环境,然后运行 ADS OPCTL CLI:
-
odsc conda install -s pytorch20_p39_gpu_v2
-
activate home/datascience/conda/pytorch20_p39_gpu_v2
-
ads opctl run -f llama2-ft-job.yaml
提交作业后,作业:Llama2-Fine-Tuning-lora-samsum-13b 下会创建六个job。通过在笔记本终端中运行命令 ads opctl watch 来检查训练进度。
ADS Python API
您还可以直接通过 ADS Python API 运行微调过程。
以下代码块显示了使用 FSDP 微调 7B 模型的完整参数的示例:
将 ID 替换为租户的 ID,并指定存储模型的对象存储bucket的位置。若要使用 ADS Python API 创建并开始运行作业,请运行以下命令:
ADS Python API
无论使用哪种方法,分布式作业运行都可实现以下目标:
-
设置 PyTorch Conda 环境并安装其他依赖项。
-
从 GitHub 获取源代码并签出指定的commit。
-
使用特定参数运行训练脚本,包括下载模型和数据集。
-
训练完成后,将输出保存到 OCI 对象存储。
微调使用默认数据集。您还可以添加自定义数据集。您在 Dataset.md找到如何使用和添加自定义数据集的说明。相同的训练脚本也支持 PEFT。例如,您可以更改PEFT with LoRA的命令为:
Merge微调模型
微调过程完成后,要测试新模型,我们必须将权重合并到基础模型并上传到 OCI data Science的模型目录。有关详细信息,请查看此 GitHub 脚本。
1.创建VM.GPU.A10.2 的notebook session,创建过程中指定保存微调权重的对象存储路径;
2.将 lora-model-merge.ipynb上传到该notebook session中;
3.运行notebook验证和合并微调的权重;
4.notebook示例中包含将微调模型上传到 OCI 数据科学模型目录的代码;
合并FSDP权重
要合并 FSDP 权重,请使用以下步骤:
1.使用VM.GPU.A10.2创建notebook session,创建过程中指定保存微调权重的对象存储路径;
2.将load-back-FSDP-checkpoints.ipynb上传到notebook session,然后按照说明进行操作。
部署
我们建议使用基于 vLLM 的推理容器来部署微调模型。vLLM 提供了各种优化有效使用 GPU,并提供开箱即用的良好吞吐量。有关详细信息,请查看我们关于在 OCI 数据科学上部署 Llama2 的博客文章和 GitHub 代码仓库上的部署示例。
总结
借助OCI 数据科学服务轻松实现多 GPU 和多节点微调Llama2模型,发挥大语言模型的潜力。OCI提供了一种强大、可扩展且安全的方法,无需专有代码,利用直观的 Oracle ADS 库,微调和部署变得无缝,所有这些都由 OCI 上的高性能、可扩展的 GPU 提供支持。