Sticky Posts

6kwords5 mins.

# 暮冬 Z 羡慕 的博客 文章汇总 # 加速算法 【Im2Col】卷积加速算法【1】 NCHW 【Im2Col】卷积加速算法【2】NHWC 【im2col】AScend conv accelerate 【Winograd】卷积加速算法原理及实现 【gemm】Gemm 计算加速 【gemm】内存对齐 【Halide】调度优化【1】 【Halide】调度优化【2】 【conv 加速】NVDLA 卷积加速算法 # AI 推理引擎 【推理引擎】常见推理引擎 【推理引擎】NCNN 和 Tengine 量化推理逻辑对比 【量化】连续卷积层首尾量化的可

Post List

15kwords14 mins.

# 前言 本篇是学习 MLIR 中的 Transform Dialect 的第四篇,本章主要讲的是 MLIR Transform Dialect 的进阶用法,核心围绕如何用更规范、更类型安全的方式编写 transform 操作,以及如何定义自己的 transform 类型。内容来自 MLIR 官方教程 《Chapter 3: More than Simple Transform Operations》。 相关链接: LLVM Project ,MLIR 官方文档,MLIR 官网教程, 《Chapter 0: A Primer on “Structured” Linalg Operations》
17kwords15 mins.

# 前言 本篇是学习 MLIR 中的 Transform Dialect 的第三篇,添加新的 Transformation 操作。这一章节主要讲了如何为 MLIR 的 Transform 方言添加一个简单的新变换操作。内容来自 MLIR 官方教程 《Chapter 2: Adding a Simple New Transformation Operation》 相关链接: LLVM Project ,MLIR 官方文档,MLIR 官网教程 。 作为初学者,错误在所难免,还望不吝赐教。 # 基本简介 在前一章节 《Chapter 1: Combining Existing Transforma
23kwords21 mins.

# 前言 本篇是学习 MLIR 中的 Transform Dialect 的第二篇,主要通过一个具体的 “全连接 + 偏置 + ReLU” 层例子,介绍了如何使用 Transform Dialect 来编写变换脚本。内容来自 MLIR 官方教程 《Chapter 1: Combining Existing Transformations》。 相关链接: LLVM Project ,MLIR 官方文档,MLIR 官网教程, 《Chapter 0: A Primer on “Structured” Linalg Operations》,【MLIR】Transform Dialect【0】保持计算结
15kwords13 mins.

# 前言 本篇是学习 MLIR 中的 Transform Dialect 的第一篇,主要讲解 MLIR 为何及如何保持计算结构。内容来自 MLIR 官方教程 《Chapter 0: A Primer on “Structured” Linalg Operations》。 相关链接: LLVM Project ,MLIR 官方文档,MLIR 官网教程, 《Chapter 0: A Primer on “Structured” Linalg Operations》。 作为初学者,错误在所难免,还望不吝赐教。 # 基本简介 本章节主要内容是在阐述 : 为什么编译器不直接把高级计算(如矩阵乘)转成低级
18kwords16 mins.

# 前言 现在开启 MLIR 学习系列。本篇是跟着 Toy 语言学习 MLIR 的第六篇,前述章节已经完整介绍了 toy 语言经 MLIR 降级到 llvm ir,并通过 JIT 进行编译执行的过程,本章节是教程中增添复合类型章节。前述内容请参考【MLIR】跟着 Toy 语言学习 MLIR【1】Toy 语言和 Toy Dialect,【MLIR】跟着 Toy 语言学习 MLIR【2】pattern 匹配和重写,【MLIR】跟着 Toy 语言学习 MLIR【3】通过接口实现通用转换。 相关链接: LLVM Project ,MLIR 官方文档,MLIR 官网教程,【编译器】使用 llvm 编译自
18kwords16 mins.

# 前言 现在开启 MLIR 学习系列。本篇是跟着 Toy 语言学习 MLIR 的第五篇,前述章节已经介绍到 toy dialect 降级到 Affine dialect,本章节主要介绍将其降级到 LLVM 及 Codegen 生成可执行文件的过程。前述内容请参考【MLIR】跟着 Toy 语言学习 MLIR【1】Toy 语言和 Toy Dialect,【MLIR】跟着 Toy 语言学习 MLIR【2】pattern 匹配和重写,【MLIR】跟着 Toy 语言学习 MLIR【3】通过接口实现通用转换,【MLIR】跟着 Toy 语言学习 MLIR【4】部分降级到低层方言。 相关链接: LLVM P
12kwords11 mins.

