DeepSpeed 使用 LoRA 训练后文件结构详解

DeepSpeed 使用 LoRA 训练后文件结构详解

在大语言模型(LLM)的训练过程中,DeepSpeed 提供了强大的分布式训练能力,而 LoRA(Low-Rank Adaptation)通过参数高效微调技术显著减少了资源占用。完成训练后,DeepSpeed 会输出一系列文件,这些文件包括模型权重、训练状态、优化器状态和其他相关配置文件。理解这些文件的用途对于后续模型加载、微调和推理非常重要。

本文将基于训练后生成的文件结构,逐一解析这些文件的作用及使用场景。

下图是我训练之后得到的内容,基于此阅读本篇博文。

在这里插入图片描述


一、文件结构概览

训练完成后生成的文件大致可以分为以下几类:

  1. 模型权重文件

    • bf16_zero_pp_rank_*_mp_rank_*.pt
    • zero_pp_rank_*_mp_rank_*.pt
  2. 训练状态文件

    • random_states_*.pkl
    • scheduler.bin
    • latest
  3. LoRA 微调适配器文件

    • adapter_config.json
    • adapter_model.safetensors
  4. 分词器及其他配置文件

    • config.json
    • special_tokens_map.json
    • tokenizer_config.json
    • tokenizer.json
    • README.md
  5. 转换脚本

    • zero_to_fp32.py

二、详细文件解析

1. 模型权重文件

bf16_zero_pp_rank_*_mp_rank_*.pt

这些文件是 优化器状态(optimizer states),用于保存训练过程中优化器的中间状态,通常在恢复中断训练或进行多阶段微调时会用到。文件名的结构说明了分布式训练的配置:

  • bf16 表示训练中使用了半精度(bfloat16)计算。
  • zero_pp_rank_* 是 ZeRO 优化器的分片编号,pp 代表模型的分布式数据并行策略。
  • mp_rank_* 是模型并行分片编号。
zero_pp_rank_*_mp_rank_*.pt

这些文件是 模型状态文件(model states),保存了经过分布式切分的模型权重。它们是 DeepSpeed ZeRO 优化器在分布式训练下生成的模型权重分片。

需要注意的是,这些分片权重在推理时不能直接使用,通常需要通过脚本将它们合并成一个完整的模型权重文件。


2. 训练状态文件

random_states_*.pkl

这些文件记录了训练时的随机数状态,包括生成器的种子等信息,用于保证训练的可重复性。每个文件对应一个分布式训练节点(rank)。

scheduler.bin

这是 学习率调度器(scheduler) 的状态文件,记录了训练过程中学习率的变化曲线。如果你需要恢复训练,这个文件可以帮助调度器从中断点继续。

latest

这是一个指针文件,通常用来标记当前最新的 checkpoint,便于训练恢复时直接加载最近的模型状态。


3. LoRA 微调适配器文件

adapter_config.json

这是 LoRA 微调的配置文件,记录了 LoRA 的超参数和目标模块,例如:

  • r:低秩矩阵的秩。
  • alpha:缩放因子。
  • target_modules:指定 LoRA 适配的模型模块(如 queryvalue)。
  • lora_dropout:dropout 的概率。
adapter_model.safetensors

这是 LoRA 微调后的适配器权重,使用 safetensors 格式存储以提高安全性和加载速度。它只包含微调过程中训练出的 LoRA 模块权重,相比完整模型权重文件更加轻量。

适配器权重的加载通常需要配合基础模型和 adapter_config.json


4. 分词器及其他配置文件

config.json

基础模型的架构配置文件,包含模型的隐藏层大小、注意力头数、层数等信息。这是模型加载时必不可少的文件。

special_tokens_map.json

记录了特殊符号(如 [CLS], [SEP])的映射关系,用于确保模型正确处理输入文本中的特殊符号。

tokenizer_config.json

分词器的配置文件,记录了分词器的超参数,例如是否区分大小写、模型最大序列长度等。

tokenizer.json

