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

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
��讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

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

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多