1.LM训练05 ZeRO系列
2.求cocos2d-x教程
3.Cesium开发基础篇 | 05glTF介绍及加载
4.SparkSQL源码分析-05-SparkSQL的源代码join处理
5.UE5 05 Media框架的探索与流视频播放应用
LM训练05 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基础上,openvpn 源码安装对模型参数进行分区。
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 内存碎片
原因:内存碎片是tensor生命周期错配的结果。
问题:即使有足够的显存,可能会因为缺少连续内存而使得内存分配失败。
方法:ZeRO为激活检查点和梯度预先分配连续内存块,并在初始化时将它们复制到预先分配的ambari源码下载连续内存中。
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不需要进行特殊处理。gtalk 源码下载
5.2.3 backward
5.2.4 reduce_ipg_grads()
ipg:Independent Parallel Gradient
简介:对连续的ipg梯度进行reduce。
求cocos2d-x教程
cocos教程百度网盘免费资源在线学习链接: /s/1lYZHKPPVuvBR4rddE1jasA
提取码: e2htcocos教程 极客学院Cocos2d-x源码 _第5阶段 项目实战 _第4阶段 功能扩展 _第3阶段 常用功能 _第2阶段 基础知识 _第1阶段 环境搭建 5 使用Eclipse在Ubuntu下搭建Cocos2d-x 3集成开发环境 4 Cocos Code IDE使用 3 Windows环境下Visual Studio 中搭建Cocos2d-x 3.1集成开发环境 2 Cocos2d-x3.1rc0项目创建及新功能介绍 1 WinMac环境Cocos2d-x开发环境搭建 . HelloWorld示例详解.webm . 在Mac平台编译成Android程序.webm . Mac平台开发环境搭建.webm
Cesium开发基础篇 | glTF介绍及加载
在Cesium开发中,了解如何加载和使用glTF模型是非常重要的。glTF,即Graphics Language Transmission Format,是一种专为图形应用设计的高效、可扩展且互操作的3D内容传输格式,由Khronos集团维护,现已成为Web上的3D对象标准。
glTF提供了一种通用的方式来传输和加载3D模型,几乎所有的3D Web框架都支持glTF格式。它通过JSON文件描述模型,支持外部数据,并允许将文件转换为二进制格式glb。Cesium提供了一个源码库,可将obj文件转换为glTF格式,方便开发者使用。
glTF模型结构包括一个JSON文件和可选的外部文件,以及两种主要格式:glTF和glb。glTF文件定义了场景、节点、网格、相机、材质等元素,而glb则将所有内容封装在二进制格式中。JSON文件中的场景对象以数组形式存储,每个对象通过引用节点定义了场景图。暴力摩托源码节点可以包含变换参数、网格引用、相机等,并通过索引定义了对象之间的关系。
每个glTF模型的核心是其JSON结构,包括场景、节点、相机、网格、皮肤、动画、访问器、材质和纹理等元素。场景由引用节点定义,节点可以包含变换参数、网格和相机,以及描述网格变换的蒙皮。相机定义了渲染场景的视锥体配置,网格描述了场景中的几何数据,皮肤定义了蒙皮参数,动画描述了节点随时间变化的参数,访问器提供了数据源,材质定义了3D对象的外观参数,而纹理定义了图像如何在对象上张贴。
为了验证和查看glTF模型,可以使用多个在线工具,如glTF在线验证器、浏览-Sketchfab、PlayCanvas查看器、ThreeJS查看器、BabylonJS查看器等。开发者还可以使用glTF转glb工具将模型转换为二进制格式。
Cesium提供了两种加载glTF模型的方式:通过Entity API和Primitive API。Entity API允许开发者创建和管理模型,而Primitive API则负责渲染模型。使用模型时,可以设置模型矩阵属性,定义模型的坐标转换,为模型创建一个局部坐标系。
为了深入学习Cesium和glTF,推荐查阅相关文档和书籍。此外,了解glTF规范、掌握Cesium API,并尝试使用不同工具加载和查看模型,可以极大地提升开发技能。通过实践和学习,开发者能够更好地利用Cesium实现复杂的3D可视化应用。
SparkSQL源码分析--SparkSQL的join处理
SparkSQL的join处理策略多样,针对不同场景各有优劣。首先,map join适用于小表广播至worker节点,提升性能,但大表可能导致OOM。shuffle hash join则对大表进行分区和排序,效率高但内存密集。默认策略通过sort merge join,对大表进行分区排序,避免内存问题,但需预先排序。
当常规策略不可用时,会考虑等值或不等值join的广播nested loop join,适用于特定条件的right或left outer join。笛卡尔积join在无指定key时使用,仅限inner join。
SparkPlan中的Join子节点与策略紧密相关,如在等值连接时,根据hint选择Broadcast hash join、Shuffle sort merge join或shuffle hash join。没有hint时,依据表大小、join类型和排序情况自动选择。
非等值连接时,hint会引导使用broadcast nested loop join或Cartesian product join,无hint时则依据表大小和连接类型来决定。
在特殊情况下,如NotInSubquery,仍可能选择Broadcast hash join。总的来说,SparkSQL的join策略灵活多变,旨在根据具体场景提供最优的执行效率和资源利用率。
UE5 Media框架的探索与流视频播放应用
在探讨如何在虚幻引擎(Unreal Engine,简称UE)中集成视频流播放功能时,我们首先需要了解UE的基本播放流程和模块设计。通常,UE在蓝图中创建对应资产即可轻松搭建视频链接,但若涉及如rtsp协议等国产摄像头的视频流接入需求,则需要借助UE的灵活性和插件支持进行额外模块的加入。本文旨在深入解析UE Media框架,通过理解其设计模式、C++知识以及具体实现,帮助开发者实现视频播放功能的拓展。
在UE中,视频播放的通用流程主要在蓝图中完成,官方文档和各类个人博客提供了详尽的教程。模块(Module)作为UE的基本元素,封装和实现了特定功能,如Media模块,它在UE5.3版本中与其他版本有区别,但面向的是UE初学者。
理解UE的基本知识对于实现视频播放功能至关重要。UE的多线程机制允许在游戏过程中高效处理视频播放任务,避免阻塞主线程。掌握FRunnable、FRunnableThread、FAsyncTask、FEvent等多线程相关类是必要的,这有助于开发者正确地在视频播放中应用多线程技术。
UE的TickGroup机制则帮助开发者理解Tick流程,确保视频播放任务在恰当的时机执行。虽然整个Tick流程较为复杂,本文仅关注Media模块的Tick嵌入位置,提供一个概览,以便开发者理解其在引擎中的作用。
设计模式在UE中得到广泛应用,如工厂模式(Factory)用于创建和管理对象,外观模式(Facade)提供简化接口,而代理模式(Proxy)则用于保护或控制对真实对象的访问。理解这些模式有助于开发者更高效地组织和扩展代码。
在C++知识方面,`TSharedFromThis`是UE中智能指针的实现之一,用于方便地管理对象的生命周期和共享状态。通过了解`std::enable_shared_from_this`在STL中的应用,开发者能更好地在UE中使用这一特性。CRTP(The Curiously Recurring Template Pattern)的了解则能提供更深入的智能指针原理理解。
UE的Media模块包含三个主要部分:Media、MediaAssets、MediaUtils,分别从底层接口、具体实现到资源管理角度提供视频播放功能。MediaPlayerFacade和MediaPlayer是关键组件,它们通过外观模式(Facade Pattern)提供接口,隐藏底层复杂性,同时允许开发者通过插件轻松扩展功能。
UMediaPlayer与IMediaPlayer之间的区别在于高、低层播放器的职责划分,前者负责高阶逻辑处理,后者实现底层解码逻辑。MediaPlayer的实例化通常通过MediaPlayerFacade实现,通过不同的插件支持不同的解码器。
UE视频播放流程涉及多个线程的协作,Media模块单独运行在自己的线程中,处理视频解码和采样,而其他功能(如输入、输出和渲染)则在主GameThread中执行。UE源码中使用特定术语如Track和Sink来管理视频播放的各个部分,每个部分在不同Tick阶段执行特定任务。
本文旨在提供UE Media框架的全面解析,帮助开发者理解其工作原理和实现细节,以便在项目中灵活应用和扩展视频播放功能。通过本文,开发者不仅能够解决特定需求,如接入国产摄像头视频流,还能更深入地理解UE的模块化设计和多线程机制,为复杂项目提供坚实的基础。