Riscv-V-家电-Autosar-yolov6

Riscv-V-家电-Autosar-yolov6

参考文献链接

https://mp.weixin.qq.com/s/4-Xdtm8RzK43Ii-R6tRkug

https://mp.weixin.qq.com/s/G1ARusLbwmJC25mLUTn-NA

https://mp.weixin.qq.com/s/kAmHhZyWhLb7QKhfvgte2g

https://mp.weixin.qq.com/s/O8dykDcRyh1OgC4d0vOT5g

英伟达关闭对RISC-V GPU的软件支持!

尽管英伟达在其GPU控制器中是开源技术的早期采用者,但它对为RISC-V架构的GPU提供软件支持并不感兴趣。

 

 

 在GTC峰会的CUDA 12会议上,英伟达的一名代表在回答问题时告诉HPCwire,英伟达没有计划为专有的GPU软件*台CUDA添加RISC-V支持。

 CUDA对英伟达转型为软件公司至关重要。并行编程框架是机器人、汽车和医疗保健等市场的软件和服务产品背后的支撑,这些软件和服务只能在英伟达的GPU上运行。

英伟达正在大力向Arm靠拢,Arm是英伟达自主研发的CPU的幕后推手。CUDA已经支持x86,但在路线图中没有RISC-V支持。

CUDA即将发布的第12版(预计很快就会发布)对英伟达基于Arm的名为Grace的CPU进行了许多优化。该芯片制造商将其最新的基于hopper的GPU与Grace CPU进行配对,Grace CPU可以通过名为NVLink的专有互连进行通信,其带宽是PCIe Gen 5的5倍,后者将用于x86 CPU和Nvidia GPU系统。

英伟达的首席执行官Jensen Huang在与亚太媒体的新闻发布会上表示,英伟达是其GPU控制器中较早采用RISC-V的公司,但这是目前对该架构的最佳使用。“我们喜欢RISC-V,因为它是开源的...但更重要的是,它适应性强。我们可以将它用于各种有趣的CPU配置。然而,RISC-V还不适合外部第三方软件,短期内也不适合。”

黄仁勋说,相比之下,x86和Arm架构有一个庞大的软件生态系统,它不是碎片化的,是稳定的,不管它来自哪个供应商。

RISC-V开源和适应性强的好处也有缺点。

RISC-V架构更像是Linux的芯片版本,并且可以自由授权和修改。目标是让企业以低成本制造自己的芯片,同时减少对专有的x86和Arm架构的依赖,这些架构必须购买或获得许可。

RISC-V体系结构有一个基本指令集,公司可以在此基础上进行定制,把他们的专有扩展放在上面。例如,英伟达的竞争对手Imagination已经生产了自己的RISC-V CPU,称为Catapult,它可以将其兼容的图形处理器和人工智能捆绑在上面。Imagination提供完整的软件和调试支持。类似地,其他公司也提供带有矢量扩展的RISC-V AI芯片和自己的软件栈。

问题就在这里。黄仁勋认为,这种不连贯的软件生态系统,以及针对不同芯片的不同软件产品,是RISC-V的劣势。他指出,为一个碎片化的生态系统做贡献对RISC-V的发展是不利的。

“从长远来看,我们将看到世界如何发展。但是建立一个软件兼容的生态系统,一个架构兼容的生态系统,这是非常非常难的,”黄仁勋说,并补充道,“你能做一个像Arm和x86那样的RISC-V生态系统吗?当然,但这可能需要十年或二十年的时间。”

黄仁勋的观点可能反映了苹果对RISC-V的看法。半导体分析师迪伦·帕特尔本月初在一篇通讯文章中表示,苹果将在非用户面对的部件上用RISC-V核心替换Arm控制器。这些部分通常较少依赖于系统软件。

驱动体系结构和扩展开发的RISC-V International主要关注硬件扩展。支持RISC-V的开源开发人员和公司正在开发和升级Linux 6.0对新扩展的支持,Michael Larabel在Phoronix上对此进行了记录。

虽然软件仍然是一个问题,但RISC-V架构的硬件采用正在增长。英特尔正在与巴塞罗那超级计算中心合作开发RISC-V芯片,谷歌与SiFive合作开发人工智能应用芯片。

当被问及对黄的言论以及英伟达对RISC-V CUDA的立场时,RISC-V International首席执行官卡莉斯塔·雷德蒙没有直接回应这个话题。

“我们看到,从数据中心到移动设备,整个计算领域的势头和投资都在增长。生态系统也在快速发展。考虑到对设计灵活性的需求正在引入一套共享和开放的标准,比如我们的单一管理程序方法,过去可能需要几十年的工作现在正在顺利进行。”Redmond在电子邮件中说。

先有洗衣机,再有光刻机:中国家电的反内卷之路

在体验了TikTok一周之后,我确认了一个真理:什么都可能有国界,人类的无聊没有。
而中国小家电正在以一种堪称惊人的娴熟,利用这种无聊来试图改造这个世界上所有人的生活。
当我在美国时尚潮流博主的短视频里,看到和自家一模一样的吸尘器和碎冰机一闪而过,并翻出某宝订单确认了一遍,价格四百七十二块八,国产货。我突然意识到:
未来3-5年中国最有可能成为世界主流,甚至是世界潮流的制造业品牌,很可能不会出现在手机业,而会出现在家电制造业。
中国家电正在占领世界。
抗得住诱惑的才叫企业家
海信出现在2020年欧洲杯的那一年,每90分钟的比赛,海信能在绿茵场旁边的广告挡板上独占8分钟。大量看到广告的中国人以为这又是中国企业人傻钱多搞出来的宣传攻势,但其实当时海信的海外营收占主营业务比重已经高达33.39%,仅仅一年后这个数字就上涨到了38.12%,你从营收结构上已经很难说这是一家单纯的本土企业,而国际化企业在国际赛场上打广告天经地义。

 

 海信多年来一直赞助欧洲杯和世界杯

海外业务占比更高的是海尔,2021年实现海外收入1137.25亿元,占了总营收的40.97%。美的甚至更高,2021年海外业务占比42%。前面提到的JS环球生活打的是小家电,规模不大,但是业务结构已经完全是一套国际化公司的逻辑,公司总营收51.51亿美元,光北美市场就占了57.6%。
中国的券商研报和财经新闻经常喜欢说一些十分正确的废话,比如我查资料的时候就看见前几天还有个报道说“中国家电出海正当时”,我寻思这话我十八年前就在报纸上见过,可见只要是赚外国人的钱,就没什么不合适的时候。
但你真正仔仔细细去看一遍这个时代的中国家电业,又已经显然和十八年前不一样了。
今天中国以美的、海尔、海信、TCL为代表的家电企业,基本走的是品牌出海模式,英国著名的品牌价值评估公司BrandZ每年发布的中国全球化品牌50强,海信和海尔都在前十。

 

 

 但十八年前中国的家电出口,则主要是代工模式,走纯OEM,连ODM都做不了。当时全球家电出口总量的30%都在中国,对应的是全球500强里的家电企业,95%和中国的家电行业建立过贴牌代工的合作关系。

