我们知道,Meta 推出的 Llama 3、Mistral AI 推出的 Mistral 和 Mixtral 模型以及 AI21 实验室推出的 Jamba 等开源大语言模型已经成为 OpenAI 的竞争对手。
不过,大多数情况下,使用者需要根据自己的数据对这些开源模型进行微调,才能充分释放模型的潜力。
虽然在单个 GPU 上使用 Q-Lora 对较小的大语言模型(如 Mistral)进行微调不是难事,但对像 Llama 3 70b 或 Mixtral 这样的大模型的高效微调直到现在仍是一个难题。
因此,Hugging Face 技术主管 Philipp Schmid 介绍了如何使用 PyTorch FSDP 和 Q-Lora,并在 Hugging Face 的 TRL、Transformers、peft 和 datasets 等库的帮助下,对 Llama 3 进行微调。除了 FSDP,作者还对 PyTorch 2.2 更新后的 Flash Attention v2 也进行了适配。
微调主要步骤如下:
注:本文进行的实验是在英伟达(NVIDIA)H100 和英伟达(NVIDIA)A10G GPU 上创建和验证的。配置文件和代码针对 4xA10G GPU 进行了优化,每个 GPU 均配备 24GB 内存。如果使用者有更多的算力,第 3 步提到的配置文件(yaml 文件)需要做相应的修改。
基于一项由 Answer.AI、Q-Lora 创建者 Tim Dettmers 和 Hugging Face 共同参与的合作项目,作者对 Q-Lora 和 PyTorch FSDP(完全共享数据并行)所能提供的技术支持进行了总结。
FSDP 和 Q-Lora 的结合使用能让使用者在 2 个消费级 GPU(24GB)上就能对 Llama 2 70b 或 Mixtral 8x7B 进行微调,细节可以参考下面文章。其中 Hugging Face 的 PEFT 库对此有至关重要的作用。
文章地址:https://www.answer.ai/posts/2024-03-06-fsdp-qlora.html
PyTorch FSDP 是一种数据 / 模型并行技术,它可以跨 GPU 分割模型,减少内存需求,并能够更有效地训练更大的模型。Q-LoRA 是一种微调方法,它利用量化和低秩适配器来有效地减少计算需求和内存占用。
第一步是安装 Hugging Face Libraries 以及 Pyroch,包括 trl、transformers 和 datasets 等库。trl 是建立在 transformers 和 datasets 基础上的一个新库,能让对开源大语言模型进行微调、RLHF 和对齐变得更容易。
接下来,登录 Hugging Face 获取 Llama 3 70b 模型。
环境设置完成后,我们就可以开始创建和准备数据集了。微调用的数据集应该包含使用者想要解决的任务的示例样本。阅读《如何在 2024 年使用 Hugging Face 微调 LLM》可以进一步了解如何创建数据集。
文章地址:https://www.philschmid.de/fine-tune-llms-in-2024-with-trl#3-create-and-prepare-the-dataset
作者使用了 HuggingFaceH4/no_robots 数据集,这是一个包含 10,000 条指令和样本的高质量数据集,并且经过了高质量的数据标注。这些数据可用于有监督微调(SFT),使语言模型更好地遵循人类指令。no_robots 数据集以 OpenAI 发表的 InstructGPT 论文中描述的人类指令数据集为原型,并且主要由单句指令组成。
接下来使用 PyTorch FSDP、Q-Lora 和 SDPA 对大语言模型进行微调。作者是在分布式设备中运行模型,因此需要使用 torchrun 和 python 脚本启动训练。
作者编写了 run_fsdp_qlora.py 脚本,其作用是从磁盘加载数据集、初始化模型和分词器并开始模型训练。脚本使用 trl 库中的 SFTTrainer 来对模型进行微调。
SFTTrainer 能够让对开源大语言模型的有监督微调更加容易上手,具体来说有以下几点:
注意:作者使用的是类似于 Anthropic/Vicuna 的聊天模板,设置了「用户」和「助手」角色。这样做是因为基础 Llama 3 中的特殊分词器(<|begin_of_text|> 及 <|reserved_special_token_XX|>)没有经过训练。
这意味着如果要在模板中使用这些分词器,还需要对它们进行训练,并更新嵌入层和 lm_head,对内存会产生额外的需求。如果使用者有更多的算力,可以修改 run_fsdp_qlora.py 脚本中的 LLAMA_3_CHAT_TEMPLATE 环境变量。
在配置参数方面,作者使用了新的 TrlParser 变量,它允许我们在 yaml 文件中提供超参数,或者通过明确地将参数传递给 CLI 来覆盖配置文件中的参数,例如 —num_epochs 10。以下是在 4x A10G GPU 或 4x24GB GPU 上微调 Llama 3 70B 的配置文件。
注意:训练结束时,GPU 内存使用量会略有增加(约 10%),这是因为模型保存所带来的开销。所以使用时,请确保 GPU 上有足够的内存来保存模型。
在启动模型训练阶段,作者使用 torchrun 来更加灵活地运用样本,并且易于被调整,就像 Amazon SageMaker 及 Google Cloud Vertex AI 一样。
对于 torchrun 和 FSDP,作者需要对环境变量 ACCELERATE_USE_FSDP 和 FSDP_CPU_RAM_EFFICIENT_LOADING 进行设置,来告诉 transformers/accelerate 使用 FSDP 并以节省内存的方式加载模型。
注意:如果想不使用 CPU offloading 功能,需要更改 fsdp 的设置。这种操作只适用于内存大于 40GB 的 GPU。
本文使用以下命令启动训练:
预期内存使用情况:
在 g5.12xlarge 服务器上,基于包含 1 万个样本的数据集,作者使用 Flash Attention 对 Llama 3 70B 进行 3 个 epoch 的训练,总共需要 45 小时。每小时成本为 5.67 美元,总成本为 255.15 美元。这听起来很贵,但可以让你在较小的 GPU 资源上对 Llama 3 70B 进行微调。
如果我们将训练扩展到 4x H100 GPU,训练时间将缩短至大约 125 小时。如果假设 1 台 H100 的成本为 5-10 美元 / 小时,那么总成本将在 25-50 美元之间。
我们需要在易用性和性能之间做出权衡。如果能获得更多更好的计算资源,就能减少训练时间和成本,但即使只有少量资源,也能对 Llama 3 70B 进行微调。对于 4x A10G GPU 而言,需要将模型加载到 CPU 上,这就降低了总体 flops,因此成本和性能会有所不同。
注意:在作者进行的评估和测试过程中,他注意到大约 40 个最大步长(将 80 个样本堆叠为长度为三千的序列)就足以获得初步结果。40 个步长的训练时间约为 1 小时,成本约合 5 美元。
使用 QLoRA 时,作者只训练适配器而不对整个模型做出修改。这意味着在训练过程中保存模型时,只保存适配器权重,而不保存完整模型。
如果使用者想保存完整的模型,使其更容易与文本生成推理器一起使用,则可以使用 merge_and_unload 方法将适配器权重合并到模型权重中,然后使用 save_pretrained 方法保存模型。这将保存一个默认模型,可用于推理。
注意:CPU 内存需要大于 192GB。
训练完成后,我们要对模型进行评估和测试。作者从原始数据集中加载不同的样本,并手动评估模型。评估生成式人工智能模型并非易事,因为一个输入可能有多个正确的输出。阅读《评估 LLMs 和 RAG,一个使用 Langchain 和 Hugging Face 的实用案例》可以了解到关于评估生成模型的相关内容。
文章地址:https://www.philschmid.de/evaluate-llm
至此,主要流程就介绍完了,心动不如行动,赶紧从第一步开始操作吧。
本文来自微信公众号“机器之心”
【开源免费】graphrag是微软推出的RAG项目,与传统的通过 RAG 方法使用向量相似性作为搜索技术不同,GraphRAG是使用知识图谱在推理复杂信息时大幅提高问答性能。
项目地址:https://github.com/microsoft/graphrag
【开源免费】Dify是最早一批实现RAG,Agent,模型管理等一站式AI开发的工具平台,并且项目方一直持续维护。其中在任务编排方面相对领先对手,可以帮助研发实现像字节扣子那样的功能。
项目地址:https://github.com/langgenius/dify
【开源免费】RAGFlow是和Dify类似的开源项目,该项目在大文件解析方面做的更出色,拓展编排方面相对弱一些。
项目地址:https://github.com/infiniflow/ragflow/tree/main
【开源免费】phidata是一个可以实现将数据转化成向量存储,并通过AI实现RAG功能的项目
项目地址:https://github.com/phidatahq/phidata
【开源免费】TaskingAI 是一个提供RAG,Agent,大模型管理等AI项目开发的工具平台,比LangChain更强大的中间件AI平台工具。
项目地址:https://github.com/TaskingAI/TaskingAI
【开源免费】XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。它帮助开发者提供一个简单易用的平台,可以对大语言模型(LLM)和多模态图文模型(VLM)进行预训练和轻量级微调。XTuner 支持多种微调算法,如 QLoRA、LoRA 和全量参数微调。
项目地址:https://github.com/InternLM/xtuner
【开源免费】LangGPT 是一个通过结构化和模板化的方法,编写高质量的AI提示词的开源项目。它可以让任何非专业的用户轻松创建高水平的提示词,进而高质量的帮助用户通过AI解决问题。
项目地址:https://github.com/langgptai/LangGPT/blob/main/README_zh.md
在线使用:https://kimi.moonshot.cn/kimiplus/conpg00t7lagbbsfqkq0