分词器的完整定义文件,通常包含词汇表、分词规则等信息。

README.md

文件的说明文档,通常包含训练设置或模型相关的简要信息。


5. 转换脚本

zero_to_fp32.py

这是一个非常重要的脚本,用于将分布式训练生成的 ZeRO 优化器分片权重(zero_pp_rank_* 文件)转换成单个完整的模型权重文件(pytorch_model.bin),便于推理或进一步的模型部署。

使用方式示例:

python zero_to_fp32.py \
  --input_dir /path/to/checkpoint \
  --output_file /path/to/pytorch_model.bin

三、文件间的关系

从以上解析可以看出,DeepSpeed 使用 LoRA 训练后的文件大致可以分为三类:

  1. 模型相关文件:包括分布式权重、LoRA 模块权重和配置文件。
  2. 训练状态文件:用于恢复训练进度,包括优化器状态、随机数状态和学习率调度器状态。
  3. 分词器和辅助文件:确保分词器配置与模型训练过程一致,便于模型部署。

这些文件共同构成了完整的训练结果,既可以用于后续训练,也可以通过转换脚本生成推理所需的完整权重文件。


四、总结

通过对 DeepSpeed 使用 LoRA 训练后生成文件的解析,我们可以清晰地了解每个文件的作用以及它们在模型微调和部署中的重要性。在实际使用中,根据需求选择性地加载权重文件、恢复训练状态或进行分词器配置,可以显著提高工作效率。

pp_rank在变而mp_rank不变的原因分析

bf16_zero_pp_rank_0_mp_rank_00_optim_states,bf16_zero_pp_rank_1_mp_rank_00_optim_states等文件,为什么pp后面的rank在变,mp rank却都是00没变啊

这是一个非常好的问题!我们来分析一下 DeepSpeed 的分布式训练中 ppmp 的含义,以及为什么在文件名中 pp 后面的 rank 会变化,而 mp_rank 始终是 00


1. ppmp 的含义

在 DeepSpeed 的分布式训练中,ppmp 分别代表:

  • pp (Pipeline Parallelism):表示流水线并行的 rank(分片编号)。

    • 流水线并行将模型的不同层切分到不同的设备上(GPU/节点)。每个 rank 对应一部分模型的层,例如 Rank 0 处理前几层,Rank 1 处理中间层,Rank 2 处理后几层。
    • 如果模型很大(例如数十亿参数),流水线并行可以帮助减小单个设备的内存占用。
  • mp (Model Parallelism):表示模型并行的 rank。

    • 模型并行将单个模型的权重进一步拆分到多个设备中。例如,某一层的权重可以拆分为多个部分,每个设备只保存部分权重。
    • mp_rank_00 表示模型并行的 rank 号为 0,即没有额外的模型切分。

2. 为什么 pp_rank 在变化,mp_rank 始终是 00

文件名中 pp_rank 是流水线并行的 rank 编号,mp_rank 是模型并行的 rank 编号。
以下是两者变化的关键原因:

2.1 关于 pp_rank 的变化
  • 在流水线并行中,每个 GPU 或设备负责模型的一部分层(例如层 0-10 分配到 pp_rank_0,层 11-20 分配到 pp_rank_1)。
  • 每个 pp_rank 对应一段模型的计算任务,因此它会随着分布式训练的设备编号增加而变化。

在你的文件中,pp_rank_0pp_rank_1pp_rank_2pp_rank_3 说明模型被分割为了 4 段流水线,每段由不同的 GPU 或设备负责。


2.2 关于 mp_rank 没有变化
  • 你的训练设置中,模型并行的配置为 mp=1,也就是说,没有进一步对每个层的权重做切分。
  • 由于模型并行的 rank 总是 00,说明每个层的权重都完整地存储在一个设备上,权重没有再被分割到其他设备。

这与模型的大小和训练资源有关:

  • 如果模型体积足够小,可以直接在每个 GPU 内存中保存整个层的权重,无需模型并行。
  • 如果模型非常大(例如 70B 参数),可能需要启用模型并行(mp>1),这时会看到多个 mp_rank_* 文件。