海信如今的董事长叫林澜,是2006年进的公司,之前从西门子跳槽到科龙管的就是海外业务。后来到了海信,听说公司已经有规模不小的出口体量,结果一看,90%都是OEM。

 

 现在舆论对世纪初那些搞OEM搞到不思进取的企业们,普遍充满鄙夷。但那是你们没亲身体会过那个年代做OEM有多好赚钱:图纸一摆,照着别人的标准把产品做出来,然后运到码头,把钱收了,剩下什么都不用管,钱就像开了闸的水龙头一样往口袋里涌。

干毫无技术含量的活,赚最为简单无脑的钱,世界上百分之九十九的人都会败下阵来,而挡得住这种诱惑的人,才有了被称为企业家的可能性。
那时候掌舵海信的那个企业家,叫周厚健,他最重要的帮手就是林澜。
在中国民营经济史上,海信所在的青岛有过一个外号,叫做“北方之光”,海信是这个称号成立的一部分原因,但只是比较小的那一部分。从东海西路的海信大厦出发,开车大约17分钟,就能走到308国道旁边的海尔工业园,张瑞敏和海尔就是更重量级的那一部分原因。

 

 海尔工业园夜景

1999年,海尔花了3000万美元在美国南卡罗莱纳州买地建厂,张瑞敏5月下旬在美国的电视新闻里和时任州长碰杯,被当时正在电视机前吃晚饭的《中国企业家》驻美记者李亚*看到,于是有了一篇后来经常被拿出来“鞭尸”的文章,叫《提醒张瑞敏》。
用李亚*自己的话说,在听到海尔美国建厂这个消息的时候,他心里“咯噔”一下。
张瑞敏是全中国最早决定做品牌出海的企业家之一,但他是个异类,在当时中国家电产业基本还在走代工路线的情况下,他力排众议为海尔制定了一个“一台代工都不做”出海战略,而且先去的也不是非洲东南亚,而是美国和日本。
1999年海尔在美国建厂的奠基现场
当时海尔往美国派了四个人对接建厂,年纪最大的是个财务,也只有三十多岁,剩下三个全是二十来岁毕业没几年就跟着张瑞敏创业的大学生。在那之前,“出个国”,就已经是他们可以列入人生梦想清单的事了。
到了2002年进军日本,海尔干脆只派了一个少壮派过去做常驻高管,这个人叫杜镜国,一句日语都不会说,落地的那天他连自己的日语名字都不会念,后来他一手操办了海尔对三洋的两次业务兼并,是今天海尔在整个亚洲的海外业务奠基人。
在《提醒张瑞敏》那篇文章里,李亚*写:任何一项异地、异国投资,首先应该考虑自己和对方的比较优势。美国的优势在科学与技术,劣势在于市场饱和、人力成本高昂;中国的优势在于广阔市场和低廉的人力成本。

 

 言下之意,做OEM才是扬长避短的正道,你张瑞敏跑来美国建厂,翅膀还没长硬就妄想跟发达国家玩品牌,就等着被资本主义忽悠瘸吧。

他大抵没有想到,后人在回顾这段历史的时候,只停留于低廉人力成本优势的扬长避短,会成为大众最唾弃的那一种发展方式。
你很难说当时的张瑞敏到底有没有想清楚一切,但客观的事实是,当时中国经济正在进入一个堪称疯狂的上升周期。不夸张地说,国内市场的竞争虽然激烈,但可预见的蛋糕实在太大,只要不上赶着作死,很多时候是闭着眼睛都能赚钱的。
张瑞敏的“先难后易”逻辑,本质是要趁着国内市场高速增长的窗口期,对冲出海趟雷的风险。希望在竞争白热化之前,就为竞争做好准备,等日后国内市场趋于饱和的时候,逐渐成熟的海外业务可以反哺国内。
这个逻辑,一直到25年之后,新冠疫情爆发的那个黑天鹅之冬,才真正被业界最广泛地理解清楚。
2021年三季报发布的时候,借着疫情期间海外业务极为迅猛的增长,海尔的营收正式对格力实现了反超。这一年海尔一共实现了1137.25亿元的海外营收,占了总营收的40.97%,几乎就是半壁江山。海尔的市值一度凭此反超格力200亿。
海尔身上的问题很多,比如特殊历史原因所留下的极为复杂的股权结构,以及相对应的高昂管理费用,和尾大不掉的销售网络。前些年海尔的研发投入占总营收的比重也一直明显低于格力和美的,以至于在相当长一段时间里,人们表面上说着中国白电三巨头,但基本拿海尔当人家双雄争霸的背景板,压根不爱带你玩。
但诸多值得诟病的问题里,坚决进行的海外业务布局,算得上是一次不错的落子,在遭遇疫情的这三年里,明显成了海尔业务里的一枚阵眼。

 

 海尔位于海外的GEA研发中心

格力和董明珠则远没有那么幸运。在最合适给未来布局的十年产业发展窗口期,格力的管理层最迫切的课题,经常是和国资委领导班子之间的龃龉和博弈。
2003年海信在开自己的第一次全球客户大会,格力在跟自己的大股东撕X;2004年海尔在美国建第二个产业园,格力换了个理由继续和自己的大股东撕X。
董小姐在内忧外患里疲于奔命,对抗完外资对抗险资。几乎腾不出手来给这个千亿巨头做系统性的未来战略布局,以至于到了一个不得不变的时候,才那么像是病急乱投医。她对国产制造与核心科技的执念与情怀,被埋在一片有关于公司控制权的危楼里。
很多事表面上看起来是经营和路线规划问题,归根究底是企业治理机制和产权架构的问题。和格力相对照的,是一早就实现了MBO(管理层收购)的美的。何享健在快刀斩乱麻地理清了股权架构之后,对公司如臂使指。也因此,美的的多元化和出海业务战略布局,都远比格力长远且清晰。其中最重要的一役就是收购了德国工业4.0的代表企业:库卡机器人。
这一切都导致,在格力的利润率和总营收领先美的百亿量级的时候,美的在资本市场上的估值就比格力贵了一千亿。
反内卷的最佳方式
资本的心理,和你买股票的时候是一样的,利国利民当然好,但归根到底最在乎的,是它明天会不会涨,涨多少,涨到什么时候。而这一切常常取决于一家公司所在的业务领域还有多少增长空间。
2021年,中国的家电市场规模是8811亿元,白电三巨头加上我们上述提到的海信,九阳,以及另一个小家电的重要品牌苏泊尔,六家公司的境内总营收就已经高达5000亿人民币。这意味着再往上增长,只能自己卷自己。
而根据Statista数据,全球家电市场规模大约是5606亿美元,大约折合人民币3.76万亿。中国企业全加起来,最多占了海外市场的20%-30%,反过来说这就意味着所有往外走的中国家电企业面前,是至少70%的增长空间。
换算成股票,一个最高能到10块的股,现在已经7块5了;另一个最高能到100块的股,现在刚刚26块。换谁来,都会更喜欢后面这个。
反内卷的最佳方式,从来就不是躺*,而是扩张。不过扩张的前提,是你得有这个能力。
家电业一早进入了成熟期,以至于大多数人对于家电业的印象是“没有技术含量”,但事实几乎是相反的:在家电业,产品研发依然是市场竞争的决定性因素。
这一点在这几年的小家电领域更为典型。
2020年全国人民被封在家里被迫闭门进修厨艺,搞厨电的网红小熊电器,成了整个上半年家电板块涨幅最大的企业,市值最高涨摸到过250亿元的高位,半年涨了三倍。但第二年就开始一路暴跌,干脆利落地一夜回到解放前。
小熊电器,起家于酸奶机和豆芽机,是前几年崛起的著名网红牌子。有那么一段时间,在淘系和京东随便搜一个厨房小家电,长得最可爱的那个马卡龙配色款,你都不用看牌子,百分之九十就是它家的,看一眼就会可爱到你真的会很想掏钱。

 

 但有时候,“萌”在“技术壁垒”面前,显得毫无意义。

