大模型部署的方案

 借着热点,简单聊聊大模型的部署方案,作为一个只搞过CV部署的算法工程师,在最近LLM逐渐改变生活的大背景下,猛然意识到LLM部署也是很重要的。大模型很火,而且确实有用(很多垂类场景可以针对去训练),并且和Vision结合的大模型也逐渐多了起来。所以怎么部署大模型是一个超级重要的工程问题,很多公司也在紧锣密鼓的搞着。

目前效果最好讨论最多的开源实现就是LLAMA,所以我这里讨论的也是基于LLAMA的魔改部署

基于LLAMA的finetune模型有很多,比如效果开源最好的vicuna-13b和较早开始基于llama做实验的alpaca-13b,大家可以看:

  • https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard 开源LLM

  • https://lmsys.org/blog/2023-05-03-arena/  基于llama的开源对比

  • https://github.com/camenduru/text-generation-webui-colab 一些开源LLM的notebook

至于为啥要选LLAMA,因为当前基于LLAMA的模型很多,基础的llama的效果也不错,当然RWKV也很不错,我也一直在看。


f2c980be3689e64dcf276c69010e3ecd.png

具体的可以看这里,https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard

Github上较多的是实现是直接python推理然后基于gradio的网页端展示,还不能被当成服务调用(或者说不大优雅),一般来说作为服务:

  • 响应速度要快,每秒的tokens越多越好

  • 稳定性,出现core了不会影响推理或者可以及时恢复

  • 支持各种形式,http、sse、grpc等形式

其实最重要的一点还是要快,其次必须要量化,因为大模型的权重往往很大,量化可以有效减小权重(省显卡),是非常必要的。要做成服务的话,需要稍稍花一点功夫和魔改一下,幸运的是网上已经有不错的demo实现供我们尝试,这篇文章主要是总结下以LLAMA为例的LLM部署方案,希望能抛砖引玉。

PS:我们常用的ChatGPT据说是居于Python服务搭建的,相比模型的耗时,python环境的开销可以忽略不计。

以LLAMA为例

LLM很大,比如GPT3-175B的大模型,700GB的参数以及运行过程中600GB的激活值,1.3TB总共,正常来说,得32个A100-40GB才能放的下。

但实际应用中,消费级显卡要比专业显卡便宜的多(比如3090相比A10,同样都是24G显存),所以用消费级显卡部署LLM也很有钱途。一张卡放不下那就放两张,如果没有nvlink,那么PCIE的也凑合用。

回到LLAMA模型,有7B、13B、30B、65B的版本,当然是越大的版本效果最好,相应的也需要更多的显存(其实放到内存或者SSD也是可以的,但是速度相比权重全放到显存里头,肯定要慢)。

LLAMA的实现很多,简单列几个我看过的,都可以参考:

  • https://github.com/juncongmoo/pyllama  原始llama的实现方式

  • https://github.com/qwopqwop200/GPTQ-for-LLaMa 支持量化,INT4、INT8量化的llama

  • https://github.com/tpoisonooo/llama.onnx.git  以ONNX的方式运行llama

量化和精度

对于消费级显卡,直接FP32肯定放不下,一般最基本的是FP16(llama的7B,FP16需要14G的显存,大多数的消费级显卡已经说拜拜了),而INT8和INT4量化则就很有用了,举几个例子:

  • 对于3080显卡,10G显存,那么13B的INT4就很有性价比,精度比7B-FP16要高很多

  • 对于3090显卡,24G显存,那么30B的INT4可以在单个3090显卡部署,精度更高

可以看下图,列举了目前多种开源预训练模型在各种数据集上的分数和量化精度的关系:

33f39b08b05cb755ab702b9f9a525048.png
我自己也测试了几个模型,我使用的是A6000显卡,48G的显存,基于GPTQ-for-LLAMA测试了各种不同规格模型的PPL精度和需要的显存大小。
执行以下命令CUDA_VISIBLE_DEVICES=0 python llama.py ${MODEL_DIR} c4 --wbits 4 --groupsize 128 --load llama7b-4bit-128g.pt --benchmark 2048 --check测试不同量化精度不同规格模型的指标:

# 7B-FP16
Median: 0.03220057487487793
PPL: 5.227280139923096
max memory(MiB): 13948.7333984375# 7B-INT8
Median: 0.13523507118225098
PPL: 5.235021114349365
max memory(MiB): 7875.92529296875# 7B-INT4
Median: 0.038548946380615234
PPL: 5.268043041229248
max memory(MiB): 4850.73095703125# 13B-FP16
Median: 0.039263248443603516
PPL: 4.999974727630615
max memory(MiB): 26634.0205078125# 13B-INT8
Median: 0.18153250217437744
PPL: 5.039003849029541
max memory(MiB): 14491.73095703125# 13B-INT4
Median: 0.06513667106628418
PPL: 5.046994209289551
max memory(MiB): 8677.134765625# 30B-FP16 
OOM # 30B-INT8
Median: 0.2696110010147095
PPL: 4.5508503913879395
max memory(MiB): 34745.9384765625# 30B-INT4
Median: 0.1333252191543579
PPL: 4.526902675628662
max memory(MiB): 20070.197265625

30B的FP16和65B的爆显存了,还没搞自己的多卡环境,之后会补充结果到这里。

可以先看看其他大佬的测试结果,大概有个预期,65B模型的话,INT4在两张3090上是可以放得下的:


e675e933bebf9959ebc60f1345c5d175.png

速度测试

我这边也测试了llama在huggingface中Python库的实现速度、以及基于GPTQ的量化、多卡的速度,其中stream模式参考了text-generation-webui中的Stream实现。
其中FP16就是直接调用GPTQ-for-LLaMa/llama_inference.py中未量化的FP16推理,调用方式为model.generate,model来自:

