手把手教学:基于vLLM与AutoDL快速搭建GLM-4-9B-Chat推理API
1. 为什么选择vLLM和AutoDL来部署GLM-4-9B-Chat?
如果你对AI大模型感兴趣,想自己动手部署一个像ChatGPT那样的聊天机器人,但又担心成本太高、技术太复杂,那今天这篇分享就是为你准备的。我过去几年在AI和智能硬件领域摸爬滚打,试过各种部署方案,踩过不少坑。今天要聊的这套组合——vLLM + AutoDL + GLM-4-9B-Chat,是我实测下来,对个人开发者和小团队来说,成本最低、上手最快、效果最稳的方案之一。
简单来说,vLLM 是一个专门为大型语言模型(LLM)推理设计的开源库。你可以把它想象成一个“超级加速器”。传统的模型部署方式,比如直接用Hugging Face的Transformers库,在处理用户请求时,内存管理效率不高,尤其是在多人同时访问时,速度会明显变慢。而vLLM的核心技术是 PagedAttention,这个技术灵感来自操作系统的虚拟内存分页管理。它能把模型运行时的关键数据(KV缓存)更高效地组织起来,减少内存浪费。实测下来,在相同硬件上,vLLM的推理速度能比传统方式快上2倍甚至更多,这意味着你用更少的钱,能服务更多的用户请求。
那AutoDL又是什么呢?它是一个提供GPU云服务器的平台。自己买一张高性能的显卡(比如RTX 3090)动辄上万,而且还有电费、噪音、维护成本。AutoDL这类平台的好处是“按需租用”,用几个小时就付几个小时的钱。对于GLM-4-9B-Chat这个90亿参数的模型,一张24G显存的RTX 3090显卡就完全能跑起来,在AutoDL上租用一小时的成本可能就一两块钱,非常适合做实验、开发测试或者小规模应用。
最后是主角GLM-4-9B-Chat,这是智谱AI开源的对话大模型。9B的参数量在保证不错对话能力的同时,对算力要求相对友好。更重要的是,它完全兼容OpenAI的API协议。这意味着一旦我们部署成功,你之前为ChatGPT写的代码、用的工具(比如LangChain、LlamaIndex),几乎可以无缝切换过来,学习成本和迁移成本极低。
所以,这套方案的核心优势就是:用云平台的低成本弹性算力,配合vLLM的高效推理引擎,快速部署一个生产可用的、兼容行业标准的开源大模型服务。无论你是想学习大模型技术,还是为自己的应用找一个可靠的AI大脑,跟着下面的步骤走,半小时内就能看到成果。
2. 第一步:在AutoDL上准备你的“云电脑”
万事开头难,但AutoDL已经把开头变得非常简单了。我们首先需要一台带GPU的云服务器。
打开AutoDL官网并登录后,点击顶部的“算力市场”。这里就像个显卡超市,琳琅满目。对于GLM-4-9B-Chat,我强烈推荐选择 RTX 3090(24G显存) 的机型。这个配置性价比最高,显存足够加载模型并留有缓冲处理并发请求,而且租金相对便宜。当然,如果你追求更快的速度,RTX 4090也可以,但成本会高一些。
选好显卡后,关键的一步来了:选择系统镜像。镜像就相当于你电脑的操作系统和预装软件。这里有个小技巧,为了最大程度避免环境冲突,我们最好选择一个干净的、只包含基础深度学习框架的镜像。在原始文章里,他们选择了PyTorch 2.1.0,这是没问题的。但根据我的经验,以及参考最新的社区实践,我建议你直接使用一个更省事的“宝藏镜像”。
在镜像选择页面,不要直接选“基础镜像”,而是点击“社区镜像”。在搜索框里输入 GLM-4 或者 vLLM,你会发现一个由 datawhalechina 维护的镜像,名字可能类似 GLM-4 / PyTorch 2.1。这个镜像的妙处在于,它已经为你预装好了vLLM、PyTorch、Transformers等所有必需的依赖,甚至配置好了国内 pip 源。选择它,可以让你跳过后面几乎所有安装依赖的步骤,直接进入模型下载环节,成功率几乎是100%。这能帮你省下至少15分钟,并且避免各种版本冲突的“玄学”问题。
注意:选择这个社区镜像是可选的,但强烈推荐给新手。如果你选择从零开始配置基础PyTorch镜像,也能跟着教程走,只是需要多执行一些安装命令。
点击“立即创建”后,稍等一两分钟,你的云服务器就准备好了。在实例管理页面,点击“JupyterLab”或“终端”进入操作环境。我更喜欢用JupyterLab,因为它有图形化界面,上传下载文件、编辑代码都更方便。
进入JupyterLab后,第一件事是打开终端(Terminal)。我们先做一个优化操作:更换pip源为国内镜像,这样后续安装任何Python包都会飞快。在终端里粘贴并运行下面这行命令:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
如果你的运气好,直接用了社区镜像,这一步可能已经自动完成了。为了确认,可以运行 pip config list 查看一下。
3. 第二步:下载GLM-4-9B-Chat模型
服务器准备好了,接下来就是把“大脑”——模型文件,放进去。模型文件比较大,大约14GB,直接从国外的Hugging Face下载可能会很慢。幸好,国内有优秀的开源社区“魔搭(ModelScope)”,它提供了模型的国内镜像,下载速度飞快。
我们在JupyterLab左侧的文件浏览器中,进入 /autodl-tmp 目录。这个目录挂载的是数据盘,空间大且持久,适合存放模型。然后右键新建一个文件夹,命名为 model,再新建一个Python文件,命名为 download_model.py。
打开 download_model.py 文件,将以下代码粘贴进去。这段代码使用了魔搭的 snapshot_download 功能来下载模型,并指定了缓存目录。
from modelscope import snapshot_download
# 指定模型名称和下载路径
model_dir = snapshot_download('ZhipuAI/glm-4-9b-chat',
cache_dir='/autodl-tmp/model',
revision='master')
print(f"模型已下载至:{model_dir}")
保存文件后,回到终端,确保当前目录在 /autodl-tmp,然后运行:
cd /autodl-tmp
python download_model.py
接下来就是等待了。根据网络情况,通常需要5到15分钟。你会看到下载进度条。完成后,终端会打印出模型保存的路径,类似 /autodl-tmp/model/ZhipuAI/glm-4-9b-chat。这个路径我们后面会用到。
这里有个我踩过的坑提醒你:一定要确认下载到了数据盘(/autodl-tmp)而不是系统盘。系统盘空间小,放不下大模型,强行下载会导致磁盘写满,实例崩溃。看到打印的路径里有 /autodl-tmp 就对了。
4. 第三步:启动vLLM OpenAI兼容API服务
模型下载完毕,最激动人心的时刻来了:启动服务。vLLM的强大之处在于,它提供了一个开箱即用的命令,可以直接启动一个兼容OpenAI API协议的服务器。这意味着你不需要自己写任何服务端代码。
在终端中,使用 cd 命令切换到模型所在目录的上一级,或者直接使用绝对路径。运行以下命令:
python -m vllm.entrypoints.openai.api_server \
--model /autodl-tmp/model/ZhipuAI/glm-4-9b-chat \
--served-model-name glm-4-9b-chat \
--max-model-len 2048 \
--trust-remote-code
我来解释一下这几个参数:
--model: 这就是你刚才下载的模型在本地的完整路径。--served-model-name: 给你的服务起个名字,调用API时会用到,可以自定义。--max-model-len: 这是非常关键的一个参数。它限制了模型单次处理的最大文本长度(Token数)。GLM-4-9B-Chat官方支持很长的上下文,但设置得越大,初始化时占用的显存就越多。对于24G显存的3090,设置为2048是一个安全且能保证性能的值。如果你主要处理短对话,甚至可以设为1024以节省显存,处理更多并发。--trust-remote-code: 因为GLM模型使用了一些自定义的代码,需要这个参数来信任并加载。
敲下回车后,你会看到vLLM开始加载模型。加载过程会显示加载了哪些模块,并最终在最后几行看到类似 INFO: Started server process [12345] 和 INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) 的信息。
恭喜!这说明你的大模型API服务已经在云服务器的 8000端口 上成功启动了。现在,这台服务器已经变成了一个“类ChatGPT”的服务器。不过,这个服务目前只在云服务器内部(localhost:8000)可访问。我们的电脑在外面,还连不上。别急,下一步就是打通这“最后一公里”。
5. 第四步:将云端API服务映射到本地
服务在云端跑起来了,但我们总不能每次测试都在云服务器的终端里用curl命令吧?我们需要一种方法,让我们自己电脑上的程序能像访问本地服务一样,去访问这个在云端8000端口上的服务。这个方法就是端口映射,或者叫“内网穿透”。AutoDL非常贴心地为我们提供了这个功能。
首先,保持云服务器终端里vLLM服务正在运行(那个终端窗口不要关闭)。然后,回到AutoDL的实例管理页面,找到你正在运行的实例。在“快捷工具”或“更多”里,你会看到一个叫 “自定义服务” 的按钮,点击它。
点击后,页面下方会弹出一个面板,里面有一条长长的命令,格式类似:
ssh -CNg -L 6006:127.0.0.1:6006 root@connect.westc.gpuhub.com -p 12345
这条命令就是关键。它的作用是在你的本地电脑和云服务器之间建立一条安全的隧道(SSH隧道)。命令中 -L 参数后面的 6006:127.0.0.1:6006 意思是:将本地电脑的6006端口,映射到云服务器内部(127.0.0.1)的6006端口。
但我们的vLLM服务跑在8000端口,所以需要修改一下。把第二个端口号(目标端口)从6006改成8000。同时,你可以把第一个端口号(本地端口)从6006改成任意你喜欢的、本地没被占用的端口,比如 5000。修改后的命令看起来像这样:
ssh -CNg -L 5000:127.0.0.1:8000 root@connect.westc.gpuhub.com -p 12345
现在,打开你本地电脑的命令提示符(Windows)或终端(Mac/Linux),将修改好的这条命令粘贴进去,按回车执行。第一次连接可能会询问你是否信任主机,输入 yes 即可。接着,它会提示你输入密码。这个密码就在AutoDL“自定义服务”面板的那条命令下方,直接复制粘贴过去(粘贴时可能不显示,这是正常的),再按回车。
如果连接成功,这个终端窗口会看起来“卡住”了,没有任何新输出。这就对了!它正在后台默默工作,保持隧道畅通。这个窗口不能关闭,一旦关闭,映射就断了。
至此,魔法完成了。现在,你本地电脑的 http://localhost:5000,实际上访问的就是云端服务器上的 http://localhost:8000。你可以在本地浏览器访问 http://localhost:5000/v1/models 试试看,如果返回一个JSON数据,列出了你的 glm-4-9b-chat 模型,那就大功告成了!
6. 第五步:像使用OpenAI一样调用你的模型
服务通了,怎么用呢?因为vLLM提供的API和OpenAI的格式一模一样,所以你可以使用任何OpenAI客户端库。这里我用Python的 openai 库给你演示两种最常用的方式:对话(Chat)和补全(Completion)。
首先,确保你本地电脑已经安装了openai库:pip install openai。
方式一:对话补全(Chat Completions)
这是现在最常用的方式,模拟多轮对话。创建一个Python脚本,比如 test_chat.py:
from openai import OpenAI
# 注意,base_url指向我们本地映射的端口
client = OpenAI(
api_key="no-key-required", # vLLM不需要验证,但参数必须有,随便填
base_url="http://localhost:5000/v1" # 就是刚才映射的本地端口
)
response = client.chat.completions.create(
model="glm-4-9b-chat", # 必须和启动服务时 --served-model-name 一致
messages=[
{"role": "system", "content": "你是一个乐于助人的助手。"},
{"role": "user", "content": "用简单的语言解释一下什么是人工智能?"}
],
max_tokens=150,
temperature=0.7, # 控制创造性,0-1之间,越高回答越随机
)
print(response.choices[0].message.content)
运行这个脚本,你就会看到GLM-4模型生成的回答了。temperature 参数你可以调整,设为0会让回答非常确定和重复,设为1会让它天马行空,通常0.7到0.9之间平衡得比较好。
方式二:文本补全(Completions) 这是更传统的“提示词+续写”模式。
from openai import OpenAI
client = OpenAI(
api_key="no-key-required",
base_url="http://localhost:5000/v1"
)
response = client.completions.create(
model="glm-4-9b-chat",
prompt="中国的首都是",
max_tokens=10,
temperature=0
)
print(response.choices[0].text)
看到这里,你是不是觉得和调用官方的OpenAI API几乎没区别?唯一的区别就是 base_url 换成了我们自己的服务地址。这意味着,你之前为GPT-3.5或GPT-4写的任何应用,只需要改一下API的地址和密钥(或者去掉密钥),就能无缝切换到你自己部署的GLM-4模型上,彻底摆脱网络限制和调用费用的困扰。
7. 性能实测与调优建议
部署好了,也调通了,我们总得看看这个“自家孩子”跑得怎么样吧?vLLM宣称性能强劲,我们得亲手测一测。最直观的方法就是和不用vLLM的原始方式做个对比。
vLLM项目自带了一个性能基准测试脚本。我们可以在云服务器上运行它。首先,我们需要下载这个脚本。在云服务器的终端里(新开一个,别关掉运行API服务的那个),运行:
cd /autodl-tmp
wget https://raw.githubusercontent.com/vllm-project/vllm/main/benchmarks/benchmark_throughput.py
先测试vLLM后端的速度:
python benchmark_throughput.py \
--model /autodl-tmp/model/ZhipuAI/glm-4-9b-chat \
--backend vllm \
--input-len 64 \
--output-len 128 \
--num-prompts 25 \
--seed 2024 \
--dtype float16 \
--max-model-len 512 \
--trust-remote-code
再测试使用原始HuggingFace Transformers(hf后端)的速度:
python benchmark_throughput.py \
--model /autodl-tmp/model/ZhipuAI/glm-4-9b-chat \
--backend hf \
--input-len 64 \
--output-len 128 \
--num-prompts 25 \
--seed 2024 \
--dtype float16 \
--hf-max-batch-size 1 \ # 注意,原始方式批处理大小设为1比较公平
--trust-remote-code
我上次在RTX 3090上跑的结果大概是这样的:
| 推理框架 | 吞吐量 (requests/s) | 吞吐量 (tokens/s) |
|---|---|---|
| vLLM | ~7.4 | ~1420 |
| 原始HF | ~3.4 | ~650 |
可以看到,vLLM的性能提升了一倍以上。这意味着在同样的硬件上,vLLM能同时处理更多的用户请求,或者以更快的速度响应单个请求。对于想对外提供服务的应用来说,这个提升直接关系到用户体验和服务器成本。
几个实用的调优建议:
--max-model-len是黄金参数:这个值直接决定服务初始化时预分配的内存。对于聊天场景,2048通常足够。如果你需要处理长文档,可以尝试增加到4096或8192,但务必观察显存使用情况(可以用nvidia-smi命令查看)。如果显存满了,服务会崩溃。- 关注温度(
temperature)和重复惩罚(frequency_penalty):在API调用时,合理设置这些参数能极大改善生成质量。temperature低则回答稳定但可能枯燥,高则有趣但可能胡言乱语。对于事实性问答,建议0.1-0.3;对于创意写作,可以0.8-1.0。frequency_penalty(0到2之间)可以降低重复词的出现概率,设为0.1到0.5对改善文本流畅度有帮助。 - 用完记得关机! 这是最重要的一条,直接关系到你的钱包。AutoDL按使用时长计费。当你测试完毕,一定要回到实例管理页面,点击“关机”。数据盘(
/autodl-tmp)里的模型会保留,下次开机还能用。只关机不销毁,就不会产生GPU费用,只会产生极低的存储费用。
这套流程我带着团队的新人走过好几遍,最快的一次不到20分钟就从零跑通了整个流程。自己掌控一个随时可用的、高性能的大模型API,这种感觉和直接用现成的服务是完全不同的。它不仅给了你技术上的自主权,更让你对模型的工作原理、服务部署的细节有了更深的理解。下次当你需要为一个新想法快速验证时,或者当公开API遇到限速时,你就能从容地启动自己的GLM-4服务了。
更多推荐
所有评论(0)