腾讯java开发面试难不难,【端智能】MNN CPU性能优化年度小,上岸蚂蚁金服

在卷积算子的实现中,上一节增加的 Pack 过程可以与 Im2Col 过程合并,仅在Im2Col过程中增加一些转置指令,不影响内存读写的瓶颈耗时。

首先我们看原始的实现,以 w=4,h=2,c=4,n=1,kx=3,ky=1 为例,我们需要先基于NC4HW4布局进行Im2Col,再把Im2Col的结果转换到c,ep的内存布局。

为了对Im2Col和Pack进行合并,我们注意到在w和c的方向上,内存的搬运是有连续性的,因此可以先计算出一个包含一系列矩形框的“骨架”(最多含有),每个矩阵框包含源地址、目标偏移、矩形大小等信息,然后再根据这些矩形框,逐个连续从输入源取值并转置到目标位置上。

示例流程如下图:

经过这个优化之后,我们和Google 提出的 的 Indirect Convolution Algorithm (集成在 XNNPack)进行了对比测试,由下表数据可见,在汇编都进行了深度优化的基础上,MNN 的 Im2Col-Pack Fuse - GEMM 卷积算法比XNNPack略优,此外,在非 1x1 卷积(矩阵乘即可,不需要额外处理)较多的模型,综合了 Winograd 算法的 MNN 则明显快于 Tflite-XNNPack 。

A76 上测试数据:

| 引擎 | Mobilenet v1/ms | Squeezenet v1.0 /ms | InceptionV3 / ms |

| — | — | — | — |

|

Tflite-XNNPack

|

33.696

|

54.563

|

342.066

|

|

MNN-(限定Im2Col-GEMM)

|

31.618

|

49.406

|

325.549

|

|

MNN

|

31.997

|

35.463

|

240.169

|

硬件相关优化

  ARM 调优

在算子优化的基础上,我们对ARM汇编做了进一步的精细调优,包括但不限于:

  • 矩阵乘/packing等广泛存在的存储指令ld* 优化为stp,读取指令选取合适的优化为ldp。

  • 部分合适的代码优化为读写双pipeline并行,

  • 部分简单指令例如 sub add指令hide到耗时长指令之内

  x64-AVX2

主流PC/服务器均支持AVX2的SIMD计算,它有16个256位的向量寄存器,一次可计算8个浮点数。

基于之前的算子优化,我们将 AVX2 的矩阵乘定为24x1x4,并编写汇编深度调优,提升了70%-100%的性能,使AVX2上MNN多数模型运行性能接近或超过理论浮点峰值(注:部分模型用Winograd算法加速,为了和训练框架的统计保证一致,模型计算量仍按滑窗计算)。

  x64-AVX512

Intel出的Xeon处理器增加了AVX512指令集,支持512位的向量寄存器,一次可计算16个浮点数,更新的AVX512-VNNI指令集追加了uint8-int8的dot指令,可以一次性计算32个整型乘加。

dot指令-vpdpbusd

FOR j := 0 to 7

tmp1.word := Signed(ZeroExtend16(a.byte[4j]) * SignExtend16(b.byte[4j]))

tmp2.word := Signed(ZeroExtend16(a.byte[4j+1]) * SignExtend16(b.byte[4j+1]))

tmp3.word := Signed(ZeroExtend16(a.byte[4j+2]) * SignExtend16(b.byte[4j+2]))

tmp4.word := Signed(ZeroExtend16(a.byte[4j+3]) * SignExtend16(b.byte[4j+3]))

dst.dword[j] := src.dword[j] + tmp1 + tmp2 + tmp3 + tmp4

ENDFOR

dst[MAX:256] := 0

在Intel同事的支持下,我们借助AVX512的16单位浮点乘加指令与dot量化计算指令,在AVX2优化的基础上,使浮点矩阵乘加速 60%(1024x1024x1024矩阵由24ms下降到15ms),量化计算加速200%(单测用例31.53ms下降到10.15ms)。

低精度计算

  半精度浮点

采用16位浮点替代浮点计算,一般对精度影响不大,不但能加速,还可以减少一半的内存占用。

2018年之后的新手机大都支持 ARMv8.2 指令集,它支持了FP16的SIMD计算,可以达到浮点的两倍性能。

MNN在2020年即已支持这一功能,在算子统一的基础之上,我们重新设计并实现了ARMv8.2的矩阵分块方案与相应汇编代码,取得了进一步的性能提升。此外,为了满足部分应用使用32位架构部署的需求(减少包大小),我们也把FP16计算相关汇编同步编写了一份32位的汇编,支持了32位架构的FP16加速。

对于老的机器,不支持FP16计算的情况,我们实现了介于 Int8 - FP32 的一种优化方案 —— BF16,以减少内存,提升性能。这个方案的原理是以少量的转换指令(BF16与FP32可以简单的移位指令互转),减少读写内存的损耗。

实测在低端机红米4上,BF16 有 10%-20% 的加速效果,在中端机荣耀10上,大部分模型也有一定性能优势。

红米4 单核性能

| 模型 | FP32 / ms | BF16 /ms |

| — | — | — |

|

Moblienet v2

|

140.801

|

131.472

|

|

Squeezenet v1.0

|

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

拿到字节跳动offer后,简历被阿里捞了起来,二面迎来了P9"盘问"

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

84220)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值