model = LlamaForCausalLM.from_pretrained(model, torch_dtype='auto',# load_in_8bit=True, device_map='auto')

而量化版本的模型:

  • INT8模型调用方式同FP16,参数load_in_8bit设置为True,直接利用hugglingface的transformer库INT8的实现

  • INT4的模型使用GPTQ的方式进行量化,具体代码通过triton语言(区别于我之前提到的triton inference server)进行加速

模型平台精度显存速度备注
llama-7BA4000FP1613.6gOutput generated in 1.74 seconds (28.74 tokens/s, 50 tokens)
Output generated in 9.63 seconds (25.97 tokens/s, 250 tokens)
GPTQ-for-LLaMa/llama_inference.py
测试包含模型前后处理
利用率99%

A40004-bit5gOutput generated in 2.89 seconds (17.51 tokens/s, 50 tokens)

A40004-bit5gOutput generated in 2.93 seconds (17.11 tokens/s, 50 tokens)stream模式
一次输出1个token

A40004-bit3.4+2.3gOutput generated in 2.91 seconds (17.31 tokens/s, 50 tokens)多卡测试双A4000
两张卡利用率 20-30左右

A4000INT88.3gOutput generated in 10.20 seconds (5.8 tokens/s, 50 tokens)
int8 实现用的huggingface的实现
利用率25%

我这边拿我的A4000测了下,测试从tokenizer编码后开始,到tokenizer解码后结束。
大概的结论:

  • FP16速度最快,因为INT4和INT8的量化没有优化好(理论上INT8和INT4比FP16要快不少),而INT4的triton优化明显比huggingface中INT8的实现要好,建议使用INT4量化

  • stream模式和普通模型的速度似乎差不多

A6000的懒得测试了,补充一个网上搜到的指标,A6000相比A4000相当于类似于3090和3070的性能差距吧...


8fd1a0e08e7d40c1e2cb40f4186540c1.png

LLM和普通小模型在部署方面的区别

在我以往的任务中,都是处理CV相关的模型,检测、分类、识别、关键点啥的,最大模型可能也只有2、3G的样子。平时的检测模型,大点的也就300多M,在FP16或者INT8量化后则更小了,所以一般来说没有显存焦虑(当然有特殊情况,有时候可能会在一张卡上部署很多个模型,比如自动驾驶场景或者其他工业场景,这时候也是需要合理分配模型的显存占用)。

但部署LLM这种大模型就不一样了,随便一个6、7B的模型,动不动就20多G的权重;65B、175B的模型更是有几百G,模型变得异常大,因为这个原因,原来的部署方式都要发生一些变化。

模型方面的区别

  • 首先模型很大,大模型导出ONNX有一些问题,ONNX保存大模型的权重存在一些限制

  • LLM模型中一般包含很多if-else分支,比如是否采用kv-cache,对转换一些个别结构的模型(比如tensorrt)不是很友好

  • 我们之前都是单GPU运行,多GPU的话,很多常用的runtime都不支持,onnxruntime或者tensorrt(tensorrt有内测多GPU的支持)默认都不支持多GPU

  • 对于大模型来说,量化是必要的,因为FP16或者FP32的模型需要的显存太大,都是钱啊。量化起来也不容易,QAT代价太大,PTQ校准的时候也需要很大的内存和显存,会用INT8和INT4量化

  • 网上对于这类模型的加速kernel不是很多,可以参考的较少,很多需要自己手写

服务方式的区别

对于小模型来说,推理速度一般不会太慢,基本都在500ms以内,稍微等待下就得到结果了,也即是普通的http请求,一次请求得到一次结果。

而LLM因为是一个一个token产出来的,如果等全部token都出来再返回,那么用户等待时间就挺长的,体验不好,所以一般都是使用stream模式,就是出一点返回一点,类似于打字机的赶脚。

部署方案讨论

这部分是本篇文章主要想说的地方,也是想和大家讨论,一起想想方案,抛砖引玉。

对于部署像LLAMA这种的大语言模型,我之前也没有经验,浏览了一些开源的仓库和资料,大概也有些思路,简单总结总结,有那么几个方案:

依赖Python实现的方案

和普通的CV模型一样,python实现肯定是最简单也是实现最多的,我们可以基于现有的开源实现直接包一层服务框架,类似于flask的服务即可,但是也需要有一定的可靠性。

所以这里可以选择triton-inference-server的python后端,自己包一层前后处理,可以支持stream模式(使用grpc)。


这个实现起来比较简单,多注意输入输出即可,相对于CV来说,我们的输入可以是text或者是input_ids,要和图像的unchar区别开,加速部分只能依赖python实现,同时也依赖python环境。

f157bd55f9c6cae58ae5ccdf46cec853.png

fastertransformer_backend方案

对于生产环境的部署,可以使用triton inference server,然后基于tritonserver有fastertransformer-backend。fastertransformer-backend是一个支持多个LLM模型的backend,手工实现了很多高性能的针对transformer的算子,每个模型都是手写cuda搭建起来的,性能相比使用库要高一档。不过代价就是比较难支持新的模型框架,需要修改大量的源码。

NVIDIA Triton introduces Multi-GPU Multi-node inference. It uses model parallelism techniques below to split a large model across multiple GPUs and nodes:

  • Pipeline (Inter-Layer) Parallelism that splits contiguous sets of layers across multiple GPUs. This maximizes GPU utilization in single-node.

  • Tensor (Intra-Layer) Parallelism that splits individual layers across multiple GPUs. This minimizes latency in single-node

1607bdee72ca21db1dcd5ba12a012a2a.png
所幸开源社区的大佬很多,近期的非官方PR也支持了LLAMA。我自己尝试跑了下速度要比第一个huggingface的实现要快20%,这个精度基于FP16,支持多卡,目前暂时未支持INT8和INT4。

利用加速库分而治之的方案

我们知道LLAMA的7B模型包含32个结构相同的decoder:

# transformers/src/transformers/models/llama/modeling_llama.py
self.layers = nn.ModuleList([LlamaDecoderLayer(config) for _ in range(config.num_hidden_layers)])

因此我们也可以将这32个子模型分别使用我们常用的加速库部署起来,比如7B的大模型,拆分成子模型每个模型300多M,使用TensorRT可以轻松转换,也有大佬已经在做了:

  • https://github.com/tpoisonooo/llama.onnx

7B的llama模型转成ONNX大概是这些:

  • decoder-merge-0.onnx

588d82ef069701cc4887f416b71336b7.png

  • embed.onnx

54793b499ebe7dd24ea349a6d30fdb26.png

  • head.onnx

583ce101e0a738689905c94e203733fa.png

  • norm.onnx

8c6a38d7c941bee5956e9c3b103bd7ea.png
串起来的话,可以把这些模型放到不同的显卡上也是可以的,比如两张显卡,第一张卡放15个子模型,第二张卡放剩余17个子模型,组成pipeline parallelism也是可以的。
有几点需要注意:

  • 加速库可以使用不限于TensorRT,比如TVM、AItemplate啥的

  • 需要一个后端将所有子模型串起来,最好C++实现

  • 对于kv-cache,怎么存放需要考虑下

可以使用triton-inference-server去组pipeline,不同子模型的instance可以放到不同的gpu上。

后记

暂时先说这些,这篇文章之后也会随时更新。目前只是简单列了列我自己的想法,大家如果有好的想法也欢迎跟老潘一起交流。

每天出的新东西新技术太多了,看不过来,这篇文章也拖了好久,上述的这三种方案我自己都尝试过了,都是可行的,大家感兴趣可以试试,不过有个消息是TensorRT已经在默默支持多卡推理了,最快可能下个月(6月)就会出来(可能是对外release),不知道TensorRT大模型版本怎么样?

da5b9b2533a81bc83cc10dd81e717d06.png

参考链接

  • https://github.com/huggingface/text-generation-inference

  • https://github.com/huggingface/chat-ui/issues

  • https://github.com/ELS-RD/transformer-deploy

-END-

分享

收藏

点赞

在看

1292e6109d7e9d24957516ef5f5b5b46.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16945.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大大大模型部署方案抛砖引玉

作者 | Oldpan 编辑 | oldpan博客 点击下方卡片,关注“自动驾驶之心”公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心【模型部署】技术交流群 借着热点,简单聊聊大模型的部署方案,作为一个只搞过CV部署的算法工程师&#…

为什么很多企业把35岁视为分水岭

(点击即可收听) 为什么很多企业把35岁视为分水岭 有时候,别人的故事,若干年后,就是自己的故事,只要身在互联网这个行业里,可以说,每个人都避免不了35岁危机 不要五十步笑百步 前阵子,朋友圈一位行业知名大佬,35岁,每天兢兢业业,任劳任怨,本以为安稳渡过3个月试用期,正快要转正时…

AI冲击人工:资深翻译3年前就接受了可能到来的失业,原画师被取代后又出现了“AI概念师”...

九派新闻AI会取代我们吗? 高盛公司最新一份研究报告指出,ChatGPT等AI领域出现突破后,全球预计将有3亿个工作岗位被生成式AI取代。OpenAI近日发表论文称,如果一项工作使用AI能减少50%以上的时间,那么它就是可替代的。其…

项目完成小结:使用Blazor和gRPC开发大模型客户端

先介绍下这个项目。 最近我一直在探索大语言模型,根据不同场景训练了好几个模型,为了让用户测试使用,需要开发前端。 这时候,用 Gradio 搭建的前端是不太够的,虽说 GitHub 上也有一堆开源的 ChatGPT 前端&#xff0c…

Mac 上的搜狗输入法卡顿问题

我的 Mac 使用的中文输入法是搜狗拼音输入法,一直有一个问题,就是 Mac 开机太久,输入法会出现卡顿问题,按下按键 0.5s 后需才会显示对应的汉字,用着非常难受,以前这种情况我都是通过重启 Mac 来解决&#x…

大语言模型将如何影响软件开发?

当人人具备编写代码的能力之后,这将会给软件生产和分配带来哪些结构性的变化? 原文链接:https://www.geoffreylitt.com/2023/03/25/llm-end-user-programming.html 未经授权,禁止转载! 作者 | Geoffrey Litt 译者 | 弯…

提示词工程让儿童编程轻而易举

编写长长的代码时常令人头疼。尤其是小朋友,打字不快,但想象力丰富。 现在借助chatgpt。 一切变得超级简单。 1. https://github.com/roocell/gptCozmo 2. https://github.com/Bhood23/CozmoGPT while True:from pyChatGPT import ChatGPTimport speec…

【软件简史】怎样理解 Alan Kay 曾在1984 年写道:“我们希望像以前编辑文档一样编辑我们的工具” 这句话 —— LLM 将如何影响软件的创建?

近段时间,大语言模型(LLM)掀起了一股狂潮。 OpenAI 发布的 GPT-4 模型在包括编程在内的各个功能上都取得了令人瞩目的进步。微软研究院发布了一篇论文,展示了 GPT-4 能够在没有太多提示的情况下生成非常复杂的代码,如 3D 视频游戏。与此同时,OpenAI 还发布了 ChatGPT 插…

宇宙即计算~一种新科学:斯蒂芬·沃尔夫勒姆

斯蒂芬沃尔夫勒姆这个名字,在中文世界里可能远谈不上家喻户晓;但他的英文名Stephen Wolfram恐怕反而却要熟悉得多。 他是Mathematica软件的发明者和首席设计师,被广泛地认为是当今科学和计算技术中最重要的革新者之一。 大名鼎鼎的数学软件Ma…

02.GLM-130B

文章目录 前言泛读相关知识GPTBERTT5小结 背景介绍主要贡献和创新点GLM 6B 精读自定义Mask模型量化1TB 的中英双语指令微调RLHFPEFT训练策略 实验分析与讨论模型参数六个指标其他测评结果 代码复现(6B)环境准备运行调用代码调用网页服务命令行调用 模型微…

2023 CCF-百度松果基金正式启动申报!大语言模型、AIGC等热点课题首次公布

5 月 31 日,2023 年 CCF-百度松果基金(简称“松果基金”)正式启动申报,面向全球高校及科研院所青年学者开放,入选项目将获得松果基金百万课题基金及千万级支持与服务。申报截至 2023 年 7 月 10 日。 本届松果基金共设…

聊天尬死名场面,你遇到过吗?教你一键获取斗图表情包,晋升聊天达人

大家好呀,我是辣条。 写这篇文章的灵感来源于之前和朋友的聊天,真的无力吐槽了,想发适合的表情包怼回去却发现收藏的表情包就那几个,就想着是不是可以爬取一些表情包,再也不用尬聊了。 先给大家看看我遇到的聊天最尬…

国内使用bing国际版(非国内国际切换版本)

最近百度的广告越来越猖狂了,拦也拦不住,惹不起我还躲不起吗? 但是用bing搜素,国内版的广告也不少,www.bing.com还会被强制解析为cn.bing.com,所以要修改host,直接解析到global.bing.com上 这…

mytrader-开源股票期货金融软件+支持C/C++/Python/Excel/VBA/麦语言的量化分析交易平台

mytrader致力于为量化交易、算法交易、程序化交易以及技术分析爱好者打造最极致的行情分析交易平台。 mytrader是一款基于ZQDB构建的量化分析交易平台。 mytrader是绿色免安装版本,您可以直接克隆下载ZQDB项目:https://gitee.com/7thTool/zqdb.git 双击…

期货ctp开源量化平台

OC开放量化平台(原open_ctp);使用c,python等语言;支持A股,国内期货CTP;使用CMAKE构建跨平台工程;实现个人策略编写的开放平台:量化选 股,CTP策略等待你实现;“ctp互动交易平台“”使…

BTC/ETH历史行情数据/期权/合约成交数据分析工具

经常看到各个币圈群里很多朋友都在找各种指标数据,比如想看各个合约或者期权品种的成交情况,想看大宗成交的单子自己开单心里有个数,想看未平仓量统计方便看到交易量与“敞口”是否匹配等等,做得越久对数据分析的需求越来越大。 …

基于MT4平台通过CTP操作期货(一) -- 行情

通过MT4平台来由ctp接口操作期货,首先需要处理好商品和行情 1.期货商品品种 由于期货商品代号会随着时间变化,且商品品种较多,手动维护商品的话太繁琐。比较简单的处理方式 是做一个服务端的插件,在插件的启动事件 int APIENT…

量化交易如何通过函数获取行情数据?

我们可以把量化交易称之为工具, 在交易市场,用于股票交易的工具,也在不断升级。 1,股市诞生之初,只能在交易所大厅交易,那个时候用的纸质股票; 2,随后股市诞生了电话下单&#xf…

TradingView

官网:https://cn.tradingview.com 申请图表库 用本地服务器打开 二:文件目录 三:基础概念 3.1 UDF:通用数据饲料(Universal Data Feed) 通过HTTP协议向图标库提供数据 使用方法:创建一个能从数据库获取数据并且响应图表库请…