lmdeploy icon indicating copy to clipboard operation
lmdeploy copied to clipboard

GPTQ 和 AWQ 的推理 kernel 能否互用?

Open sleepwalker2017 opened this issue 1 year ago • 7 comments

请教个量化相关的问题,看起来 GPTQ 和 AWQ 在推理阶段的代码语义是一致的,都是通过 zero/scale/q_weight得到原始的权重然后和激活进行 GEMM,量化的 group size 一致,且都是 per-channel的。

所以在推理阶段,两个kernel 的代码能否互通使用呢?

感谢

sleepwalker2017 avatar May 21 '24 04:05 sleepwalker2017

权重 layout 调整好了理论上是可以的

lzhangzz avatar May 22 '24 07:05 lzhangzz

权重 layout 调整好了理论上是可以的

好的感谢!所以评估的时候说GPTQ 更快或者 AWQ 更快其实没有意义对吧,只能说某个实现更快。

另外,有个新的论文不知道你们是否研究过,代码仓库在这里,一个更快的int4fp16的实现。 https://github.com/SqueezeBits/QUICK?tab=readme-ov-file

sleepwalker2017 avatar May 22 '24 08:05 sleepwalker2017

另外,有个新的论文不知道你们是否研究过,代码仓库在这里,一个更快的int4fp16的实现。

这玩意并不快。

lzhangzz avatar May 22 '24 08:05 lzhangzz

另外,有个新的论文不知道你们是否研究过,代码仓库在这里,一个更快的int4fp16的实现。

这玩意并不快。

感谢!我看论文以为发现了新世界。 他里面声称反量化过程中存在 bank 冲突你了解吗? 我没看到他有详细的解释,一直很懵,我测试的代码,比如一个 warp 内的相邻线程同时向shared_memory的相邻地址写入64bit数据,虽然线程 0 和线程 16 是写入同一个 bank,但是实际上profile 是没有 bank 冲突的。 大佬如果了解这块的话,求指点!

sleepwalker2017 avatar May 22 '24 09:05 sleepwalker2017

layout 调整好了就没有 bank conflict

比如一个 warp 内的相邻线程同时向shared_memory的相邻地址写入64bit数据,虽然线程 0 和线程 16 是写入同一个 bank,但是实际上profile 是没有 bank 冲突的。

32 个 32-bit 的 bank 无法同时执行 32 个 64-bit 读写操作。64-bit 读写操作是分 0-15 和 16-31 两步执行的,也可以理解为 64-bit 读写只有 16 个 bank。

lzhangzz avatar May 22 '24 09:05 lzhangzz

@sleepwalker2017

Page 66 of this GTC talk

lzhangzz avatar May 22 '24 10:05 lzhangzz

layout 调整好了就没有 bank conflict

比如一个 warp 内的相邻线程同时向shared_memory的相邻地址写入64bit数据,虽然线程 0 和线程 16 是写入同一个 bank,但是实际上profile 是没有 bank 冲突的。

32 个 32-bit 的 bank 无法同时执行 32 个 64-bit 读写操作。64-bit 读写操作是分 0-15 和 16-31 两步执行的,也可以理解为 64-bit 读写只有 16 个 bank。

嗯嗯理解,这种情况下没有冲突。所以那篇论文里号称的反量化过程中的 bank 冲突实际是不存在的是吗?

另外他说的是省去了从shared memory 到寄存器之间的读写,这一块实际上不如我们这边的 kernel 高效是吗?

sleepwalker2017 avatar May 22 '24 10:05 sleepwalker2017

所以那篇论文里号称的反量化过程中的 bank 冲突实际是不存在的是吗?

还是要看具体怎么做的

另外他说的是省去了从shared memory 到寄存器之间的读写,这一块实际上不如我们这边的 kernel 高效是吗?

大家都是这么做的

lzhangzz avatar May 31 '24 13:05 lzhangzz

所以那篇论文里号称的反量化过程中的 bank 冲突实际是不存在的是吗?

还是要看具体怎么做的

另外他说的是省去了从shared memory 到寄存器之间的读写,这一块实际上不如我们这边的 kernel 高效是吗?

大家都是这么做的

感谢 学习了!

sleepwalker2017 avatar May 31 '24 19:05 sleepwalker2017