【复现DeepSeek-R1之Open R1实战】系列8:混合精度训练、DeepSpeed、vLLM和LightEval介绍
这里写目录标题
- 1 混合精度训练
- 1.1 FP16和FP32
- 1.2 优点
- 1.3 存在的问题
- 1.4 解决办法
- 2 DeepSpeed
- 3 vLLM
- 3.1 存在的问题
- 3.2 解决方法
- 3.2.1 PagedAttention
- 3.2.2 KV Cache Manager
- 3.2.3 其他解码场景
- 3.3 结论
- 4 LightEval
- 4.1 主要功能
- 4.2 使用方法
- 4.3 应用场景
本文继续深入了解Open R1项目中用到的相关技术,包括训练模型用到的混合精度训练(bfloat16)、DeepSpeed、vLLM,以及评估模型用到的LightEval。
1 混合精度训练
1.1 FP16和FP32
单精度float(32bit,4个字节)如下图所示:

半精度float(16bit,2个字节)如下图所示:

半精度float的存储空间是float32的一半,float16的组成分为了三个部分:
- 最高位表示符号位sign;
- 有5位表示exponent位;
- 有10位表示fraction位。
从其bitmap计算出表示的数字的方式如下:
- 如果 Exponent 位全部为0:
- 如果 fraction 位 全部为0,则表示数字 0
- 如果 fraction 位 不为0,则表示一个非常小的数字(subnormal numbers):(-1)signbit×2-14×(0+fraction/1024)
- 如果 Exponent 位全部位1:
- 如果 fraction 位 全部为0,则表示 ±inf
- 如果 fraction 位 不为0,则表示 NAN
- Exponent 位的其他情况:(-1)signbit×2(exponent-15)×(1+fraction/1024)
1.2 优点
混合精度训练,指的是单精度 float和半精度 float16 混合,这样的优点是:
- 内存占用更少:fp16模型占用的内存只需原来的一半,占用的内存越小,训练的时候可以用越大的batchsize,同时通信量(特别是多卡或多机多卡)和等待时间大幅减少。
- 计算更快:目前不少GPU都有针对 fp16 的计算优化,半精度的计算吞吐量可以是单精度的 2-8 倍。
1.3 存在的问题
但是,fp16也存在明显的问题:
- 溢出错误(Overflow / Underflow):fp16 的动态范围 ( 6×10-8 ~ 65504) 比FP32的 ( 1.4×10-45 ~ 1.7×1038) 要小很多,因此在计算过程中很容易出现上溢出(Overflow)和下溢出(Underflow)的错误,溢出之后就会出现“NAN”的问题。对于深度学习而言,最大的问题在于 Underflow(下溢出),在训练后期,例如激活函数的梯度会非常小,在深度学习中,由于激活函数的的梯度往往要比权重梯度小,更易出现下溢出的情况。
- 舍入误差(Rounding Error):舍入误差指的是当梯度过小,小于当前区间内的最小间隔时,该次梯度更新可能会失败,如下图所示:

