1.[转]Megatron-LM源码系列(八): Context Parallel并行
2.UE4.26(5.0)后的源码Sequence系统
3.UVM学习笔记(三)
4.SequenceDiagram 查看代码时序图的利器,做技术方案必备!源码
5.Java源码分析 | CharSequence
6.UE4 LevelSequence源码解析
[转]Megatron-LM源码系列(八): Context Parallel并行
原文链接: Megatron-LM源码系列(八): Context Parallel并行
Context Parallel并行(CP)与sequence并行(SP)相比,源码核心差异在于SP只针对Layernorm和Dropout输出的源码activation在sequence维度进行切分,而CP则进一步扩展,源码对所有input输入和所有输出activation在sequence维度上进行切分,源码帝国源码帝国模板形成更高效的源码并行处理策略。除了Attention模块外,源码其他如Layernorm、源码Dropout等模块在CP并行中无需任何修改,源码因为它们在处理过程中没有涉及多token间的源码交互。
Attention模块之所以特殊,源码是源码因为在计算过程中,每个token的源码查询(query)需要与同一sequence中其他token的键(key)和值(value)进行交互计算,存在内在依赖性。源码因此,在进行CP并行时,计算开始前需要通过allgather通信手段获取所有token的KV向量,反向计算时则通过reduce_scatter分发gradient梯度。
为了降低显存使用,前向计算阶段每个GPU仅保存部分KV块,反向阶段则通过allgather通信获取全部KV数据。这些通信操作在特定的rank位置(相同TP组内)进行,底层通过send和recv等操作实现allgather和reduce_scatter。
以TP2-CP2的transformer网络为例,CP并行的通信操作在Attention之前执行,其他则为TP通信。AG表示allgather,RS表示reduce_scatter,AG/RS表示前向allgather反向reduce_scatter,RS/AG表示前向reduce_scatter反向allgather。微信 考题 源码
TP2对应为[GPU0, GPU1], [GPU2, GPU3],CP2指的就是TP组相同位置的rank号,即[GPU0, GPU2], [GPU1, GPU3]。CP并行类似于Ring Attention,但提供了OSS与FlashAttention版本,并去除了冗余的low-triangle causal masking计算。
LLM常因序列长度过长而导致显存耗尽(OOM)。传统解决方法包括重计算或扩大TP(tensor parallel)大小,但各自存在计算代价增加或线性fc计算时间减少与通信难以掩盖的问题。CP则能更高效地解决这一问题,每个GPU处理一部分序列,同时减少CP倍的通信和计算量,同时保持TP不变,使得activation量也减少CP倍。性能优化结果展示于图表中,用户可通过指定--context-parallel-size在Megatron中实现CP。
具体源码实现以Megatron-Core 0.5.0版本为例进行说明。
参考资料:
UE4.(5.0)后的Sequence系统
在虚幻引擎4.版本后,Sequence系统的计算方式进行了调整,具体详情可参考《大规模内容的性能保障:虚幻引擎4.中的Sequencer》一文。阅读后,您能大致理解ECS(Entity Component System)在源码层面的实现方式。本文使用的原生引擎版本为5.0.3,相较于4.版本,UE5中接入了更多Section,系统得到了补充,但本文不介绍具体系统功能。
要了解ECS的入口点,可以创建LevelSequence资产,添加任意Actor及轨道,幻象秒赞源码然后在求值或ImportEntityImpl函数中设置断点,观察堆栈内容。在MovieSceneEntitySystemRunner中,可以看到UE实现的入口点注释。对照官方介绍,Sequence的四个更新阶段均在GameThread_...Phase形式的类中记载,这些类包含代码Linker->SystemGraph.ExecutePhase(ESystemPhase, Linker, AllTasks),这是各系统执行的入口。
为了详细介绍流程,需要了解类的持有关系和简单功能。主要围绕以下结构展开:Linker及其初始化过程、Linker相关的类型关系、Entity的引入、System图构造及使用、System执行以及实际执行。
在初始化阶段,首先打开LevelSequence资产,FSequencer作为默认编辑器,调用InitSequencer方法进行初始化,创建全局UMovieSceneCompiledDataManager并持有RootEvaluationTemplateSequence。这个类在ECS过程中主要用于将整个Sequence划分为多个求值区间。RootEvaluationTemplateSequence用于整体调度工作成员,并为外部提供数据访问接口。初始化过程中,创建Linker与Runner,并将其互相绑定。Linker的位置可以根据IMovieScenePlayer的指定或直接在临时包下创建。Linker的全局变量GComponentRegistry持有FComponentRegistry类型,EntityManager提供其指针。新的帝国cms 源码分析FInstanceRegistry被创建,并记录RootSequence信息。Sequence实例化参数可用于获取全部Sequence信息,委托指示此Sequence绑定丢失时标记Guid。在Invalidate函数内,由CompiledDataManager进行区间划分并掌握轨道与段落信息,为SequenceUpdater赋值。
初始化完成后,后续将在FSequencer::Tick或UMovieScenePlayer::Play中执行。此时Runner将调用Linker各个阶段的系统执行。从Runner::GameThread_SpawnPhase开始介绍Linker相关的类型结构。
Linker主要执行了链接系统与执行系统的工作。在GameThread_SpawnPhase阶段,通过全局变量GlobalDependencyGraph获取保存的Class ID,这些ID是在Init阶段通过UMovieSceneEntitySystem构造函数保存的。GlobalDependencyGraph在系统初始化时保存了所有系统的依赖关系,随后Linker->LinkRelevantSystems遍历整个GlobalDependencyGraphClass数组,如果系统通过relevant判断则执行Linker->LinkSystem。在此过程中,系统被分配至执行数组并安排好执行顺序,通过DFS检测依赖关系是否构成环。
在执行System阶段,通过FMovieSceneEntitySystemGraph::ExecutePhase,系统按照顺序装入列表并依次调用其OnRun方法执行每个System。System执行的流程涉及Component类型匹配、执行逻辑得出结果并写入目标位置。具体实现细节包括Builder构建任务、匹配Entity、执行操作等。System类型多样,本文仅介绍System与Entity的xposed 放撤回 源码交互,而非特定功能实现。
系统实际执行时,组件与系统交互关系复杂,特别是对于具体轨道如平移Actor等操作。理解这部分需要详细了解组件和系统之间的交互。
本文仅浮于表面,深入理解需要参考官方文档。写此文的目的是记录对虚幻引擎Sequencer系统学习的感悟。如果有空,可能会继续挖掘更多相关内容。
UVM学习笔记(三)
前言
笔记内容对应张强所著的《UVM实战》。该书对UVM使用进行了比较详尽的介绍,并在前言中提供了书籍对应源码的下载网址,是一本带有实操性的书籍,对新手比较友好,推荐阅读。
第2章一个简单的UVM验证平台2.4 UVM的终极大作: sequence
2.4.1 在验证平台中加入sequencer
sequence机制作用:用于产生激励。其分为两部分,一是sequence,二是sequencer。
在定义driver时指明此driver要驱动的transaction的类型,这样定义的好处是可以直接使用uvm_driver中的某些预先定义好的成员变量,如uvm_driver中有成员变量req,它的类型就是传递给uvm_driver的参数。由此带来的变化如下:(不需要定义中间变量tr了)
2.4.2 sequence机制
三者关系:
每一个sequence都有一个body任务,当一个sequence启动之后,会自动执行body中的代码。body中uvm_do这个宏的作用如下:
如果不使用uvm_do宏,也可以直接使用start_item与finish_item的方式产生transaction。
sequencer负责协调sequence和driver的请求
get_next_item和try_next_item的比较
2.4.3 default_sequence的使用
引入default_sequence的原因:
如何使用default_sequence:
使用default_sequence时如何提起和撤销objection?
2.5 建造测试用例2.5.1 加入base_test
对my_env进一步封装,添加一些公司个性化内容,举例如下:
2.5.2 UVM中测试用例的启动
通过传递参数变量值启动的原因:
如何使用:
参考资料
UVM实战(卷一) 张强 编著 机械工业出版社
SequenceDiagram 查看代码时序图的利器,做技术方案必备!
时序图是理解和设计技术方案的强大工具,尤其在快速了解业务流程、代码逻辑及类间关系时。IDEA中有个名为SequenceDiagram的插件,能简化这个过程。安装步骤如下:
首先,通过在线方式在IntelliJ IDEA中安装SequenceDiagram插件。进入设置,你可以调整生成时序图的参数,如调用层数、显示范围(仅限项目类或包含依赖)、跳过私有方法和getter/setter等,以优化图的清晰度和大小。
完成设置后,只需在需要生成时序图的方法上右键,选择“Sequence Diagram”,即可即时生成。每个节点都提供“Go to Source”和“Remove Method 'xxxxxx()'”选项,方便快速定位源代码和精简图示。
如果你需要激活此插件,相关的激活码可以查阅。本文由mdnice发布,旨在帮助开发者提升效率。
Java源码分析 | CharSequence
本文基于 OracleJDK ,HotSpot 虚拟机,深入探讨了 CharSequence 接口在 Java 中的角色与应用。CharSequence 定义
CharSequence 是 java.lang 包下的一个接口,专门用于描述字符序列,即字符串。它提供对多种不同类型的 char 序列的统一只读访问,包括 String、StringBuffer、StringBuilder 和 CharBuffer 等。Unicode 规范与 char 值表示
扩展 char 数据类型基于原始 Unicode 规范。Unicode 标准定义了合法代码点的范围是从 U+ 到 U+FFFF。这些代码点分为基本多语言平面(BMP)和补充平面。一个 char 值表示 BMP 代码点,可为代理代码点或 UTF- 编码的代码单元。一个 int 值表示所有 Unicode 代码点,包括补充代码点,其中低(最低有效) 位用于表示代码点,高(最高) 位必须为零。常用方法解析
CharSequence 接口提供了多个核心方法,包括: length() 方法返回字符序列的长度,即 位 char 的个数。 charAt(int index) 方法返回指定索引处的 char 值,索引范围从零到 length() - 1。 subSequence(int start, int end) 方法返回指定范围的子序列,长度为 end - start。 toString() 方法将序列转换为字符串。 chars() 方法返回序列中的 int 值流,适用于内部循环优化。 codePoints() 方法返回序列中的代码点值流。 compare(CharSequence cs1, CharSequence cs2) 方法在 Java 中引入,用于按字典顺序比较两个 CharSequence 实例。 这些方法为开发者提供了高效处理字符序列的工具,确保 Java 应用程序能够灵活应对复杂字符串操作。UE4 LevelSequence源码解析
本文旨在总结UE4中LevelSequence工具的学习理解,内容涉及LevelSequence结构、插值数据提取及数据导出实例,同时也提供了一些实用技巧。
LevelSequence在UE4中分为运行时Runtime和编辑器Editor两部分。Runtime中,主要文件位于/Runtime/MovieScene和/Runtime/MovieSceneTracks文件夹下,包括了LevelSequence资产在关卡中的组成形式和播放设置。在Editor中,文件位于/Editor/Sequencer文件夹下,包含了Sequence的组成部分和通用方法。每个ALevelSequenceActor包含UMovieSceneSequence和ULevelSequencePlayer,前者存储数据,后者负责播放。
UMovieSceneSequence和ULevelSequencePlayer的结构,展示了Sequence资产与当前场景之间的关系。Sequence数据按Actor组织,每个Actor可以持有多种UMovieSceneTrack,用于记录不同属性,所有Track均继承自UMovieScenePropertyTrack。Track由多个Section组成,Section由UMovieSceneChannel存储关键帧数据。
LevelSequence的模拟过程由Evaluation实现,现在主要由EntitySystem负责,以支持多线程提高效率,具体解释见文章:Performance at scale: Sequencer in Unreal Engine 4. - Unreal Engine。
在实际模拟中,关键数据的提取是重点。对于Transform等float类型数据,Sequence编辑器支持以曲线方式灵活调整关键值之间的变化过程。MovieSceneFloatValue结构体用于存储关键帧数据,通过访问该值即可获得对应数据。
导出数据的实例是将Sequence内属性(如Transform)导出为曲线。首先获取LevelSequence资产,然后获取绑定的Actor。利用获取的Actor,可以进一步获得轨道,并将对应数据存储到曲线中。
一些技巧包括:某些特殊Component在Sequence中作为同等层级存在,可通过此方式获取Component的Track;相对位置配置在Instance Data中,可通过变量获取对应数据;实践体验Sequence生成过程,建议通过/Editor/SequencerRecord入手,直观看到生成流程。
参考文章包括:UE4 LevelSequence源码剖析(一)- 知乎、UE4 LevelSequence源码剖析(二)- 知乎、UE4 LevelSequence源码剖析(三)- 知乎、Performance at scale: Sequencer in Unreal Engine 4. - Unreal Engine。
UE4 LevelSequence源码剖析(一)
UE4的LevelSequence源码解析系列将分四部分探讨,本篇聚焦Runtime部分。Runtime代码主要位于UnrealEngine\Engine\Source\Runtime\MovieScene目录,结构上主要包括Channels、Evaluation、Sections和Tracks等核心模块。
ALevelSequenceActor是Runtime的核心,负责逐帧更新,它包含UMovieSceneSequence和ULevelSequencePlayer。ALevelSequenceActor独立于GameThread更新,并且在Actor和ActorComponent更新之前,确保其在RuntTickGroup之前执行。
IMovieScenePlaybackClient的关键接口用于绑定,编辑器通过IMovieSceneBindingOwnerInterface提供直观的蓝图绑定机制。UMovieSceneSequence是LevelSequence资源实例,它支持SpawnableObject和PossessableObject,便于控制对象的拥有和分离。
ULevelSequencePlayer作为播放控制器,由ALevelSequenceActor的Tick更新,具有指定对象在World和Sublevel中的功能,还包含用于时间控制的FMovieSceneTimeController。UMovieSceneTrack作为底层架构,由UMovieSceneSections组成,每个Section封装了Section的帧范围和对应Channel的数据。
序列的Eval过程涉及EvalTemplate和ExecutionTokens,它们协同工作模拟Track。FMovieSceneEvaluationTemplate定义了Track的模拟行为,而ExecutionTokens则是模拟过程中的最小单元。真正的模拟操作在FMovieSceneExecutionTokens的Apply函数中执行,通过BlendingAccumulator进行结果融合。
自定义UMovieSceneTrack需要定义自己的EvaluationTemplate,这部分将在编辑器拓展部分详细讲解。序列的Runtime部分展示了如何在GameThread中高效管理和模拟场景变化,为后续的解析奠定了基础。