# 前言 现在开启 MLIR 学习系列。本篇是跟着 Toy 语言学习 MLIR 的第四篇,主要介绍高层级 toy dialect 降级到低层方言的过程,前述内容请参考【MLIR】跟着 Toy 语言学习 MLIR【1】Toy 语言和 Toy Dialect,【MLIR】跟着 Toy 语言学习 MLIR【2】pattern 匹配和重写,【MLIR】跟着 Toy 语言学习 MLIR【3】通过接口实现通用转换。 学习 MLIR 最好的方式还是照着官方教程来,但是只看 MLIR 官网教程,Ch1 到 Ch6,没有基础的话又让人学着有点吃力。现发现好多细节,不看教程认识不到,所以当前内容跟随官网教程。 相
15kwords14 mins.

# 前言 现在开启 MLIR 学习系列。本篇是跟着 Toy 语言学习 MLIR 的第三篇,主要介绍如何实现通过接口进行通用转换,前述内容请参考【MLIR】跟着 Toy 语言学习 MLIR【1】Toy 语言和 Toy Dialect,【MLIR】跟着 Toy 语言学习 MLIR【2】pattern 匹配和重写。 学习 MLIR 最好的方式还是照着官方教程来,但是只看 MLIR 官网教程,Ch1 到 Ch6,没有基础的话又让人学着有点吃力。现发现好多细节,不看教程认识不到,所以当前内容跟随官网教程。 相关链接: LLVM Project ,MLIR 官方文档,MLIR 官网教程,【编译器】使用 l
13kwords12 mins.

# 前言 现在开启 MLIR 学习系列。本篇是跟着 Toy 语言学习 MLIR 的第二篇,主要介绍 toy dialect 高层级方言的匹配重写,前述内容请参考【MLIR】跟着 Toy 语言学习 MLIR【1】Toy 语言和 Toy Dialect。 学习 MLIR 最好的方式还是照着官方教程来,但是只看 MLIR 官网教程,Ch1 到 Ch6,没有基础的话又让人学着有点吃力。所以本教程没有直接参照官网 Toy 教程,而是以 MLIR 工程的 toy 相关代码入手。欢迎参考。 相关链接: LLVM Project ,MLIR 官方文档,MLIR 官网教程,【编译器】使用 llvm 编译自定义语
16kwords15 mins.

# 前言 现在开启 MLIR 学习系列。本章介绍 Toy 语言和 Toy Dialect 这一步骤的转换。当然,是从 Toy AST 到 Toy Dialect 这一过程得转换。从 Toy 文本语言到 AST 这个转换过程,需要编译原理的知识和非常麻烦的词法分析器,且这个过程与 MLIR 无关,所以该文章不会包含这个过程。 学习 MLIR 最好的方式还是照着官方教程来,但是只看 MLIR 官网教程,Ch1 到 Ch6,没有基础的话又让人学着有点吃力。所以本教程没有直接参照官网 Toy 教程,而是以 MLIR 工程的 toy 相关代码入手。欢迎参考。 相关链接: LLVM Project ,ML
587words1 mins.

# It's A Rain Day 足球 雨天 足球 踢足球,开始于高中入学... # 血遗术之谜 推荐一下我的小说: 《血遗术之谜》 更偏向于严肃小说。写小说,开始于研究生时代。 # 另外 还有博客和 3D 建模。
1.3kwords1 mins.

# 凌乱 专门定好闹钟,在日出的时候爬到甲板上,拍一张海上日出的样子。 💬 "[我他妈去看海了,我他妈是一个人,海他妈也是一片海。]" 本科时足球课老师对我的评价是,速度快,真快!但现在是真跑不动了。毛毛雨的天气适合做各种事情,比如踢场足球,我的双色足球鞋很个性! 谁能明白倒在黎明前的痛苦。明明只差那么一点点,但结果是一样的。它带来的影响,远比一次又一次的失败要多得多。 失败模拟器不好玩。 💬 "[只有赢,才能治好我所有的阴郁和病痛。]" ————《百米。》 烟火,灿烂但短暂。 💬 "[失败总是贯穿人生始终。]"
16kwords14 mins.

# 前言 本篇介绍 Triton 实现的矩阵乘运算。本文结合 Triton 官方文档和官方 triton 矩阵乘实现方式,以绘图的方式介绍其加速算法和原理。比这对 NVIDIA GPU 架构理解尚浅,肯定存在理解偏差和错误,请批判性阅读,互相学习。 参考 Triton 中文官方文档、Triron 矩阵乘实现方式 作为初学者,错误在所难免,还望不吝赐教。 # 一点 CUDA 必备知识 # 流式多处理器 SM 一块 GPU 拥有多个流式多处理器 SM。 原子性绑定:一个线程块(Thread Block)中的所有线程,会被绑定到且仅绑定到同一个 SM 上执行。 一对多复用:一个 SM 在同一时刻
2.9kwords3 mins.

