大模型的最后一步,也是必经一步就是最后部署到本地提供服务。无论是你直接使用预训练模型、还是嵌入数据库异或微调大模型,最后都是要部署某个地方执行某个功能。这就是部署。部署对于大模型本身来说,仅仅执行推理阶段,所以整体要求比训练少很多,而且在推理阶段我们可以牺牲计算精度来提升模型的推理速度,也是可以接受的。同时更重要的是我们可以在硬件GPU上面进行加速 对于超大型的网络,如GPT可能要更多的考虑并发与速度,这里不过多的讲解。我们目光仅仅聚焦于小型,面向企业或者个人的网络。
部署:
实际操作的地址是这里,我就不狗尾续貂了。仅仅总结一下部署的三种方式:
- 端口
- API(最为重要!!!)
- 网页
其中API是最为重要的部署,作为企业,一般是首推此方式。因为API能够部署,其他两个自然不在话下,但是API的部署略微复杂一点点,涉及到端口转发,当然网络上都有详细的资料可供参考。
此处使用的部署为LMdeploy框架。这里自然引发一个问题:
我明明正常使用也可以调用模型,为啥还要走LMdeploy一遍再用呢?
具体的原因就是:
- 速度。因为我们大模型代码都是使用python编写,python解释极好,但是运行速度却慢的一比。那么我们期望他运算快一点,自然要将其进行转化。其次当我们将模型每一层分开后,加载的速度会更快,在单一显卡上的载入也会更加迅速(相较于加载整个模型)。
- 硬件。个人电脑部署还好说,就一个运算卡。企业部署多数使用多个显卡,将每一层分割到不同卡,加速推理过程。这些多卡分布再运行的时候一个个方也并非易事。
所以这是框架的好处. 以下是端口的生成展示:
最佳优化部署流程(模型已经经过测试,生成内容满足需求):
此处给出部署的最佳实践,最佳实践是相对于自己来说的,也就是自己的资金、时间与项目要求等,按照一下思维导图可以找到自己的最优路线。
graph TB
A{尝试部署} --成功-->Z(部署结束)
A --失败-->B(正常版本 + KV-Cache量化)
B --失败--> C(BiT量化)
C --失败--> D(KV-Cache + BIt量化)
D --更小bit量化-->C
D --失败--> E(重新评估项目/购买显卡/选择低参数模型)
E --更小bit量化-->D
E -->F[升级GPU]
E-->G[选择低参数量模型]
E-->H[模型剪枝]
F -->I[模型测试成功]
G-->I
H-->I
I-->A
B --成功-->Z
C --成功-->Z
D --成功-->Z
过程解释
精度由多种因素导致,要看所使用的框架类型,模型的参数支持。并非固定。此处书生大模型仅支持:
KV-Cache
KV Cache 量化是指将逐 Token(Decoding)生成过程中的上下文 K 和 V 中间结果进行 INT8 量化,以降低生成过程中的显存占用.通俗易懂的就是:
模型头和尾(最后要做个逆运算,回来)不变,但是中间计算结果的精度的减少了,自然显存占用少了。
Bit量化
4bit Weight 量化,将 FP16 的模型权重量化为 INT4,Kernel 计算时,访存量直接降为 FP16 模型的 1/4,大幅降低了访存成本。通俗解释就是:
模型的神经元节点进行精度减少,自然所有推理过程占用都会减少。同时对比来看损失也更大