Tilus: A Virtual Machine for Arbitrary Low-Precision GPGPU Computation in LLM Serving

发表时间: 2025-04 · arXiv:2504.12984

原文: https://arxiv.org/abs/2504.12984

文章标题: Tilus:一种用于LLM服务中任意低精度GPGPU计算的虚拟机
作者/机构: Yaoyao Ding (University of Toronto), Bohan Hou (Carnegie Mellon University), Xiao Zhang (University of Toronto), Allan Lin (University of Waterloo), Tianqi Chen (Carnegie Mellon University), Cody Yu Hao (Anyscale), Yida Wang (Amazon), Gennady Pekhimenko (University of Toronto)


速读

一句话结论 本文提出了一个专为大语言模型服务设计的通用GPU虚拟机Tilus,通过原生地支持1到8位任意精度的张量计算,在保持可编程性的同时,实现了比现有最先进方案最高2.6倍的性能加速。

要解决什么问题 大语言模型推理的显存带宽和计算吞吐压力极大,量化是核心解法,但现有GPU编程抽象在处理低精度计算时存在严重的机制卡点。虽然4位量化能节省资源,但会带来不可忽视的精度损失;而能兼顾精度的5到7位等非2的幂次位宽,却缺乏高效的底层算子支持。现有的两类主流编译器都绕不开各自的死结:以Triton为代表的过程导向编译器没有暴露GPU的显存层级,且缺乏对子字节数据类型的原生支持,导致在处理低精度权重时,必须手动从大存储类型中解包,并依赖共享内存进行极其昂贵的张量布局转换才能满足张量核心的指令要求;以Ladder为代表的调度导向编译器虽然引入了低精度原语,但它采用的是类型级打包(将低精度数据硬塞进大存储类型中),这种方式不仅无法高效处理非2的幂次位宽,其原语式的调度还直接阻断了软件流水线优化,导致权重从全局内存加载到寄存器的过程无法与计算重叠,严重拖慢了执行效率。

怎么做的 核心思路是构建一个直接暴露GPU分层显存(全局内存、共享内存、寄存器)的通用GPU虚拟机,通过在寄存器级别对数据块进行重新解释,彻底绕开依赖共享内存的布局转换开销。该方法由三个关键部件构成。首先是代数布局系统,它精确定义了张量元素在一个数据块内如何分布到各个GPU线程上。布局被形式化为一个映射函数 $L(t, i)$,表示线程 $t$ 中第 $i$ 个局部元素的逻辑索引。系统提供了将元素存在单线程内的局部布局和分布在多线程间的空间布局作为基石,并通过组合算子构建复杂布局: $$h(t, i) = (f \circ g)(t, i)$$ 这种代数结构使得系统能够精确计算并匹配不同数据类型在寄存器中的位分布。其次是带分层显存的单指令多块编程模型,它在线程块粒度上维护标量、指针和张量变量,提供显式的内存搬运和计算指令,让开发者能精准控制数据在显存层级间的移动以实现软件流水线。最后是任意低精度处理机制,为了高效加载如6位整数这种非标准位宽,系统在全局内存中先将其重排并紧凑打包为8位无符号整数,随后通过异步指令将其流水线式地加载到共享内存再到寄存器中。此时,代数布局系统发挥关键作用:它直接在寄存器内将这块数据重新解释为目标低精度类型和布局,因为两者在跨线程的位分布上是完全兼容的(例如每个线程恰好持有24位数据,即3个8位整数或4个6位整数)。完成重新解释后,再利用特定目标的寄存器指令进行无线程间通信开销的向量化类型转换,转为高精度浮点数送入张量核心计算。这套机制完美支持了1到8位的任意位宽。

