前言

在企业构建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 是一个高效的大型语言模型推理和部署框架,具备以下核心特性:

  1. 高效内存管理
    通过独特的 PagedAttention 算法,优化 KV 缓存管理,减少内存浪费,显著提升模型运行效率。
  2. 高吞吐量
    支持异步与连续批处理请求,加速文本生成与处理,极大提高推理速度。
  3. 易用性
    与 HuggingFace 模型无缝集成,兼容 OpenAI API,支持多种主流大模型,简化部署和推理过程。
  4. 分布式推理
    支持多 GPU 环境下的分布式推理,通过模型并行和高效数据通信,提升大模型的处理能力。
  5. 开源社区
    开源框架拥有活跃的社区支持,为开发者提供创新与改进的便利。

企业价值
对于企业部署 RAG 大模型,vLLM 提供高性能、零成本的解决方案,其卓越的接口性能和简单的部署流程,使其成为企业自建 RAG 系统的首选。

接下来,将详细介绍如何通过 vLLM 部署 GLM-4 的具体步骤。

硬件与环境配置建议

企业可根据成本和业务需求选择硬件设备,以下是推荐配置:

  1. GPU建议
  • 建议使用 NVIDIA 3090 或 4090 显卡。
  • 若仅用于功能验证,一块 GPU 即可满足需求;实际部署可根据业务规模决定 GPU 数量。
  1. 操作系统
  • Ubuntu 20.04 或更高版本。
  1. CUDA版本
  • 需安装 CUDA 12.1 或更高版本。
  1. 深度学习框架
  • PyTorch 2.1.0 或更高版本。
  1. 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
  1. vLLM 库中导入核心类:
  • LLM
    :主要用于通过 vLLM 引擎执行离线推理,是操作模型的核心类。
  • SamplingParams
    :用于设置采样参数,控制生成文本的随机性和多样性,为文本生成提供更细粒度的控制。
  1. 简化模型加载:
  • 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加速后模型的性能如下:

构建企业私有RAG大模型: (可商用)利用vLLM部署开源大模型,能写文章、能聊天!_大模型入门

从这个性能对比中可以看到,vllm加速的能力相当可以,基本可以提升100%。

写在最后

RAG 应用系统能够实现大模型的配置管理,通过 API 接入各大模型厂商,从而享受实时更新和性能优化,但这通常伴随较高的成本。另一种选择是自行部署开源模型,这样可以有效控制成本。开源模型不仅支持企业自定义微调,还可以随着开源版本的升级进行更新。通过 vLLM 部署开源模型,能够提升系统性能,进而更好地满足企业需求。同时,vLLM 还支持灵活部署接口,提供 Chat 和 Text 两种功能。未来,我们将继续介绍其他开源模型的 vLLM 部署方式。

重要说明: 这些开源大模型还可以支持企业内部各种应用的接入,推动不同产品通过大模型技术实现创新