第 38 题:稀疏化(sparsity)如何被编译器利用?2:4 structured sparsity的硬件支持?
题目
稀疏化(sparsity)如何被编译器利用?2:4 structured sparsity的硬件支持?
完整讲解
一、稀疏化如何被编译器利用?
稀疏化(sparsity)指权重或激活中大量为 0;编译器可 识别稀疏表示(如 COO、CSR、block-sparse、2:4 结构)并做:一、 选 稀疏 kernel(只算非零或按块跳过);二、 图改写(把 dense op 换成 sparse op、或插入稀疏格式转换);三、 与融合/调度结合(如稀疏 matmul 后接的激活可融合进同一 kernel)。前提是 IR 或前端能表达「稀疏」——要么用稀疏类型/属性,要么用专门 op(如 SparseTensor、2:4 压缩 op)。
二、2:4 structured sparsity 是什么?
2:4 稀疏:每连续 4 个元素中恰好 2 个非零(2 个为 0);是 NVIDIA 在 Ampere 上支持的格式,硬件可 一条指令 完成「2:4 稀疏 × 稠密」的乘加,吞吐高于纯稠密。编译器/库(如 cuSPARSELt)需要:一、 把权重量化成 2:4 格式(含索引/元数据);二、 在图上用 2:4 稀疏 op(或调用库)替代原 dense matmul;三、 保证 layout 与硬件约定一致(如 4 元组内 2 非零的索引编码)。
三、硬件支持与编译配合
- Ampere 及更新:Tensor Core 支持 2:4 稀疏 GEMM;编译器/运行时选「稀疏 GEMM」实现,并保证权重已按 2:4 剪枝与编码。
- 剪枝:2:4 通常由 训练时或训后剪枝 得到,编译器侧主要做 格式转换 + 图替换,不负责「剪哪两个」。
- 其他稀疏:非 2:4 的稀疏(如任意稀疏、block-sparse)多由 软件 实现(稀疏 kernel、或先解压再算);编译器可做稀疏 op 融合、layout 选择等。
面试要点
- 编译器利用稀疏:选稀疏 kernel、图改写为稀疏 op、与融合/调度结合;需 IR 能表达稀疏类型或稀疏 op。
- 2:4:每 4 元组中 2 非零;Ampere+ 有硬件支持,编译器/库用 2:4 op 替代 dense matmul,权重要按 2:4 编码。
- 2:4 由训练/剪枝得到;编译器做格式与图替换;其他稀疏多软件实现。
记忆要点
- 稀疏利用:稀疏 kernel、图改写、融合;IR 需能表达稀疏或专用 op。
- 2:4 = 每 4 个中 2 个非零;Ampere Tensor Core 支持,需权重 2:4 编码。
- 编译器做 2:4 图替换与格式对接;非 2:4 稀疏多走软件 kernel。