3. 总结

你看到的现象说明训练使用了 流水线并行(Pipeline Parallelism,pp>1,但没有启用 模型并行(Model Parallelism,mp=1

  • pp_rank_* 的变化表示模型的不同部分被分配到不同的设备进行流水线计算。
  • mp_rank_00 始终不变,说明模型的每一部分权重没有进一步切分。

4. 深入思考

如果你有更多 GPU 或更大的模型,可以调整 mp 配置。例如设置 mp=2,则会看到文件名中出现 mp_rank_00mp_rank_01,说明模型并行在每层权重内部做了进一步切分。

在配置文件中,pipeline_parallel_sizetensor_parallel_size 是控制这两种并行方式的关键参数:

{
  "pipeline_parallel_size": 4,  // 流水线并行大小,对应 pp_rank
  "tensor_parallel_size": 1    // 模型并行大小,对应 mp_rank
}

后记

2024年12月28日22点52分于上海,在GPT4o大模型辅助下完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944172.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Llama 3 预训练(二)

目录 3. 预训练 3.1 预训练数据 3.1.1 网络数据筛选 PII 和安全过滤 文本提取与清理 去重(De-duplication) 启发式过滤(Heuristic Filtering) 基于模型的质量过滤 代码和数学推理数据处理 多语言数据处理 3.1.2 确定数…

Autoware Universe 安装记录

前提: ubuntu20.04,英伟达显卡。 ROS2-Galactic安装 wget http://fishros.com/install -O fishros && . fishros 选择galactic(ROS2)版本,桌面版 ROS2-dev-tools安装 sudo apt install python3-testresources sudo apt update …

【小程序】自定义组件的data、methods、properties

目录 自定义组件 - 数据、方法和属性 1. data 数据 2. methods 方法 3. properties 属性 4. data 和 properties 的区别 5. 使用 setData 修改 properties 的值 自定义组件 - 数据、方法和属性 1. data 数据 在小程序组件中,用于组件模板渲染的私有数据&…

socket编程(C++/Windows)

相关文章推荐&#xff1a; Socket 编程基础 面试官&#xff0c;不要再问我三次握手和四次挥手 TCP的三次握手与四次挥手 参考视频&#xff1a; https://www.bilibili.com/video/BV1aW4y1w7Ui/?spm_id_from333.337.search-card.all.click TCP通信流程 服务端 #include<…

linux自动化一键批量检查主机端口

1、准备 我们可以使用下面命令关闭一个端口 sudo iptables -A INPUT -p tcp --dport 端口号 -j DROP我关闭的是22端口&#xff0c;各位可以关其它的或者打开其它端口测试&#xff0c;谨慎关闭22端口&#xff01;不然就会像我下面一样握手超时&#x1f62d;&#x1f62d;&…

实验五 时序逻辑电路部件实验

一、实验目的 熟悉常用的时序逻辑电路功能部件&#xff0c;掌握计数器、了解寄存器的功能。 二、实验所用器件和仪表 1、双 D触发器 74LS74 2片 2、74LS162 1片 3、74194 1片 4、LH-D4实验仪 1台 1.双…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

flask基础

from flask import Flask, requestapp Flask(__name__)# app.route(/) # def hello_world(): # put applications code here # return Hello World!app.route(/) # 路由 当用户访问特定 URL 时&#xff0c;Flask 会调用对应的视图函数来处理请求 def index():return …

WPF使用OpenCvSharp4

WPF使用OpenCvSharp4 创建项目安装OpenCvSharp4 创建项目 安装OpenCvSharp4 在解决方案资源管理器中&#xff0c;右键单击项目名称&#xff0c;选择“管理 NuGet 包”。搜索并安装以下包&#xff1a; OpenCvSharp4OpenCvSharp4.ExtensionsOpenCvSharp4.runtime.winSystem.Man…

社媒运营专线 - SD-WAN 跨境网络专线 —— 外贸企业社媒平台的专属 “快车道”

在当今全球化的商业浪潮中&#xff0c;社交媒体平台已成为外贸企业拓展国际市场、提升品牌知名度和促进业务增长的关键阵地。然而&#xff0c;网络访问速度慢、IP 不纯净等问题却如影随形&#xff0c;严重制约了企业社媒运营的效率和效果。幸运的是&#xff0c;社媒运营专线 - …

RustDesk内置ID服务器,Key教程

RustDesk内置ID服务器&#xff0c;Key教程 首先需要准备一个域名&#xff0c;并将其指定到你的 rustdesk 服务器 ip 地址上&#xff0c;这里编译采用的是Github Actions &#xff0c;说白了是就workflows&#xff0c;可以创建一些自动化的工作流程&#xff0c;例如代码的检查&a…

代码随想录算法【Day4】

Day4 1.链表的题目&#xff0c;要在草稿纸上模拟清晰后就简单了 2.双指针更加灵活的应用。 3.环形链表多练习。 24. 两两交换链表中的节点 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* _dummyHead new ListNode(0); //虚拟头结点_dummyHead…

计算机毕业设计hadoop+spark+hive民宿推荐系统 酒店推荐系统 民宿价格预测 酒店价格 预测 机器学习 深度学习 Python爬虫 HDFS集群

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

win11中win加方向键失效的原因

1、可能是你把win键锁了&#xff1a; 解决办法&#xff1a;先按Fn键&#xff0c;再按win键 2、可能是可能是 贴靠窗口设置 中将贴靠窗口关闭了&#xff0c;只需要将其打开就好了

Unity自定义Inspector属性名特性以及特性自定义布局问题

前言&#xff1a; 在Unity中编辑属性的适合&#xff0c;一般都是显示属性的英文&#xff0c;如果想要改成中文的话又不能改变属性名&#xff0c;那么自定义特性是很好的选择。 一、自定以特性 这一块没有什么要多说的&#xff0c;就是自定义特性 using UnityEngine; #if UNI…

sentinel集成nacos启动报[check-update] get changed dataId error, code: 403错误排查及解决

整合nacos报403错误 因为平台写的一个限流代码逻辑有问题&#xff0c;所以准备使用sentinel来限流。平台依赖里面已经引入了&#xff0c;之前也测试过&#xff0c;把sentinel关于nacos的配置加上后&#xff0c;启动一直输出403错误 [fixed-10.0.20.188_8848-test] [check-upda…

普通人怎么入门学习并使用AI?

前言 作为普通人看着AI一天一天变革&#xff0c;心急如焚&#xff0c;未来但是就是不知道怎么才算真正进入了AI&#xff0c;使用AI....作为从头至尾追随AI脚步的码农有几点小建议~ 一、&#x1f4bb;使用 AI 网站或软件&#xff0c;解决实际问题 不管用哪种AI&#xff0c;先用…

洛谷 P1725:琪露诺 ← 单调队列+DP

【题目来源】https://www.luogu.com.cn/problem/P1725【题目描述】 在幻想乡&#xff0c;琪露诺是以笨蛋闻名的冰之妖精。 某一天&#xff0c;琪露诺又在玩速冻青蛙&#xff0c;就是用冰把青蛙瞬间冻起来。但是这只青蛙比以往的要聪明许多&#xff0c;在琪露诺来之前就已经跑到…

SDL单设备登录

SDL单设备登录 需求&#xff1a;当账户在其他地方登录时&#xff0c;当前已登录账户会被顶下线 核心思路&#xff1a; 前后端建立WebSocket连接&#xff0c;当客户端登录账户&#xff0c;根据用户id保存Socket连接&#xff0c;如果该用户已有保存的连接&#xff0c;则通知下线…

MySQL数据库函数——日期函数

常用的日期函数 函数功能curdate()返回当前日期curtime()返回当前时间now()返回当前日期和时间year(date)获取指定date的年份month(date)获取指定date的月份day(date)获取指定date的日期date_add(date,interval expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值d…