KuangjuX / Paper-reading

My Paper Reading Lists and Notes.
15 stars 1 forks source link

BOLT: BRIDGING THE GAP BETWEEN AUTO-TUNERS AND HARDWARE-NATIVE PERFORMANCE #28

Closed KuangjuX closed 11 months ago

KuangjuX commented 11 months ago

BOLT: BRIDGING THE GAP BETWEEN AUTO-TUNERS AND HARDWARE-NATIVE PERFORMANCE

Introduction

Ansor 搜索花费时间长,性能又不好;因此希望借助 cutlass 进行模版化搜索,希望兼顾这两者。 本篇论文的贡献:

Motivation

当前关于 Auto-tunner 会造成与原生的 Nvidia SDK 库有较大的性能差异以及无效率的搜索。本篇文章的关注点在于使用模版库可以使 auto-tuners 的空间缩紧。

Insights

Graph Level Enable deeper operator fusion. Bolt 开发了一个叫 persistent kernel fusion 的技术用来提高性能。算子融合可以将多个算子融合成一个算子来提升性能。例如将 Conv2D + BiasAdd + Hardswish 在一个 kernel 中去提升性能,但是这种可能不会被 cuDNN 等库所支持。

Operator Level Operator level: Automating templated code generation. Bolt 设计了一个轻量级的 profiler 进行自动搜索,搜索的结果随后被放在模版中并生成底层代码。

Design

Bolt 追随 BYOC 的路径,对张量程序绘制合适子图并将其卸载到 Bolt 进行优化。首先从流行框架的 DNN model 开始,Bolt 首先复用 TVM 前端将其解析为 relay graph。在图上进行计算图优化(deeper operator fusion)和 graph partition。Bolt 接下来执行 hardware-native profilling 去搜索最好的 kernel。最终 Bolt 生成高性能的 CUDA 代码。

Enabling deeper operator fusion

Figure4(a) 展示了使用 epilogue 作为融合的基础,同时融合多个 GEMM 或者 Conv 进入一个单的算子用于提升性能:

Figure4(b) 展示了 persistent kernel fusion 在 kernel 级别的视角。

Prerequisite: Epilogue fusion. Cutlass 的 epilogue 模式包括:

Persistent kernel (GEMM/Conv) fusion

Persistent kernel 允许将多个 GEMMs 和 Conv 融合到一个算子用来提升性能。

Key property: Threadblock residence. 计算持久化内核融合的挑战在于计算第二个 GEMM/Conv 时不去从全局内存中加载它的 input activation。这就要求第一阶段 GEMM/Conv 输出的每个 threadblock 保留在第二个输入的 GEMM/Conv 相同的线程块中。论文中叫做 threadblock residence。如果不能做到这个,第二阶段的 GEMM/Conv 不得不从全局内存中加载内存,就消除了持久化 kernel 融合的优势。对于 GEMM fusion,要求对于每个算子 ThreadBlock_N = GEMM_N。对于 Conv,要求 ThreadBlock N = Conv output channel。

RF-resident fusion.

Sharded memory-resident fusion. 当 GEMM_N 更大时有更高的 RF 压力,因此使用 sharded memory-resident fusion 用于缓解 warp size 的限制。在第二阶段的 GEMM/Conv 需要在 warp 共享时,数据可以暂存在共享内存中。Figure7 展示了一个例子,计算 D1 需要 N 维度的多个 warp tile 流式传输 fragments。因此在 GEMM0 阶段在累加器产生的数据必须从 RF 加载到 sharded memory 为了加载 GEMM1。每个 warp 所拥有的数据将被在下一层进行共享。为了能够进行 sharded memory-resident fusion,本篇论文实现了一个 smem fragment iterator 可以把 accumulator tile 存到 sharded memory 中,之后从第二阶段的 GEMM 中的共享内存中取值。

Automating templated code generation

Light-weight performance profiler

Bolt 设计了一个轻量级的 performance profiler 用于搜索最好的模版参数。具体来说,Bolt 首先提取 CUTLASS 模版相关的性能参数,包括 threadblock,warp 和 instruction shape, swizzling functor 和 stages 等等。随后确定它们可能的值通过具体的 GPU 体系结构和 Auto-tunner。Hardware-specific guideline 包含以下几个方面:

Templated code generation

Evaluation

Microbenchmarks

GEMM/Conv2D

从 BERT 和 ResNet-50 这些模型中提取了一些内部算子做 micro benchmark,和 Ansor 的性能做对比。