- 博客(52)
- 收藏
- 关注
原创 torch.compile
一个Deep Learning Compiler,为多种加速器生成高性能代码。对NVIDIA和AMD GPUs, 使用OpenAI Triton编译器作为Backend。规范化2000+ PyTorch Operators为250+ Primitive Operators, 极大降低了开发Pytorch后端的难度。基于Python Frame Evaluation Hook技术,实现安全的Pytorch的计算图捕获。AOT生成计算图的反向图。
2025-08-15 18:07:35
149
原创 AOT Autograd
AotAutograd(Ahead-of-Time Autograd)是一个用于在模型真正运行前跟踪模型的前向/反向图的模块,在Inductor中,通过aot_autograd调用了AOT Autograd的功能:生成反向传播图:在前向传播图的基础上,提前生成反向传播图。图编译:对生成的前向/反向图进行编译。
2025-08-15 18:05:01
322
原创 TorchDynamo - FX Graph
TorchDynamo在CPython的Frame Evaluation过程中增加了Hook,在Python字节码真正执行前,将Pytorch Operation捕获为FX Graph的形式,再动态修改字节码,实现JIT的编译和优化。TorchDynamo机制类似DynamoRIO的机制,所以取名为TorchDynamo。这个方案拥有如下优势:Python支持完备:可以轻松地fall back到原始的Bytecode执行(eager mode)。
2025-08-13 17:25:46
832
原创 TorchDynamo - Python PEP523
在Python PEP 523中提出了允许用户指定解释器的Frame Evaluation Function的提案,实现了允许外部C代码控制CPython的Frame Evaluation的机制。这个机制使JIT可以根据需要,来自由选择是编译Python字节码为机器码,还是Fall back到原始的字节码解释执行,这成为了。
2025-08-13 12:05:35
446
原创 TorchDynamo - API
PyTorch的torch.compile通过TorchDynamo捕获Python字节码并转换为FX图进行优化。支持两种使用方式:函数调用或装饰器形式。主要参数包括:backend(默认inductor)、fullgraph(是否强制全图捕获)、dynamic(动态形状)等。提供多种优化模式,如reduce-overhead(减少Python开销)和max-autotune(自动调优)。用户可自定义backend查看FX图结构,示例展示了如何捕获加法操作的计算图及输入输出。
2025-08-13 10:27:03
699
原创 Pytorch编译
查看官网说明,python版本可以在3.9和3.12之间任选:创建一个3.12的conda环境:源码下载CUDA版本号本地的CUDA版本号是12.4:查询官网:Previous PyTorch Versions可以看到2.6.0是一个可用的版本号。clone源代码:clone submodule:查看下载的submodule:查看分支:可以找到2个相关的分支:orig/release/2.6:2.6版本的初始分支。release/2.6:在2.6版本的初始分支基础上,合入了一
2025-08-12 15:17:37
269
原创 MLIR Defining Dialects
MLIR提供了一个强有力的声明式规范机制TableGen来维护领域特定的Record,基于Record可以自动生成C++的模板代码。基于TableGen,大大简化了Dialect的定义和维护工作。因此,使用声明式规范机制来定义新的Dialect是官方推荐的做法。
2025-08-08 11:55:03
168
原创 MLIR Language Reference
MLIR的IR形式类似传统的SSA形式,但是又导入了多面体循环优化的一些概念。这种混合IR的设计是为了方便表示,分析,变换高层数据流图,并生成特定后端的高性能代码。MLIR被设计为3种形式:textual form:方便人阅读的。in-memory form:方便程序变换和分析。compact serialized form:方便存储和传输。三种形式的语义内容是相同的,本文以textual form来介绍相关内容。
2025-08-07 11:38:11
691
原创 MLIR Data Layout
Data layout表达了一个特定类型的值在内存中的存储形式,使能了多样的线性内存寻址模式。Data layout的接口。
2025-08-06 14:36:06
230
原创 MLIR Bufferization
MLIR中的Bufferization是将tensor语义的ops转换为memref语义的ops。Bufferization的顶层目标是:使用尽可能少的内存。拷贝尽可能少的内存。这就意味着要尽可能地做Buffer复用,Bufferization就成了一个类似Register Allocation的算法问题。在实际的Use Case中,对Bufferization还有一些额外的需求,比如重计算和计算一次并拷贝的权衡等。
2025-08-05 19:58:08
1004
原创 MLIR Introduction
MLIR 项目是一个构建可重用和可扩展编译器基础设施创新项目,旨在解决软件碎片化问题,显著降低构建特定领域编译器的成本。
2025-08-04 20:18:52
287
原创 Triton源码分析 - 目录
本系列文章主要分析Triton-shared编译管线相关内容,后续视情况添加NVIDIA GPU编译管线相关内容。
2025-07-31 17:39:26
160
原创 MLIR TableGen
TableGen 是一种领域特定语言(DSL),TableGen 的设计目标是允许编写灵活的描述,并将记录的通用特性提取出来,从而减少重复代码并提高代码的可维护性。TableGen 的前端解析.td文件,这些文件包含了用 TableGen 语言编写的声明和定义。前端将这些声明和定义实例化,生成一个中间表示(IR),这个 IR 包含了所有定义的记录(records)和类(classes)。生成的中间表示(IR)会被传递给特定领域的后端进行处理。后端根据 IR 生成目标代码,通常是 C++ 代码。
2025-07-31 17:33:50
716
原创 Triton Dialect
其中:%0:右边expression的结果值的名字(Value的name)tt:表示Dialect名称空间为tt(Triton)splat:operation的名字%1:operation的输入i32:%1的类型tensor<1024*i32>:operation的结果类型(即3%的类型)loc(%loc5):对应源码的行号,调试信息。如下是一个pytorch cat算子的Triton DSL(inductor产生)
2025-07-28 00:00:50
1051
原创 Triton - Introduction
Triton是一种为并行编程设计的语言和编译器,旨在提供一个Python-based变成环境,提升DNN compute kernels的开发效率的同时,也能最大化利用现代GPU硬件的计算吞吐能力。原生的Triton编译器的编译管线与GPU深度绑定,微软在原生Triton的基础上,在社区贡献了triton-shared项目,对接到了MLIR的linalg Dialect,方便支持其他类型的AI加速器。
2025-07-26 17:04:37
600
翻译 FlashAttention 01 - Fast and Memory-Efficient Exact Attentionwith IO-Awareness
Transformers在输入长序列时,因为self-attention的时间和空间复杂度是序列长度的平台,运行缓慢且内存消耗大。近似attention方法通过牺牲模型性能,减少计算复杂度解决这个问题,但是经常不能获得墙上时钟级的提速。我们认为这里缺失了一个原则是让attention算法IO-aware,即将不同层级的GPU内存的读写纳入考量。我们提出了FlashAttention,一个IO-aware的精确attention算法,使用tiling来减少GPU和HBM和SRAM间的内存读写次数。
2024-08-26 16:00:40
272
翻译 vLLM 01 - Efficient Memory Management for Large Language Model Serving with PagedAttention
作者:Woosuk Kwon1,∗ Zhuohan Li1,∗ Siyuan Zhuang1 Ying Sheng1,2 Lianmin Zheng1 Cody Hao Yu3 Joseph E. Gonzalez1 Hao Zhang4 Ion Stoica1。
2024-08-19 11:00:46
738
翻译 Sora - Open-Sora技术报告1.1
https://github.com/hpcaitech/Open-Sora/blob/v1.2.0/docs/report_02.md
2024-08-13 19:49:12
288
翻译 Sora - Open-Sora技术报告1.0
OpenAI's Sora能够生成1分钟的高质量视频,但是并没有对外批露任何实现细节。为了让AI更"open",我们致力于构建一个开源版本的Sora。这个报告描述了我们训练一个基于Transformer的视频扩散模型的初次尝试。
2024-08-12 12:01:40
121
原创 llvm libLLVMCore源码分析 25 - GVMaterializer Class
源码路径llvm\include\llvm\IR\GVMaterializer.hllvm\include\llvm\IR\AutoUpgrade.hllvm\Bitcode\BitcodeReader.hllvm\lib\Bitcode\Reader\BitcodeReader.cppllvm GVMaterializer Classllvm中使用GVMaterializer类作为加载Module的类的抽象接口,比如llvm的BitcodeReader就是该类的实体类:cla
2022-03-28 11:45:51
600
原创 llvm libLLVMCore源码分析 24 - Comdat Class
源码路径llvm\include\llvm\IR\Comdat.hCOMDAT在很多ABI中,定义了COMDAT段,这种类型的段在链接时会根据段名进行合并。链接器如何合并这些段,通过一个标志指示。llvm支持的标志的可选类型如下:enum SelectionKind { Any, ///< 链接器可以选择任意一个COMDAT ExactMatch, ///< 所有COMDAT的内容必须完全相同,否则会上报链接错误。 Larges
2022-03-28 09:55:02
666
原创 llvm libLLVMCore源码分析 23 - DINode
源码路径llvm\include\llvm\IR\Metadata.hllvm\include\llvm\IR\DebugInfoMetadata.hDINode表示DWARF标签信息(DW_TAG_*),DINode继承树如下:GenericDINode泛化的类DWARF元数据类型,第一个Operand是一个MDString,其余的Operand是对其他Metadata的指针。IR示例如下:!0 = !{}!1 = !GenericDINode(tag: 3, he
2022-03-25 11:26:52
1628
原创 llvm libLLVMCore源码分析 22 - DebugInfoMetadata
源码路径llvm\include\llvm\IR\Metadata.hllvm\include\llvm\IR\DebugInfoMetadata.hDebugInfoMetadataDebugInfoMetadata是特殊的元数据类型,用于调试:除了MDTuple,其余都是DebugInfoMetadata。DILocationDILocation表示源代码中的位置。用第1个Operand表示范围,类型为DILocalScope;用第2个Operand表示函数Inline.
2022-03-25 11:01:42
843
原创 llvm libLLVMCore源码分析 21 - Metadata Class
源码路径llvm\include\llvm\IR\Metadata.hllvm\include\llvm\IR\DebugInfoMetadata.hllvm Metadata classllvm IR中允许使用元数据附在指令和全局对象上,为优化器和代码生成器提供一些额外的信息(比如调试信息)。在llvm中,使用Metadata类表示元数据。Metadata类的继承树如下:为了高效的管理Metadata对象,Metadata在llvm中的存储分为3种类型:Uniqued:元数据内
2022-03-18 17:15:19
1063
原创 llvm libLLVMCore源码分析 20 - Function Class
源码路径llvm\include\llvm\IR\Function.hllvm Function class在llvm中,使用Function class表示函数,Function class的定义如下:class Function : public GlobalObject, public ilist_node<Function> {...};首先,Function继承自GlobalObject,是一个全局独立对象。其次,Function继承ilist_node&
2022-03-16 10:37:44
1257
原创 llvm libLLVMCore源码分析 19 - GlobalValue
源码路径llvm\include\llvm\IR\GlobalValue.hllvm\include\llvm\IR\GlobalIndirectSymbol.hllvm\include\llvm\IR\GlobalAlias.hllvm\include\llvm\IR\GlobalIFunc.hllvm\include\llvm\IR\GlobalVariable.hllvm\include\llvm\IR\Function.hllvm GlobalValue class在
2022-03-15 15:28:50
1424
原创 llvm libLLVMCore源码分析 18 - BlockAddress & ConstantExpr
源码路径llvm\include\llvm\IR\Constant.hllvm BlockAddress classBlockAddress用于唯一标识一组(Function F,BasicBlock B)的地址:blockaddress(@function,%block)BlockAddress常量的类型是i8 addrspace(P)*,P是包含该BasicBlock的Function所在的地址空间(通常是0)。BlockAddress只能用作indirectbr/callb.
2022-03-14 10:27:50
634
原创 llvm libLLVMCore源码分析 17 - ConstantAggregate
源码路径llvm\include\llvm\IR\Constant.hllvm ConstantAggregate classConstantAggregate是所有复合常量的基类,复合常量把子复合常量或者简单常量(ConstantData)当作操作数进行管理,继承树如下:ConstantStruct表示结构体常量,如下代码:const struct Foo f = { .a = 1, .b = 2 };int constant_struct(int b) { return
2022-03-14 09:35:21
326
原创 llvm libLLVMCore源码分析 16 - ConstantData
源码路径llvm\include\llvm\IR\Constant.hllvm ConstantData classConstantData类是所有简单常量的基类,继承树如下:ConstantData仅用于表示常量本身,使用了Flyweight设计模式,可以在不相关的Module之间共享。既比如1个的常量i32 100,可以用于所有需要表示常量i32 100的地方,仅需要1个对象实例。ConstantInt表示任意位宽的整型常量。如下代码:int constant_i.
2022-03-11 16:25:31
412
原创 llvm libLLVMCore源码分析 15 - Constant Class
源码路径llvm\include\llvm\IR\Constant.hllvm Constant class在llvm中,用Constant类作为所有常量的基类,代表值不会在运行时发生变化。Constant类定义如下,可以看到Constant类继承自User,因为Constant会引用其他Value,也会被其他Value引用。class Constant : public User {};Constant类继承树如下:ConstantData:简单常量,如int,floa
2022-03-11 10:59:00
366
原创 llvm libLLVMCore源码分析 14 - BasicBlock Class
源码路径llvm\include\llvm\IR\BasicBlock.hllvm BasicBlock class回顾一下llvm IR的组织结构。在llmv中,一个Module中可以有n个Function,Function内可以有n个BasicBlock,BasicBlock是单进单出的n条Instruction序列。因此,BasicBlock本质上是一个顺序执行的指令的容器。在源代码中,BasicBlock的定义如下:classBasicBlockfinal:pu...
2022-03-09 18:19:32
1209
2
原创 llvm libLLVMCore源码分析 11 - PHI Node Instruction
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hllvm PHI NodeLLVM IR采用SSA(Static Single Assignment)的形式,这种形式的核心要求有2点:每个变量只被赋值1次。 每个变量在使用前必须先定义。如下源代
2022-03-09 15:37:25
559
原创 llvm libLLVMCore源码分析 12 - Vector & Aggregate Operations
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hVector OperationsExtractElementInst(父类:Instruction)extractelement指令从vector从取出指定索引位置的标量。语法<re
2022-03-09 09:53:30
603
原创 llvm libLLVMCore源码分析 13 - Other Operators
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hOther Operatorsllvm中有部分指令不能简单地归类到某一类别下,这些指令被llvm归类到Other Operators。ICmpInst(父类:CmpInst)icmp返回比较两个操
2022-03-08 18:14:42
1120
原创 llvm libLLVMCore源码分析 10 - Exception Handling Instructions
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hLLVM中的异常处理当LLVM的代码中抛出异常时,LLVM runtime会先尝试找到对应函数的异常帧(exception frame),如果是支持异常处理的语言(如C++),则异常帧中会包含异常处理表(
2022-03-08 11:08:53
777
原创 llvm libLLVMCore源码分析 09 - Cast Operators
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hCast OperatorsTruncInst(父类:CastInst)trunc指令将操作数截断为另一个类型。语法<result> = trunc <ty> <
2022-03-01 16:48:27
1253
原创 llvm libLLVMCore源码分析 08 - Memory Operators
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hMemory Ordering待补充Memory OperatorsAllocaInst(父类:UnaryInstruction)alloca指令用于在当前函数的栈帧上分配内存,当函数返回
2022-02-28 17:02:52
933
原创 llvm libLLVMCore源码分析 07 - Unary & Binary Operators
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hUnary Operators所有的Unary Operators在llvm中均使用类UnaryOperator实现,没有单独的子类。fnegfneg指令用于返回操作数的负值。语法&..
2022-02-26 18:25:38
911
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人