Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Inference] Add the quant_linear_fuse_pass #58637

Merged
merged 18 commits into from
Nov 22, 2023

Conversation

Wanglongzhi2001
Copy link
Contributor

@Wanglongzhi2001 Wanglongzhi2001 commented Nov 3, 2023

PR types

New features

PR changes

APIs

Description

使得下图所示计算图中的quant dequant weight dequant 和 matmul_v2 以及 elementwise_add 融合成 quant_linear 以便进行 int8 的推理
image
融合后结果:
image

目前实现方法:
先直接调用 delete_quant_dequant_linear_op_pass 和 delete_weight_dequant_linear_op_pass 的内容把 quant dequant 以及 weight_dequant 删掉,然后再调用自己的实现来融合剩下的 matmul_v2 以及 elementwise_add 算子变成 quant_linear

想请教的地方:

  1. 我目前这样实现把所有的 quant dequant op (包括不是在 matmul_v2 前面的) 都删掉再做融合这样是否有影响?
  2. 我目前实现 matmul_v2 和 element_wise 算子的融合是针对了 matmul_v2 算子,没有考虑到 mul 算子,因为我看有一些其他的 pass 会有将 matmul_v2 转换为 mul 算子的行为,但是目前应该是只有这个 matmul_v2 算子有 int8 的实现,所以请问这样是否有影响?
  3. 目前运行 pass 后我的 quant_linear 节点只有以下一个 attribute
    image

我不大清楚哪些 attributes 是必须的,我看 quant_linear op 的实现里有这些 attributes,请问是否这些 attributes 都要添加?
image

Copy link

paddle-bot bot commented Nov 3, 2023

你的PR提交成功,感谢你对开源项目的贡献!
请关注后续CI自动化测试结果,详情请参考Paddle-CI手册
Your PR has been submitted. Thanks for your contribution!
Please wait for the result of CI firstly. See Paddle CI Manual for details.

@paddle-bot paddle-bot bot added the contributor External developers label Nov 3, 2023
@Wanglongzhi2001
Copy link
Contributor Author

@RichardWooSJTU 吴哥麻烦帮忙看看

@RichardWooSJTU
Copy link
Contributor

RichardWooSJTU commented Nov 7, 2023

我目前这样实现把所有的 quant dequant op (包括不是在 matmul_v2 前面的) 都删掉再做融合这样是否有影响?

A: 有影响,对于含有conv算子的模型也都删掉了quant/dequant,但是并没有其他pass执行后续操作

我目前实现 matmul_v2 和 element_wise 算子的融合是针对了 matmul_v2 算子,没有考虑到 mul 算子,因为我看有一些其他的 pass 会有将 matmul_v2 转换为 mul 算子的行为,但是目前应该是只有这个 matmul_v2 算子有 int8 的实现,所以请问这样是否有影响?

A: 你的pass将matmul_v2已经删除了,并融合到了quant_linear里面。

我不大清楚哪些 attributes 是必须的

A: 每一个都是必须的,只不过会有默认值。这需要你理解每一个attr的含义及作用

@Wanglongzhi2001
Copy link
Contributor Author

我目前这样实现把所有的 quant dequant op (包括不是在 matmul_v2 前面的) 都删掉再做融合这样是否有影响?

A: 有影响,对于含有conv算子的模型也都删掉了quant/dequant,但是并没有其他pass执行后续操作

我目前实现 matmul_v2 和 element_wise 算子的融合是针对了 matmul_v2 算子,没有考虑到 mul 算子,因为我看有一些其他的 pass 会有将 matmul_v2 转换为 mul 算子的行为,但是目前应该是只有这个 matmul_v2 算子有 int8 的实现,所以请问这样是否有影响?

A: 你的pass将matmul_v2已经删除了,并融合到了quant_linear里面。

我不大清楚哪些 attributes 是必须的

A: 每一个都是必须的,只不过会有默认值。这需要你理解每一个attr的含义及作用

好的~

return elementwise_add_out_var;
}
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里还是建议匹配含有quant/dequant算子的完整pattern

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

好的