1.4 解决办法
- 混合精度训练(Mixed Precision):混合精度训练的精髓在于“在内存中用FP16做储存和乘法从而加速计算,用FP32做累加避免舍入误差”。混合精度训练的策略有效地缓解了舍入误差的问题。
- 损失放大(Loss Scaling):即使用了混合精度训练,还是会存在无法收敛的情况,原因是激活梯度的值太小,造成了下溢出(Underflow)。损失放大的思路是:
- 反向传播前,将损失变化(dLoss)手动增大 2k 倍,因此反向传播时得到的中间变量(激活函数梯度)则不会溢出;
- 反向传播后,将权重梯度缩 2k 倍,恢复正常值。
2 DeepSpeed
DeepSpeed的核心就在于,GPU显存不够,CPU内存来凑。
它将当前时刻,训练模型用不到的参数,缓存到CPU中,等到要用到了,再从CPU挪到GPU。这里的“参数”,不仅指的是模型参数,还指optimizer、梯度等。越多的参数挪到CPU上,GPU的负担就越小;但随之的代价就是,更为频繁的CPU,GPU交互,极大增加了训练推理的时间开销。因此,DeepSpeed使用的一个核心要义是:时间开销和显存占用的权衡。
DeepSpeed 是由微软开发的一个用于深度学习模型训练的优化库, 提供了多种技术来优化深度学习模型的训练过程,其中最著名的技术之一是 ZeRO,它是一种减少分布式训练中冗余的方法。
ZeRO(Zero Redundancy Optimizer)分为0、1、2、3四个不同的阶段,对应DeepSpeed 参数是 zero_stage,每个阶段都建立在前一个阶段的基础上,并提供额外的内存节省能力。
-
Stage 0:这是不采用任何内存优化方案的状态,相当于普通的分布式数据并行(Data Parallelism)。在这种情况下,整个模型会被复制到每个 GPU 上,并且每个 GPU 都会保存一份完整的优化器状态、梯度和参数。
-
Stage 1:在这个阶段,仅对优化器状态进行分割(Partitioning optimizer state),这意味着每个进程只保存优化器状态的一部分。这减少了每个 GPU 所需的内存,因为不再需要存储整个模型的优化器状态。
-
Stage 2:除了 Stage 1 的优化器状态分割外,Stage 2 还包括梯度的分割(Partitioning gradients)。这样做的结果是,不仅优化器状态被分割,梯度也被分割成更小的部分,进一步降低了内存需求。
-
Stage 3:这是最为复杂的阶段,它不仅包含了 Stage 1 和 Stage 2 的所有优化措施,还将模型参数本身进行了分割(Partitioning model parameters)。这意味着模型参数也会分布在多个 GPU 上,从而允许训练比单个 GPU 内存更大的模型。
此外,还有一个相关的概念叫做 ZeRO-offload,它可以将部分或全部的优化器状态、梯度和参数卸载到 CPU 内存上,以进一步降低 GPU 显存的使用量。不过,这样做通常会带来一定的计算性能损失,因为需要通过 PCI-E 总线传输数据。
3 vLLM
vLLM(Virtualized Language Learning Model)是一种用于自然语言处理(NLP)的模型架构或框架,旨在提高大规模语言模型(如GPT等)的性能和效率。论文:《Efficient Memory Management for Large Language Model Serving with PagedAttention》。
在模型推理时,GPU的内存分配如下:

其中:
- Parameters 保留权重等参数,是静态的,这部分无法优化;
- KV Cache 是 Transformer 的 attention 机制引入的中间缓存;
- Others 是临时激活函数使用,占用比例较小,优化空间不大。
从上面 GPU 的内存分配来看,KV Cache 是影响推理吞吐量的瓶颈,如果 KV Cache 管理不好,导致一次推理输出的数量太少,就会导致推理速度降低。
3.1 存在的问题
- KV Cache 太大:LLM 服务需要为每个请求维护一个键值(KV)缓存,用于存储模型在生成文本时的上下文信息。随着请求数量的增加,KV缓存的大小迅速增长,占用大量 GPU 内存。
- 复杂的解码算法:LLM 服务通常提供多种解码算法供用户选择,如贪婪解码、采样解码和束搜索(beam search)。这些算法对内存管理的复杂性有不同的影响。
- 未知的输入和输出长度:LLM 服务的输入和输出长度是变化的,这要求内存管理系统能够适应不同长度的提示。随着请求的输出长度在解码过程中增长,所需的 KV 缓存内存也会增加,可能会耗尽用于新请求或现有的内存。
3.2 解决方法
为了解决这些挑战,vLLM 提出了一种新的注意力算法 PagedAttention,并构建了一个高效的内存管理系统:KV Cache Manager,通过分页技术来管理 KV Cache,从而提高内存的利用效率,减少内存浪费,并支持更复杂的解码算法。这种方法允许在非连续的物理内存中存储连续的键和值,使得内存管理更加灵活,能够更有效地处理 LLM 服务中的内存挑战。vLLM架构如下图所示:

