- vLLM是一个开源的大模型推理加速框架,通过PagedAttention高效地管理attention中缓存的张量,实现了比HuggingFace Transformers高14-24倍的吞吐量,就像在操作系统中管理CPU虚拟内存一样
- NVIDIA FasterTransformer (FT) 是一个用于实现基于Transformer的神经网络推理的加速引擎。它包含Transformer块的高度优化版本的实现,其中包含编码器和解码器部分。使用此模块,您可以运行编码器-解码器架构模型(如:T5)、仅编码器架构模型(如:BERT)和仅解码器架构模型(如:GPT)的推理。FT框架是用C++/CUDA编写的,依赖于高度优化的 cuBLAS、cuBLASLt 和 cuSPARSELt 库,这使您可以在 GPU 上进行快速的 Transformer 推理。与 NVIDIA TensorRT 等其他编译器相比,FT 的最大特点是它支持以分布式方式进行 Transformer 大模型推理。在底层,节点间或节点内通信依赖于 MPI 、 NVIDIA NCCL、Gloo等。因此,使用FasterTransformer,您可以在多个 GPU 上以张量并行运行大型Transformer,以减少计算延迟。同时,TP 和 PP 可以结合在一起,在多 GPU 节点环境中运行具有数十亿、数万亿个参数的大型 Transformer 模型。
- DeepSpeed-MII 是 DeepSpeed 的一个新的开源 Python 库,旨在使模型不仅低延迟和低成本推理,而且还易于访问。
一般有几个需求
- 统一api,这样切换模型时上游应用无感,最好是 OpenAI-compatible,其api 被主要上游框架(比如langchain)兼容
- 支持流式输出和普通输出
- 支持多实例,进而支持灰度发布等
- 支持通用的加速库比如vllm等
- prompt拼写:llm本质都是语言模型,因此提供的只有语言模型调用方式,将所有请求简化为输入一个string,输出一个string的模式。然而,从语言模型到chat应用之间仍然有一个gap:输入prompt的拼写。text-in-text-out的设计可以简化引擎开发,但是prompt拼写的难题就被丢给了用户。提供chat能力的核心需求是如何将多轮对话按照模型训练时的格式渲染成模型的input id。
- function call 的处理。以ReAct模板的prompt为例,在模型吐字时留上一小块buffer不返回,如果没有
\nAction:
那就继续返回;如果遇到这个string,则说明模型可能要输出function call,在此收集输出直到遇到eos或者作为stop word 的\nObservation:
,然后再把buffer一次性parse成函数并返回。
设计思路
- 因为要支持不同的llm 库或加速库,比如Transformer、vllm等,且不同的llm在一些细节上有差异,因此推理侧必须有一个统一的LLM 抽象,在Fastchat里是XXModelWorker,在xinference 里是XXLLM
- 将python llm 库 api化,一个api 要有一个api handler 函数,一般抽象为一个对象 作为api handler的载体,这个对象持有上面的XxLLM 执行chat/generate 方法,有时候还要支持/封装分布式、异步等细节。在Fastchat里是ModelWorker,在xinference 里是WorkerActor
- 不同的llm 还有很多差别的(比如加载 load_model、运行chat/generate、模型配置转换),也有很多共性,所以模型设计的分层抽象很重要,Fastchat 的思路是 提供了一个ModelAdapter(主要差异化了加载) 和一个 generate_stream_gate 函数成员(差异化text生成),inference的思路是一个模型(比如chatglm、llama等)一个XXLLM
- 这里的模型配置转换说的是,比如一个chat message 包含role 和content 两个部分,role=system/user/assistant 各家各有差异,但因为对外提供的接口一般是openai 风格,所以有一个转换的过程。
- 除了文本生成模型,还经常需要部署embedding模型、rerank模型、图生图、文生图等(入参出参与LLM 肯定不一样了),Fastchat 的方式是 让ModelWorker支持除了generate_stream_xx 外的get_embeddings、get_rerank方法,inference的思路除了LLM之外还定义了 EmbeddingModel、RerankModel等。
FastChat
如何理解FastChat 都干了什么?本质是对下面的 原始的大模型推理代码进行抽象(模型加载、模型推理=tokenizer+model)和封装,对外提供rest api。
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).half().cuda()
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
你好
标签:prompt,stream,框架,模型,api,model,vLLM,推理,generate
From: https://www.cnblogs.com/muzinan110/p/18084850