QuantLinearFusePass::QuantLinearFusePass() {
AddOpCompat(OpCompat("matmul_v2"))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

应该是匹配matmul还是matmulv2?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

计算图中显示的 op 是 matmul_v2,并且结果也表明是成功匹配到了,所以应该是 matmul_v2 吧?

@Wanglongzhi2001
Copy link
Contributor Author

@RichardWooSJTU 吴哥麻烦再 review 一下

@zhoutianzi666
Copy link
Contributor

你好,有在具体的模型上测试下这个 pass 能带来的性能提升吗?

@Wanglongzhi2001
Copy link
Contributor Author

Wanglongzhi2001 commented Nov 21, 2023

你好,有在具体的模型上测试下这个 pass 能带来的性能提升吗?

有在 bert 模型下测过 Paddle Inference 下原生 fp32 推理(不运行任何pass, 输入的大小为 (batch_size, 512),测试方法为先进行三次的 warm up ,然后运行十次取平均结果)以及只运行这一个 pass 的运行时间对比:

image


for (int i = 0; i < weight_tensor->dims()[1]; ++i) {
scale_weights[i] = 1.0f / weight_scale_data[i];
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我觉得这里拿到 weight 的 quant scale 用 for 循环的话会降低 pass 的性能,但是在目前只有 weight 的 dequant scale 的情况下,感觉也只能这样拿到 quant 的 scale 了。@zhoutianzi66

@RichardWooSJTU
Copy link
Contributor

你好,有在具体的模型上测试下这个 pass 能带来的性能提升吗?

有在 bert 模型下测过 Paddle Inference 下原生 fp32 推理(不运行任何pass, 输入的大小为 (batch_size, 512),测试方法为先进行三次的 warm up ,然后运行十次取平均结果)以及只运行这一个 pass 的运行时间对比:

image

上面的问题不是说pass的运行时间 而是推理的运行时间,pass时间不算在内;

@Wanglongzhi2001
Copy link
Contributor Author

Wanglongzhi2001 commented Nov 21, 2023

你好,有在具体的模型上测试下这个 pass 能带来的性能提升吗?

有在 bert 模型下测过 Paddle Inference 下原生 fp32 推理(不运行任何pass, 输入的大小为 (batch_size, 512),测试方法为先进行三次的 warm up ,然后运行十次取平均结果)以及只运行这一个 pass 的运行时间对比:
image

上面的问题不是说pass的运行时间 而是推理的运行时间,pass时间不算在内;

我测的是推理时间应该没错,从 predictor.run() 前面计时再到 predictor.run() 结束再次计时,对比的是任何 Pass 都不用的推理时间和只用这一个 pass 之后的推理时间。

qili93
qili93 previously approved these changes Nov 21, 2023
Copy link
Contributor

@qili93 qili93 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM for @unittest.skipIf

@RichardWooSJTU
Copy link
Contributor

RichardWooSJTU commented Nov 21, 2023

你好,有在具体的模型上测试下这个 pass 能带来的性能提升吗?

有在 bert 模型下测过 Paddle Inference 下原生 fp32 推理(不运行任何pass, 输入的大小为 (batch_size, 512),测试方法为先进行三次的 warm up ,然后运行十次取平均结果)以及只运行这一个 pass 的运行时间对比:
image

上面的问题不是说pass的运行时间 而是推理的运行时间,pass时间不算在内;

我测的是推理时间应该没错,从 predictor.run() 前面计时再到 predictor.run() 结束再次计时,对比的是任何 Pass 都不用的推理时间和只用这一个 pass 之后的推理时间。

嗯嗯 所以说和pass的实现没有关系,性能只和算子相关。看起来在大batch下还不如fake量化? 可能需要开启一下kernel选择用于算子加速

在python中 加入
paddle.base.core.enable_autotune()
paddle.base.core.update_autotune_status()

在环境变量上加入
export FLAGS_use_autotune=1
export FLAGS_cublaslt_exhaustive_search_times=10

@Wanglongzhi2001
Copy link
Contributor Author

你好,有在具体的模型上测试下这个 pass 能带来的性能提升吗?

有在 bert 模型下测过 Paddle Inference 下原生 fp32 推理(不运行任何pass, 输入的大小为 (batch_size, 512),测试方法为先进行三次的 warm up ,然后运行十次取平均结果)以及只运行这一个 pass 的运行时间对比:
image

上面的问题不是说pass的运行时间 而是推理的运行时间,pass时间不算在内;

我测的是推理时间应该没错,从 predictor.run() 前面计时再到 predictor.run() 结束再次计时,对比的是任何 Pass 都不用的推理时间和只用这一个 pass 之后的推理时间。

嗯嗯 所以说和pass的实现没有关系,性能只和算子相关。看起来在大batch下还不如fake量化? 可能需要开启一下kernel选择用于算子加速

在python中 加入 paddle.base.core.enable_autotune() paddle.base.core.update_autotune_status()

在环境变量上加入 export FLAGS_use_autotune=1 export FLAGS_cublaslt_exhaustive_search_times=10

好的

Copy link
Contributor

@qili93 qili93 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM for @unittest.skipIf

@yuanlehome yuanlehome merged commit 6747af6 into PaddlePaddle:develop Nov 22, 2023
28 checks passed
@yuanlehome yuanlehome changed the title add the quant_linear_fuse_pass [Inference] Add the quant_linear_fuse_pass Nov 22, 2023
SecretXV pushed a commit to SecretXV/Paddle that referenced this pull request Nov 28, 2023
@Wanglongzhi2001
Copy link
Contributor Author

Wanglongzhi2001 commented Feb 5, 2024

在python中 加入
paddle.base.core.enable_autotune()
paddle.base.core.update_autotune_status()

在环境变量上加入
export FLAGS_use_autotune=1
export FLAGS_cublaslt_exhaustive_search_times=10

添加环境变量后,分别测试在原生 fp32 和原生 int8 下的的测试结果如下:
模型:macbert-large-chinese(3.35亿参数)
测试环境:A100

image

由于原生 fp32 有一些例如 multihead_matmul_fuse 等额外加速推理的算子融合 pass 在当前这个 int8 融合算子后不支持,所以当前 int8 的加速只是纯算子运算速度层面的加速,后续还有很多 pass 层面的加速空间。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
contributor External developers
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants