有没有接到民警电话问有没有买过无人机的?
上周接到了,而且完全没有印象买过无人机,后来想了一下是买过一个玩具无人机,查了下记录好像是很久之前买过的,有快 10 年了。
民警说到了我的名字以及儿童的名字。
xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
上周接到了,而且完全没有印象买过无人机,后来想了一下是买过一个玩具无人机,查了下记录好像是很久之前买过的,有快 10 年了。
民警说到了我的名字以及儿童的名字。
做数字化相关工作,最容易遇到的一种情况就是,大家都在聊架构,但说的根本不是一回事。 老板聊的是业务怎么跑得更顺,产品在说功能怎么设计,技术在讨论系统怎么搭,数据团队关心的是数据怎么流、怎么管、怎么用。结果同样都叫架构,开会时听着像在同频,落到执行层面却经常对不上。 所以这篇文章,我想把几类最常见、也最容易混的架构放在一起讲清楚, 尤其是很多团队经常提到、但又容易讲得很虚的数据架构。 业务架构说白了,解决的是企业到底在做什么,核心流程怎么跑,关键角色怎么协同。 它关注的不是代码,也不是数据库,而是业务本身的组织方式。 比如客户从线索到成交,中间经过哪些环节,哪些部门参与,哪些动作是关键节点,哪些指标最值得盯。 业务架构通常会落到这些内容上: 业务架构清不清楚,决定了后面产品、系统、数据会不会越做越乱。因为如果连业务主链路都没理顺,后面不管系统搭得多复杂,最后都容易变成局部优化。 如果说业务架构是在讲做什么,那产品架构就是在讲要做成什么样。 它更偏产品视角,核心任务是把业务需求沉淀成可以被用户使用的功能能力。 比如一个销售管理产品,客户管理、商机管理、合同管理、回款管理这些模块怎么分,哪些能力是基础能力,哪些是扩展能力,页面与功能之间怎么组织,这些都属于产品架构的范畴。 产品架构更强调两个问题:能力边界清不清楚?模块组合合不合理? 这一步做得好,后续研发、测试、实施都会更顺。做不好,就很容易出现功能堆砌、模块打架、后期难维护的问题。 产品里规划好的能力,最终还得有系统来承接,这就是应用架构在解决的事情。 应用架构关注的是企业里有哪些应用系统,这些系统分别干什么,彼此之间怎么配合。 比如 CRM 管客户,ERP 管供应链,OA 管审批,BI 做分析,营销系统做投放自动化。系统之间不是简单并列,而是有明确的职责边界和协作关系。 应用架构看起来离业务远一点,实际上它直接影响日常工作的顺畅程度。系统职责划分不清,常见后果就是重复建设、数据割裂、流程绕路。 再往下一层,就是技术架构。 技术架构解决的是系统底层如何实现,包括服务怎么拆、接口怎么设计、中间件怎么选、数据库怎么部署、系统怎么保证稳定性和扩展性。 它更偏工程实现,是研发团队最熟悉的一层。 技术架构一般会涉及这些问题: 很多人会把技术架构和数据架构混在一起,其实两者重点不同。技术架构更关心系统怎么建,数据架构更关心数据怎么跑。一个偏底座,一个偏血液循环。 如果说前面几类架构更多是在回答职责和分工,那数据架构回答的就是数据这条线到底怎么跑通。 为什么数据架构重要。因为企业现在的问题通常不是没数据,而是数据很多,却分散、混乱、不一致。业务系统里有一份,报表里有一份,数据仓库里又有一份,最后同一个指标开会时能报出三个版本。这种情况,本质上就不是报表问题,而是数据架构没搭好。 一个相对完整的数据架构,包含下面几个环节。 先看数据源。企业里的数据一般来自业务系统、日志系统、第三方平台、Excel 文件、API 接口,来源越多,后面整合的难度越高。数据架构第一步,就是把数据入口梳理清楚,知道数据来自哪里,更新频率是什么,质量怎么样。 有了数据源之后,核心问题就是流转链路。数据要不要同步,多久同步一次,是批量抽取还是实时采集,要不要做清洗转换,怎么进入ODS、DW、ADS这些层。很多企业的数据问题,其实就出在这一步,链路不清晰,口径自然也很难统一。 数据进来之后,不是随便找个库放进去就算完事。要不要分层,怎么建主题域,明细层、汇总层、应用层怎么划分,历史数据保留多久,冷热数据怎么处理,这些都属于数据架构里非常实际的问题。 数据存储结构设计得好,后面的分析效率会高很多。设计得差,后面每做一次需求都像临时救火。 真正成熟的数据架构,不会只停留在采集和存储,还会把治理一起纳进来。比如主数据怎么统一,指标口径怎么管理,数据质量怎么监控,权限怎么分配,元数据怎么维护。这部分往往不显山不露水,但缺了它,数据平台越大,后面越容易乱。 最后才是应用层。报表、看板、经营分析、用户画像、风控模型、推荐算法,本质上都是数据消费方式。数据架构不是为了把数据堆起来,而是为了让数据能被真正使用,支持业务判断和决策。 所以你会发现,数据架构不是单纯画一张图,而是把数据的来源、链路、存储、治理、应用整套机制串起来。它既连接业务,也连接技术,是数字化建设里非常关键的一层。 前面讲的业务架构、产品架构、应用架构、技术架构和数据架构,更多是在解决应该怎么设计的问题,而项目架构解决的,是这件事到底怎么一步一步落地。 说得直白一点,项目架构管的不是某一个系统,也不是某一块数据,而是整个项目怎么拆、怎么排、怎么协同、怎么推进。比如先做什么,后做什么,哪些事情可以并行,哪些必须等前一步完成,哪些角色要参与,哪些节点要验收,这些都属于项目架构要考虑的内容。 它通常会关注这几个点:项目范围的界定、阶段计划的安排、人员分工的划分、里程碑的设定、风险和依赖的管理。 很多项目不是技术不行,也不是方案不对,而是推进过程中节奏乱了,前后顺序没捋清,最后导致交付拖延、沟通反复、问题堆积。项目架构的意义,就是把一件复杂的事拆成能执行、能协作、能交付的路径,让大家知道现在在哪一步,下一步该干什么。 想要区分这些架构,其实核心是需要分清它们各自解决的问题:业务架构负责的是业务怎么跑,产品架构负责能力怎么设计,应用架构负责系统怎么分工,技术架构负责底层怎么实现,数据架构负责数据怎么流通,项目架构负责事情怎么一步步落地。 我建议大家平时做数字化工作的时候,先把最贴近自己业务的那部分吃透,再搭着数据架构一起理解。因为真正到了项目里,很多问题并不是某一类架构单独出了问题,而是几层之间没有衔接好。等你把这些关系理顺了,再去看系统建设、数据治理、数仓规划和项目实施,思路会清楚很多,很多原本绕来绕去的地方,也会慢慢变得顺手。一、业务架构
二、产品架构
三、应用架构
四、技术架构
五、数据架构
1.数据来源
2.数据流转
3.数据储存
4.数据管理
5.数据应用
六、项目架构
七、总结


