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

静态图推理如何开启AMP? #56491

Closed
Zhiwei35 opened this issue Aug 21, 2023 · 26 comments
Closed

静态图推理如何开启AMP? #56491

Zhiwei35 opened this issue Aug 21, 2023 · 26 comments
Assignees
Labels

Comments

@Zhiwei35
Copy link

Zhiwei35 commented Aug 21, 2023

hello, 我想要用静态图做AMP推理,然而我查阅了paddle文档后,只发现有静态图训练的AMP enable方法,没有发现推理的AMP enable方法,请问可以帮我看看如何解决静态图AMP推理吗?谢谢,文档链接,简易代码如下

  with paddle.static.program_guard(main_prog, startup_prog):

        input_ids = paddle.static.data(
            name="input_ids",
            shape=shape,
            dtype="int64",
        )

        token_type_ids = paddle.static.data(
            name="token_type_ids",
            shape=shape,
            dtype="int64",
        )
       
        model = ErnieModel()
        out = model(input_ids, token_type_ids)
        exe = paddle.static.Executor(device)
        rst = exe.run(
                main_prog,
                feed={"input_ids": input_ids_data,
                      "token_type_ids": token_type_ids_data},
                fetch_list=[out],
            )
@carryyu
Copy link
Contributor

carryyu commented Aug 21, 2023

推理只与导出推理模型时的精度有关,如果导出的是FP32类型的推理模型,可按照如下方式进行转换:
https://www.paddlepaddle.org.cn/inference/v2.5/api_reference/python_api_doc/create_predictor.html#convert-to-mixed-precision

@Zhiwei35
Copy link
Author

感谢解答,我尝试后再来反馈一下

@Zhiwei35 Zhiwei35 added the AMP label Aug 21, 2023
@Zhiwei35
Copy link
Author

Zhiwei35 commented Aug 21, 2023

推理只与导出推理模型时的精度有关,如果导出的是FP32类型的推理模型,可按照如下方式进行转换: https://www.paddlepaddle.org.cn/inference/v2.5/api_reference/python_api_doc/create_predictor.html#convert-to-mixed-precision

hello,我用你推荐的方法试了一下ernie的fp16转换,我理解这个就是apply个pass做graph rewrite,与我实际的device无关,于是我在Intel GPU上按照文档示例直接跑,请问如下结果正常吗?我理解ernie应该不至于一个op都不在fp16白名单上,感谢解答

black_list = set()

convert_to_mixed_precision(
    './ErnieWithMHAfp32_infer.pdmodel',     # fp32模型文件路径
    './ErnieWithMHAfp32_infer.pdiparams',    # fp32权重文件路径
    './ErnieWithMHAfp16_infer.pdmodel',     # 混合精度模型文件保存路径
    './ErnieWithMHAfp16_infer.pdiparams',    # 混合精度权重文件保存路径
    PrecisionType.Half, # 转换精度,如 PrecisionType.Half
    PlaceType.GPU,      # 后端,如 PlaceType.GPU
    True,               # 保留输入输出精度信息,若为 True 则输入输出保留为 fp32 类型,否则转为 precision 类型
    black_list          # 黑名单列表,哪些 op 不需要进行精度类型转换
)

最后的打印结果显示低精op为0:
I0821 02:10:04.653637 592229 executor.cc:187] Old Executor is Running.
I0821 02:10:06.338765 592229 auto_mixed_precision_pass.cc:300] The number of ops run at low precision [0/911]

@carryyu
Copy link
Contributor

carryyu commented Aug 21, 2023

@vivienfanghuagood 麻烦关注一下这个issue,在intel GPU上的低精度Kernel支持~

@vivienfanghuagood
Copy link
Contributor

推理只与导出推理模型时的精度有关,如果导出的是FP32类型的推理模型,可按照如下方式进行转换: https://www.paddlepaddle.org.cn/inference/v2.5/api_reference/python_api_doc/create_predictor.html#convert-to-mixed-precision

hello,我用你推荐的方法试了一下ernie的fp16转换,我理解这个就是apply个pass做graph rewrite,与我实际的device无关,于是我在Intel GPU上按照文档示例直接跑,请问如下结果正常吗?我理解ernie应该不至于一个op都不在fp16白名单上,感谢解答

black_list = set()

