llm-finetuning

llm-finetuning

Modal和axolotl驱动的大语言模型高效微调框架

这个开源项目整合了Modal和axolotl,为大语言模型微调提供了一个高效框架。它采用Deepspeed ZeRO、LoRA适配器和Flash Attention等先进技术,实现了高性能的模型训练。该框架支持云端部署,简化了资源管理流程,并可灵活适配不同模型和数据集。项目还提供了全面的配置说明和使用指南,方便开发者快速上手和定制化应用。

LLM微调ModalaxolotlDeepSpeedLoRAGithub开源项目

几分钟内微调任何 LLM (特别介绍 Mixtral、LLaMA、Mistral)

本指南将向您展示如何使用 modalaxolotl 快速微调任何 LLM。

无服务器版 axolotl

Modal 为流行的 axolotl LLM 微调库赋予了无服务器超能力。 如果您在 Modal 的云基础设施上运行微调任务,您可以在训练模型时无需担心处理 Docker 镜像或让昂贵的 GPU 虚拟机闲置。

使用 Modal 编写的任何应用程序都可以轻松地扩展到多个 GPU —— 无论是多台 H100 服务器并行运行微调, 还是数百个 A100 或 A10G 实例运行生产推理。

为效率和性能而设计

我们的示例配置使用了许多 axolotl 支持的推荐的最先进优化方法,以实现高效、高性能的训练,包括:

快速入门

我们的快速入门示例在文本到 SQL 数据集的一个非常小的子样本上对 7B 模型进行过拟合,作为概念验证。 过拟合是测试训练设置的绝佳方法, 因为它可以快速完成(不到五分钟!)并且只需要最少的数据,但与实际训练过程非常相似。

它使用 DeepSpeed ZeRO-3 Offload 在 2 个 A100 上分片模型和优化器状态。

