前言
在企业构建RAG应用系统时,大模型是系统的核心。在RAG架构中,可以灵活配置不同的大模型,包括闭源模型如文心一言、通义千问、智普、元宝,以及OpenAI等提供收费API的高效接口。此外,为了降低成本,RAG系统通常会预置几款开源大模型,特别是在企业内部部署时,默认配置一款开源模型,以平衡性能和成本。
目前可商用的开源大模型主要包括:
- GLM-4-9B-Chat
- Qwen2.5-7B
- DeepSeek-7B-Chat
其中,DeepSeek近期备受关注,但本文将重点讨论如何部署GLM的大模型版本(vLLM),为企业提供高效生成支持。
GML-4介绍
GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。 在语义、数学、推理、代码和知识等多方面的数据集测评中,GLM-4-9B 及其人类偏好对齐的版本 GLM-4-9B-Chat 均表现出较高的性能。 除了能进行多轮对话,GLM-4-9B-Chat 还具备网页浏览、代码执行、自定义工具调用(Function Call)和长文本推理(支持最大 128K 上下文)等高级功能。 本代模型增加了多语言支持,支持包括日语,韩语,德语在内的 26 种语言。我们还推出了支持 1M 上下文长度(约 200 万中文字符)的模型。
vLLM介绍
vLLM 是一个高效的大型语言模型推理和部署框架,具备以下核心特性:
- 高效内存管理
通过独特的 PagedAttention 算法,优化 KV 缓存管理,减少内存浪费,显著提升模型运行效率。 - 高吞吐量
支持异步与连续批处理请求,加速文本生成与处理,极大提高推理速度。 - 易用性
与 HuggingFace 模型无缝集成,兼容 OpenAI API,支持多种主流大模型,简化部署和推理过程。 - 分布式推理
支持多 GPU 环境下的分布式推理,通过模型并行和高效数据通信,提升大模型的处理能力。 - 开源社区
开源框架拥有活跃的社区支持,为开发者提供创新与改进的便利。
企业价值
对于企业部署 RAG 大模型,vLLM 提供高性能、零成本的解决方案,其卓越的接口性能和简单的部署流程,使其成为企业自建 RAG 系统的首选。
接下来,将详细介绍如何通过 vLLM 部署 GLM-4 的具体步骤。
硬件与环境配置建议
企业可根据成本和业务需求选择硬件设备,以下是推荐配置:
- GPU建议
- 建议使用 NVIDIA 3090 或 4090 显卡。
- 若仅用于功能验证,一块 GPU 即可满足需求;实际部署可根据业务规模决定 GPU 数量。
- 操作系统
- Ubuntu 20.04 或更高版本。
- CUDA版本
- 需安装 CUDA 12.1 或更高版本。
- 深度学习框架
- PyTorch 2.1.0 或更高版本。
- Python版本
- 使用 Python 3.10 或更高版本(推荐使用 Conda 环境管理工具)。
确保环境与硬件兼容,是大模型高效运行的关键。
vLLM的安装
执行以下命令:pip 换源加速下载并安装依赖包
# 升级pippython -m pip install --upgrade pip# 更换 pypi 源加速库的安装pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install modelscope==1.11.0pip install openai==1.58.1pip install torch==2.5.1pip install transformers==4.45.2# 下载flash-attn 请等待大约10分钟左右~MAX_JOBS=8 pip install flash-attn --no-build-isolation
直接安装 vLLM,默认会安装 支持CUDA 12.1及以上版本的vLLM,如果你的环境是12.1及以上那就直接执行以下命令。
pip install vllm
如果我们需要在 CUDA 11.8 的环境下安装 vLLM,指定 vLLM 版本和 python 版本下载安装。
模型的下载
使用HF国内的镜像下载,执行以下命令,将模型下载到/glm/model目录下。
git clone https://hf-mirror.com/THUDM/glm-4-9b-chat
下载完成后可以看到目录结构如下:
/glm/model|-- LICENSE|-- README.md|-- config.json|-- configuration.json|-- configuration_chatglm.py|-- generation_config.json|-- model-00001-of-00010.safetensors|-- model-00002-of-00010.safetensors|-- model-00003-of-00010.safetensors|-- model-00004-of-00010.safetensors|-- model-00005-of-00010.safetensors|-- model-00006-of-00010.safetensors|-- model-00007-of-00010.safetensors|-- model-00008-of-00010.safetensors|-- model-00009-of-00010.safetensors|-- model-00010-of-00010.safetensors|-- model.safetensors.index.json|-- modeling_chatglm.py|-- tokenization_chatglm.py|-- tokenizer.model`-- tokenizer_config.json
代码准备
简单示例Python文件
在/glm目录下创建vllm-run.py,创建完目录结构如下:
/glm|-- model| |-- LICENSE| |-- README.md| |-- config.json| |-- configuration.json| |-- configuration_chatglm.py| |-- generation_config.json| |-- model-00001-of-00010.safetensors| |-- model-00002-of-00010.safetensors| |-- model-00003-of-00010.safetensors| |-- model-00004-of-00010.safetensors| |-- model-00005-of-00010.safetensors| |-- model-00006-of-00010.safetensors| |-- model-00007-of-00010.safetensors| |-- model-00008-of-00010.safetensors| |-- model-00009-of-00010.safetensors| |-- model-00010-of-00010.safetensors| |-- model.safetensors.index.json| |-- modeling_chatglm.py| |-- tokenization_chatglm.py| |-- tokenizer.model| `-- tokenizer_config.json`-- vllm-run.py
- 从 vLLM 库中导入核心类:
- LLM
:主要用于通过 vLLM 引擎执行离线推理,是操作模型的核心类。 - SamplingParams
:用于设置采样参数,控制生成文本的随机性和多样性,为文本生成提供更细粒度的控制。
- 简化模型加载:
- vLLM 封装了模型初始化逻辑,只需传入模型名称或路径即可,无需手动加载模型和分词器,大大提升了开发效率。
通过示例代码可以快速熟悉 vLLM 引擎的使用方式,为后续的开发和应用奠定基础。
from transformers import AutoTokenizerfrom vllm import LLM, SamplingParams
# GLM-4-9B-Chat# max_model_len, tp_size = 8192, 4# 如果遇见 OOM 现象,建议减少max_model_len,或者增加tp_size
max_model_len, tp_size = 2048, 1model_name = "./model"prompt = [{"role": "user", "content": "你好"}]
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)llm = LLM( model=model_name, tensor_parallel_size=tp_size, max_model_len=max_model_len, trust_remote_code=True, enforce_eager=True, # GLM-4-9B-Chat-1M 如果遇见 OOM 现象,建议开启下述参数 enable_chunked_prefill=True, max_num_batched_tokens=2048)stop_token_ids = [151329, 151336, 151338]sampling_params = SamplingParams(temperature=0.95, max_tokens=1024, stop_token_ids=stop_token_ids)
inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
print(outputs[0].outputs[0].text)
执行以下命令:
# export CUDA_VISIBLE_DEVICES=3 ,如果不指定卡号,默认使用0卡python vllm-run.py
执行结果:
INFO 01-05 01:57:47 model_runner.py:1099] Loading model weights took 17.5635 GBINFO 01-05 01:57:48 worker.py:241] Memory profiling takes 0.75 secondsINFO 01-05 01:57:48 worker.py:241] the current vLLM instance can use total_gpu_memory (23.64GiB) x gpu_memory_utilization (0.90) = 21.28GiBINFO 01-05 01:57:48 worker.py:241] model weights take 17.56GiB; non_torch_memory takes 0.09GiB; PyTorch activation peak memory takes 1.40GiB; the rest of the memory reserved for KV Cache is 2.23GiB.INFO 01-05 01:57:48 gpu_executor.py:76] # GPU blocks: 3653, # CPU blocks: 6553INFO 01-05 01:57:48 gpu_executor.py:80] Maximum concurrency for 2048 tokens per request: 28.54xINFO 01-05 01:57:52 llm_engine.py:431] init engine (profile, create kv cache, warmup model) took 4.56 secondsProcessed prompts: 100%|███████████████████████████████████████████| 1/1 [00:00<00:00, 2.19it/s, est. speed input: 17.55 toks/s, output: 35.11 toks/s]
你好👋!很高兴见到你,欢迎问我任何问题。
创建兼容 OpenAI API 接口的服务器
GLM4 兼容 OpenAI API 协议,因此我们可以直接使用 vLLM 创建 OpenAI API 服务器。通过 vLLM 部署 OpenAI API 协议服务器非常便捷,默认情况下,服务器会在以下地址启动:http://localhost:8000该服务器一次只托管一个模型,并实现了列表模型、completions 和 chat completions 三个接口。
- completions:用于基本的文本生成任务,模型根据给定的提示生成一段文本。这类任务通常用于生成文章、故事、邮件等内容。
- chat completions:专门针对对话的任务,模型需要理解并生成对话内容。这类任务通常用于构建聊天机器人或对话系统。
在创建服务器时,我们可以指定多个参数,包括模型名称、模型路径和聊天模板等。
--host和--port 参数用于指定服务器的地址和端口。
--model参数用于指定模型名称。
--chat-template参数用于指定聊天模板。
--served-model-name参数用于指定服务模型的名称。
--max-model-len参数用于指定模型的最大长度。
特别注意,--max-model-len=2048
是为了避免 GLM4-9b-Chat 模型的最大长度(128K)过长,导致 vLLM 在初始化 KV 缓存时消耗过多资源。
使用 vLLM 提供的类创建 API Server,可以通过以下命令执行:
python -m vllm.entrypoints.openai.api_server --model ./model --served-model-name glm-4-9b-chat --max-model-len=2048 --trust-remote-code
执行命令后结果:
INFO 01-05 03:05:01 launcher.py:19] Available routes are:INFO 01-05 03:05:01 launcher.py:27] Route: /openapi.json, Methods: GET, HEADINFO 01-05 03:05:01 launcher.py:27] Route: /docs, Methods: GET, HEADINFO 01-05 03:05:01 launcher.py:27] Route: /docs/oauth2-redirect, Methods: GET, HEADINFO 01-05 03:05:01 launcher.py:27] Route: /redoc, Methods: GET, HEADINFO 01-05 03:05:01 launcher.py:27] Route: /health, Methods: GETINFO 01-05 03:05:01 launcher.py:27] Route: /tokenize, Methods: POSTINFO 01-05 03:05:01 launcher.py:27] Route: /detokenize, Methods: POSTINFO 01-05 03:05:01 launcher.py:27] Route: /v1/models, Methods: GETINFO 01-05 03:05:01 launcher.py:27] Route: /version, Methods: GETINFO 01-05 03:05:01 launcher.py:27] Route: /v1/chat/completions, Methods: POSTINFO 01-05 03:05:01 launcher.py:27] Route: /v1/completions, Methods: POSTINFO 01-05 03:05:01 launcher.py:27] Route: /v1/embeddings, Methods: POSTINFO 01-05 03:05:01 launcher.py:27] Route: /pooling, Methods: POSTINFO 01-05 03:05:01 launcher.py:27] Route: /score, Methods: POSTINFO 01-05 03:05:01 launcher.py:27] Route: /v1/score, Methods: POSTINFO: Started server process [12590]INFO: Waiting for application startup.INFO: Application startup complete.INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)INFO: 127.0.0.1:34690 - "GET /v1/models HTTP/1.1" 200 OK
通过 curl 命令查看当前API Server的模型列表。
curl http://localhost:8000/v1/models
查看结果如下:
{ "object": "list", "data": [{ "id": "glm-4-9b-chat", "object": "model", "created": 1736046317, "owned_by": "vllm", "root": "./model", "parent": null, "max_model_len": 2048, "permission": [{ "id": "modelperm-8e1318fd423b4b87a903f4c09aa8babe", "object": "model_permission", "created": 1736046317, "allow_create_engine": false, "allow_sampling": true, "allow_logprobs": true, "allow_search_indices": false, "allow_view": true, "allow_fine_tuning": false, "organization": "*", "group": null, "is_blocking": false }] }]}
生成文本接口,curl使用prompt调用
curl http://localhost:8000/v1/completions \ -H "Content-Type: application/json" \ -d '{ "model": "glm-4-9b-chat", "prompt": "你是谁?", "max_tokens": 300, "temperature": 0 }'
查看结果如下:
{ "id": "cmpl-5d4a4ec2ac9e408dbebc655b23f0aa2c", "object": "text_completion", "created": 1736047041, "model": "glm-4-9b-chat", "choices": [{ "index": 0, "text": "你在哪里?你在做什么?\n\n我是一个人工智能助手,我的名字是 ChatGLM。我目前运行在清华大学 KEG 实验室和智谱 AI 公司共同训练的语言模型上。我的主要任务是针对用户的问题和要求提供适当的答复和支持。至于“在哪里”,由于我是一个虚拟的 AI,所以我没有物理意义上的位置。我存在于服务器上,通过互联网与用户进行交互。至于“在做什么”,我现在正在做的是处理和回应你的问题。有什么可以帮助你的吗?😊🤖📚🌐🤔👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻👋🏻", "logprobs": null, "finish_reason": "length", "stop_reason": null, "prompt_logprobs": null }], "usage": { "prompt_tokens": 5, "total_tokens": 305, "completion_tokens": 300, "prompt_tokens_details": null }}
聊天对话接口,用 curl 命令测试 OpenAI Chat Completions API 。
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "glm-4-9b-chat", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "讲讲星星"} ], "chat_template": "default", "max_tokens": 150, "temperature": 0 }'
查看结果如下:
{ "id": "chatcmpl-bd9c98a8b4ae4cf1a2b8e56f8aee3f84", "object": "chat.completion", "created": 1736048807, "model": "glm-4-9b-chat", "choices": [{ "index": 0, "message": { "role": "assistant", "content": "\n你好👋!有什么可以帮助你的吗?", "tool_calls": [] }, "logprobs": null, "finish_reason": "stop", "stop_reason": 151336 }], "usage": { "prompt_tokens": 14, "total_tokens": 26, "completion_tokens": 12, "prompt_tokens_details": null }, "prompt_logprobs": null}
我们可以看到两次请求的返回值中“object”的类型不同。
使用vLLM加速后模型的性能如下:
从这个性能对比中可以看到,vllm加速的能力相当可以,基本可以提升100%。
写在最后
RAG 应用系统能够实现大模型的配置管理,通过 API 接入各大模型厂商,从而享受实时更新和性能优化,但这通常伴随较高的成本。另一种选择是自行部署开源模型,这样可以有效控制成本。开源模型不仅支持企业自定义微调,还可以随着开源版本的升级进行更新。通过 vLLM 部署开源模型,能够提升系统性能,进而更好地满足企业需求。同时,vLLM 还支持灵活部署接口,提供 Chat 和 Text 两种功能。未来,我们将继续介绍其他开源模型的 vLLM 部署方式。
重要说明: 这些开源大模型还可以支持企业内部各种应用的接入,推动不同产品通过大模型技术实现创新