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

[ARM] Multiheadattention #4463

Merged
merged 13 commits into from
Feb 23, 2023
Merged

[ARM] Multiheadattention #4463

merged 13 commits into from
Feb 23, 2023

Conversation

EdVince
Copy link
Contributor

@EdVince EdVince commented Jan 10, 2023

  1. 原本的fp32实现修改为与x86的同步,都是调用gemm
  2. 新增fp16的实现,只有softmax用fp32,其它都用fp16
  3. bf16不打算支持
  4. test中增加了白名单,对于mha的test来说,放宽2倍就能过test,这里给了5倍

@codecov-commenter
Copy link

codecov-commenter commented Jan 10, 2023

Codecov Report

Merging #4463 (b9df882) into master (47ea287) will decrease coverage by 0.09%.
The diff coverage is 100.00%.

@@            Coverage Diff             @@
##           master    #4463      +/-   ##
==========================================
- Coverage   94.72%   94.63%   -0.09%     
==========================================
  Files         726      726              
  Lines      194540   191451    -3089     
==========================================
- Hits       184275   181184    -3091     
- Misses      10265    10267       +2     
Impacted Files Coverage Δ
src/layer/arm/multiheadattention_arm.cpp 100.00% <100.00%> (+0.67%) ⬆️
src/command.cpp 70.32% <0.00%> (-18.71%) ⬇️
src/layer/arm/convolution_3x3.h 64.53% <0.00%> (-3.98%) ⬇️
src/layer/vulkan/packing_vulkan.cpp 80.04% <0.00%> (-3.54%) ⬇️
src/pipeline.cpp 58.69% <0.00%> (-2.18%) ⬇️
src/layer/vulkan/reshape_vulkan.cpp 92.01% <0.00%> (-2.14%) ⬇️
src/gpu.cpp 80.76% <0.00%> (-1.96%) ⬇️
src/layer/arm/flatten_arm.cpp 97.26% <0.00%> (-1.92%) ⬇️
src/layer/vulkan/permute_vulkan.cpp 96.99% <0.00%> (-1.60%) ⬇️
src/layer/vulkan/reorg_vulkan.cpp 96.35% <0.00%> (-1.57%) ⬇️
... and 117 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

@EdVince EdVince changed the title Multiheadattention ARM [ARM] Multiheadattention and GELU Jan 10, 2023
@EdVince EdVince changed the title [ARM] Multiheadattention and GELU [ARM] Multiheadattention Jan 10, 2023
@wangtiance
Copy link

请教一下,softmax是否只能用fp32实现?fp16是否精度不够?如果输入值是int8/int16,也要先转化为浮点数?

@EdVince
Copy link
Contributor Author

EdVince commented Jan 19, 2023

请教一下,softmax是否只能用fp32实现?fp16是否精度不够?如果输入值是int8/int16,也要先转化为浮点数?

Softmax本就是一个对精度很明感的计算,如果multiheadattention里softmax也用fp16的话,精度会掉的很厉害,特别是输入的维度比较大的时候。pr3940是白座实现的int8的multiheadattention,可以看到它在softmax处也是用了float来算。在我看过的一些芯片上的softmax的硬件设计中,对于softmax他们都是选择输入int8输出float这样子的。不过也有全用int8来做的softmax,这个我就不太了解了。Softmax的计算确实是一个很明显的瓶颈,但无奈它又是一个精度敏感算子,尽量能用fp32还是用fp32的好。

@wangtiance
Copy link

请教一下,softmax是否只能用fp32实现?fp16是否精度不够?如果输入值是int8/int16,也要先转化为浮点数?

Softmax本就是一个对精度很明感的计算,如果multiheadattention里softmax也用fp16的话,精度会掉的很厉害,特别是输入的维度比较大的时候。pr3940是白座实现的int8的multiheadattention,可以看到它在softmax处也是用了float来算。在我看过的一些芯片上的softmax的硬件设计中,对于softmax他们都是选择输入int8输出float这样子的。不过也有全用int8来做的softmax,这个我就不太了解了。Softmax的计算确实是一个很明显的瓶颈,但无奈它又是一个精度敏感算子,尽量能用fp32还是用fp32的好。

感谢解释!我也是在AI推理芯片上做算法的,不知道有没有人尝试过干脆把softmax换成别的归一化函数,对定点数友好一点的。

@EdVince
Copy link
Contributor Author

EdVince commented Jan 19, 2023

请教一下,softmax是否只能用fp32实现?fp16是否精度不够?如果输入值是int8/int16,也要先转化为浮点数?

Softmax本就是一个对精度很明感的计算,如果multiheadattention里softmax也用fp16的话,精度会掉的很厉害,特别是输入的维度比较大的时候。pr3940是白座实现的int8的multiheadattention,可以看到它在softmax处也是用了float来算。在我看过的一些芯片上的softmax的硬件设计中,对于softmax他们都是选择输入int8输出float这样子的。不过也有全用int8来做的softmax,这个我就不太了解了。Softmax的计算确实是一个很明显的瓶颈,但无奈它又是一个精度敏感算子,尽量能用fp32还是用fp32的好。

感谢解释!我也是在AI推理芯片上做算法的,不知道有没有人尝试过干脆把softmax换成别的归一化函数,对定点数友好一点的。

一步到位,换一个算力更大的芯片得了。

@wangtiance
Copy link

请教一下,softmax是否只能用fp32实现?fp16是否精度不够?如果输入值是int8/int16,也要先转化为浮点数?

Softmax本就是一个对精度很明感的计算,如果multiheadattention里softmax也用fp16的话,精度会掉的很厉害,特别是输入的维度比较大的时候。pr3940是白座实现的int8的multiheadattention,可以看到它在softmax处也是用了float来算。在我看过的一些芯片上的softmax的硬件设计中,对于softmax他们都是选择输入int8输出float这样子的。不过也有全用int8来做的softmax,这个我就不太了解了。Softmax的计算确实是一个很明显的瓶颈,但无奈它又是一个精度敏感算子,尽量能用fp32还是用fp32的好。

感谢解释!我也是在AI推理芯片上做算法的,不知道有没有人尝试过干脆把softmax换成别的归一化函数,对定点数友好一点的。

一步到位,换一个算力更大的芯片得了。

haha, 能用钱解决的都不是问题

@nihui nihui mentioned this pull request Jan 29, 2023
14 tasks
@Baiyuetribe
Copy link
Contributor

该优化在M2上效果明显,可以考虑合并;另外也非常期待Vulkan优化
image
arm优化后比原始方案提速4倍

@nihui
Copy link
Member

nihui commented Feb 20, 2023

arm82/arm86 ci 没过呀

@EdVince
Copy link
Contributor Author

EdVince commented Feb 20, 2023

arm82/arm86 ci 没过呀

我看android的过了,这linux的是需要什么特别的设置的吗?

@nihui
Copy link
Member

nihui commented Feb 20, 2023

arm82/arm86 ci 没过呀

我看android的过了,这linux的是需要什么特别的设置的吗?

android ci 只有编译,没有跑test,linux 会跑 test

@nihui nihui merged commit ff80ac2 into Tencent:master Feb 23, 2023
@nihui
Copy link
Member

nihui commented Feb 23, 2023

Thanks for your contribution !

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

Successfully merging this pull request may close these issues.

5 participants