在这里插入图片描述
P.S. 推荐一个大神的教程给想要了解或者学习人工智能知识的读者,这个教程里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏教程,请点击下方链接查看, 传送门https://blog.csdn.net/qq_74013365

现在AI圈有多火?出门聊创业不说自己沾点大模型,都不好意思递名片。

但热闹全是表面的,后台账单才最真实。全行业都在喊推理成本扛不住,赚的钱大半都给算力厂商打工了。

1. 先唠明白:推理为啥这么费钱

1.1 推理分两步,脾气完全不一样

很多人不知道,大模型回你一句话,其实分两个阶段干活。

第一个阶段叫Prefill,你输完整段问题,它一口气全部处理完,纯纯计算密集型,就像考试先把整张卷子读一遍,特别费脑子。

第二个阶段叫Decode,就是它一个字一个字蹦答案的时候。每蹦一个字,都要翻完之前所有的聊天记录,计算量不大但特别费内存。

像老人回忆往事,翻半天回忆录才憋出一句,主打一个磨磨蹭蹭占地方。

这俩一个费算力一个费显存,性格差得十万八千里,给后续优化埋了一堆坑。

1.2 现在的处境:模型越来越胖,房子越来越挤

现在的大模型,参数奔着万亿级去了,体型一年比一年壮。

不光体型大,架构还越玩越花。又是混合专家又是线性注意力,混搭风拉满,不同模块的算力需求天差地别。

再加上市面上流行长上下文,聊三天三夜记录都不删,显存直接告急。

就像你手机里的聊天软件,用久了占几十个G,删也舍不得删,卡得要死要活。

2. 第一层优化:算子是底子,单兵能力得过硬

2.1 算子就是系统里的小兵

推理系统性能好不好,最底层全看算子。

这就像拔河比赛,队形排得再花哨,每个人都没劲儿,照样输得一塌糊涂。每个算子执行效率拉胯,再牛的调度也救不回来。

现在硬件更新还快,今天出个新计算单元,明天加个显存黑科技,软件跟不上的话,硬件再强也是老牛拉跑车,有劲使不出。

2.2 手写还是自动编译,是个两难问题

想把算子性能拉满,最直接的办法是手写代码。针对特定场景精雕细琢,性能能冲到天花板。

但代价也大,不同形状的算子都要写一套,程序员的头发掉得比模型参数还多,开发成本高到离谱。

用编译器自动生成呢?省事儿是省事儿,性能直接打对折。

相当于定制西装和淘宝均码的区别,合身的贵,便宜的不合身,怎么选都别扭。

2.3 细粒度优化,走中间路线

我们琢磨出一个折中办法:不粗暴地合并或者拆分算子,而是细粒度拆解算子之间的依赖关系。

该并行的并行,该融合的融合,就像以前排队做核酸,不是所有人挤一条队,也不是每人开一条,分成小组流水作业,效率直接上去。

实测下来,端到端的推理速度,比主流方案能提1.5到1.86倍。

3. 第二层优化:内存管理,得学会过日子

3.1 KV Cache,就是AI的聊天记录

推理里最占显存的东西,叫KV Cache。通俗点说,就是AI存的聊天备忘录。

对话越长,这份记录就越大。单张GPU显存就那么大,聊嗨了分分钟给你爆显存,和你手机内存被聊天软件撑爆是一个道理。

3.2 常见的两个省钱思路

现在业内主流有两个解决方向。

一种是做压缩,挑重点留,没用的废话全删掉。就像你清手机内存,过期表情包、缓存视频全选删除,空间一下就出来了。

另一种是分页管理,学操作系统的虚拟内存,不用的记录挪去CPU内存,要用的时候再调回来,减少内存碎片。

3.3 异构模型得用定制方案

现在模型都玩异构架构了,不同注意力层的内存需求完全不一样。

还用统一的大页管理,就像给所有人发同尺码的鞋,大脚挤小脚晃,浪费一大堆空间。

我们搞了多粒度内存管理,大脚穿大鞋小脚穿小鞋,碎片大幅减少。针对新型异构模型,吞吐量比最优方案还高4.92倍。

4. 第三层优化:量化,就是精打细算过日子

4.1 量化的本质:砍精度换空间

量化说穿了很简单,用更短的数字存模型参数。

本来精确到小数点后八位,现在砍到四位甚至两位,省显存还跑得快。就像你发朋友圈的照片,原图好几兆,压缩一下几百K,肉眼看不出差多少,省流量还加载快。

4.2 全量化翻车,混合精度是主流

但不能全砍精度,砍太狠模型就傻了,输出的话前言不搭后语,像喝多了胡言乱语。

所以现在主流是混合精度:99%的参数用低精度,少数关键的“离群值”保留高精度。理论上既省空间又不丢效果,堪称完美。

4.3 坑全在调度开销上

理想很丰满,现实很骨感。真跑起来性能直接掉到原来的30%,根本没法用。

为啥?单独照顾这几个离群值太费劲了。就像公司发通知,大部分人群发就行,几个人得单独打电话,时间全花在调度上了。

我们从编译和运行时两头优化,把调度开销打下去。英伟达平台性能提1.5倍以上,国产芯片上也能普遍翻两倍,精度还基本不掉。

5. 第四层优化:异构调度,人尽其才物尽其用

5.1 两个阶段,别都扔给GPU

以前不管Prefill还是Decode,全扔给GPU干。但这俩负载特征完全不一样,干一样的活纯属浪费。

Prefill是计算密集型,纯体力活,就得GPU这种壮劳力干。Decode是访存密集型,占地方不费劲儿,全让GPU干就像让高级工程师干前台活,大材小用。

5.2 CPU也能挑大梁

CPU虽然计算能力弱,但内存大啊。我们就把Decode里占显存多、计算量小的部分,卸载到CPU上去跑。

GPU专心干重活,CPU负责管档案,分工明确。特定场景下,吞吐量直接能翻7倍左右。

6. 第五层优化:并行策略,不能一套方案用到黑

6.1 大模型必须分家,怎么分有讲究

现在模型太大了,单张卡根本塞不下,必须拆到多张卡上跑。

怎么拆学问大了,张量并行、数据并行、专家并行,不同模块适合不同分法。没有万能方案,硬套肯定翻车。

6.2 负载是动的,策略也得跟着变

真实业务里,用户请求不是匀速的。白天高峰挤爆,后半夜几乎没人,和地铁早晚高峰一模一样。

高峰的时候得优先保吞吐量,多拉快跑;平峰的时候可以压低时延,体验更好。所以并行策略得跟着负载动态切换,自适应调度,不能一套方案用到死。

7. 聊聊我们做的赤兔引擎

7.1 为啥要做国产推理引擎

现在优秀的开源推理引擎不少,但大多对国产芯片适配不好。

高端卡又受限,总不能一直被卡脖子。所以我们做了赤兔,主打国产算力+国产模型,就是想让国产硬件也能跑出好性能。

7.2 实际效果怎么样

英伟达平台上,我们和主流引擎性能基本持平,A800集群上甚至更快一点。

国产芯片这边,华为昇腾、沐曦这些都适配了,结合量化技术,用更少的资源就能跑出不错的效果。

还有个狠活:单CPU加单GPU,就能跑起来617B参数的完整模型。虽然速度不算最快,但用这么点资源撬动这么大的模型,已经是很大的突破了。

7.3 路还长,接着优化

现在版本更到0.5.4,马上要出0.6版本,智能体推理这块还要加强。

说白了,我们做这么多,就是想把大模型的推理成本打下来。不用堆天价硬件,普通配置也能跑大模型,让AI真的普惠起来。

P.S. 推荐一个大神的教程给想要了解或者学习人工智能知识的读者,这个教程里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏教程,请点击下方链接查看,传送门https://blog.csdn.net/qq_74013365

更多推荐