训练大型语言模型以及微调的教程比比皆是,但关于在生产环境中部署它们并监控其活动的资料相对稀缺。上个章节提到了未来云原生的AI是趋势,然而涉及到云原生会比较偏技术。而在此之前为了解决大模型部署量产的问题,社区也一直在探索,目前已经有不少的工具可用于这个领域。
今天挑选几个颇具特色的主流部署工具来谈谈,例如vLLM、LLAMA.cpp 和TGI等工具,它们各自都提供各自的部署模式,本文对于数据分析师乃至数据科学家,还是刚接触AI部署的新兵,相信可以为读者打开一扇窗户进行快速的了解。
TGI
Huggingface TGI是一个用Rust和Python编写的框架,用于部署和提供大型语言模型。它根据HFOILv1.0许可证允许商业使用,前提是它作为所提供产品或服务中的辅助工具。
目前TGI是一个用于部署和服务大型语言模型 (LLM) 的工具包。TGI 为最流行的开源 LLM 提供高性能文本生成,包括 Llama、Falcon、StarCoder、BLOOM、GPT-NeoX 和 T5。
TGI的几项关键技术:
-
支持张量并行推理
-
Safetensors格式的权重加载
-
支持传入请求Continuous batching以提高总吞吐量
-
在主流的模型架构上使用FlashAttention和PagedAttention用于推理的transformers代码优化。!!并非所有模型都支持这些优化
-
使用bitsandbytes(LLM.int8())和GPT-Q进行量化
-
支持Logits warper
-
支持微调
目前TGI支持的大模型清单如下,当然也可以部署自定义的模型,只不过性能就未必那么好了。
Llama Phi 3 Gemma Cohere Dbrx Mamba Mistral Mixtral Gpt Bigcode Phi Falcon StarCoder 2 | Baichuan Qwen 2 Opt T5 Galactica SantaCoder Bloom Mpt Gpt2 Gpt Neox Idefics (Multimodal) Idefics 2 (Multimodal) Llava Next (Multimodal) |
架构与启动
TGI的架构并不复杂,左侧为Web Server,右侧为GPU集群的调度。双方通过gRPC进行通讯,而GPU之间的通讯协议为NCLL。
TGI支持本地部署和Docker启动,实验环境可以直接用docker命令,而在产线环境建议直接采用云原生部署。
docker run --gpus all --shm-size 1g \
#可以事先下载好模型
-p 8080:80 -v $PWD/$MODEL_PATH:/$MODEL_PATH \
#用于存储下载模型转换Safetensors格式后的权重
-v $PWD/data:/data \
ghcr.io/huggingface/text-generation-inference \
--model-id /$MODEL_PATH
启动完毕之后,可以利用Python来访问,(前提是机器的显卡已经完成正确的安装和配置)
import json
import requests
url = "http://localhost:8080/generate"
params = {
"inputs": "Hello, lubanmocui! ",
"parameters": {
"best_of": 1,
"details": True,
"return_full_text": True,
"decoder_input_details": True,
"truncate": 10,
"max_new_tokens": 128,
"stop": ["\n", "."],
"do_sample": True,
"temperature": 0.8,
"top_k": 10,
"top_p": 0.95,
},
}
response = requests.post(url, json=params)
result = json.loads(response .text)
print(result)
若是显卡的配置不给力的话,还可以通过--quantize的参数设置来解决,TGI会自动对模型进行量化操作。
-
bitsandbytes
8-Bit 量化,速度偏慢,但是被支持得最广泛的 -
bitsandbytes-nf4
4-Bit 量化,大部分的模型都可以直接使用,采用了BNB-NF4的量化方案 -
bitsandbytes-fp4
4-Bit 量化,和BNB-NF4类似,但是使用标准的4-Bit浮点数类型 -
gptq
4-Bit 量化,只能在做过GPTQ Post Training的模型 -
awq
4-Bit 量化,类似GPTQ -
eetq
8-Bit 量化
当然还有一些其他的参数配置:
docker run --gpus all --shm-size 1g \
-p 8080:80 -v $PWD/data:/data \
ghcr.io/huggingface/text-generation-inference:latest \
--model-id model-ids \
--quantize bitsandbytes-nf4 \
--max-best-of 1 \
--max-concurrent-requests 128 \
--max-input-length 3000 \
--max-total-tokens 4000 \
--max-batch-prefill-tokens 12000
vLLM适用于需要高效内存管理和并行计算的大规模语言模型推理,特别是在资源受限的环境中表现优秀。其主要优势在于高效的内存使用和灵活的并行处理能力,但需要细致的配置和优化。而TGI则专注于提升文本生成任务的推理速度,适用于需要高效文本生成的应用场景。其主要优势在于推理速度优化和模型压缩,但主要针对特定任务进行优化,量化可能会影响模型精度。选择哪一个系统取决于具体的应用需求。