# 前言 本文介绍 FlashAttention。本文只关注 FlashAttention 前向推理部分的应用。 参考链接:Transformer 模型详解(图解最完整版) , Attention is All You Need,Pytorch 版本的 Transformer 实现、一文了解 Transformer 全貌(图解 Transformer)、大模型推理加速:看图学 KV Cache、手撕大模型|KVCache 原理及代码解析、FlashAttention 详解:为什么它能让大模型注意力计算又快又省显存?、Flash Attention 原理详解 (含代码讲解)、【手撕 LLM-Fl
5.1kwords5 mins.

# 前言 本文介绍 VLLM 的 PagedAttention。 参考链接:Transformer 模型详解(图解最完整版) , Attention is All You Need,Pytorch 版本的 Transformer 实现、一文了解 Transformer 全貌(图解 Transformer)、大模型推理加速:看图学 KV Cache、手撕大模型|KVCache 原理及代码解析、PagedAttention 论文解读、论文《Efficient Memory Management for Large Language Model Serving with PagedAttention
4.3kwords4 mins.

# 前言 本文介绍 VLLM 的 Online Softmax。 本文大部分内容来自于 【手撕 LLM-Flash Attention】从 softmax 说起,保姆级超长文!!。 参考链接:Transformer 模型详解(图解最完整版) , Attention is All You Need,Pytorch 版本的 Transformer 实现、一文了解 Transformer 全貌(图解 Transformer)、大模型推理加速:看图学 KV Cache、手撕大模型|KVCache 原理及代码解析 、FlashAttention 深度解析:从数学原理到工程实现、Flash Attenti
6.6kwords6 mins.

# 前言 本文罗列一些大模型、Transformer 相关的基础知识。 可能会有误解和疏漏,谨慎参考。 # 什么是动态图 什么是计算图 :由「算子节点 + 张量边」组成的 DAG 有向无环图,记录:数据怎么走、谁加谁、谁乘谁、谁做归一化 什么是静态图 :我们通常把 onnx、TensorRT network IR 等看作静态图。先把整个网络结构完整定义、固化、序列化成一张固定的图,图是永久存在的文件 / 结构体(ONNX 文件、TRT Network IR),图一旦生成,运行中不能随便改分支、不能改循环次数,我们拿这张固定的图跑数据。 什么是动态图 :每次前向推理之前,才临时构建计算
13kwords11 mins.

# 前言 学习大模型,首先得学习 Transformer。Transformer 由论文《Attention is All You Need》提出,现在已经是大模型的基础。本文介绍 Transformer 模型的结构。 Transformer 太火了,网上能够找到足够多的图和介绍文章,所以本文文章出现的图均来自论文和网络,非本人所画。 参考链接:Transformer 模型详解(图解最完整版) , Attention is All You Need,Pytorch 版本的 Transformer 实现、一文了解 Transformer 全貌(图解 Transformer) # Transfor
5.2kwords5 mins.

# 前言 NPU 的设计相对封闭,从市面上先进的 NPU 芯片和其工具链,乃至开发文档中,我只能学习到大方向的设计思路。这远远不够:1. 资料有限,有可能在大方向理解上出现偏差,这导致整个流程相当多的地方走不通或难度过大; 2. 细节上需要经验来自行领悟,细节不通也无法下手。 一些开源的项目,如 TVM、NVDLA、和 MLIR,这些工程和现在 NPU 芯片的编译器的优化思路差异很大。 前者强调通用性、可移植性。为多种硬件后端提供统一的编译堆栈,通过自动化搜索等搜寻最优调度。而专用 NPU 的硬件已经固定(可拓展也是固定硬件资源的拓展),专家根据硬件特性直接编写最优或近似最优的优化策略(如 G
1.2kwords1 mins.

# 前言 本篇文章发现了单纯的 “深度优先的 Tile 调度” 存在的问题。先简单介绍一下单纯的深度优先调度,再指出其可能出现的问题。 错误在所难免,还望不吝赐教。 # 深度优先调度 请允许叫他深度优先调度。本人研究论文不多,我也不知道这种调度方式到底有没有一个官方的、或者大家默认的名称。但是从调度逻辑上,我把他叫做 ——“深度优先调度”。一来是为了指代简单,二来可以方便交流。 以下面这个两层卷积网络为例: 图中详细展示了输入输出 tensor,和两个卷积层的参数。 下图是这个例子的深度优先调度顺序。假设三个 Tensor 是这样切分的:第一个切成 20,20,20,4;第二个切成 10,1