对微调模型的推理显示了输出结构的一致性([SQL] ... [/SQL])。要获得更好的结果,您需要使用更多数据!请参阅下面的开发部分。

  1. 设置 Modal 的认证以使用基础设施,Hugging Face 的认证以使用模型,以及(可选)Weights & Biases 的认证以观察训练:

    <details> <summary>设置步骤</summary>
    1. 创建一个 Modal 账户。
    2. 在当前 Python 虚拟环境中安装 modalpip install modal
    3. 在您的环境中设置 Modal 令牌(python3 -m modal setup
    4. 您需要在工作区中有一个名为 my-huggingface-secret密钥。您可以在 Modal 仪表板中使用 HuggingFace 模板创建一个新密钥,使用 HuggingFace 的密钥(在设置中的 API 令牌下)填充 HF_TOKEN
    5. 对于某些 LLaMA 模型,您需要访问 Hugging Face 页面(例如 LLaMA 3 8B 的这个页面_,并同意他们的使用条款和条件以获得访问权限(立即授予)。
    6. 如果您想使用 Weights & Biases 进行日志记录,您还需要在工作区中有一个名为 wandb 的密钥。您也可以从模板创建。没有好的日志,训练是很困难的,所以我们建议您尝试使用它或了解 axolotlMLFlow 的集成!
    </details>
  2. 克隆此存储库

    git clone https://github.com/modal-labs/llm-finetuning.git cd llm-finetuning
  3. 启动微调任务

    export ALLOW_WANDB=true # 如果您使用 Weights & Biases modal run --detach src.train --config=config/mistral-memorize.yml --data=data/sqlqa.subsample.jsonl

这个示例训练脚本为了使入门变得容易而有一定的主观性。请随意根据您的需求进行调整。

  1. 对您刚刚训练的模型进行推理
# 运行一次测试推理 modal run -q src.inference --prompt "[INST] 使用以下模式上下文,生成一个回答问题的 SQL 查询。 CREATE TABLE head (name VARCHAR, born_state VARCHAR, age VARCHAR) 按姓名顺序列出部门负责人的姓名、出生州和年龄。 [/INST]" # 🤖: [SQL] SELECT name, born_state, age FROM head ORDER BY name [/SQL] # 或类似的结果! # 🧠: 有效吞吐量为 36.27 tok/s
# 部署无服务器推理服务 modal deploy src.inference curl https://YOUR_MODAL_USERNAME--example-axolotl-inference-web.modal.run?input=%5BINST%5D用SQL说hello%5B%2FINST%5D # [SQL] Select 'Hello' [/SQL]

检查扁平化数据

axolotl 的一个关键特性是它将您的数据从 JSONL 文件扁平化为您在配置中指定的提示模板格式。 标记化和提示模板是微调时最容易出错的地方

我们强烈建议您在首次对新数据集进行微调时,始终检查您的数据。

开发

axolotl 的差异

这个 Modal 应用程序不像 axolotl 那样通过 CLI 暴露所有配置。相反,您在配置文件中指定所有所需的选项。

代码概述

微调逻辑在 train.py 中。以下是重要的函数:

  • launch/runs 卷中准备一个新文件夹,其中包含新训练任务的训练配置和数据。它还确保从 HuggingFace 下载基础模型。

  • train 使用准备好的文件夹,使用配置和数据执行训练任务。 关于 train 命令的一些注意事项:

  • --data 标志用于将您的数据集传递给 axolotl。然后,这个数据集被写入配置文件中指定的 datasets.path。如果您已经在 datasets.path 有一个数据集,您必须小心也将相同的路径传递给 --data,以确保正确加载数据集。

  • axolotl 不同,您不能向 train 命令传递额外的标志。但是,您可以在配置文件中指定所有所需的选项。

  • --no-merge-lora 将阻止 LoRA 适配器权重被合并到基础模型权重中。

inference.py 文件包含一个 vLLM 推理服务器,用于任何预训练或从先前训练任务微调的模型。

配置

您可以在 config 中查看一些示例配置,以快速开始使用不同的模型。在这里可以看到 axolotl 配置选项的概述。

最重要的选项包括:

模型

base_model: mistralai/Mistral-7B-v0.1

数据集(您可以在这里看到所有数据集选项)

datasets: # 这将是数据保存到云端卷时使用的路径。 - path: data.jsonl ds_type: json type: # JSONL 文件每行包含 question、context、answer 字段。 # 这被映射到 axolotl 的 instruction、input、output 标签。 field_instruction: question field_input: context field_output: answer # 格式由 axolotl 用来生成提示。 format: |- [INST] 使用以下模式上下文,生成一个回答问题的 SQL 查询。 {input} {instruction} [/INST]

LoRA

adapter: lora # 对于 qlora,或留空以进行完整微调(需要更多 GPU 内存!) lora_r: 16 lora_alpha: 32 # alpha = 2 x rank 是一个很好的经验法则。 lora_dropout: 0.05 lora_target_linear: true # 针对所有线性层

自定义数据集

axolotl 支持多种数据集格式。我们建议将您的自定义数据集作为 .jsonl 文件添加到 data 文件夹中,并对您的配置进行适当的修改。

使用 Weights and Biases 进行日志记录

要使用 Weights and Biases 跟踪您的训练运行,请将您的 wandb 配置信息添加到您的 config.yml 中:

wandb_project: code-7b-sql-output # 设置项目名称 wandb_watch: gradients # 跟踪梯度的直方图

并在启动训练任务时将 ALLOW_WANDB 环境变量设置为 true

ALLOW_WANDB=true modal run --detach src.train --config=... --data=...

多 GPU 训练

我们推荐使用 DeepSpeed 进行多 GPU 训练,它很容易设置。axolotl 提供了几个默认的 deepspeed JSON 配置,而 Modal 使得在代码中附加多个任何类型的 GPU 变得容易,所以您只需要指定想要使用哪个配置即可。

首先在您的 .yml 中编辑 DeepSpeed 配置:

deepspeed: /root/axolotl/deepspeed_configs/zero3_bf16.json

然后当你启动训练任务时, 设置 GPU_CONFIG 环境变量为你想使用的 GPU 配置:

GPU_CONFIG=a100-80gb:4 modal run --detach src.train --config=... --data=...

查找和使用你的权重

你可以通过 CLI 找到所有运行的结果:

modal volume ls example-runs-vol

或在你的 Modal 仪表板 中查看。

你可以使用以下命令浏览训练运行创建的文件,这个命令也会在训练运行结束时在日志中打印出来:

modal volume ls example-runs-vol <运行 ID> # 示例:modal volume ls example-runs-vol axo-2024-04-13-19-13-05-0fb0

默认情况下,Modal axolotl 训练器会自动将 LoRA 适配器权重合并到基础模型权重中。

完成的运行目录将看起来像这样:

$ modal volume ls example-runs-vol axo-2024-04-13-19-13-05-0fb0/

'example-runs-vol' 中 'axo-2024-04-13-19-13-05-0fb0/' 的目录列表
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ 文件名                                          ┃ 类型 ┃ 创建/修改时间              ┃ 大小    ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━┩
│ axo-2024-04-13-19-13-05-0fb0/last_run_prepared │ 目录 │ 2024-04-13 12:13:39-07:00 │ 32 B    │
│ axo-2024-04-13-19-13-05-0fb0/mlruns            │ 目录 │ 2024-04-13 12:14:19-07:00 │ 7 B     │
│ axo-2024-04-13-19-13-05-0fb0/lora-out          │ 目录 │ 2024-04-13 12:20:55-07:00 │ 178 B   │
│ axo-2024-04-13-19-13-05-0fb0/logs.txt          │ 文件 │ 2024-04-13 12:19:52-07:00 │ 133 B   │
│ axo-2024-04-13-19-13-05-0fb0/data.jsonl        │ 文件 │ 2024-04-13 12:13:05-07:00 │ 1.3 MiB │
│ axo-2024-04-13-19-13-05-0fb0/config.yml        │ 文件 │ 2024-04-13 12:13:05-07:00 │ 1.7 KiB │
└────────────────────────────────────────────────┴──────┴───────────────────────────┴─────────┘

LoRA 适配器存储在 lora-out 中。合并后的权重存储在 lora-out/merged 中。请注意,许多推理框架只能加载合并后的权重!

要使用过去训练任务的模型进行推理,你可以通过命令行指定运行名称:

modal run -q src.inference --run-name=...

常见错误

CUDA 内存不足(OOM)

这意味着你的 GPU 在训练过程中内存不足。要解决这个问题,可以通过多 GPU 训练增加 GPU 数量/内存容量,或尝试在 config.yml 中减少以下任何一项:micro_batch_size、eval_batch_size、gradient_accumulation_steps、sequence_len

self.state.epoch = epoch + (step + 1 + steps_skipped) / steps_in_epoch ZeroDivisionError: 除以零

这意味着你的训练数据集可能太小。

在 CLI 中使用 modal run 时缺少配置选项

确保你的 modal 客户端版本 >= 0.55.4164(使用 pip install --upgrade modal 升级到最新版本)

AttributeError: 'Accelerator' 对象没有 'deepspeed_config' 属性

尝试从你的配置中删除 wandb_log_model 选项。参见 #4143

编辑推荐精选

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

下拉加载更多