3.2.1 PagedAttention
PagedAttention 是一种受操作系统中虚拟内存和分页技术启发的注意力算法。它允许将连续的 K 和 V 向量存储在非连续的内存空间中。这一点与传统的注意力算法不同,后者通常要求 K 和 V 向量在内存中连续存储。

3.2.2 KV Cache Manager
KV Cache Manager 是 vLLM 系统中的一个核心组件,负责以分页的方式高效管理 KV Cache。这一管理器的设计灵感来源于操作系统中的虚拟内存管理技术,特别是分页机制。

3.2.3 其他解码场景
其他解码场景的优化包括:Parallel sampling、Beam search和共享前缀。
3.3 结论
评估表明,与 FasterTransformer 和 Orca 等最先进的系统相比,vLLM 在相同的延迟水平下将流行 LLM 的吞吐量提高了2-4倍。
4 LightEval
LightEval 是由 Hugging Face 推出的一款轻量级AI评估工具,专门用于评估大型语言模型(LLMs),它支持多任务处理和复杂模型配置,并且能够在多种硬件上运行,包括 CPU、GPU 和 TPU 。
4.1 主要功能
- 多设备支持:LightEval 支持在多种设备上进行模型评估,这使得它能够适应不同的硬件环境,满足企业的需求。
- 易于使用:即使是技术水平不高的用户也能轻松上手,可以在多种流行基准上评估模型,甚至可以定义自己的自定义任务。
- 自定义评估:用户可以根据需求定制化评估过程,包括指定模型评估的配置,如权重、管道并行性等。
- 与 Hugging Face 生态系统集成:LightEval 可以与 Hugging Face Hub 等工具配合使用,方便模型的管理和共享。
- 支持复杂配置:通过配置文件加载模型,可以进行复杂的评估配置,例如使用适配器/增量权重或更复杂的配置选项。
- 流水线并行评估:支持在16位精度下评估大于约40B参数的模型,通过流水线并行技术将模型分片到多个 GPU 以适应 VRAM。
4.2 使用方法
- 安装 LightEval:首先需要克隆 LightEval 的 GitHub 仓库到本地,然后创建一个虚拟环境并激活之,最后安装 LightEval 及其依赖项。
- 配置评估环境:可以通过
accelerate config命令来配置多 GPU 环境。 - 运行评估:使用
run_evals_accelerate.py脚本在单个或多个 GPU 上评估模型。可以通过命令行参数指定模型和任务的配置。 - 指定任务和模型参数:通过
--tasks参数指定要运行的任务,通过--model_args参数指定模型的路径或名称,使用--override_batch_size来覆盖默认的批处理大小,使用--output_dir指定输出目录。 - 自定义任务和指标:如果需要添加新的任务或指标,可以修改
tasks_table.jsonl文件或创建新的 Python 文件来定义它们,确保新任务可以通过 LightEval 运行。 - 查看和分析结果:评估完成后,结果将保存在指定的输出目录中。可以查看生成的日志文件和结果文件来分析模型的性能。
4.3 应用场景
- 企业级 AI 模型评估:在部署AI模型到生产环境前进行全面的评估,确保模型的准确性和可靠性。
- 学术研究:研究人员可以用 LightEval 来测试和比较不同语言模型在特定任务上的表现,支持研究假设和论文发表。
- 模型开发和迭代:开发者在模型开发过程中用 LightEval 来优化模型,通过评估结果调整模型参数和结构。
- 教育和培训:教育机构可以用 LightEval 作为教学工具,帮助学生了解如何评估 AI 模型,学习最佳实践。
- 模型选择和基准测试:在选择预训练模型或比较不同模型的性能时,LightEval 提供标准化的评估流程。
相关文章:
【复现DeepSeek-R1之Open R1实战】系列8:混合精度训练、DeepSpeed、vLLM和LightEval介绍
这里写目录标题 1 混合精度训练1.1 FP16和FP321.2 优点1.3 存在的问题1.4 解决办法 2 DeepSpeed3 vLLM3.1 存在的问题3.2 解决方法3.2.1 PagedAttention3.2.2 KV Cache Manager3.2.3 其他解码场景 3.3 结论 4 LightEval4.1 主要功能4.2 使用方法4.3 应用场景 本文继续深入了解O…...
从面试中的“漏掉步骤”谈自我表达与思维方式的转变
在今天的面试中,我遇到了一个让我深刻反思自己思维方式的问题。当面试官问到如何应对用户量和请求量逐渐增加时,我的回答遗漏了一些基础步骤,导致我给出了“我暂时想不出更好的反思”的回答。这一经历让我意识到,在面对问题时&…...
大模型面经:SFT和RL如何影响模型的泛化或记忆能力?
监督微调 (SFT) 和强化学习 (RL)都是目前大模型的基础模型后训练技术,像DeepSeek-R1、kimi等的训练方法都将两种技术应用到了极致。 如何去设计训练步骤(先SFT再RL,还是直接RL)都需要对SFT和RL的能力有较深刻的了解。 本篇就以面…...
力扣-回溯-17 电话号码的字母组合
思路 和之前的回溯不同的是,要遍历完所有的数字,并且在单层递归逻辑里需要遍历一整个字符串 代码 class Solution { public:vector<string> letters {"", "", "abc", "def", "ghi", "…...
大模型幻觉
1.什么是大模型幻觉? 在语言模型的背景下,幻觉指的是一本正经的胡说八道:看似流畅自然的表述,实则不符合事实或者是错误的。 幻觉现象的存在严重影响LLM应用的可靠性,本文将探讨大型语言模型(LLMs)的幻觉问题,以及解决幻觉现象的一些常见方法。 2.为什么需要解决LLM的…...
2025-02-20 学习记录--C/C++-PTA 7-27 冒泡法排序
一、题目描述 ⭐️ 二、代码(C语言)⭐️ /** * 冒泡法实现升序 */#include <stdio.h>int main() {int N, // 整数个数 6K, // 扫描遍数 2num, // 待排序的整数 2 3 5 1 6 4numArr[100], // 待排序的整数合集 2 3 5 1…...
RK3588配置成为路由器
文章目录 前言一、配置netplan二、安装hostapd1.创建hostapd.conf文件2.安装软件3.修改启动文件4.修改/etc/default/hostapd 文件 三、安装dnsmasq服务四、配置NET及重启验证五、常见问题总结 前言 RK3588开发板有两个网口,一个无线网卡。我需要配置为家用路由器模…...
【数据挖掘】--算法
【数据挖掘】--算法 目录:1. 缺失值和数值属性处理1缺失值处理: 2. 用于文档分类的朴素贝叶斯3. 分治法:建立决策树4. 覆盖算法建立规则5. 挖掘关联规则6. 线性模型有效寻找最近邻暴力搜索(Brute-Force Search)kd树&am…...
Huatuo热更新--如何使用
在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main(可自定义),然后按下图创建文件,注意名称与文件夹名称保持一致 然后新建场景(Init场景),添加3个空物体…...
基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)
文章目录 基于Django快递物流管理可视化分析系统(完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料)一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…...
基于射频开关选择的VNA校准设计
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
解决本地模拟IP的DHCP冲突问题
解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中,如果本机原有 IP(如 192.168.2.7)是通过 DHCP 自动获取的,直接添加新 IP(如 10.0.11.11)可能会导致 DHCP 服…...
ChromeDriver下载
平时为了下个驱动,到处找挺麻烦,收集了很多无偿分享给需要的人,仅供学习和交流。 ChromeDriver 102.0.5005.61 ChromeDriver 105.0.5195.102 ChromeDriver 108.0.5359.71 ChromeDriver 111.0.5563.64 ChromeDriver 116.0.5845.97 Chrom…...
springboot pagehelper分页插件封装
封装插件: 可自定义返回的Pages实体类参数 package com.wm.common;import com.github.pagehelper.ISelect; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import lombok.Data; import java.util.List;/*** 分页封装* param <…...
Elasticsearch7.1.1 配置密码和SSL证书
生成SSL证书 ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass 我这里没有设置ssl证书密码,如果需要设置密码,需要再配置给elasticsearch 在之前的步骤中,如果我们对elastic-certificates.p12 文件配置了密码…...
让win11右键默认显示更多选项
cmd / powershell 右键默认显示更多选项 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 刷新,使配置生效(该命令需要cmd执行,powershell不行) …...
毕业项目推荐:基于yolov8/yolo11的100种中药材检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
kill -9 结束某个用户所有进程的方式-linux019
1. 使用 pkill 命令 pkill 命令可以通过用户名直接终止该用户的所有进程。加上 -9 参数,表示强制结束进程。 pkill -9 -u XXXX 说明:这个命令会使用 SIGKILL 信号(即 kill -9)强制终止 ttlsa 用户的所有进程。 2. 使用 killal…...
自用题库---面试使用
1、css中如何实现水平垂直居中 方法一:flex: display: flex; justify-content: center; align-item: center;方法二:绝对定位margin:auto: position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin:auto;方法三:已…...
蓝桥杯好数
样例输入: 24 输出:7 输入:2024 输出: 150 思路:本题朴素方法的时间复杂度是O(n * log10(n)) ,不超时。主要考察能否逐位取数,注意细节pi,这样不会改变i,否则会导致循环错误。 #in…...
Jenkins 配置 Credentials 凭证
Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind:凭证类型 Username with password: 配置 用…...
用openresty和lua实现壁纸投票功能
背景 之前做了一个随机壁纸接口,但是不知道大家喜欢对壁纸的喜好,所以干脆在实现一个投票功能,让用户给自己喜欢的壁纸进行投票。 原理说明 1.当访问http://demo.com/vote/时,会从/home/jobs/webs/imgs及子目录下获取图片列表&…...
Vue 监听属性(watch)
Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 监听属性(watch) 目录 监听属性 监听值改变 使用watch实现 区别 总结 监听属性 通过watch来响应数据的变化。 虽然大多数情况计算属性都可以满足需要,但有时还是需要使用侦听器。…...
mysql查看binlog日志
mysql 配置、查看binlog日志: 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启,修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin(开启日志并指定日志前缀ÿ…...
BiRefNet C++ TensorRT (二分类图像分割)
BiRefNet C TensorRT (二分类图像分割) 利用TensorRT和CUDA的双边参考网络(BiRefNet)的高性能c实现,针对实时高分辨率二分类图像分割进行了优化。 BiRefNet c TENSORRT旨在有效地在GPU上运行双边参考分割任务。通过利…...
蓝桥杯篇---IAP15F2K61S2矩阵键盘
文章目录 前言简介矩阵键盘的工作原理1.行扫描2.检测列状态3.按键识别 硬件连接1.行线2.列线 矩阵键盘使用步骤1.初始化IO口2.扫描键盘3.消抖处理4.按键识别 示例代码:4x4矩阵键盘扫描示例代码:优化后的矩阵键盘扫描注意事项1.消抖处理2.扫描频率3.IO口配…...
【ARM】MDK在编译 i.MXRT1芯片的时候出现报错Error: L6079E
1、 文档目标 解决MDK在编译 i.MXRT1芯片的时候出现报错Error: L6079E 2、 问题场景 客户在使用NXP 的NXP i.MXRT1050的芯片进行工程构建的时候出现下面的报错信息: Error: L6079E: Subtool invocation error: Error executing armcc. The system could not find…...
论文笔记(七十二)Reward Centering(二)
Reward Centering(二) 文章概括摘要2 简单的奖励中心 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…...
LeetCode 2595.奇偶位数:位运算
【LetMeFly】2595.奇偶位数:位运算 力扣题目链接:https://leetcode.cn/problems/number-of-even-and-odd-bits/ 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式(下标从 0 开始)中值为 1 的偶数下标的个数。 用 odd 表示…...
推荐几款较好的开源成熟框架
一. 若依: 1. 官方网站:https://doc.ruoyi.vip/ruoyi/ 2. 若依SpringBootVueElement 的后台管理系统:https://gitee.com/y_project/RuoYi-Vue 3. 若依SpringBootVueElement 的后台管理系统:https://gitee.com/y_project/RuoYi-Cl…...