convert_to_mixed_precision(
    './ErnieWithMHAfp32_infer.pdmodel',     # fp32模型文件路径
    './ErnieWithMHAfp32_infer.pdiparams',    # fp32权重文件路径
    './ErnieWithMHAfp16_infer.pdmodel',     # 混合精度模型文件保存路径
    './ErnieWithMHAfp16_infer.pdiparams',    # 混合精度权重文件保存路径
    PrecisionType.Half, # 转换精度,如 PrecisionType.Half
    PlaceType.GPU,      # 后端,如 PlaceType.GPU
    True,               # 保留输入输出精度信息,若为 True 则输入输出保留为 fp32 类型,否则转为 precision 类型
    black_list          # 黑名单列表,哪些 op 不需要进行精度类型转换
)

最后的打印结果显示低精op为0: I0821 02:10:04.653637 592229 executor.cc:187] Old Executor is Running. I0821 02:10:06.338765 592229 auto_mixed_precision_pass.cc:300] The number of ops run at low precision [0/911]

具体是什么型号呢?麻烦贴一下,以及问题复现的脚本~

@Zhiwei35
Copy link
Author

Zhiwei35 commented Aug 22, 2023

hi @vivienfanghuagood @carryyu ,感谢帮助~目前已经可以成功apply AMP pass,但是目前遇到了一个困难在于AMP pass无法指定白名单,只能指定黑名单。因为我的图里面有一个自定义的fp16 op,这个op在AMP pass里面不认识,所以AMP pass会把这个fp16的输入输出全部cast为fp32,导致这个fp16 op无法launch。希望可以再提供一点点帮助,感谢
具体如下图为我的含fp16 MHA的原始graph:
image
apply AMP pass后,我自定义的fp16 op就被cast为fp32了:
image

@vivienfanghuagood
Copy link
Contributor

hi @vivienfanghuagood @carryyu ,感谢帮助~目前已经可以成功apply AMP pass,但是目前遇到了一个困难在于AMP pass无法指定白名单,只能指定黑名单。因为我的图里面有一个自定义的fp16 op,这个op在AMP pass里面不认识,所以AMP pass会把这个fp16的输入输出全部cast为fp32,导致这个fp16 op无法launch。希望可以再提供一点点帮助,感谢 具体如下图为我的含fp16 MHA的原始graph: image apply AMP pass后,我自定义的fp16 op就被cast为fp32了: image

@yuanlehome 麻烦远乐关注一下convert_to_mixed_precision对自定义算子兼容的问题~

@yuanlehome
Copy link
Contributor

hi @vivienfanghuagood @carryyu ,感谢帮助~目前已经可以成功apply AMP pass,但是目前遇到了一个困难在于AMP pass无法指定白名单,只能指定黑名单。因为我的图里面有一个自定义的fp16 op,这个op在AMP pass里面不认识,所以AMP pass会把这个fp16的输入输出全部cast为fp32,导致这个fp16 op无法launch。希望可以再提供一点点帮助,感谢 具体如下图为我的含fp16 MHA的原始graph: image apply AMP pass后,我自定义的fp16 op就被cast为fp32了: image

@yuanlehome 麻烦远乐关注一下convert_to_mixed_precision对自定义算子兼容的问题~

情况已经了解。我们会在convert_to_mixed_precision中新增一个可选参数white_list来支持自定义算子的情况,预计代码明后两天可合入develop。

@Zhiwei35
Copy link
Author

hi @vivienfanghuagood @carryyu ,感谢帮助~目前已经可以成功apply AMP pass,但是目前遇到了一个困难在于AMP pass无法指定白名单,只能指定黑名单。因为我的图里面有一个自定义的fp16 op,这个op在AMP pass里面不认识,所以AMP pass会把这个fp16的输入输出全部cast为fp32,导致这个fp16 op无法launch。希望可以再提供一点点帮助,感谢 具体如下图为我的含fp16 MHA的原始graph: image apply AMP pass后,我自定义的fp16 op就被cast为fp32了: image

@yuanlehome 麻烦远乐关注一下convert_to_mixed_precision对自定义算子兼容的问题~

情况已经了解。我们会在convert_to_mixed_precision中新增一个可选参数white_list来支持自定义算子的情况,预计代码明后两天可合入develop。

非常感谢!

@yuanlehome
Copy link
Contributor

hi, 您那边是否可以基于这个pr测试一下呢?#56535

@Zhiwei35
Copy link
Author

好的,多谢,我试试

@Zhiwei35
Copy link
Author

Zhiwei35 commented Aug 23, 2023

hello @yuanlehome ,我拉你的分支试了一下,没有起作用,自定义的multihead_attention依然会被转为fp32,用法如下:
image

