自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 IR - 张量和指针

在Triton IR中,operation的operand的类型有:标量、张量、指针、张量描述符。

2025-07-31 10:36:36 108

原创 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编译

【代码】Triton Shared编译。

2025-07-27 22:12:31 221

原创 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> &lt

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关注的人

提示
确定要删除当前文章?
取消 删除