小熊股价的低迷有很多外因,比如家电业成熟度比较高,比如电商渠道的增长开始逐渐放缓。但最核心的,还是小熊的技术实力和研发短板。
种类繁多的小家电,基本可以划为两类:电动类和电热类。电动类比如吸尘器、吹风机、扫地机器人,对应的企业是戴森,Shark,科沃斯;电热类比如电饭煲,热水壶,空气炸锅,对应的企业比如苏泊尔,奥克斯,还有前一段刚刚上市的比依股份。
电动类要创新,核心在电机。拿戴森来说,20年投了3.5亿英镑(约合人民币30亿元),就为了自研自产一个电机,为此围绕着数字马达做出了1000多项相关专利。
国内拿戴森当目标的追觅科技,1800名员工里技术人员占了70%,研发占总营收比重每年超过12%,第一个攻关的技术难题就是高速马达。戴森在北美最大的对手Shark,被并购后和九阳整合成立JS环球生活,2019年上市的时候有4157名全职员工,研发人员占了22%。JS把Shark拿到中国来,产品没上就先申请了300多项清洁领域专利,其中100多项是发明专利。

 

 JS环球生活的业务情况

相比之下,小熊的品类大部分都是低门槛的电热类小家电,上市的时候研发费率还不到3%,一共400多项专利,其中的发明专利只有11项。公司的起点是酸奶机,创始人李一峰当年选的这个品,恰恰就是看中它技术门槛够低,先期投资够小——创业的时候,整个团队一共就凑了20万块钱,换个稍微复杂点的产品,可能连模具都做不出来。
有时候你看多了市场上的创业者,难免要看出心酸来。李一峰受困于20万选了酸奶机,而追觅科技去年底的C轮融资,一把手就融了36亿人民币。
追觅的创始人叫俞浩,当年是清华航院的学生会主席,是中国最早的三旋翼和四旋翼无人机开发者之一,通过物理奥赛保送进的清华航空航天专业,在校那会做过一个项目叫“天空工厂”,到今天都是清华校内规模最大、技术最强的学生科技兴趣团队,找研发经费时不时就能薅到波音这种跨国公司的羊毛。

 

 追觅科技的创始人俞浩

小公司的起点低,从来都不是罪过,但有时候注定成为枷锁。业界有一种说法,是电热类的小家电,相比电动类,本来就没多少技术含量。但这句话不完全对。
电热类是一个非常容易跨进来,但极其难以做深做专的领域,因为电热类要创新,核心的研发方向,要么就得有出色的材料学基础研究做后盾,要么思路清奇到非卷生卷死想不出来。

前者比如很著名的日本电饭煲,当年的核心科技就在内胆材料,一直是中国小家电公司们试图突破,却又遇到了很多困难的方向。包括当年苏泊尔也是卖身法国小家电巨头SEB之后,才拿到了无烟炒锅的材料解决方案。材料化学领域,一直是中国基础研究的短板,中国大量产业都首先于此。
而后者最典型的例子就是巴慕达。这是个日本专做小家电的牌子,主打面包机,三四千人民币一台的烤面包机,什么其他的功能都没有,但号称能烤出让全人类感动的面包来。
这公司为此专门做了个AI算法,搭配上一套自研的局部温控和自动洒水系统,在烤制过程中对面包片的每个位置施加不同的温度,洒水量也不一样,从而让面包片的每个部位都能有恰到好处的焦度,还能外焦里嫩,锁水不干……

 

 巴慕达的烤箱广告

有段时间国内媒体很喜欢拿这种例子吹日本企业的匠人精神,其实基本都是胡扯。日本小家电企业之所以走出这个路线,本质是日本太小,人口规模上限决定了根本没有规模化的扩张式打法。
加上日本又陷入了严重老龄化,过去20年家电产业根本没有增长,白电比如冰箱、洗衣机,每年也就是400万台的销量,20年都没变过。小家电卖得还更少。你不拼了老命卷出点“匠人精神”,压根活不下去。
正常来说,解决的方式是想办法往外走。但泡沫破裂,资产负债表衰退,带来日本电子产业链的塌方,走不出去,最后只能向内卷生卷死。所以还是那句话:反内卷的最佳方式,从来就不是躺*,而是扩张——以研发为基础的,有质量的海外扩张。
互联网浪潮背后的制造业暗线
纵观中国商业史,家电业其实从来没有离开过最主流的战场。只是当一个行业逐渐趋于成熟的时候,它很容易就会被人从视线里忽略。
在互联网行业过去20年惊人的社会声量之下,任何传统行业都很容易黯然失色。家电业是其中特殊又不特殊的那一个,不特殊在它确实成为了“互联网+”的那个加号后面,被省略的万千行业之一;而特殊则在于,在汽车工业未能成功崛起的情况下,家电业巨大的规模体量,让其成为了中国互联网时代浪潮的背后,实体制造业变迁最具有代表性的一条暗线。

 

 这条暗线,自掀起了中国商界第一场价格战的长虹倪润峰,以及应战的TCL李东生、创维黄宏生开始;到与渠道大打出手的白电三巨头海尔张瑞敏、美的何享健,格力董明珠;再到渠道端腥风血雨里穿梭的国美黄光裕,永乐陈晓,苏宁张*东……可以一直延续到更为今天年轻人所熟知的刘强东,以及从互联网跨界到硬件,从电视切入智能家居的贾跃亭和雷军。

2013年12月12日,雷军和董明珠在央视的那个十亿赌局,早就已经被说烂了。董明珠是个热爱狂言绮语的狠人,她跟谁打赌都不稀奇,但雷军不是。我和某小米的粉丝私下聊天时聊起来,他最大的疑惑是当年就已经隐隐在互联网科技产业走上教父级地位的雷军,怎么就会接了董小姐的招?
米粉话里话外,多少不太看得起董小姐连带整个中国家电业。但事实是,2013年的小米正在布局智能家居,和董明珠打赌的两个月之前,小米电视第一代刚刚上市,官方说9月16日就能开卖,结果9月上的全是工程机,正式版一直到10月中旬才供上来。雷军想进家电业做IOT,有的是东西要从董小姐身上学。

 

 小米十周年演讲,雷军把这次打赌定义为“一件蠢事”200亿的小米跑去和1200亿的格力比,体现出小米在发展过程中“膨胀了”

事实上,过去20年,中国的家电业一直走在探索中国制造出路与前程的最前方。
率先引进产线,率先组建供应链,率先掀起价格屠夫式的商战,然后在里面撞得头破血流,率先在关于渠道的争夺里杀得刀光剑影,也率先探索现代企业管理和新型供应链体系,率先掌握“核心科技”,然后率先在市场的推动下开始成建制地出海扩张。
2014年11月底,做完胸腺瘤手术从香港回京的贾跃亭在望京和睦家医院住院。高管们每天来病房和贾跃亭讨论业务,内容里主要涉及两个硬件产品,一个叫乐视超级电视,另一个叫做乐视手机。我猜老贾一定不知道中国曾经有个站在过时代中心的企业家叫做陶建幸,因为那一年望京和睦家医院的病床上,搞家电搞出成就感的老贾,聊着聊着就决定去造车。
二十年前的1994年,一家叫做春兰股份的公司在上交所上市,公司的主营业务是空调,当年占了全国总销量的40%,8年卖了1000万台。作为创始人的陶健幸却觉得,空调就像基建,一台机器卖出去用十年,天花板一眼望的见,死磕在这个赛道里没有远大前程,于是决定去造车。
先是摩托,后是重卡,后来还有新能源,结果投资的公司加起来,8年亏了100亿,春兰从此退出中国商界的舞台中心。
你看,中国家电业,在趟雷这件事上,都是身先士卒的。贾跃亭从来就不是第一个被造车忽悠瘸了的人,陶建幸才是。
不过话说回来,做家电的不是不能去造车,只是有些事急不来。

 

 春兰官网2005年关于公司投入新能源汽车的产业链的新闻稿

家电业风云际会的故事,行业里纵横捭阖的枭雄都太多。加上行业和技术逐渐成熟,今天人们津津乐道的往往已经不是企业的技术演进。但不可否认的是,一直以来中国的家电制造业都在为了实现核心科技的自主可控而一路乘风破浪。

格力要做自己的“核心科技”,但却发现中国没有自己的高端装备,干脆就连高端制造装备一起做了,所以格力才会有中国最先进级别的数控机床技术。

美的收购德国库卡也是这个逻辑。而库卡又是全球工业机器人的重量级供应商,几乎全世界所有的汽车厂商都在用库卡的机械臂。

海信2000年成立芯片设计所的时候,中国的电视上根本没有一片数字视频处理器芯片是有自主知识产权的。到今天海信的TVTCON芯片出货量已经占了全球总量的50%。

通用电气在成为著名的汽车零部件供应商和清洁能源供应商之前,第一个产品C端产品是热感应电炉,最早的三大支柱业务之一就是家电业。日本三洋卖身给松下的时候,最值钱的业务一是太阳能,二是车用镍氢电池,三是手机制造。博世作为全球最强大的汽车零部件供应商,同样也有自己的家电业务板块。

当你向上切入了家电制造业,掌握了高端装备的相关技术,想切入汽车、手机、甚至是新能源和半导体,即使算不上天经地义,但至少也不能算异想天开。这个行业依然有它在新时代的想象空间。
结语
当年董明珠刚当上格力电器总经理,在北京当着媒体的面拆过一台格力空调,里边的核心零件,压缩机是日本的,控制器也是日本的。但如果26年后再拆,全是格力自己的。这中间经历的艰辛或者不足为外人道,但也不该被轻描淡写地忽略掉。
毕竟,要是一个国家的制造业连洗衣机都造不出,又从哪来的光刻机?
在长达30年的发展和探索中,中国的家电业基本实现了完全的技术自主。相比起依然受到硬件芯片,和软件操作系统两方面掣肘,还在艰难进行技术攻坚的手机行业,未来3-5年,中国更有可能成为世界主流,甚至是世界潮流的制造业品牌,或许会率先出现在家电领域。
2‌‌‌‌‌‌‌‌‌‌‌‌020年,豆瓣有人发帖说,2021年娱乐圈风水会变,并且将进入三年停滞期,但在2023年会有一位世界巨星诞生,谓之天降紫微星。这两年这个传说随着流量明星们的塌房,变成了一个热梗。
但我一贯不太相信“天降”,因为制造业的罗马从来不是一日建成,在经历了二十年爆炸式发展之后,中国经济回归常态化增长的过程里,我们需要的,盼望的,从来就不该是一个横空出世的“紫微星”。而是更多目光望向天空,脚踏实地的企业与人。

AUTOSAR基础篇之StbM

前言

首先,请问大家几个小小问题,你清楚:

  • 基于AUTOSAR的应用层如何获取准确的时间戳吗?
  • 时间同步的具体过程包含哪些细节呢?
  • 如何正确地获取到全局时间戳呢?

今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:

 

 

 正文

时间同步软件框架

正如前文《AUTOSAR基础篇之CanTsyn》所述,CanTsyn模块负责时间同步之间的协议处理,StbM模块则用来负责抽象底层不同的时间同步协议,为上层提供统一的时间戳接口以及当前的时间同步状态的接口。

通过如下图1所示的Tsync则用来代表基于不同总线通讯的时间同步协议,StbM则是时间同步协议层基础上的抽象,OS作为Triggered Customer,SW-C则作为Active Customer,后文将解释这两者之间的区别。

 

 图1 AUTOSAR时间同步协议软件框架

在上图中,我们可以看到存在5个不一样的数据流,下面将一一解释每个数据流的基本作用:

  • 数据流1表示StbM主动调用TriggerCustomer提供的函数接口来完成时间同步,当前主要应用场景为OS Schedule Table的同步;
  • 数据流2表示Active Customer(SW-C)主动调用StbM提供的标准接口来获取当前时间戳或者时间同步状态;
  • 数据流3表示Active Customer(SW-C)主动调用StbM提供的标准接口来更新StbM维护的时间基准;
  • 数据流4表示StbM模块通过Tsyn模块提供的标准函数接口来更新StbM的时间基准;
  • 数据流5表示StbM模块主动通过Tsyn模块提供的标准函数接口来将当前的时间同步信息发送到相应的bus总线上。

在时间同步领域内涉及到诸多专有名词,因此为了便于大家理解后续的内容,有必要在此跟大家解释些重要的标准术语,具体细节如下图2所示:

 

 图2 时间同步标准术语解释

启动阶段

在该阶段StbM模块将会提供完成必要的初始化来提供针对上层应用的时间同步服务。

前置条件

StbM模块通过调用函数接口StbM_Init来完成初始化工作,但是在此之前需务必完成基础通讯模块的初始化,如Canif模块初始化,CanTsyn模块初始化等。

初始化

通过调用上述函数完成初始化之后,将会完成如下基本动作:

  • 变量StbMSynchrinizedTimeBase将会被初始化为0;
  • timeBaseStatus将会将所有的bit初始化为0;
  • 如果参数StbMStoreTimebaseNonVolatile等于STORAGE_AT_SHUTDOWN,那么就会从NVM中获取数据(一般包含s跟ns部分),如果NVM获取数据不成功,则都会赋值为0处理。

正常工作

Synchronized Time Base

每一次调用函数接口StbM_BusSetGlobalTime()时就会更新对应的同步time base以及对应的Time Base Status。

Time Master 同步状态监控

如下图3所示,一个全局时间网络至少一个Time Master跟一个Time Slave, Time Master将会将其时间信息传递至在同一Time Domain下的Time Slave。

 

 图3 Time Master 同步状态更新示意图

由上图可知,Time Master通过reference本地clock来更新本地全局时间,然后通过sync/FUP报文发送给到总线上。其中,如果Time Domain为0-15则为synchronized time base,而Time Domain 16-31则为Offset Time Base。

  • 通过调用函数接口 StbM_GetCurrentTime() 来获取当前对应Time Domain下的Time Base,对应的timebasestatus以及user data;
  • 通过调用函数接口StbM_GetCurrentTimeRaw() 来获取当前时间Time Base的ns部分;
  • 通过调用函数接口StbM_GetCurrentTimeDiff() 来获取输入的时间戳与当前时间戳的时间间隔,单位为ns;
  • 通过调用函数接口StbM_BusSetGlobalTime()来更新当前的Time Base以及设置对应的timebaseStatus;
  • 通过调用函数接口 StbM_SetGlobalTime()并且会就将GLOBAL_TIME_BASE bit位置1,同时清除其他bit 位;

Time Slave 同步状态监控

如下图4所示体现了Time Slave的数据流交互关系,在下图中我们可以看到Time Slave会接收来自同一Time Domin下的sync/fup 报文,同时加上本地计算出来的接收sync/fup报文的时间差最终用于更新当前StbM的Time Base,该Time Base将最终被应用到应用层。

 

 图4 Time Slave同步状态更新图

Time Slave在完成上述时间同步的过程中,需要注意几点:

  • 每次更新调用函数StbM_BusSetGlobalTime时,都会比较下当前更新的时间戳与当前内部正在使用的时间戳的差值是否超过StbMSyncLossThreshold参数设定的值,如果该值为0,则会取消该部分的检查,如果超过了设定的值, 那么将会将timeBaseStatus中的状态位TIMELEAP 置1;
  • 如果下一次更新,差值保证在范围内,那么timeBaseStatus中的状态位TIMELEAP将会被清0;
  • TIme Slave会实时确认下当前的时间戳与最*一次调用该函数的时间差距是否在参数StbMSyncLossTimeout设定的范围内,如果Timeout发生,那么需置timeBaseStatus中的TIMEOUT bit位,一旦调用StbM_BusSetGlobalTime函数将会清除该TIMEOUT bit位。
  • 如果从来没有发生过时间同步, 那么TIMEOUT位将不会置位,只要发生过一次成功的时间同步,后续同步没有按照预期发送,那么就会启动这个Timeout检查。
  • 如果参数syncToTimeBase设定为sync to GTM,那么调用StbM_BusSetGlobalTime() 将会清除timeBaseStatus中的SYNC_TO_GATEWAY bit位;
  • 如果参数syncToTimeBase设定为sync to subdomain,那么调用StbM_BusSetGlobalTime() 将会置位timeBaseStatus中的SYNC_TO_GATEWAY bit位;
  • 一旦调用函数接口fStbM_BusSetGlobalTime(),那么就会设置timeBaseStatus中的GLOBAL_TIME_BASE Bit位,一旦置位,则不会清除。

Time Gateway同步状态监控

Time Gateway既作为属于某个Time Domain的Time slave,同时也会作为某个Time Domain下的Time Master而存在,如果存在Time Gateway的节点,那么必然存在Time SubDomain的概念。

如果Time Gateway作为某个Time Domain的Time Slave存在,同样存在着如下特性需要了解:

  • 每次更新调用函数StbM_BusSetGlobalTime时,都会比较下当前更新的时间戳与当前内部正在使用的时间戳的差值是否超过StbMSyncLossThreshold参数设定的值,如果该值为0,则会取消该部分的检查,如果超过了设定的值, 那么将会将timeBaseStatus中的状态位TIMELEAP 置1;
  • 如果下一次更新,差值保证在范围内,那么timeBaseStatus中的状态位TIMELEAP将会被清0;
  • TIme Slave会实时确认下当前的时间戳与最*一次调用该函数的时间差距是否在参数StbMSyncLossTimeout设定的范围内,如果Timeout发生,那么需置timeBaseStatus中的TIMEOUT bit位,一旦调用StbM_BusSetGlobalTime函数将会清除该TIMEOUT bit位。
  • 如果从来没有发生过时间同步, 那么TIMEOUT位将不会置位,只要发生过一次成功的时间同步,后续同步没有按照预期发送,那么就会启动这个Timeout检查。
  • 如果参数syncToTimeBase设定为sync to GTM,那么调用StbM_BusSetGlobalTime() 将会清除timeBaseStatus中的SYNC_TO_GATEWAY bit位;
  • 如果参数syncToTimeBase设定为sync to subdomain,那么调用StbM_BusSetGlobalTime() 将会置位timeBaseStatus中的SYNC_TO_GATEWAY bit位;
  • 一旦调用函数接口fStbM_BusSetGlobalTime(),那么就会设置timeBaseStatus中的GLOBAL_TIME_BASE Bit位,一旦置位,则不会清除。

Offset Time Base

对于Offset Time Base,相比Synchronized Time Base存在着如下一些特性:

  • 每次调用StbM_SetOffset()就会用来更新相应的Time base的 Offset Time;
  • 函数StbM_SetOffset() 与StbM_GetOffset() 只能接收16-31的TimeBaseId;
  • 每一次调用函数StbM_GetOffset()将会返回对应的Offset Time Base的Offset Time;
  • 在配置上也会存在限制,即只有StbMSynchronizedTimeBaseIdentifier为16至31,StbMOffsetTimeBase才会真实有效。

Customer

Customers作为理解为基于StbM模块基础之上的一种应用角色,按照其功能作用可划分为如下两种角色:

  • Active customers:顾名思义就是一种主动触发调用StbM相关函数接口的应用角色;
  • Triggered customers:就是一种被动被StbM模块调用其自身接口的应用角色;

Active customers

对于Active customers,为了便于理解,我们可以列出如下场景来体现其基本作用:

  • 读取当前的time base value,同步状态以及user data;
  • 设置对应time base的value以及相应的user data;

Triggered customers

对于Triggered customer,当前仅用于同步OS的schedule table,通过调用OS提供的API函数 SyncScheduleTable() 来实现Schedule Table之间的counter同步。

通过配置参数STBM_TRIGGERED_CUSTOMER_PERIOD来完成StbM定周期调用上述函数接口来完成各个sechdule table的os counter间的同步;

同时StbM仅在Schedule Table 处于WAITING,RUNNING,或者 RUNNING_SYNCHRONOUS状态时完成同步,因此也就意味着StbM在同步前先要确认下当前需同步的Schedule Table的状态,然后才能进行同步。

关闭阶段

针对Shutdown阶段,仅存在一个需要做的操作,如果参数StbMStoreTimebaseNonVolatile等于STORAGE_AT_SHUTDOWN,那么便会将当前实时时间戳(S跟ns部分)存储在NVM中。

常用函数接口说明

为了便于大家了解StbM模块所提供的基本功能,因此将常见的函数接口列举如下,以方便大家的查阅:

 

 图5 StbM模块常用函数接口

YOLOv6量化部署实战指南

1. 背景和难点

YOLOv6  是美团发布的一款开源的面向工业应用的 2D 目标检测模型 [1],主要特点是速度快、精度高、部署友好,在美团众多视觉业务场景中都有着广泛的应用。通过量化(Quantization)提升推理速度是实际工业应用中的基本操作,但由于 YOLOv6 系列模型采用了大量的重参数化模块,如何针对 YOLOv6 进行高效和高精度的量化成为一个亟待解决的问题。本文旨在解决 YOLOv6 量化方面的难题,并以 YOLOv6s 模型为例,从训练后量化(Post-Training Quantization, PTQ)和量化感知训练(Quantization-Aware Training, QAT)两个方面进行分析,探索出了一条切实可行的量化方案。

YOLOv6 采用了多分支的重参数化结构 [2] (如图 1A 所示),通过在网络结构层面加入人工先验可以在训练阶段让模型更好收敛。在推理阶段,多分支可以等价合并为单路,从而提升运行速度。但现有的训练后量化方法,不能很好应对多分支结构带来的剧烈变动的数值范围,导致量化后产生严重的精度损失 [3]。另外,如何针对多分支结构设计量化感知训练(QAT)方法也面临着较大的挑战。蒸馏常被用来辅助 QAT 提升性能,但如何应用 2D 目标检测的蒸馏方法来辅助 YOLOv6 模型的量化,也需要设计合理的方案在实际应用中进行检验。

 

 图1 多分支结构重参数化过程(A)结构变化(B)参数变化 (来源:[2])

2. 量化方案实战

2.1 重参数化优化器

YOLOv6 网络中大量使用重参数化结构,在提高模型训练精度的同时能够显著降低模型部署推理延时,但也带来了模型量化部署方面的难题。对重参数化网络的直接量化一般会带来不可接受的精度损失,例如 RepVGG-B1 [2] 网络在 ImageNet 数据集上的浮点精度为 78.42%,采用 TensorRT 后量化(PTQ)的量化模型精度则降低为 54.55%。

此外,由于重参数化结构在训练和部署时结构不同,因此无法直接适配现有的量化感知训练(QAT)方法,如何使用 QAT 方法来提高 YOLOv6 量化模型的精度,同样存在着挑战。*期,一篇重参数化优化器的工作 RepOpt [3] 较好地解决了重参数化结构的量化问题。

2.1.1 RepOpt

RepOpt [3] 对重参数化结构量化困难的问题进行了研究,发现重参数结构的分支融合操作,显著放大了权重参数分布的标准差。异常的权重分布产生了过大的网络激活层数值分布,进一步导致该层量化损失过大,因此模型精度损失严重。

鉴于此,我们统计了基于 RepVGG 结构的 YOLOv6 模型(YOLOv6s_repvgg)各层的权重及激活数值分布,分析了 YOLOv6 中的重参数化层的数据分布。下图 2 以 “Rep_p4.block.0.rbr_reparam” 层为例,给出其特征图数值分布直方图,我们发现其数值广泛分布在 [0, 57] 的区间内。显然,采用现有的 INT8 量化方法,无论怎样选择量化缩放参数 (scale),都会产生较大的量化误差。

 

 图2 YOLOv6 网络使用 RepVGGBlock 和 RepOptBlock 版本的单层激活值数据分布为解决这一问题,RepOpt 提出了一种基于优化器的重参数化设计(如下图 3 所示),通过梯度掩码(Gradient Mask)的方式在网络训练反向传播的过程中加入先验,保证了训练精度可达到 RepVGG 相*的水*,而网络结构则在训练和推理阶段始终保持普通的 VGG 结构,这种训练方法请参考 RepOpt [3]。该工作中提出的 RepOpt-B1 网络模型,在浮点精度与 RepVGG-B1基本一致的情况下,量化模型精度提升超过 20%,极大地改善了重参数化网络的量化掉点问题。此外,RepOpt模型的训练速度快,内存占用也比较低。

 

 图3 RepVGG 和 RepOpt 结构示意图

 2.1.2 RepOpt 版本的 PTQ

我们实现了 RepOpt 版本的 YOLOv6s网络(YOLOv6s_repopt),达到了与 YOLOv6s_repvgg 一致的浮点精度 42.4% (300 epoch),两个版本的网络结构在部署阶段保持一致。我们首先分析了 YOLOv6s_repopt 模型的数据分布特征。

如图 2 所示,给出了“Rep_p4.block.0.rbr_reparam” 层的特征图数值分布直方图,可以看到数值紧密分布在 [0, 10] 的区间内,相比 YOLOv6s_repvgg 的数值分布对于量化操作更加友好。进一步采用 TRT 的后量化方法进行模型量化部署,可以看到 YOLOv6s_repvgg 的量化网络精度降低了 7.4%,在实际工程中基本不可用。而 YOLOv6s_repopt 网络的量化模型精度为 40.9%,精度损失仅为 1.5%,相比原版模型有了极大的改善。

 

 

 表1 使用 RepOpt 在标准分类和检测任务上的 INT8 精度提升

2.1.3 RepOpt 版本的 QAT

此外,使用 RepOpt 结构解决了原本的 RepVGG 网络无法直接使用现有量化感知训练的问题。对于结构重参数化的 RepVGG 网络,如何使用 QAT 来恢复量化模型精度,我们一直存有困扰。如下图 4(左)所示,如果对重参数化操作之前的多分支网络进行 QAT,对每个分支分别添加伪量化算子进行量化感知训练,由于每个分支的量化参数不同,导致多分支结构无法等效融合进行高性能部署;如果对重参数化操作之后的单分支网络进行 QAT, 由于网络中不再有 BN 层,使用 QAT 方法进行微调并不容易恢复到浮点精度。而对于 RepOpt 结构网络则不存在这一问题,因为 RepOpt 在训练和部署中网络结构是保持一致的。

 

 图4 RepVGG 和 RepOpt 结构的 QAT 过程示意图如图 4 (右)所示,对 RepOpt 的卷积等算子加入伪量化节点进行量化感知训练,提升量化模型精度,然后直接部署该量化模型,而不需要再进行模型融合的操作。后文,我们将给出具体的 QAT 算法及对模型精度的提升结果。

2.2 基于量化敏感度分析的部分量化

YOLOv6s_repopt 在 PTQ 后的 mAP 达到了 40.9%,虽然比之前的 35.0% 有了很大的改善,但仍然有 1.5% 的精度损失,还无法满足业务需求。因此,我们采用了部分量化(Partial PTQ),一种使网络中的部分量化敏感层恢复浮点计算,来快速恢复量化模型精度的方法。首先需要对网络中的每一层都进行量化敏感度分析。我们在 YOLOv6s-repopt 网络上对常用的敏感度分析方法均方误差(MSE)、信噪比(SNR)、余弦相似度(Cosine Similarity)进行了对比测试。量化校准(calibration)测试使用 4 个 batch 的数据,敏感度计算用 1 个 batch,batch 大小设置为 32。测试时,每次只对一层进行量化,获取该层的激活数据后计算敏感度数值,代表了该层的量化敏感度。作为对比,我们可以直接计算网络在 COCO val 数据集上的 mAP,使用检测精度作为该层的量化敏感度,即检测精度越高,该层敏感度越低(下文称为 mAP 方法)。

 

 表2  常用的量化敏感度计算方法及含义

测试结果如下图 5 所示,我们对测试结果进行归一化后,从不同敏感度分析结果中选择敏感性最高的 6 层跳过,计算部分量化精度。

 

 图5 YOLOv6s_repopt 各层敏感度对比部分量化精度如下表 3 所示,可以看到:mAP 方法取得了最好的效果,能够有效代表 YOLOv6 敏感度分析结果。但由于 mAP 方法需要频繁地计算验证集精度,耗时太久且容易过拟合验证集,因此在实际项目中为了追求效率,我们建议使用 MSE 方法。

 

 表3 使用不同量化敏感指标得到的 Top-6 敏感层及部分量化精度对比

2.3 基于通道蒸馏的量化感知训练

至此,我们优化后的 PTQ 的精度达到了 42.0%,进一步提高模型精度需要引入量化感知训练(QAT)。量化感知训练(Quantization Aware Training, QAT)可以改善 PTQ 量化精度损失,通过在训练过程中对卷积等算子加入伪量化操作(如图 4 所示),使得网络参数能更好地适应量化带来的信息损失,从而显著降低量化后的精度损失。

模型蒸馏作为一种有效的提升小模型精度的方法,在 QAT 过程中被广泛使用,来提升量化模型的精度。以下,我们将探索针对 YOLOv6 网络的量化感知训练方法。

2.3.1 通道蒸馏

传统的分类网络在蒸馏时,往往对最后一层输出的 logits 进行蒸馏;但是在检测网络中一般采用“特征图”蒸馏的方法,直接让学生网络(student)输出的特征图拟合教师网络(teacher)输出的特征图(一般不会选取整个特征图,而是一些感兴趣区域)。

这种方法的缺陷是特征图中的每个 pixel 对蒸馏的损失贡献相同。我们采用了每通道分布蒸馏 [6],即让 student 输出的每个通道的分布拟合 teacher 输出的每个通道的分布。两种方法的区别如下图 6 所示:

 

 图6 使用空间维度蒸馏和通道维度蒸馏的对比示意

2.3.2 YOLOv6 量化感知蒸馏框架

针对 YOLOv6s,我们选择对 Neck(Rep-PAN)输出的特征图进行通道蒸馏(Channel-Wise Distillation, CW)。另外,我们采用“自蒸馏”的方法,教师模型是 FP32 精度的 YOLOv6s,学生模型是 INT8 精度的 YOLOv6s。

 

 下图 7 是一个简化示意图,只画出了 Neck 的一个分支:

图7 应用于 YOLOv6s 的通道蒸馏方案示意图如下表 4 所示,在 Partial QAT 中引入通道蒸馏方案(CW),量化精度进一步提升了 0.3%。

 

 

 表4 Partial QAT 使用通道蒸馏提升对比

3. 部署时优化

3.1 图优化

量化部署时,可以直接利用 TensorRT 的 PTQ 接口进行生成量化引擎,但是这种方法往往精度损失较大。因此,一般要先进行 QAT,使量化模型精度满足业务需求,然后导出带有“Quant”、“DeQuant”节点的 ONNX,最后再利用 TensorRT 构建量化引擎。我们发现这两种方案最终生成的图结构并不相同,导致部署模型的实际运行效率存在很大的差异,通常 QAT 方法生成的模型效率更低。我们在 NVIDIA T4 机器上对量化模型进行了对比测试(见下表 5)。尽管 QAT INT8 模型的 QPS 比 FP16 高了~27%,但是离 PTQ INT8 还有较大差距。我们对此现象进行了细致的分析,发现原因是 QAT 引入的“Quant”,“DeQuant”节点打破了原有 TensorRT 的融合策略,导致了很多算子无法融合,从而影响了最终量化引擎的性能。在这一节中,我们以 YOLOv6s_repopt 为例,展示一种定位具体瓶颈的图优化方法。在量化实践中,图优化是一个很实用的手段,我们可以依法炮制,提升模型的 QPS。

 

 表5 PTQ 和 QAT 模型的 QPS 对比

3.1.1 性能分析

首先,我们利用 nsys 工具 [5] 对 QAT INT8 的模型和 PTQ INT8 模型进行了性能分析,如下表所示:

 

 表6 PTQ/QAT 节点的 Kernel 运行时间分析从中我们发现,QAT INT8 有 10.8% 的 kernel 执行了 permutationKernelPLC3 操作,这些操作对应 quantize_scale_node 节点,如下图 8 所示:

 

 

 图8 permutationKernelPLC3 操作定位

3.1.2 图结构分析

为什么 QAT INT8会有大量的 permutationKernelPLC3 操作?我们利用 trtexec 和 pltEngine 工具,画出了 PTQ INT8 和 QAT INT8 的计算图,并进行了仔细的分析。下图 9 是其中一个子图的对比:

 

 图9 PTQ 与 QAT 子图区别

QAT INT8 计算图中 neck.reduce_layer1.conv 融合节点输出精度是 FP32,并且跟了 2 个 quantize_scale_node 节点,而 PTQ INT8 图中的 neck.reduce_layer1.conv 融合节点输出的是 INT8。很显然,QAT 图中 FP32 和 INT8 之间的转换会带来额外的开销。我们又利用 Netron 来分析 QAT INT8 的 ONNX 图结构,找到了 neck.reduce_layer1.conv 这个位置,图 10 给出该节点示意。

 

 

 图10 因 Scale 不同而产生了双分支

通过分析 ONNX 图结构,我们发现了QAT INT8 引擎中 neck.reduce_layer1.conv 输出为 FP32,并且为两个分支保留了quantize_scale_node 的原因。因为 neck.upsample1.upsample_transpose 分支的输入量化 scale 为 0.083,而 neck.Rep_n3.conv1 分支的输入量化 scale 为 0.105,这两个节点输入尺度是不同的,导致 neck.reduce_layer1.conv 无法直接输出为 INT8。可以看出,对于同一个输出,输入到多路分支后为何 scale 不同的,原因是右边的分支经过了 concat 操作,会导致输出的数据分布发生变化,再进行激活校准(Activation Calibration)时,会得到的不同的最佳截断值 (Activaition Max)。
3.1.3 图结构优化

根据上面的分析,如果一个节点的输出,输入到不同的分支节点中,并且分支节点的量化 scale 不同,则 quantize_scale_node 节点无法融合,进而导致了额外的开销。如何解决这个问题?我们使用了一个简单的方法,就是强制使所有分支节点的量化 scale 相同(根据经验,在同一数量级上的 scale 可以安全合并),即直接修改 QAT 网络中的 Quantizer 节点的参数。我们整理了 YOLOv6s_repopt 中所有需要进行 scale 融合的节点(如表 7 所示),由于 TensorRT 的 8 bit 的量化范围是[-127,127],所以只需要将多路分支的 Activation Amax 设为同一个值,一般取多路分支中的最大值。

 

 表7 需要融合 Scale 的节点列表

3.1.4 性能测试

经过以上的多路分支的 scale 融合后,我们再次利用 trtexec 和 pltEngine 工具,画出了 QAT INT8 进行优化前后的图结构。可以发现,quantize_scale_node 节点已经全部被融合。

 

 图11 图优化后 INT8 图节点变化我们测试了经过图优化的 QAT 模型,QPS 达到了 528,性能非常接* PTQ 的 556,而且 mAP 依然保持优化前的 42.1%。

 

 表8 图优化后 QPS 对比

 3.2 线上服务优化

我们在 NVIDIA T4 服务器上进行了端到端的吞吐测试,利用“多实例”并发处理的技术,YOLOv6s_repopt INT8 QPS 达到了 552,相较 FP16 提升了~40%。我们对服务器的各项指标进行了监测,发现此时 T4 GPU 的利用率只有 95%,还有压榨空间,而 16 核 CPU 利用率已经超过了 1500%,几乎满负荷运转。我们推测整个线上服务的“瓶颈”可能在 CPU,而图片预处理会使用大量 CPU 资源。

 

 表9 服务器资源配置

3.2.1 DALI 预处理

为了解决 CPU 预处理带来的“瓶颈”,我们采用了 NVIDIA 的 DALI 库,将预处理直接放到 GPU 中运算。该库可以在 GPU 上对二进制图片进行解码和预处理,极大的缓解 CPU 瓶颈,下图 12 为 DALI 的经典流程。

 

 图12 DALI 加速图像预处理流程

3.2.2 吞吐测试

如下图 13 所示,INT8 + DALI 的吞吐达到了 1182 imgs/s,比 INT8 吞吐提升了 1.14 倍。引入 DALI 预处理后,T4 GPU 利用率达到了100%,而 16 核 CPU 的利用率则下降到了 1100% 左右,部分 CPU 资源得到了“解放”。另外,我们也测试 FP16 + DALI 的吞吐,反而有略微的下降。我们推测是 DALI 抢占了部分 GPU 计算资源,而 FP16 服务的瓶颈在 GPU,所以对整体性能产生了负面影响。

 

 图13 使用 DALI 后吞吐测试提升对比

4. 总结

综上所述,本文基于 YOLOv6 V1.0 版本,以 YOLOv6s 为例探讨了基于重参数化结构设计的 2D 检测模型的量化难点和具体方案,在模型精度基本保持的前提下,通过量化加速,提升了约 40% 的 QPS。部署时的预处理优化则额外提升了 214%,极大地提升了工业部署吞吐能力。下表列出了本文尝试的方法及叠加效果。

 

 表10 本文使用的量化方案及效果对比本文使用的速度测试环境见表 11, 测试输入 batch size 为 1,尺寸为 640x640。

 

 表11 速度测试环境

YOLOv6 版本更新

*日,YOLOv6 已经更新了 V2.0 版本,并新增了中大型网络,对轻量级和小网络的性能进行了全面升级,进一步提升综合性能,量化效果也得到大幅提升,其中 YOLOv6-S 量化模型达到了 43.3mAP 和 869 FPS (TensorRT 8.4)。更多详细内容请关注官方出品的技术报告 [7]。

 

 表12 YOLOv6-S V2.0 量化效果我们希望通过分享本文的实践,进一步推动最新通用目标检测算法的落地。未来,我们会和业界同行一道,探索更优的量化方案,持续提升量化精度和推理速度,助力降本增效,深化业务价值。

 

参考文献

[1] YOLOv6:又快又准的目标检测框架开源啦

[2] RepVGG: Making VGG-style ConvNets Great Again,https://arxiv.org/abs/2101.03697

[3] ReOpt: Re-parameterizing Your Optimizers rather than Architectures

[4] SNR: https://github.com/openppl-public/ppq/blob/8a849c9b14bacf2a5d0f42a481dfa865d2b75e66/ppq/quantization/measure/norm.py

[5] Nsight-systems: https://docs.nvidia.com/nsight-systems/UserGuide/index.html

[6] Channel-wise Knowledge Distillation for Dense Prediction, https://arxiv.org/abs/2011.13256

[7] YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications, https://arxiv.org/abs/2209.02976

 

 

参考文献链接

https://mp.weixin.qq.com/s/4-Xdtm8RzK43Ii-R6tRkug

https://mp.weixin.qq.com/s/G1ARusLbwmJC25mLUTn-NA

https://mp.weixin.qq.com/s/kAmHhZyWhLb7QKhfvgte2g

https://mp.weixin.qq.com/s/O8dykDcRyh1OgC4d0vOT5g

posted @ 2022-09-27 05:03  吴建明wujianming  阅读(221)  评论(0编辑  收藏  举报