@yuanlehome
Copy link
Contributor

yuanlehome commented Aug 23, 2023

hello @yuanlehome ,我拉你的分支试了一下,没有起作用,自定义的multihead_attention依然会被转为fp32,用法如下: image

set这么使用呢?set(['multihead_attention']),如果还不行,你方便把模型发我一份嘛?我测一下 email: liuyuanle@baidu.com

@Zhiwei35
Copy link
Author

hello @yuanlehome ,我拉你的分支试了一下,没有起作用,自定义的multihead_attention依然会被转为fp32,用法如下: image

你方便把模型发我一份嘛?我测一下 email: liuyuanle@baidu.com

参数文件太大了,只能发模型文件,这样你能测到吗?

@yuanlehome
Copy link
Contributor

hello @yuanlehome ,我拉你的分支试了一下,没有起作用,自定义的multihead_attention依然会被转为fp32,用法如下: image

你方便把模型发我一份嘛?我测一下 email: liuyuanle@baidu.com

参数文件太大了,只能发模型文件,这样你能测到吗?

那我这边想办法搞个demo模型,复现并测试吧~

@yuanlehome
Copy link
Contributor

yuanlehome commented Aug 23, 2023

您那边测试的时候麻烦加上 GLOG_vmodule=auto_mixed_precision_pass=4 python ... 看下完整log

另外 set务必这么使用 white_list=set(['multihead_attention'])

@Zhiwei35
Copy link
Author

嗯,感谢,按照你的guide跑了一下,已经email你log

可以考虑写一个包含某个不在白名单的op的model来简单测试一下

@yuanlehome
Copy link
Contributor

hi, 已收到email,并且分析到了原因,现在请再pull pr最新commit尝试一下~

@Zhiwei35
Copy link
Author

Zhiwei35 commented Aug 24, 2023

hello yuanle,非常感谢帮助,现在已经可以成功拿到AMP graph,不过还有一个小建议,看能不能加个postprocess在AMP pass,如下图,1 2两个cast可以相互抵消,1是fp16tofp32,2是fp32tofp16;3是fp16tofp16,可以去掉;这样对性能会有一些小提升
image

@yuanlehome
Copy link
Contributor

hello yuanle,非常感谢帮助,现在已经可以成功拿到AMP graph,不过还有一个小建议,看能不能加个postprocess在AMP pass,如下图,1 2两个cast可以相互抵消,1是fp16tofp32,2是fp32tofp16;3是fp16tofp16,可以去掉;这样对性能会有一些小提升 image

根据你的建议已经做了相关优化,请再次测试pr最新commit并给出反馈。

@Zhiwei35
Copy link
Author

hello yuanle,还有一种fp16tofp16的cast没有消除
image

@yuanlehome
Copy link
Contributor

hello yuanle,还有一种fp16tofp16的cast没有消除 image

不应该,cast输入输出类型相同的情况也会被消除的才对。可以把最后一次转换前后的pdmodel文件发我一下吗?

@Zhiwei35
Copy link
Author

模型可能不太方便给,转换前的graph如下,转换后的graph就是上面这个chat展示的,另外就是,你branch的最新commit跑转换后的graph会报错,错误也比较奇怪,说传到我自定义kernel的dtype是fp32,然而转换后的graph里面,multihead_attention的所有输入是fp16,为上图cast的输出。然后回退到你23号的commit,重新AMP,得到我标 1 2 3的那个图,可以跑
image
image

@yuanlehome
Copy link
Contributor

yuanlehome commented Aug 25, 2023

模型可能不太方便给,转换前的graph如下,转换后的graph就是上面这个chat展示的,另外就是,你branch的最新commit跑转换后的graph会报错,错误也比较奇怪,说传到我自定义kernel的dtype是fp32,然而转换后的graph里面,multihead_attention的所有输入是fp16,为上图cast的输出。然后回退到你23号的commit,重新AMP,得到我标 1 2 3的那个图,可以跑 image image

只需要转换前后的模型文件,不需要权重文件,可以吗?这些截图不全,我看不到完整信息,分析有障碍。。

@yuanlehome
Copy link
Contributor

Hello, 模型已收到,请拉取这个bug fix pr #56664 再次测试~

@Zhiwei35
Copy link
Author

@yuanlehome @vivienfanghuagood 问题解决,感谢帮助

@paddle-bot paddle-bot bot added status/close 已关闭 and removed status/new-issue 新建 labels Aug 30, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants