【LLM】能刷掉80%候选人的一道大模型面试题

大模型服务的吞吐率太小怎么办?

这是一道能刷掉 80% 候选人的大模型面试题。

更关键的是,这些同学可能到面试结束都没意识到,自己怎么就成了炮灰?

这个视频我将从面试官的视角出发,给大家详细拆解一下。

当面试官问出这道问题时,他的心理预期以及期待的优秀回答,尤其是最后一点,如果你能答出,

立马能让面试官眼前一亮,超越 80% 的面试竞争者。

点赞收藏马上开始。

面试官的第一个心理预期

就是想知道你是否了解大模型服务的吞吐率跟哪些因素有关

首先看一下吞吐率是怎么算的,吞吐率等于处理的请求 n 必上延时,说人话就是,在一定的时间内,服务处理的请求数除以消耗的时间。我们看一下分母模型处理的延时跟什么有关,是不是模型的 forward 时间?

我们当然希望这个时间尽可能小,对不对?再看分子,怎么能让分子变大呢?处理的请求 n 跟两个因素有关;

一是模型一次能处理的条数,也就是 batch size

二是服务的实例数量,也就是部署了多少个节点,一个节点能处理n,那 k 一个节点理论上就是 k 乘上n,这两个因素都直接增大了分子。

好到这里为止,我们就答出了面试官的第一个心理预期,那就是大模型服务的吞吐率跟两个因素有关,

1、是模型单次推理的延时,

2、是模型一次能处理的请求数量。

因此让吞吐率提高的方法是,尽量降低模型的推理延迟,同时增大模型的并行处理请求的能力。第一层回答到这里就结束了,也就是最基本的概念,相信大多数同学都能答得上来。

面试官的第二个心理预期

就是想知道你是否了解提高吞阻率的具体解决方法

我们继续来看,大模型的单次推理延迟有几个方向:

首先是减少计算量。可以采用权重加激活量化来解决,如果 profile 到服务的计算资源还有空余,

比如 GPU 的利用率只有60%,也可以用投机采样来做,也就是用一个小模型猜测,加大模型验证的方式。

另一个方向是提高访存利用率,将要结合所使用模型的计算量来分析,如果模型不是计算密集型的,也就是计算速度比访问内存速度快得多,这时候主要就是受到内存访问的瓶颈。在 self-attention 中大部分都是属于这种情况,因此减少访问内存次数可以极大提升单次推理速度。

Flash attention 就是这个思想,对大模型的并行处理能力也有两个优化方向。

一是在显存运行的情况下,增大模型一次处理的 batch size。

这里有多种方法,静态batching、动态 batching 以及连续的 batching 等等,差别就是合并 batch 的方式不同。

二是在业务条件允许的情况下做水平扩展,增加节点数。

这里就要考虑到 scaling 的问题,也就是增加节点数之后要尽可能最大化利用每个节点的计算能力。

需要考虑到负载均衡的问题,比如用 K8S 加 GPU 利用率监测加 QLB 负载均衡来进行调优。

好,回答到这里我们就答出了面试官的第二个心理预期。

从基本概念到具体解决方法,那根据我的面试经验,大多数候选人可能就到此为止。

但是如果你想冲击一些大厂的大模型岗位,那还得再更进一步,跟其他候选人拉开差距。

面试官的第三个心理预期

就是希望你用业务中实际用过且行之有效的技术,能让他彻底信服。

这里要注意一个关键点,分清主次,选最重要最适合落地的方式来讲,这也是考验你的技术选型能力。

回到问题上来,如果是优化吞吐率,影响最大的因素肯定是模型处理的并行度。

单次推理延时影响的是单个用户的体验,而并行度是高并发的情况下的多个用户的体验。

另外从实际工程经验来看,如果增大 batch size,会以 10% 到 30% 的单次实验增加,换了数倍甚至数十倍的吞吐率加速。

因此最后一层回答,我们就以目前最流行,加速最明显的 continuous batching 技术,来详细讲解是如何和实际业务模型结合的。

首先要明白为什么有这个方法?原因是大模型服务不能假定固定长度的输入序列和输出序列

因此对于 static batching 或者 Dynamic batching 来说,生成输出的变化可能会导致 GPU 严重未充分利用。

解决这个问题的方法是采用迭代级调度,一旦批中了一个序列完成生成,就可以在其位置插入一个新的序列,从而实现比静态批处理更高的 GPU 利用率。

我们来看这张图,它使用了连续批处理完成 7 条序列。

左图显示了单个迭代后的batch,右图显示了多次迭代后的batch。

一旦一个序列产生,结束序列标记,我们在其位置插入新的序列。

也就是图中的序列S5、S6、S7 ,这样就实现了更高的 GPU 利用率,因为 GPU 不需要等待所有序列完整才开始新的一个,而实际在代码层面实现时,还需要根据服务是流式输出还是一次性输出做进一步优化。

若是流式输出,则需要利用异步协程的async 和 await 来实现计算资源的切换,实现在 token 粒度级别的多用户输出,更进一步,在这个过程中, tokenize 和 detokenize 也可以用异步协程来实现,进一步提高编解码速度。

最后在回答过程中,我们可以边画图边结合实际用例给面试官讲解出来,体现我们对这个算法的熟练掌握程度,那到此为止,这才可以算得上是一个优秀的面试回答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值