1.在微软开源后,微软请问大家如何深入的学习C ? - 知乎
2.LM训练05 ZeRO系列
3.源码阅读忆丛(37)Minigui
4.微软的 Windows 助手——UFO,原理剖析
5.巨硬Application Inspector初体验On Mac
在微软开源后,源码请问大家如何深入的学习C ? - 知乎
阅读微软开源的C代码,实际上已经公开了三年有余。分析如果你感到无法找到相关资源,微软使用百度等搜索引擎通常可以解决问题。源码许多人已经提到了微软的分析steam多开源码Reference Source网站,然而你似乎仍然在寻找如何将代码集成到Visual Studio中查看的微软方法。实际上,源码这信息在网站上已经明确标注。分析
对于阅读源代码的微软初学者来说,可能存在理解上的源码困难,如果只是分析简单浏览或集成代码查看,可以按照指示操作。微软如果你认为需要查找特定类的源码源代码时,搜索格式应为“C# 类名 source code”,分析这通常会直接导向所需的页面。若你希望直接在Visual Studio中查看源代码,搜索“view .net source code in visual studio”将提供解决方案。
对于直接浏览源代码的需求,通过搜索“view .net source code”可以访问到Reference Source站点。如果你需要下载整个源代码包,搜索“.net source code download”将引导你至Reference Source站点,提供源代码下载选项。这些步骤和资源都清晰地显示在网站上,因此问题可能在于个人搜索技巧或对信息的利用。
综合来看,提供的问题解决方案似乎较为直接,关键在于正确使用搜索引擎和理解所提供的spark源码reduce资源。如果你仍然感到困惑或无法找到所需信息,可能需要重新审视搜索策略或寻求更具体的指导,以便更好地利用提供的资源。
LM训练 ZeRO系列
分布式训练的几个主题包括:
LLM训练 分布式通信,LLM训练 显存占用分析,LLM训练 高效训练方法,LLM训练 数据并行,LLM训练 ZeRO系列,LLM训练 流水线并行,LLM训练 张量并行,LLM训练 Megatron-LM 源码分析。
微软发布了四篇论文:
ZeRO: Memory optimizations Toward Training Trillion Parameter Models (/) - 提出了ZeRO-DP和 ZeRO-R
ZeRO-Offload: Democratizing Billion-Scale Model Training (/) - 微软
ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning (/) - 微软
ZeRO++: Extremely Efficient Collective Communication for Giant Model Training (/) - 微软
ZeRO1.1 概览
ZeRO包含两组优化:
(1)ZeRO-DP:减少模型状态PGO的显存占用
(2)ZeRO-R:减少剩余显存的消耗。
1.2 ZeRO-DP
目标是优化数据并行,减少显存冗余,最小化通信量。
原理是使用动态通信策略来分区优化器状态、梯度和参数。
实现是对模型参数进行分区,梯度也相应分区,优化器只优化本分区的参数。
两个原则:类型:
1.2.1 ZeRO-Stage 1
原理是对优化器状态进行分区,每个rank更新相应参数后,收集构成完整模型。
流程:通信分析:单个GPU总通信量为2*ψ。
1.2.2 ZeRO-Stage 2
在Stage1基础上,对梯度进行分区。
ZeRO-2分割Optimizer States与Gradients。约拍源码
用完即删原则:每个rank只对自己负责的参数Pi的梯度进行规约。
通信分析:同ZeRO-Stage1,单个GPU总通信量为2*ψ。
1.2.3 ZeRO-Stage 3
在Stage1/Stage2基础上,对模型参数进行分区。
ZeRO-3分割Optimizer States、Gradients和Parameters。
需要用时去取原则:计算特定layer时,对参数进行all-gather。
通信分析:单个GPU总通信量为3*ψ。
1.2.4 动画视频
The video below shows how ZeRO (with all three stages) performs a training step including forward pass, backward pass, and parameter update.
1.2.5 实验效果
实验配置:G 8*A、全参训练,bs=1,checkpointing=True。
实验全参训练,最多只能跑B模型,B模型跑不起来。
1.2.6 ZeRO-DP VS DDP
1.3 ZeRO-R
1.3.1 中间激活值
认为checkpoint方法虽然有用,但在大型LLM中激活值仍然占用大量显存。
eg:B的LLM,bs=,激活值显存占用GB。
方法:Offload到CPU中。
1.3.2 临时缓存区
在梯度reduce操作中,用于存储中间结果的临时缓冲区会消耗大量显存。
方法:申请固定大小的缓存区 constant size buffers 。
1.3.3 内存碎片
原因:内存碎片是vr 框架源码tensor生命周期错配的结果。
问题:即使有足够的显存,可能会因为缺少连续内存而使得内存分配失败。
方法:ZeRO为激活检查点和梯度预先分配连续内存块,并在初始化时将它们复制到预先分配的连续内存中。
2、ZeRO-Offload
利用CPU内存来解决GPU显存不足的问题。
CPU:参数更新在CPU完成。
GPU:前向和后向的计算在GPU上完成。
3、ZeRO-Infinity
利用外接存储设备来解决GPU显存不足的问题。
4、ZeRO++
to do...
5、Deepspeed ZeRO源码
5.1 入口
5.1.1 总入口initialize()
源码地址:deepspeed.__init__
简介:选择不同的engin引擎。
5.1.2 ZeRO引擎DeepSpeedEngine
源码地址:deepspeed.runtime.engine
整体流程及关键方法如下所示:
(1)DeepSpeedEngine.init
核心内容:最重要的就是对优化器(Optimizer)的初始化。
ZeRO 的核心特性的实现都在优化器(Optimizer)中,核心方法_configure_zero_optimizer() 。
stage1/2 优化器:DeepSpeedZeroOptimizer
stage3 优化器:DeepSpeedZeRoOffload
(2)DeepSpeedEngine.forward
核心内容:在模型model进行前向传播,返回loss,ZeRO不需要进行特殊处理
(3)DeepSpeedEngine.backward
核心内容:获得各个rank上对应分片参数Pi的梯度Gi。
self.optimizer.backward()
Zero stage1:self.optimizer.reduce_gradients()
Zero stage2:self.overlapping_partition_gradients_reduce_epilogue
(4)DeepSpeedEngine.step
核心内容:基于梯度Gi更新对应的分片参数Pi,各rank收集最新的、完整的模型参数P
self.optimizer.step()
self.optimizer.zero_grad()
5.2 DeepSpeedZeroOptimizer
源码地址:deepspeed.runtime.zero.stage_1_and_2
简介:stage1/2 优化器,对参数的Optimizer States与Gradients进行分割。
5.2.1 init
核心思路:ZeRO初始化时候会对参数进行均匀切分给各个rank。通过参数分区,进而实现梯度、优化器的乐住源码分区。
除此之外,注册梯度钩子函数reduce_partition_and_remove_grads(当梯度计算完成时自动调用该函数)
5.2.2 forward
在模型model进行前向传播,返回loss,ZeRO不需要进行特殊处理。
5.2.3 backward
5.2.4 reduce_ipg_grads()
ipg:Independent Parallel Gradient
简介:对连续的ipg梯度进行reduce。
源码阅读忆丛()Minigui
探索GUI的历史与实现
对于GUI的细节仍然存在一些困惑,似乎总是有新的东西需要学习。年轻时,对《Windows程序设计》、MFC等书籍充满热情,那些API的神奇之处让人着迷。然而,花费大量时间深入学习,却似乎事倍功半,微软似乎更倾向于教人如何使用,而非深入解释实现原理。尽管如此,还是尝试实现过文字版的GUI,涉及基本的按钮、滚动条、菜单等元素。但一些细节仍不清楚。
通过网络搜索,了解到魏永明的Minigui项目是对Windows GUI和GDI的模仿。通过下载vc6版本的MinGUI,能够进行调试。在分析代码时,发现事件回调、消息链等常见功能并无特别之处。而DefaultMainWinProc、InvalidateRect、PopupMenuTrackProc等函数则更具实际意义。GUI就像是在显存沙漠中绘画,有其既定规则。DefaultMainWinProc负责实现画最大、最小按钮、窗口方框等常规操作,而绘制的动作有其先后顺序,即消息的先后处理。
GDI部分则展示了如何在显存中书写文字,包括粗体、斜体等效果;如何绘制图标和位图;关键的rgn裁剪矩形技术,用于加速绘制,矩形外的绘制不会进行。rgn裁剪矩形的运算包括加、减、合、并等,对应着窗口的各种移动和形状改变。不同线程之间的窗口管理由HWND_DESKTOP统一处理,desktop-common.c相当于窗口管理器,不同程序无法直接获取其他窗口的位置和大小,由其进行统一管理。desktop包含三个线程,分别负责捕捉键盘、鼠标消息,以及实际消息的处理,以及窗口给desktop的消息交由DesktopWinProc统一处理。
MinGUI的模拟版本在调试方面虽能使用,但功能实现上有缺失。相比之下,libminigui-1.0.提供了完整的gui、gdi、kernel代码,定义了大部分的画窗套路和动作,只需要关注关键部分和自己定义的动作即可。
Linux的GUI采用了xwindows,通过socket将xclient进程中的窗口绘制信息传输到xserver,由xserver统一处理。xclient之间互相不知道窗口的位置和大小,因此都通过xserver进行绘制,xserver还包含了窗口管理器。而MinGUI在一个进程的多个线程中实现,不存在窗口管理器与进程间位置信息传递的问题。
Windows使用wink.sys作为窗口管理器,作为内核态程序,用户态的动态链接库在不同进程间数据段不同,但内核态的数据段统一,因此实现了窗口管理。Windows显示流畅的原因之一在于窗口管理机制与MinGUI的desktop类似,但实现机制有所不同。
工作繁忙,业余时间进行学习。尽管以前对GUI有过大量无用功,但这次的探索仅用几天时间便有所收获。
微软的 Windows 助手——UFO,原理剖析
微软Windows助手UFO的深度解析
近年来,操作系统助手日益受到关注,它们通过用户指令自动完成任务,如在桌面、手机和各类设备上。微软新近开源的UFO,以其基于GPT-4V和Agent的跨应用调度功能备受瞩目。本文将通过源码分析,探索其工作原理。
直接跳转至结论,用户可以了解到UFO如何执行任务。以购买车票为例,首先,助手会选择打开的应用,这里需要预先启动浏览器,否则助手无法识别。内部调用gpt-4v接口的代码中,我们可以通过设置断点观察其prompt指令。
获取可用软件的过程,UFO依赖pywinauto库,它能识别并标记浏览器界面中的操作元素,便于助手识别并执行操作。然而,在尝试过程中,遇到了TPM(tokens per min)的限制问题,尽管实际请求的令牌远未达到上限,这可能与输入的两张有关。
尽管如此,UFO的基本操作思路清晰,即通过选择应用、识别操作元素并执行任务。对于更深入的探讨,可以参考相关专栏,那里有更多关于操作系统助手和Agent的详细内容。
巨硬Application Inspector初体验On Mac
Application Inspector 是微软开源的软件特征源码分析工具,主要功能在于源码分析与检查。用户需首先配置好 dotnet 环境,通过巨硬提供的安装包完成安装。接着,将/usr/local/lib加入profile并source使其生效,运行dotnet --version验证安装成功。
随后,用户需将代码编译至目标平台,如osx-x,编译后,将运行成功提示信息反馈给用户。体验过程中,用户在命令行输入命令,进入编译后的目录,尝试运行Application Inspector。
测试运行后,可以看到其支持的命令和功能,如analyze命令,用户可输入参数进行源码分析。对于本地源码,使用analyze命令,结果默认以html格式展示,检测速度快,完成后自动打开报告页面。
报告页面设计美观,用户反馈体验时指出,安装与使用较为方便,输出结果美观。然而,对于特定语言如java源码,工具支持度一般,输出内容主要涉及js和html,作为代码审计工具,功能有限,可能与默认规则有关。用户建议,期待工具持续发展,增强功能,以提高其在代码审计领域的应用价值。