KaiSpace

Personal blog

Share interesting technologies or academic thoughts

What I learn and write for a living.

tech

MRV2 学习笔记

MRV2 在 GPU 执行 step N 时,CPU 已经开始调度并准备 step N+1。问题在于,step N 的结果可能使旧 request 结束,而新的 request 也可能在这段时间到达。 MRV2 的解决方式不是“提前准确知道 N+1 的 batch”,而是: 有界的乐观调度 + GPU 内部传递真实依赖 + 结果按顺序提交;猜错的工作丢弃或回滚。 1. N+1 不需要 CPU 知道 N 的 token 值 Scheduler 只需要知道“这个 request 大概率会产生一个 token”,所以在 CPU 状态中加入 numoutputplaceholders,并乐观增加: numcomputedtokens numinflighttokens 代码入口: 真正的 token 值不必回传

Read note
0 comments0 likes
life

新加坡两周年

今天航旅纵横给我发了条消息,告诉我2024年的今天我第一次飞往新加坡。我似乎从来没有记录过我刚来新加坡时的心情,那就借这个机会回忆一下吧。 我的高考分数并不好,没有如愿去到上海交通大学。后来武汉大学保我进计算机系我便将其放在了第一志愿。实际上我有一点亏欠武汉大学,我单方面毁约了。我一直很感谢武汉大学的王正教授,他即便是正教授仍然待人非常谦虚礼貌。他让我感到了即便没有优异的成绩,仍然能被尊重和重视。我之前在各处招生活动都被我曾经都不在意的学校冷眼相待,这对一个被高考扭曲了部分心智的学生来说确实是心理上的打击。 当时我对NUS已经无望了,因为有个老师曾经告诉我NUS是清北水平的学生才能去的。但是这次运气站在了我这边,七月开头的时候NUS给我发来了offer。我的父母非常开心,我也很开心。但是我心里更有一层忧虑,是不是学校录错人了,后面会不会被踢出去。这是一种不配得感,是自卑和对社会样貌了解太少导致的,如今我如果拿到了很好的学校的offer,我不会觉得我配不上这个学校,因为我是一个人,每个人都应该有机会去到理想的地方。后来我很快地做了所有的出国准备工作,七月三十日就出国了。 我父亲陪着我一起到达新加坡,因为我母亲的公司有领导被抓了导致其护照被收上去了。最开始的几天住在Orchard Road的酒店中,我父亲还给我升级到了套房,享受着免费的vip餐厅。在新加坡的第一件事就是办电话卡,这是我第一次被印度英语冲击。在711我完全听不懂印度人在讲什么,后来我只好到另一个店铺去买。我父亲跟我一起去NUS参观校园,并办理宿舍入住。我父亲和我一起坐着只有学生才能坐(实际上没人管)的校园巴士,我又开始怀疑,我到底是不是被错录的,会不会有人查我。 作为高考生我几乎是哑巴英语,甚至在Orientation自我介绍的时候说“I am China",后来紧急弥补一下说"I am from China"。这种时候就是要厚脸皮一点但是我仍然对环境感到很不舒服。我父亲好像是八月四号和我分开的,我记得那天我们是去了滨海湾玩,到了鱼尾狮那边,我父亲请我喝了一杯咖啡,聊了聊未来的畅想。具体聊了什么我忘了,但是我记得我们在一家店坐在最里面,面朝着玻璃门,能看到滨海湾的水和蓝天。一方面我被NUS录取了对未来有所期待,另一方面环境给我带来了很好的心情。中午我父亲和我吃了发传人肉骨茶,这顿饭我很伤心,因为这顿饭吃完我父亲就要回去了,但是我努力不让父亲看出我的伤心。还好我父亲并不是多愁善感的人,也有可能他也多愁善感只是并不表露出来罢了。我想是后者吧,我现在大概理解成年人的痛苦耐受度确实是很高的。我们在地铁站分开了。我在地铁中一直在忍住不哭,只好脸一直对着车门不让其他人看出来。我已经六年没出过国了,这次还是一个人在异国他乡,我真的不知道怎么办。从来没有人教过我怎么一个人生活,也没人教我怎么融入环境,一切都要自己去面对,我对未知的生活非常害怕。但是我想我是很聪明的一个人,我虽然没有任何经验,但是我知道该怎么做。那段日子是我社交最intensive的时候,作为新生我有权利和任何人加微信,组建自己的朋友圈。最终结果来看,我做的很不错。现在别人问我怎么适应的我都会说”去了就适应了“。其实不是的,那段日子到底有多难过,多害怕只有我自己知道。 好在一切困难总会过去,然而每个人生阶段都会有不同的困难,每次困难之后是一次蜕变。也许以后有时间我也想写写我这几年的思想的变化。

Read note
0 comments0 likes
tech

从 GQA 例子读懂 Mirage 的 muGraph 搜索与后端生成链路