效果如何 实验在NVIDIA L40S、A100和H100硬件上展开,测试了Gemma-2-9B、QWen2.5-32B和Llama-3.3-70B等模型。对比基线涵盖了多条技术路线:厂商标准库cuBLAS、过程导向编译器Triton、调度导向编译器Ladder、手动优化的专用算子QuantLLM和Marlin,以及端到端推理框架vLLM。在算子级测试中,针对从1位到8位的全谱系量化数据类型(如uint8、f6e3m2、int4、uint2等),该方法全面超越所有基线。在端到端性能上,无论是批处理大小为1或16的解码阶段,还是提示词长度为2048的预填充阶段,该方法均持续优于Ladder,因为后者未能实现软件流水线和k维并行化,导致显存带宽利用率极低且执行了大量冗余的张量核心指令。在跨硬件测试中,该方法展现了极强的适应性,而基线方法Ladder在H100上出现了内核生成失败的运行时错误,vLLM在L40S上遭遇了显存溢出。不过,该方法也存在一定的工程代价,它需要一套包含领域特定语言、中间表示和多级优化遍的完整编译流水线来生成底层CUDA代码;同时,如果直接使用位运算来提取和存储低精度数据会非常低效,必须严格依赖其提出的全局内存布局预转换和寄存器重解释机制才能保证性能。

A1 主要贡献

核心问题:大型语言模型(LLM)服务对计算资源,特别是内存带宽和计算吞吐量,提出了巨大需求。低精度计算是提高效率的关键技术,但现有方法存在局限。用于生成低精度计算核心(kernel)的方法通常仅限于位宽为2的幂的权重,并且由于高级GPU编程抽象的限制,性能欠佳。这些抽象限制了精细的寄存器管理和优化的内存访问模式等关键优化。例如,4位量化虽能显著节省计算资源,但仍有不可忽视的精度损失;而5到7位量化能缓解精度损失,却缺乏高效的GPU核心支持,导致其应用受阻。

研究目标:为了解决现有低精度计算核心生成方法的覆盖范围和性能差距,本文旨在设计一个能够支持任意位宽(1-8位)低精度数据类型,同时保持GPU可编程性和高性能的系统。

创新点
本文提出了Tilus,一个专为低精度计算设计的通用GPU(GPGPU)虚拟机,其核心贡献如下:
1. 提出一个专用于低精度计算的GPGPU虚拟机:该虚拟机旨在解决现有方法在支持任意位宽(如5-7位)量化方面的覆盖不足和性能不佳的问题。
2. 新颖的代数布局系统(Algebraic Layout System):Tilus引入了一个代数布局系统,用于精确描述张量元素在一个tile(数据块)内如何在GPU线程间分布。该系统能够灵活地将寄存器中的低精度tile重新解释(reinterpret)为硬件友好的数据类型tile,从而实现高效处理。
3. 带分层内存空间的线程块级编程模型:Tilus提供了一个线程块级的编程模型,并显式暴露了GPU的分层内存空间。这使得开发者能够对数据在GPU内存层次结构中的移动、放置和计算进行精细控制。
4. 支持任意位宽的低精度数据类型:Tilus原生支持1到8位范围内的任意位宽数据类型,包括有符号整数、无符号整数和浮点数,极大地扩展了低精度计算的应用范围。

通过广泛评估,Tilus不仅能生成覆盖整个低精度范围的高效核心,并且在其支持的核心上,性能超越了当前最先进的解决方案,最高可达2.6倍。


A3 背景知识

2.1 LLM服务与量化

2.2 GPGPU编程

2.3 GPGPU语言与编译器


A2 方法细节

3. 系统概述

3.1 关键思想

3.2 虚拟机程序示例

4. 代数布局系统

4.1 参数化的基本布局

4.2 布局组合

5. 线程块级编程模型

5.1 状态空间和类型系统

5.2 程序结构和控制流

5.3 线程块级指令集

6. 任意低精度数据类型

6.1 低精度数据的存储

6.2 在LLM中高效支持低精度

7. 实现


A4 实验

实验环境

实验结果

8.2 低精度核心性能

8.3 任意数据类型支持

8.4 端到端性能

8.5 案例研究


A5 结论

本文介绍了Tilus,一个为高效低精度LLM服务设计的GPGPU虚拟机,它解决了现有解决方案的关键局限性。Tilus的核心特性包括:用于线程块寄存器内张量分布的代数布局系统,具有精细内存管理的线程块级编程模型,以及对1到8位任意精度的子字节数据类型的广泛支持。实验结果表明,与Triton和Ladder等最先进的框架相比,Tilus取得了显著的性能提升,展示了其方法的灵活性和可扩展性。这项工作为高效和可扩展的LLM推理奠定了基础,为在新兴硬件、先进量化技术和多样化低精度格式方面的进一步优化铺平了道路。


A6 附录

A. 布局形式化

B. 优化的矩阵乘法

C. 程序编译和运行时

D. 量化核心的性能分析