软著已经在申请了,现在在内测完善功能,主要就是一些自己平时用的小工具。
软件支持安卓 14 以上,如果哪位大佬有谷歌 play 账号,欢迎参与(留下你的邮箱,或者发邮件申请 [email protected] )内测计划,这对我很重要。
有没有《关于约会的一切》《完美陌生人》这一类的电影推荐,这两部是同一个制作班底,很喜欢这种在很小的场景范围拍出深度的爱情电影,小巧精致。
当时可以听到一点水被打到的声音,感觉应该是风扇和水有接触了,但是没有自己断电,我就长按电源键关机了。后面观察了一下左边转轴有点水雾,应该是风扇吹上去的,麻了。
关机吹了一会儿,从键盘里面吹出来一点水,每次吹出来一点我就擦掉,一擦就按到键盘就开机,我真的是服了。
但是现在开机了一点事都没有,键盘测试了也是每个键都可以用,还需要担心吗?😭
😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭
发帖时间是根据当前 ip 地址的时区判断吗?
还是根据当前的设备的时间?
夜猫徽章获取进度【1/5】
在海外
想直接买到香港机票,在香港玩几天然后走陆路口岸去深圳不知是否可行?
因为个人用的是 Java 的自研 agent ,官方又没提供 java 相关的 sdk 。因此顺手根据官方 npm 包和文档封装了一下,欢迎使用。
二合一的 SDK:
具体见:
https://github.com/CloudSen/wx-aibot-java-sdk
或
https://gitee.com/CloudSen/wx-aibot-java-sdk
https://github.com/anviod/edgex
在工厂和工业现场待久了,总能遇到一些让人头疼的事:车间里设备种类多,协议又杂,数据采集常常不稳定,要么延迟高,要么经常断。我做边缘计算的,每天跟着现场工程师跑,看他们调设备、查故障,慢慢就想:能不能做套更靠谱的采集方案?
于是我们花了一些时间,搞出了这套南向采集优化方案。它没什么花里胡哨的概念,就是想解决实际问题:
没搞什么复杂的技术名词,就是把现场遇到的问题一个个解决:网络抖动了,就根据响应时间自动调超时;传大数据慢了,就自动找最合适的传输单元;设备坏了要换,新设备接上配置相同的 IP 就能自动同步配置,不用人手动搞。
现在这套方案已经在几个工厂试过了,工程师反馈说延迟降了,稳定性高了,维护起来也省心。做这个的初衷,就是想让搞工业物联网的朋友们少点麻烦,多点踏实。
如果你也在为设备数据采集发愁,欢迎聊聊,说不定能帮上忙。也想听听你的场景,一起把这套方案做得更实用。
目前试用了 goja ,很好用,就是语法不全,新一点语法的跑不了。
基于 EcoPaste 项目二次开发&开源了一个增强剪贴板&截图功能的小工具 WeCut ,原有项目是个比较方便的剪贴板管理工具,我们在原版工具的基础上增加了:
本质上是为了第三个功能包了盘饺子,通过 WeCut 和 Wegent 结合,可以实现:
目前只跑通了最基本的流程,后面一段时间会对细节做一些优化,欢迎试用。
项目地址:
github.com/wecode-ai/wecut
github.com/wecode-ai/wegent
想定义好工作流,然后用 subAgent 执行,还支持 skill 扩展,目前有什么开源项目可以参考吗?
在软件开发和系统运维过程中,日志分析一直是开发者最头疼的问题之一。面对海量的日志信息,如何快速定位问题根因?传统的日志分析方法往往效率低下,需要大量人工排查。 今天为大家介绍一款强大的AI日志分析工具 - Pangu RCA(RCA Agent Portal),它能够智能分析日志,快速定位问题根因,提供专业的修复建议。 Pangu RCA基于先进的AI技术,能够: 支持主流编程语言的日志分析: AI分析结果: 系统日志、容器日志、API调用日志等各种场景,Pangu RCA都能提供智能分析。 我们计划在未来版本中增加更多功能: Pangu RCA正在改变开发者处理日志的方式,让日志分析变得智能化、高效化。如果您是开发者或运维人员,不妨试试这个强大的工具。 立即体验: https://www.pangulab.com 有任何问题或建议,欢迎通过邮件联系: r00txxyyzz@gmail.com引言
工具特色
🤖 AI智能分析
🌍 多语言支持
⚡ 快速定位
使用方法
适用场景
开发者调试
// 示例:Java应用错误日志
2024-01-15 10:30:25 ERROR com.example.UserService - Database connection failed
java.sql.SQLException: Connection timeout
at com.example.DatabaseManager.getConnection(DatabaseManager.java:45)运维监控
技术优势
未来规划
结语
AI-Compass 致力于构建最全面、最实用、最前沿的AI技术学习和实践生态,通过六大核心模块的系统化组织,为不同层次的学习者和开发者提供完整学习路径。 🌟 如果本项目对您有所帮助,请为我们点亮一颗星!🌟 <!-- trick-image:start idx=1 platform=blog --> 大模型训练时显存被什么占满了?不同量化精度下模型权重需要多少显存? 换句话说,显存就像你的工作台空间:一部分放置"工具箱和材料"(模型状态),一部分作为"临时加工区"(激活值)。前者大小固定,后者随工作量波动。 假设模型参数量为 Φ(单位:参数个数),不同量化精度下的显存占用如下: 以 Llama-3 模型为例,其参数量由以下符号定义: 模型总参数量公式: $$ 注意: 想象你在搬家,需要把所有家当装上卡车(GPU显存)。 量化精度就像选择不同精度的"包装方式": <!-- trick-image:start idx=2 platform=blog --> FP32训练需要多少显存?混合精度训练能节省显存吗? 通俗来讲,训练模型不仅要存"模型本身",还要存"每个参数的更新历史"(优化器状态),这才是显存的大头。 使用 AdamW 优化器进行 FP32 训练时: $$ 实际案例: 混合精度训练使用 FP16/BF16 存储模型参数和梯度,但需要保留一份 FP32 的模型权重副本: $$ 混合精度训练的真正优势: 想象你在做账。 所以混合精度的"诡异之处"在于:虽然日常计算用了更短的数字,但因为必须保留一份精确备份,总的"账本厚度"(模型状态显存)没有变!省下来的只是"草稿纸"(激活值)的纸张。 换句话说,混合精度训练不是为了"省空间",而是为了"算得快"——就像用计算器比手算快,虽然计算器和笔记本加起来并不比原来的大账本轻。 <!-- trick-image:start idx=3 platform=blog --> 训练过程中的激活值占多少显存?如何用"计算换显存"来优化? 换个角度理解:激活值就像炒菜时的"中间半成品"(切好的菜、调好的酱汁)。反向传播时需要这些"半成品"来计算梯度,所以前向传播必须全部保存下来。 自注意力机制的激活值: 自注意力激活值总量: $$ FFN激活值总量: $$ 每层总激活值显存: $$ 模型总激活值显存: $$ 数值示例:以 Llama-3 8B 为例($n_{\text{layer}}=32, d_{\text{hidden}}=4096, n_{\text{head}}=32, n_{\text{kv}}=8, d_{\text{FFN}}=14336, b=1, s=4096$): 核心思想:用计算换显存——在前向传播时不保存所有激活值,而是在反向传播时重新计算。 实际案例: 假设模型有32层(L=32),梯度检查点的效果: 结论:使用√L个检查点是最优平衡,显存从O(L)降到O(√L),仅增加约25-30%计算时间。 想象你在考数学试卷,有32道大题需要先做"草稿"再写"答案"。 激活值中注意力矩阵与序列长度的平方成正比——就像写作文时,文章越长,你需要记住的"前后文关联"就呈爆炸式增长。这就是为什么长文本训练特别吃显存。 <!-- trick-image:start idx=4 platform=blog --> 如何让多张GPU协同训练?ZeRO优化如何将单卡显存从16Φ降到16Φ/N? 多卡训练的核心挑战是"如何让所有GPU保持同步"。这需要三种基础通信操作,可以类比为:大家一起做作业时"抄答案""汇总结果""分发任务"的不同方式。 分布式训练依赖三种核心通信操作: 下图展示了三种集合通信原语的数据流向对比(以 4 卡为例): 数值示例:假设 4 张 GPU 各自计算得到一个梯度向量的分片 DDP显存占用:每个设备都需要完整的16Φ,DDP没有实现任何显存节省! 通俗理解 DP vs DDP: 想象一个团队做同一个项目的4份报告(数据并行)。 ZeRO(Zero Redundancy Optimizer)是微软提出的显存优化技术,核心思想是将优化器状态、梯度、模型权重分块处理,分配到多个设备上。 $$ 实际案例: 训练7B模型(Φ=7B),使用8张A100(80GB): ZeRO各层次工作原理: ZeRO-1:每个设备保存完整模型参数和梯度,优化器状态被切分。参数更新后通过All-Gather同步。 ZeRO-2:每个设备保存完整模型参数。梯度计算完一层后立即通过Reduce-Scatter分发,每个设备只保留自己负责的梯度分片。 ZeRO-3:模型参数、梯度、优化器状态全部切分。前向传播时通过All-Gather临时收集所需参数,计算完成后丢弃。 下图展示了ZeRO三个层次的切分策略对比: 上图展示了ZeRO从DDP逐步切分到全分片的演进路径,每一步都进一步降低单卡显存。 ZeRO-Offload:当显存仍然不足时,可以将部分数据卸载到CPU内存甚至磁盘。 梯度累积:进行n次前向传播后再进行一次反向传播,等效增大batch_size为原来的n倍,只需一次反向传播的激活值显存。 想象4个同学一起背一本很厚的字典。 ZeRO-3最省"书包空间"(显存),但"借阅"次数最多(通信开销最大)。 <!-- trick-image:start idx=5 platform=blog --> 当模型太大连ZeRO也不够时怎么办?如何配置数据并行+张量并行+流水线并行的3D并行? 简单理解:ZeRO 是"把材料分散存放"(参数、梯度、优化器切分到多卡),模型并行是"把工作流程切分"(不同卡负责不同的计算步骤)。前者省存储空间,后者省计算时的显存占用。 模型并行的显存占用: $$ 现代大模型通常采用 3D并行:数据并行 + 张量并行 + 流水线并行 核心公式: $$ 结合ZeRO-1的每卡显存: $$ 实际案例: 配置128张GPU(4机,每机32卡)训练70B模型: 每卡显存(模型状态): $$ $$ $$ 下图展示了3D并行训练的维度划分: 上图展示了128卡3D并行配置:4路数据并行,每组内4个流水线阶段,每阶段8卡做张量并行。 想象你要建一座摩天大楼(训练大模型),需要组织128个工人(GPU)。 3D并行就是三种方式的组合:4组建筑队(DP=4),每队分4段工程(PP=4),每段工程8人协作(TP=8),128人各司其职。 答案: 详细说明: 答案: 详细说明: 答案: 详细说明: 答案: 详细说明: 答案: 详细说明: 答案: 详细说明: 答案: 详细说明: 答案: 详细说明: 答案: 详细说明: 答案: 详细说明: 答案: 这是一道综合设计题,需要结合多种显存优化技术。 第一步:确定3D并行配置 第二步:计算模型状态显存(采用混合精度 + ZeRO-1) $$ $$ 模型状态总计 ≈ 12.03GB 第三步:估算激活值显存 第四步:总计 答案: 混合精度训练虽然模型状态仍为 $16\Phi$(因为必须保留 FP32 副本),但它在三个层面带来收益: 综合来看,现代大模型训练的标准配置是:混合精度(加速 + 激活值减半)+ 梯度检查点(激活值从 $O(L)$ 到 $O(\sqrt{L})$)+ FlashAttention(消除注意力 $O(s^2)$ 显存)+ ZeRO/3D并行(切分模型状态)。这四者缺一不可,共同使得千亿参数级模型训练成为可能。 答案: 模型参数 $\Phi = 13\text{B}$,以8张A100(80GB)为例: 推荐配置:8卡单机优先用 ZeRO-2 + 梯度检查点 + 混合精度。ZeRO-3 虽然最省显存,但通信开销显著增大(每次前向/反向都需 All-Gather),在机内 NVLink 带宽下 ZeRO-2 通常是更好的平衡点。 答案: 核心权衡:ZeRO-Offload 用 PCIe 带宽换 GPU 显存,ZeRO-Infinity 进一步用 NVMe 带宽换更多显存。在有充足 GPU 资源时应优先使用纯 GPU 方案(ZeRO-1/2/3 + 模型并行)。 答案: 序列并行解决的是张量并行中非并行区域(如 LayerNorm、Dropout)仍需完整激活值的问题。 在标准张量并行中,虽然注意力和 FFN 的计算被切分到多卡,但 LayerNorm 和 Dropout 等操作仍在每张卡上保留完整的激活值。序列并行将序列维度也进行切分: Megatron-LM v3 引入此技术,配合选择性激活重算(selective recomputation),可将激活值显存降低约 5 倍,是训练超长序列的关键技术。 <!-- Reviewed: 2026-02-13, 深度重新审校:修正文字错误(2处)/补充Mermaid图(1处:集合通信原语可视化)/补充数值示例(1处:4卡通信数据流)/补充通俗化引入(3处:集合通信原语/DP_vs_DDP对比)/8个$$公式+符号表/15个面试题 --> AI-Compass 致力于构建最全面、最实用、最前沿的AI技术学习和实践生态,通过六大核心模块的系统化组织,为不同层次的学习者和开发者提供完整学习路径。 🌟 如果本项目对您有所帮助,请为我们点亮一颗星!🌟必知必会:大模型训练显存计算与优化详解
1. 显存消耗的组成与模型权重计算
<!-- trick-image:end idx=1 -->1.1 核心问题
1.2 原文核心要点
深度神经网络训练的显存消耗主要包括两大部分:模型状态(模型权重、梯度、优化器状态)和激活值(各个非线性模块的中间激活值)。不同量化精度下的显存占用差异巨大。
1.3 显存消耗的两大组成部分
组成部分 具体内容 说明 模型状态 模型权重(参数)、梯度、优化器状态 与模型参数量Φ成正比,是固定开销 激活值 各个非线性模块的中间激活值 与batch_size和序列长度相关,是动态开销 1.4 模型权重与量化精度的关系
量化程度 每参数字节数 显存占用 1B参数模型 7B参数模型 FP32 4字节 4Φ 4GB 28GB FP16/BF16 2字节 2Φ 2GB 14GB INT8 1字节 1Φ 1GB 7GB INT4 0.5字节 ≤1Φ 0.5GB 3.5GB 1.5 模型参数量的计算公式
符号 含义 n_vocab 词表中词的个数 d_hidden 隐藏层维度(嵌入向量的维度) n_head 注意力头的数量 n_kv-head 分组查询注意力中的键值头数量 n_layer Transformer的层数 d_FFN 前馈神经网络的隐藏层维度 b 输入数据的批次大小(batch size) s 输入序列长度
\Phi = n_{\text{vocab}} \times d_{\text{hidden}} + n_{\text{layer}} \times \left[ d_{\text{hidden}} + \left(2 + 2 \cdot \frac{n_{\text{kv}}}{n_{\text{head}}}\right) d_{\text{hidden}}^2 + d_{\text{hidden}} + 3 \cdot d_{\text{hidden}} \cdot d_{\text{FFN}} \right] + d_{\text{hidden}} + d_{\text{hidden}} \times n_{\text{vocab}}
$$组成部分 公式项 说明 词嵌入层 $n_{\text{vocab}} \times d_{\text{hidden}}$ 词表大小 × 隐藏维度 Transformer层(×$n_{\text{layer}}$) 含 QKV 投影 + FFN GQA 时 KV 头数 < 注意力头数 输出层 $d_{\text{hidden}} + d_{\text{hidden}} \times n_{\text{vocab}}$ LayerNorm + 输出投影 1.6 通俗理解
直观类比
核心要点
1.7 小结
维度 说明 两大组成 模型状态(权重+梯度+优化器)+ 激活值 量化关系 FP32=4Φ, FP16=2Φ, INT8=1Φ 参数计算 含词嵌入层 + n_layer个Transformer层 + 输出层 关键认知 7B模型FP32权重=28GB,训练总显存约112GB 2. FP32训练与混合精度训练
<!-- trick-image:end idx=2 -->2.1 核心问题
2.2 原文核心要点
使用AdamW优化器进行FP32训练,模型状态总显存为16Φ。混合精度训练并没有节省模型状态的显存!其真正优势是加速计算和降低激活值显存。
2.3 FP32训练的显存占用
组成部分 显存占用 说明 模型权重 M_model 4Φ FP32参数 梯度 M_grad 4Φ 与模型权重相同精度 优化器状态 M_optim 8Φ 动量(4Φ) + 方差(4Φ) 总计 M_total 16Φ 4Φ + 4Φ + 8Φ
M_{\text{total}} = M_{\text{model}} + M_{\text{grad}} + M_{\text{optim}} = 4\Phi + 4\Phi + 8\Phi = 16\Phi
$$模型规模 参数量Φ 模型状态显存(16Φ) 单张A100(80GB)能否容纳 1B 10亿 16GB 可以 7B 70亿 112GB 不可以 13B 130亿 208GB 不可以 70B 700亿 1120GB 不可以 2.4 混合精度训练
组成部分 显存占用 说明 模型权重 M_model 2Φ FP16/BF16 梯度 M_grad 2Φ FP16/BF16 优化器状态 M_optim 12Φ FP32副本(4Φ) + 动量(4Φ) + 方差(4Φ) 总计 M_total 16Φ 2Φ + 2Φ + 12Φ
M_{\text{total}}^{\text{mixed}} = \underbrace{2\Phi}_{\text{FP16权重}} + \underbrace{2\Phi}_{\text{FP16梯度}} + \underbrace{4\Phi + 4\Phi + 4\Phi}_{\text{FP32副本 + 动量 + 方差}} = 16\Phi
$$关键结论:混合精度训练并没有节省模型权重、梯度以及优化器状态的显存占用!总计仍为16Φ。
2.5 通俗理解
直观类比
核心要点
2.6 小结
维度 说明 FP32训练 模型状态=16Φ(7B模型=112GB) 混合精度 模型状态仍=16Φ,不省显存 混合精度真正优势 计算加速 + 激活值减半 关键认识 Adam优化器状态占大头(8-12Φ) 3. 激活值显存与梯度检查点
<!-- trick-image:end idx=3 -->3.1 核心问题
3.2 原文核心要点
激活值是训练过程中必须缓存的中间结果,用于反向传播时计算梯度。激活值显存与batch_size × sequence_length成正比。梯度检查点通过重新计算来换取显存。
3.3 激活值显存计算
计算阶段 需保存的激活值 显存占用 归一化前的输入 前置归一化输入 2×b×s×d_hidden QKV投影后 Q、K、V矩阵 2×b×s×(d_hidden + d_hidden×n_kv-head/n_head×2) Softmax前 注意力logits 2×b×n_head×s×s Dropout掩码 0/1矩阵 1×b×n_head×s×s Dropout后 注意力得分 2×b×n_head×s×s 输出投影前 注意力输出 2×b×s×d_hidden
M_{\text{attn}} = 8 \cdot b \cdot s \cdot d_{\text{hidden}} + 4 \cdot \frac{n_{\text{kv}}}{n_{\text{head}}} \cdot b \cdot s \cdot d_{\text{hidden}} + 5 \cdot b \cdot s^2 \cdot n_{\text{head}}
$$
M_{\text{FFN}} = 8 \cdot b \cdot s \cdot d_{\text{FFN}} + 2 \cdot b \cdot s \cdot d_{\text{hidden}}
$$
M_{\text{layer,act}} = \left(10 + 4 \cdot \frac{n_{\text{kv}}}{n_{\text{head}}}\right) \cdot b \cdot s \cdot d_{\text{hidden}} + 8 \cdot b \cdot s \cdot d_{\text{FFN}} + 5 \cdot b \cdot s^2 \cdot n_{\text{head}}
$$
M_{\text{total,act}} = n_{\text{layer}} \times \left[\left(10 + 4 \cdot \frac{n_{\text{kv}}}{n_{\text{head}}}\right) b \cdot s \cdot d_{\text{hidden}} + 8 \cdot b \cdot s \cdot d_{\text{FFN}} + 5 \cdot b \cdot s^2 \cdot n_{\text{head}}\right] + 4 \cdot b \cdot s \cdot d_{\text{hidden}}
$$符号 含义 $b$ 批次大小 (batch size) $s$ 序列长度 $d_{\text{hidden}}$ 隐藏层维度 $d_{\text{FFN}}$ FFN 中间维度 $n_{\text{head}}$ 注意力头数 $n_{\text{kv}}$ KV 头数(GQA) $n_{\text{layer}}$ Transformer 层数 关键洞察:激活值显存与 batch_size × sequence_length 成正比,其中注意力矩阵部分与 s² 成正比,这就是长序列训练的显存瓶颈。
3.4 梯度检查点(Gradient Checkpointing)
普通训练:保存所有激活值 → 显存大,速度快
梯度检查点:只保存部分激活值 → 显存小,需要重新计算部分激活值方案 保存的激活值层数 显存占用 额外计算开销 普通训练 32层全部保存 O(L) = O(32) 0% 梯度检查点(√L个) √32 ≈ 6层 O(√L) ≈ O(6) ~25-30% 极端检查点(仅首层) 1层 O(1) ~100%(等于两次前向) 3.5 通俗理解
直观类比
核心要点
3.6 小结
维度 说明 激活值关键因素 batch_size, seq_len, d_hidden, n_layer 注意力瓶颈 注意力矩阵与seq_len²成正比 梯度检查点 用25-30%计算换取O(L)→O(√L)显存 适用场景 显存受限但算力充足,训练超大模型时必用 4. 数据并行与ZeRO优化
<!-- trick-image:end idx=4 -->4.1 核心问题
4.2 原文核心要点
DDP虽然实现多卡并行但不节省单卡显存。ZeRO通过三个层次逐步切分优化器状态、梯度和模型参数,最终实现16Φ/N的单卡显存。
4.3 集合通信原语
建立直觉之后,让我们深入理解分布式训练的通信基础——集合通信原语,它们是所有多卡协同的基石。
通信原语 功能 说明 All-Gather 全聚集操作 从多个设备收集结果,并同步完整状态到所有设备 Reduce-Scatter 规约-分发操作 执行聚合操作(求和等),每个进程只获取结果的一部分 All-Reduce 全规约操作 执行规约操作后,将结果同步到所有设备 重要结论:All-Reduce = Reduce-Scatter + All-Gather
GPU 初始数据 All-Gather Reduce-Scatter(求和) All-Reduce(求和) GPU0 [1, 2] [1,2,3,4,5,6,7,8] [10, 12](所有第1-2个元素之和) [10,12,14,16,18,20,22,24] GPU1 [3, 4] [1,2,3,4,5,6,7,8] [14, 16](所有第3-4个元素之和) [10,12,14,16,18,20,22,24] GPU2 [5, 6] [1,2,3,4,5,6,7,8] [18, 20](所有第5-6个元素之和) [10,12,14,16,18,20,22,24] GPU3 [7, 8] [1,2,3,4,5,6,7,8] [22, 24](所有第7-8个元素之和) [10,12,14,16,18,20,22,24] 4.4 DP vs DDP
特性 DP (Data Parallelism) DDP (Distributed Data Parallel) 进程模型 单进程多线程 多进程 主设备 设备0负载重(通信、计算、存储不均衡) 各设备独立 梯度同步 设备0聚合所有梯度 All-Reduce同步 单卡显存 16Φ 16Φ 显存优化 无 无 4.5 ZeRO的三个层次
层次 切分内容 常驻单卡显存 N=8时单卡显存 ZeRO-1 (P_os) 优化器状态 4Φ + 12Φ/N 4Φ + 1.5Φ = 5.5Φ ZeRO-2 (P_os+g) 优化器状态 + 梯度 2Φ + 14Φ/N 2Φ + 1.75Φ = 3.75Φ ZeRO-3 (P_os+g+p) 全部 16Φ/N 2Φ 其中 N = num_devices(设备数量)
M_{\text{ZeRO-1}} = 4\Phi + \frac{12\Phi}{N}, \quad M_{\text{ZeRO-2}} = 2\Phi + \frac{14\Phi}{N}, \quad M_{\text{ZeRO-3}} = \frac{16\Phi}{N}
$$配置 单卡模型状态显存 单卡是否可行 DDP(无优化) 16×7 = 112GB 不可行(>80GB) ZeRO-1(8卡) 5.5×7 ≈ 38.5GB 可行 ZeRO-2(8卡) 3.75×7 ≈ 26.3GB 可行(更宽裕) ZeRO-3(8卡) 2×7 = 14GB 非常宽裕 4.6 ZeRO-Offload与梯度累积
4.7 通俗理解
直观类比
核心要点
4.8 小结
维度 说明 DDP 多卡并行但单卡仍需16Φ,不省显存 ZeRO-1 切分优化器,单卡=4Φ+12Φ/N ZeRO-2 切分优化器+梯度,单卡=2Φ+14Φ/N ZeRO-3 全切分,单卡=16Φ/N(最省但通信最大) 通信基础 All-Reduce = Reduce-Scatter + All-Gather 5. 模型并行与3D并行训练
<!-- trick-image:end idx=5 -->5.1 核心问题
5.2 原文核心要点
ZeRO切分的是模型状态,模型并行切分的是模型计算图。现代大模型通常采用3D并行:数据并行+张量并行+流水线并行,总卡数 = D_dp × D_tp × D_pp。
5.3 ZeRO vs 模型并行
特性 ZeRO (尤其ZeRO-3) 模型并行 切分对象 模型状态(参数、梯度、优化器) 模型计算图 设备间传递 模型参数、梯度、优化器状态 中间激活值 每个设备功能 获取完整参数后独立计算完整梯度 只负责模型的一部分计算 5.4 模型并行的两种类型
类型 切分方式 通信特点 适用场景 张量并行 (TP) 按矩阵分块,切分单层 通信频繁,需高带宽 同机多卡(NVLink互联) 流水线并行 (PP) 按层切分,不同层放不同设备 通信量小,仅层间传递 跨机多卡
M_{\text{per\_gpu}} = \frac{16\Phi}{D_{\text{tp}} \times D_{\text{pp}}}
$$5.5 3D并行训练配置
D_{\text{dp}} \times D_{\text{tp}} \times D_{\text{pp}} = N_{\text{devices}}
$$
M_{\text{per\_gpu}} = \frac{4\Phi}{D_{\text{tp}} \times D_{\text{pp}}} + \frac{12\Phi}{D_{\text{dp}} \times D_{\text{tp}} \times D_{\text{pp}}}
$$重要结论:D_dp × D_tp × D_pp = num_devices(总卡数),卡数越多,分摊到每个设备的优化器状态就越少。在万卡集群中,优化器状态甚至可以忽略不计!
并行维度 值 配置依据 张量并行 D_tp 8 机内8卡做张量并行(NVLink高速互联) 流水线并行 D_pp 4 4机做流水线并行(跨机通信量小) 数据并行 D_dp 128/(8×4) = 4 4路数据并行
M_{\text{权重+梯度}} = \frac{4\Phi}{D_{\text{tp}} \times D_{\text{pp}}} = \frac{4 \times 70\text{B}}{8 \times 4} = \frac{280}{32} \approx 8.75\text{GB}
$$
M_{\text{优化器}} = \frac{12\Phi}{D_{\text{dp}} \times D_{\text{tp}} \times D_{\text{pp}}} = \frac{12 \times 70\text{B}}{4 \times 8 \times 4} = \frac{840}{128} \approx 6.56\text{GB}
$$
M_{\text{总计}} \approx 8.75 + 6.56 = 15.3\text{GB} \quad (\text{远小于A100的80GB,宽裕!})
$$5.6 通俗理解
直观类比
核心要点
5.7 小结
维度 说明 ZeRO vs 模型并行 ZeRO切分状态,模型并行切分计算图 张量并行(TP) 层内切分,需高带宽,适合机内 流水线并行(PP) 层间切分,通信量小,适合跨机 3D并行公式 D_dp × D_tp × D_pp = 总卡数 万卡集群 优化器状态趋近于零 6. 显存优化方法总结
优化方法 原理 显存节省 代价 混合精度训练 FP16/BF16计算 激活值减半(模型状态不省) 需要FP32副本 梯度检查点 重计算激活值 激活值从O(L)到O(√L) 增加约25-30%计算时间 梯度累积 多次前向,一次反向 减少激活值 等效增大batch ZeRO-1 切分优化器状态 优化器状态/N 额外通信 ZeRO-2 切分优化器+梯度 (优化器+梯度)/N 更多通信 ZeRO-3 全切分 全部状态/N 显著增加通信 模型并行 切分模型计算图 模型相关/并行度 实现复杂 ZeRO-Offload CPU/磁盘卸载 大幅降低GPU显存 增加IO开销 显存公式速记
场景 公式 FP32训练 16Φ 混合精度训练 16Φ(模型状态相同) ZeRO-1 4Φ + 12Φ/N ZeRO-2 2Φ + 14Φ/N ZeRO-3 16Φ/N 模型并行 16Φ/(D_tp×D_pp) 3D并行+ZeRO-1 4Φ/(D_tp×D_pp) + 12Φ/(D_dp×D_tp×D_pp) 关键数字速记
7. 高频面试题及答案
Q1: 请解释大模型训练中显存的主要组成部分。【基础】
大模型训练显存由两大部分组成:模型状态(模型权重+梯度+优化器状态)和激活值。使用AdamW+FP32训练时,模型状态=16Φ(权重4Φ+梯度4Φ+优化器8Φ),7B模型仅模型状态就需112GB。要点 说明 模型权重 可训练参数,FP32=4Φ, FP16=2Φ 梯度 与参数一一对应,用于更新 优化器状态 Adam需维护动量(4Φ)+方差(4Φ)=8Φ 激活值 中间结果,与batch_size×seq_len成正比 Q2: 混合精度训练能节省多少显存?【基础】
混合精度训练不能节省模型状态显存(仍为16Φ),因为需要保留FP32副本确保数值稳定性。其真正优势是:FP16计算加速(Tensor Core)和激活值显存减半。要点 说明 模型状态 FP32=16Φ, 混合精度=16Φ(不变) 激活值 使用FP16存储,显存减半 计算速度 FP16计算更快,尤其Tensor Core FP32副本 必须保留,防止累积更新精度损失 Q3: 请详细解释ZeRO的三个阶段及其显存优化原理。【进阶】
ZeRO通过逐级切分实现显存优化:ZeRO-1切分优化器状态(单卡=4Φ+12Φ/N),ZeRO-2额外切分梯度(2Φ+14Φ/N),ZeRO-3全部切分(16Φ/N)。级别越高显存越省但通信开销越大。要点 说明 ZeRO-1 只切分优化器,通信开销最小 ZeRO-2 梯度Reduce-Scatter后只保留自己的分片 ZeRO-3 前向时All-Gather临时收集参数,计算后丢弃 权衡 级别越高,显存越省,通信越多 Q4: 数据并行(DP/DDP)和模型并行有什么区别?【基础】
数据并行切分数据(每卡完整模型副本,通过All-Reduce同步梯度),模型并行切分模型(张量并行切矩阵、流水线并行切层,设备间传递激活值)。DDP不省显存(每卡16Φ),模型并行显存=16Φ/(D_tp×D_pp)。要点 说明 DDP切分 数据切分,每卡完整模型,All-Reduce同步梯度 模型并行切分 模型计算图切分,设备间传递激活值 张量并行(TP) 层内矩阵切分,需高带宽(NVLink) 流水线并行(PP) 层间切分,通信量小,适合跨机 Q5: 什么是梯度检查点?它如何节省显存?【进阶】
梯度检查点用计算换显存:前向传播时只保存选定检查点位置的激活值,反向传播时从最近检查点重新计算中间激活值。使用√L个检查点,显存从O(L)降到O(√L),代价是约25-30%的额外计算时间。要点 说明 核心思想 不保存所有激活值,反向传播时重新计算 最优配置 √L个检查点(L为层数) 显存节省 从O(L)降到O(√L) 计算代价 增加约25-30%训练时间 Q6: 请解释All-Reduce、All-Gather和Reduce-Scatter的区别。【基础】
All-Gather:每个设备收集所有设备的数据,最终所有设备有完整数据。Reduce-Scatter:执行规约后每个设备只获取结果的一部分。All-Reduce:规约后所有设备得到完整结果。核心关系:All-Reduce = Reduce-Scatter + All-Gather。要点 说明 All-Gather [A],[B],[C]→ 每个设备都得到[A,B,C] Reduce-Scatter 规约后分片,每设备只得一部分结果 All-Reduce 规约后广播,每设备得完整结果 关系 All-Reduce = Reduce-Scatter + All-Gather Q7: 如何估算训练一个7B参数模型需要多少显存?【进阶】
混合精度+AdamW:模型状态=16×7=112GB(FP16权重14GB+FP16梯度14GB+FP32副本28GB+动量28GB+方差28GB),加上激活值约10-30GB,总计约120-150GB。单张A100(80GB)不够,用ZeRO-3(2卡)约56GB/卡可行。要点 说明 模型权重(FP16) 7B×2=14GB 梯度(FP16) 7B×2=14GB 优化器(FP32) 副本28GB+动量28GB+方差28GB=84GB 解决方案 ZeRO-3(2卡)=56GB/卡,或ZeRO-1(8卡)≈38.5GB/卡 Q8: DeepSeek为什么选择流水线并行+ZeRO-1而不是ZeRO-3?【进阶】
工程权衡:ZeRO-3每次前向/反向都需All-Gather参数(通信量巨大),而流水线并行仅传递层间激活值。在多机场景下,PP+ZeRO-1通信更可控。且MoE架构下TP收益有限,万卡集群中优化器状态本就可忽略。要点 说明 ZeRO-3问题 每次前向/反向都要All-Gather,通信量大 PP优势 仅层间传递激活值,通信量可控 ZeRO-1足够 万卡集群中优化器状态=12Φ/N→趋近于零 MoE考虑 张量并行对MoE架构收益有限 Q9: 激活值显存与哪些因素相关?如何优化?【进阶】
激活值与batch_size(线性)、seq_len(线性+注意力矩阵的平方)、d_hidden(线性)、n_layer(线性)相关。优化方法:梯度检查点(O(L)→O(√L))、减小batch_size、梯度累积、FlashAttention(注意力从O(s²)→O(s))、序列并行。要点 说明 主要因素 b, s, d_hidden, n_layer 注意力瓶颈 注意力矩阵与s²成正比(长序列瓶颈) 梯度检查点 O(L)→O(√L),增25-30%计算 FlashAttention 融合kernel,注意力从O(s²)→O(s) Q10: 3D并行训练如何配置?各维度的考虑因素是什么?【进阶】
D_dp×D_tp×D_pp=总卡数。TP适合机内(≤8,需NVLink高带宽),PP适合跨机(层数需被PP整除),DP为剩余卡数。128卡典型配置:TP=8, PP=4, DP=4。先定TP(不超机内卡数),再定PP(根据层数和机数),最后算DP。要点 说明 张量并行(TP) 机内高带宽互联,通常≤8 流水线并行(PP) 跨机,通信量小,可能有bubble 数据并行(DP) 总卡数/(TP×PP),增大有效batch 128卡示例 TP=8, PP=4, DP=4,单卡≈15.3GB Q11: 训练一个70B模型,你有256张A100(80GB),请设计完整的显存优化方案并估算每卡显存占用。【综合】
M_{\text{权重+梯度}} = \frac{4\Phi}{D_{\text{tp}} \times D_{\text{pp}}} = \frac{4 \times 70\text{B}}{32} = 8.75\text{GB}
$$
M_{\text{优化器}} = \frac{12\Phi}{D_{\text{dp}} \times D_{\text{tp}} \times D_{\text{pp}}} = \frac{12 \times 70\text{B}}{256} \approx 3.28\text{GB}
$$Q12: 为什么混合精度训练不省模型状态显存但仍是标配?请结合激活值优化和梯度检查点综合分析。【综合】
8. 大厂常见面试题
Q13: 请计算训练一个13B模型在不同并行策略下的单卡显存占用,并给出推荐配置。【进阶】
来源:字节跳动/阿里巴巴 大模型训练岗常见计算题
策略 单卡显存公式 数值 是否可行 DDP(无优化) $16\Phi$ $16 \times 13 = 208\text{GB}$ 不可行 ZeRO-1(8卡) $4\Phi + 12\Phi/8$ $52 + 19.5 = 71.5\text{GB}$ 勉强可行(不含激活值) ZeRO-2(8卡) $2\Phi + 14\Phi/8$ $26 + 22.75 = 48.75\text{GB}$ 可行 ZeRO-3(8卡) $16\Phi/8$ $26\text{GB}$ 宽裕 TP=8 $16\Phi/8$ $26\text{GB}$ 宽裕 Q14: ZeRO-Offload 和 ZeRO-Infinity 的区别是什么?在什么场景下使用?【进阶】
来源:微软/百度 基础架构岗高频题
特性 ZeRO-Offload ZeRO-Infinity 卸载目标 优化器状态 + 梯度 → CPU 全部(参数+梯度+优化器)→ CPU + NVMe 基于 ZeRO-2 ZeRO-3 适用场景 单卡/少卡训练超出显存的模型 极端情况,需要在有限GPU上训练超大模型 性能影响 CPU-GPU 带宽成为瓶颈,训练速度下降约 30-50% NVMe 带宽更低,速度进一步下降 典型用途 学术实验室用消费级GPU微调大模型 万亿参数模型的可行性验证 Q15: 序列并行(Sequence Parallelism)是什么?它解决了什么问题?【进阶】
来源:腾讯/华为 大模型团队面试常见问题
特性 张量并行 (TP) 张量并行 + 序列并行 (TP+SP) 注意力/FFN 按隐藏维度切分 按隐藏维度切分 LayerNorm/Dropout 每卡完整激活值 按序列维度切分 激活值显存 约 $M_{\text{act}}/D_{\text{tp}}$(仅并行部分) 接近 $M_{\text{act}}/D_{\text{tp}}$(全部) 通信变化 All-Reduce All-Gather + Reduce-Scatter 总结
核心知识点回顾
知识点 核心内容 关键公式/数值 显存组成 模型状态 + 激活值 模型状态=16Φ(AdamW+FP32) 量化精度 FP32/FP16/INT8/INT4 1B参数FP32=4GB 混合精度 模型状态不省,激活值减半 仍为16Φ 激活值 与b×s成正比,注意力与s²成正比 长序列是瓶颈 梯度检查点 用计算换显存 O(L)→O(√L),+25-30%计算 DDP 不省单卡显存 每卡16Φ ZeRO-1/2/3 逐级切分优化器/梯度/参数 最终16Φ/N 模型并行 TP(层内)+PP(层间) 16Φ/(D_tp×D_pp) 3D并行 DP+TP+PP D_dp×D_tp×D_pp=总卡数 万卡集群 优化器状态趋近零 12Φ/(D_dp×D_tp×D_pp)→0 思维导图结构
大模型训练显存计算与优化
├── 1. 显存组成
│ ├── 模型状态(权重+梯度+优化器)= 16Φ
│ ├── 激活值(与b×s成正比,注意力与s²成正比)
│ └── 量化精度: FP32=4Φ, FP16=2Φ, INT8=1Φ
├── 2. 混合精度训练
│ ├── 模型状态仍=16Φ(不省显存!)
│ └── 真正优势: 计算加速 + 激活值减半
├── 3. 激活值优化
│ ├── 梯度检查点: O(L)→O(√L), +25-30%计算
│ ├── 梯度累积: 多次前向+一次反向
│ └── FlashAttention: O(s²)→O(s)
├── 4. 数据并行
│ ├── DDP: 不省显存(每卡16Φ)
│ ├── ZeRO-1: 切分优化器, 4Φ+12Φ/N
│ ├── ZeRO-2: 切分优化器+梯度, 2Φ+14Φ/N
│ ├── ZeRO-3: 全切分, 16Φ/N
│ └── ZeRO-Offload: CPU/磁盘卸载
├── 5. 模型并行
│ ├── 张量并行(TP): 层内切分, 需高带宽
│ ├── 流水线并行(PP): 层间切分, 通信量小
│ └── 显存: 16Φ/(D_tp×D_pp)
└── 6. 3D并行训练
├── 公式: D_dp × D_tp × D_pp = 总卡数
├── 配置: TP≤8(机内) → PP(跨机) → DP(剩余)
└── 万卡集群: 优化器状态→0参考文献
rt ,当前预算 24 以内,买第一辆油车,坐标上海,节假日通勤。目前本人倾向于 A4 ,驾驶经验还行,但确实 bba 开的少,想听听各位老哥相关车型 or 品牌的体验分享,ps:后面再考虑换电车...