本文只讨论 Mirage(OSDI 25'),不讨论 python/mirage/mpk 下的 MPK 子系统(这个更偏向于runtime scheduling)。请注意,这两个项目几乎没有联系,我并不清楚为什么要放在同一个repo下。(当然也有可能是我没看出来联系) 文章按真实执行顺序展开:先用 Python 构造 highlevel graph,再进入 Cython/C++ search 生成候选 muGraph,随后 verifier 判断语义等价,最后由 CUDA 或 Triton backend 尝试 lower、compile、profile,并选出最快的 runnable graph。 1. 从 GQA benchmark 进入 benchmark/groupqueryattention.py 是一个适合读 Mirage 主线的入口。它构造的 highlevel graph 很短: 这条 graph 对应的 attention 形态是: 默认 batchsize=1 时,Q 是 (2, 256,

Read note
0 comments0 likes
tech

多种代码范式详解

C++侧给python写接口 mirage/python/mirage/kernel.py .pyx .pyx 的开发范式可以概括为:Python 负责易用接口,Cython 负责跨语言 binding,C++ 负责真正逻辑。在这类代码里,Python 用户看到的是 DTensor、CyKNGraph 这种高级对象;但这些对象内部实际保存的是 CppDTensor、CppKNGraph 之类的 C++ 指针。每个 .pyx 方法通常都遵循同一个模式:先检查 Python 参数类型,把 list/tuple/str/dtype 等 Python 对象转换成 C++ 能接受的 vector/char/enum/raw pointer,然后调用 C++ core 的方法,最后把 C++ 返回的指针重新包装成 Python 对象返回。因此 .pyx 层不是主要算法实现层,而是 marshalling + thin wrapper + API facade:它让 Python 能自然地调用底层 C++ 编译器/IR/search/transpiler,同时避免把核心系统逻辑写在 Python 里。

Read note
0 comments0 likes
tech

CS3210 Parallel Computing Note

CS3210 Parallel Computing Note 第 1 部分:导论与并行计算基础 (Introduction to Parallel Computing) 1. 为什么我们需要并行计算? 在过去,程序员通常依赖硬件制造商提高单核 CPU 的时钟频率(例如从 800 MHz 升级到 1 GHz)来自动提升程序的运行速度。然而,由于功耗和散热的物理限制,单核时钟频率的增长已经停滞。 当今,对于天气预报、机器学习、流体模拟等复杂问题,即使单线程代码在算法上已经做到了极致优化,其运行速度仍然无法满足需求。因此,“让程序变快”的唯一途径就是并行计算:利用更多的物理处理单元(Cores)同时处理任务。 2. 并行化问题的核心步骤 将一个串行程序转化为并行程序,通常需要经过以下三个核心步骤(在后续章节中这也演变为了 Foster 的 PCAM 设计方法学): 1. 分解 (Decomposition / Partitioning):将庞大的应用问题拆分成更小、更离散的部分,称为任务 (Tasks)。 2. 调度 (Scheduling):决定这些任务应该以何种顺序运行,必须严格遵守任务

Read note
0 comments0 likes
tech

Flash Attention 3/4 笔记

Flash Attention笔记 在 FlashAttention(以及几乎所有现代 GPU 算子)中,计算绝不是一个 token 一个 token 算的,而是用masked attention一个tile一个tile算 硬件瓶颈:GPU 的 Tensor Core(MMA 单元)非常“饥渴”。如果你只给它算一个 token 的注意力,它的计算密度太低,根本跑不满,大部分时间都在等内存传输 。 分块(Tiling):FlashAttention 的核心就是将 N 个 token 划分成若干个 Tile 。在 Blackwell 架构上,由于第 5 代 Tensor Core 的硬约束,这个 Tile 的大小通常被固定为 128×128 。 并行维度:GPU 会同时启动成百上千个线程块(CTA),每个 CTA 负责处理一个 128×128 的小矩阵块 Flash attention 3 1. 数学定义与性能目标 FlashAttention3

Read note
0 comments0 likes
tech

[转载] 在 H100 上超越 cuBLAS:一份工作日志

在 H100 上超越 cuBLAS:一份工作日志 CUDA 矩阵乘法内核 从零开始 作者:Pranjal Shankhdhar | 2024年11月29日 来源: 在这篇文章中,我们将在最新一代 NVIDIA 硬件 H100 上,迭代地实现一个 CUDA 矩阵乘法内核。 我们将深入理解 H100 的架构,并一步步展示这些优化。最终内核在 N=4096 时比 cuBLAS 快 7%。它可以装进一个 C++ 文件中,没有任何依赖。 这篇文章可以看作是 Simon 的经典博客的续篇,该博客展示了在 A6000 GPU 上的类似优化。然而 H100 GPU 是完全不同的怪兽,需要完全不同的算法。举个例子,Simon 博客中的算法在 H100 上只能达到 cuBLAS 性能的 4%。在这篇文章中,我们将从 Simon 的博客出发,迭代地达到 cuBLAS 的 107%。 我所有的代码都可以在

Read note
0 comments0 likes