1. 选型之前:先把私有化部署的真实需求理清楚
1.1 为什么企业开始认真考虑开源大模型私有化
过去一年多,我帮不少团队做过大模型落地的技术咨询,一个很明显的趋势是:从“调API试试看”转向“能不能部署到自己机房”。这个转变背后有几个非常现实的驱动力。
第一是数据边界问题。很多企业的业务数据涉及客户信息、内部流程、合同条款,这些东西一旦离开自己的网络边界,合规部门那一关就过不去。哪怕API厂商承诺不用于训练,审计上也很难说清楚。私有化部署最直接的价值就是数据不出内网,推理请求、上下文、日志全部留在自己可控的机器上。
第二是成本结构的考量。按Token计费的API模式在用量小的时候很划算,但一旦日均调用量上到千万Token级别,账单会变得非常可观。私有化部署前期是硬件投入,后期是电费和运维,边际成本递减。对于长期稳定有推理需求的场景,算总账往往更划算。
第三是定制空间。开源模型可以自己微调、可以改推理参数、可以接自己的向量库和Agent框架,不用受限于API提供方的功能边界。比如知识库问答场景,你需要控制检索增强生成的每一个环节,闭源API能调的参数非常有限。
1.2 三个候选模型的基本定位差异
这次实测的对象是GLM-5.3、混元Hy4、Qwen3.8这三个开源大模型。需要说明的是,这三个版本号在公开资料中的具体参数规模、训练数据构成各有侧重,我这里主要从私有化部署的工程视角来做对比,而不是做学术 benchmark 排名。
从社区反馈和实际测试来看,这三个模型在中文理解、长文本处理、工具调用能力上各有千秋。GLM系列在中文知识问答和结构化输出上一直比较稳;混元系列在对话流畅度和多轮交互上有优势;Qwen系列在代码生成和数学推理上口碑较好,而且生态工具链相对完善,量化版本和推理框架适配做得比较全。
选型不是选“最强”的,而是选最适合你场景的。一个做合同审查的团队和一个做代码助手的团队,最优解可能完全不同。
1.3 私有化部署的三种典型形态
在动手之前,先明确你要的是哪种私有化:
- 单机推理:一台带GPU的服务器,跑一个量化后的模型,适合POC验证和小团队内部使用。部署简单,但并发能力有限。
- 多卡集群推理:多张GPU通过张量并行或流水线并行跑一个大模型,适合中等规模的生产环境。需要处理通信开销和负载均衡。
- 混合架构:小模型做路由和简单问答,大模型处理复杂请求,配合缓存和队列机制。这是目前比较务实的生产方案。
我这次实测覆盖了单机和多卡两种形态,重点放在单卡推理速度和多卡扩展效率上,因为这是企业选型时最关心的硬指标。
2. 硬件与环境的硬门槛:别让显存成为拦路虎
2.1 显存需求的计算逻辑
很多人问“跑这个模型需要多大显存”,这个问题不能一概而论,因为取决于三个变量:模型参数量、量化精度、上下文长度。
先给一个粗略的估算公式:
显存占用 ≈ 参数量 × 每参数字节数 + KV Cache + 框架开销
以Qwen3.8 27B为例,不同精度下的权重大小:
| 精度 | 每参数字节 | 权重显存 | 说明 |
|---|---|---|---|
| FP16 | 2 bytes | 约54GB | 原始精度,单卡很难放下 |
| INT8 | 1 byte | 约27GB | 精度损失小,推荐起点 |
| INT4 | 0.5 byte | 约13.5GB | 精度有损失,但可接受 |
| Q4_K_M | 约0.55 byte | 约15GB | 社区常用量化格式 |
KV Cache的大小取决于上下文长度和批处理大小。以27B模型、8K上下文、batch size为1来算,KV Cache大约需要2-4GB。如果上下文拉到32K,KV Cache会显著增长。
所以,RTX Pro 5000 72G这张卡跑Qwen3.8 27B的INT4量化版本是比较舒服的,权重占15GB左右,KV Cache留足空间,还能跑一定的并发。如果是K100AI单卡,显存容量和带宽决定了它更适合跑量化后的小模型或者做推理加速卡使用。
2.2 实测硬件配置清单
我这次测试用的两台机器配置如下:
测试机A(单卡推理):
- GPU:RTX Pro 5000 72G
- CPU:Intel Xeon Gold 6430
- 内存:256GB DDR5
- 存储:2TB NVMe SSD
- 系统:openEuler 22.03 LTS
测试机B(多卡推理):
- GPU:4 × RTX Pro 5000 72G
- CPU:AMD EPYC 9354
- 内存:512GB DDR5
- 存储:4TB NVMe SSD
- 系统:Ubuntu 22.04 LTS
选择openEuler是因为不少国内企业的服务器环境在往国产化迁移,提前验证一下兼容性有实际意义。实测下来,openEuler对NVIDIA驱动和CUDA的支持已经比较成熟,没有遇到大的坑。
2.3 软件栈的选择与安装要点
推理框架我主要用了三种:Ollama、vLLM、TensorRT-LLM。它们各有适用场景:
- Ollama:上手最快,一条命令就能跑起来,适合快速验证和开发调试。但生产环境的并发能力和调度灵活性不如vLLM。
- vLLM:PagedAttention机制对显存利用效率高,吞吐量表现好,是目前生产部署的主流选择。支持张量并行,多卡扩展方便。
- TensorRT-LLM:NVIDIA官方优化,推理速度最快,但编译和转换流程复杂,适合对延迟极度敏感的场景。
安装vLLM的基本步骤(以openEuler为例):
# 确认驱动版本 nvidia-smi # 创建虚拟环境 python3 -m venv vllm_env source vllm_env/bin/activate # 安装vLLM(注意版本与CUDA的匹配) pip install vllm==0.4.2 # 验证安装 python -c "import vllm; print(vllm.__version__)"注意:vLLM的版本和CUDA版本有严格的对应关系,装之前一定去官方文档查兼容性矩阵。我踩过一次坑,装了不匹配的版本,报了一堆CUDA symbol错误,排查了半天。
3. 三个模型的实测对比:速度、质量、稳定性
3.1 推理速度实测数据
速度测试我用了统一的提示词集,包含短问答、长文本摘要、代码生成三类任务,每类跑20次取平均值。测试条件:INT4量化,上下文长度4096,batch size为1。
| 模型 | 硬件 | 首Token延迟 | 生成速度 | 备注 |
|---|---|---|---|---|
| GLM-5.3 | 单卡72G | 0.8s | 42 tokens/s | 中文问答响应快 |
| 混元Hy4 | 单卡72G | 1.1s | 35 tokens/s | 长文本生成稳定 |
| Qwen3.8 27B | 单卡72G | 0.6s | 48 tokens/s | 代码任务优势明显 |
| Qwen3.8 27B | 4卡并行 | 0.9s | 156 tokens/s | 扩展效率约81% |
从数据看,Qwen3.8 27B在单卡上的生成速度最快,这跟它的模型结构和量化适配有关。4卡并行的扩展效率达到81%,说明张量并行的通信开销控制得不错,没有出现明显的线性度下降。
GLM-5.3的首Token延迟最低,说明它的prefill阶段优化得比较好,适合对响应速度敏感的交互式场景。混元Hy4的速度稍慢,但生成过程非常稳定,没有出现速度抖动。
3.2 中文理解与知识问答质量
质量评估我用了三套测试集:通用知识问答、企业文档摘要、多轮对话一致性。评分采用人工评估加自动指标结合的方式。
通用知识问答方面,三个模型对中文常识问题的回答准确率都在85%以上。GLM-5.3在涉及中国文化、历史、地理的问题上表现更自然,回答的措辞更符合中文表达习惯。Qwen3.8在科学和技术类问题上更严谨,会给出更结构化的答案。混元Hy4的回答风格比较均衡,没有明显的短板。
企业文档摘要是我比较看重的场景。给一份5000字的合同,要求提取关键条款和风险点。GLM-5.3的摘要结构最清晰,会主动分点列出甲乙方义务、违约责任、付款条件等。Qwen3.8的摘要更简洁,但偶尔会漏掉一些细节。混元Hy4的摘要最详细,但有时候会把不重要的小条款也列出来。
多轮对话一致性方面,混元Hy4表现最好,在10轮以上的对话中很少出现前后矛盾。Qwen3.8在长对话中偶尔会“忘记”前面说过的约束条件。GLM-5.3的表现介于两者之间。
3.3 工具调用与Agent场景适配
现在很多企业部署大模型不是为了聊天,而是为了做Agent——让模型调用外部工具完成复杂任务。这就对模型的函数调用能力提出了要求。
我测试了三个模型在以下场景的表现:调用天气API、查询数据库、执行代码、操作文件系统。
Qwen3.8在工具调用的格式遵循上最稳定,输出的JSON结构很少出错,这跟它在代码训练上的投入有关。GLM-5.3的工具调用能力也不错,但在参数嵌套较深的时候偶尔会格式错误。混元Hy4在简单工具调用上没问题,但面对需要多步推理的工具链时,规划能力稍弱。
实操心得:如果你要做私有化Agent部署,建议优先考虑Qwen3.8,它的工具调用格式最规范,跟LangChain、LlamaIndex这些框架的适配也最顺。但如果你更看重中文对话体验,GLM-5.3和混元Hy4也值得考虑。
3.4 量化后的精度损失对比
私有化部署绕不开量化,因为不是每个人都有多卡集群。我对比了FP16、INT8、INT4三种精度下三个模型的表现。
| 模型 | 精度 | 显存占用 | 质量保留度 | 速度提升 |
|---|---|---|---|---|
| GLM-5.3 | FP16 | 高 | 100% | 基准 |
| GLM-5.3 | INT8 | 中 | 约97% | 约1.4倍 |
| GLM-5.3 | INT4 | 低 | 约91% | 约2.1倍 |
| Qwen3.8 27B | FP16 | 高 | 100% | 基准 |
| Qwen3.8 27B | INT8 | 中 | 约98% | 约1.5倍 |
| Qwen3.8 27B | INT4 | 低 | 约93% | 约2.3倍 |
| 混元Hy4 | FP16 | 高 | 100% | 基准 |
| 混元Hy4 | INT8 | 中 | 约96% | 约1.3倍 |
| 混元Hy4 | INT4 | 低 | 约89% | 约2.0倍 |
INT8量化的精度损失普遍在3%以内,基本可以无脑上。INT4量化的损失在7%-11%之间,对于知识库问答这类场景可以接受,但对于需要精确推理的任务要谨慎。
Qwen3.8在INT4下的质量保留度最好,达到93%,这跟它的量化感知训练有关。混元Hy4在INT4下的损失稍大,如果要用INT4,建议做一轮针对你业务数据的校准。
4. 部署实操:从零到跑通的完整流程
4.1 环境准备与依赖安装
不管选哪个模型,基础环境是共通的。以下是在openEuler上从零搭建的完整流程。
第一步:确认GPU驱动和CUDA
# 查看GPU信息 nvidia-smi # 确认CUDA版本 nvcc --version如果驱动没装,去NVIDIA官网下载对应版本的驱动。openEuler的仓库里也有nvidia-driver的包,但版本可能偏旧,建议手动装。
第二步:安装Python环境和依赖
# 安装Python 3.10 sudo dnf install python3.10 python3.10-devel # 创建虚拟环境 python3.10 -m venv /opt/llm_env source /opt/llm_env/bin/activate # 升级pip pip install --upgrade pip # 安装基础依赖 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121第三步:安装推理框架
以vLLM为例:
pip install vllm以Ollama为例:
curl -fsSL https://ollama.com/install.sh | sh注意:Ollama的安装脚本会从外网拉取二进制文件,如果网络环境受限,可以手动下载对应的二进制包放到/usr/local/bin下。
4.2 模型下载与格式转换
模型权重可以从HuggingFace或ModelScope下载。国内环境建议用ModelScope,速度更稳定。
# 安装modelscope pip install modelscope # 下载Qwen3.8 27B python -c " from modelscope import snapshot_download snapshot_download('qwen/Qwen3.8-27B', cache_dir='/data/models') "如果要用vLLM加载,模型需要是HuggingFace格式。如果是GGUF格式(Ollama用的),需要用llama.cpp的转换脚本处理。
# 将HuggingFace格式转换为GGUF python llama.cpp/convert.py /data/models/Qwen3.8-27B --outfile /data/models/qwen3.8-27b.gguf --outtype q4_k_m4.3 vLLM启动参数详解
vLLM的启动参数直接影响推理性能和显存占用。以下是我实测下来比较稳的一套配置:
python -m vllm.entrypoints.openai.api_server \ --model /data/models/Qwen3.8-27B \ --tensor-parallel-size 1 \ --dtype auto \ --max-model-len 8192 \ --gpu-memory-utilization 0.9 \ --max-num-seqs 16 \ --quantization awq \ --port 8000关键参数说明:
--tensor-parallel-size:张量并行数,单卡设为1,4卡设为4。--max-model-len:最大上下文长度,根据显存调整。8192是安全值,32K需要更多KV Cache。--gpu-memory-utilization:GPU显存利用率上限,0.9表示用90%的显存,留10%给系统。--max-num-seqs:最大并发序列数,影响吞吐量。显存充足可以调大。--quantization:量化方式,awq、gptq、squeezellm等。
实操心得:
--gpu-memory-utilization不要设成1.0,留一点余量给CUDA上下文和临时缓冲区,否则容易OOM。我一般设0.85到0.9之间。
4.4 Ollama快速验证流程
如果只是想快速验证模型效果,Ollama是最省事的:
# 拉取模型 ollama pull qwen3.8:27b # 运行 ollama run qwen3.8:27b # 或者用API方式 curl http://localhost:11434/api/generate -d '{ "model": "qwen3.8:27b", "prompt": "用一句话解释什么是私有化部署", "stream": false }'Ollama会自动处理量化、显存分配、并发调度,适合POC阶段。但生产环境建议还是用vLLM,因为Ollama的并发能力和监控指标不够细。
4.5 多卡张量并行的配置要点
4卡跑Qwen3.8 27B,启动命令改成:
python -m vllm.entrypoints.openai.api_server \ --model /data/models/Qwen3.8-27B \ --tensor-parallel-size 4 \ --dtype auto \ --max-model-len 16384 \ --gpu-memory-utilization 0.88 \ --max-num-seqs 32 \ --port 8000多卡并行要注意几点:
- NCCL通信:确保NCCL版本和CUDA匹配,否则会报通信错误。
- PCIe带宽:如果卡之间是PCIe 4.0 x16,通信带宽足够。如果是x8,扩展效率会下降。
- 负载均衡:vLLM会自动做张量并行,但请求调度需要配合前面的负载均衡器。
实测4卡并行的扩展效率在80%左右,也就是说4卡的吞吐量是单卡的3.2倍左右,不是理想的4倍。这个损耗主要来自卡间通信。
5. 常见问题与排查技巧实录
5.1 显存不足(OOM)的排查思路
OOM是私有化部署最常见的问题。排查顺序如下:
- 确认模型权重大小:用
nvidia-smi看显存占用,对比模型的理论大小。 - 检查KV Cache配置:
--max-model-len设太大是OOM的主因。先降到4096试试。 - 降低并发数:
--max-num-seqs从16降到8或4。 - 启用量化:如果还没量化,上INT8或INT4。
- 检查是否有内存泄漏:长时间运行后显存持续增长,可能是框架bug,升级版本。
踩坑记录:有一次用vLLM跑一个13B模型,显存明明够,但一直OOM。后来发现是
--gpu-memory-utilization设成了0.95,加上CUDA上下文开销就爆了。改成0.85就好了。
5.2 推理速度慢的优化方向
速度慢可能出在多个环节,按以下顺序排查:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 首Token延迟高 | Prefill计算量大 | 减少上下文长度,或换用prefill优化更好的框架 |
| 生成速度慢 | 显存带宽瓶颈 | 用量化减少权重大小,或换更高带宽的卡 |
| 并发时速度骤降 | 调度策略问题 | 调整max-num-seqs,启用连续批处理 |
| 多卡比单卡还慢 | 通信开销过大 | 检查NCCL配置,确认PCIe带宽 |
Qwen3.8在INT4下的生成速度最快,如果延迟是硬指标,优先考虑这个组合。
5.3 模型输出质量异常的调试
有时候模型输出会变得很奇怪,比如重复、乱码、答非所问。常见原因:
- 量化损失过大:INT4量化在某些模型上会导致输出质量明显下降。换INT8试试。
- 温度参数设置不当:temperature太高会胡言乱语,太低会重复。一般设0.7左右。
- 上下文溢出:输入超过了max-model-len,模型会截断或报错。
- 提示词格式不对:不同模型对对话模板的要求不同,用错模板会导致输出异常。
实操心得:Qwen3.8对对话模板比较敏感,一定要用官方的chat template。GLM-5.3和混元Hy4的容错性好一些,但也不要用错。
5.4 常见问题速查表
| 问题 | 排查命令 | 可能原因 | 解决 |
|---|---|---|---|
| 启动报CUDA错误 | nvcc --version | CUDA版本不匹配 | 重装对应版本 |
| 模型加载失败 | ls /data/models | 权重文件缺失 | 重新下载 |
| API无响应 | curl localhost:8000/health | 服务未启动 | 检查日志 |
| 输出乱码 | 检查tokenizer | 编码问题 | 换tokenizer |
| 显存泄漏 | watch nvidia-smi | 框架bug | 升级或重启 |
6. 选型建议:不同场景下的最优解
6.1 知识库问答场景
如果你的核心场景是企业知识库问答,需要模型准确理解中文文档、提取关键信息、生成结构化回答,我的建议是:
- 首选GLM-5.3:中文理解最自然,摘要结构最清晰,适合处理合同、制度、报告类文档。
- 备选Qwen3.8:如果知识库涉及大量技术文档和代码,Qwen3.8更合适。
- 量化策略:INT8足够,INT4需要做业务数据校准。
知识库问答对首Token延迟不敏感,但对回答质量要求高,所以可以接受稍慢的速度换取更好的质量。
6.2 私有化Agent部署场景
Agent场景需要模型频繁调用工具、规划多步任务、处理结构化输出。推荐:
- 首选Qwen3.8:工具调用格式最规范,跟主流Agent框架适配最好。
- 备选GLM-5.3:如果Agent主要处理中文任务,GLM-5.3也可以。
- 量化策略:INT8,因为Agent对格式准确性要求高,INT4的精度损失可能导致工具调用失败。
Agent场景还需要考虑推理框架的并发能力,vLLM的连续批处理机制比较适合。
6.3 高并发API服务场景
如果要把模型作为API服务提供给多个业务方使用,吞吐量是关键:
- 首选Qwen3.8 + vLLM多卡:4卡并行下吞吐量达到156 tokens/s,扩展效率81%。
- 硬件建议:至少4张72G显存的卡,配合NVLink或高带宽PCIe。
- 量化策略:INT4,在可接受的质量损失下最大化吞吐。
高并发场景还要考虑请求队列、限流、缓存等工程问题,模型选型只是其中一环。
6.4 成本敏感型场景
如果预算有限,只有单张卡,或者想用二手卡:
- 首选Qwen3.8 27B INT4:15GB左右的显存占用,单张72G卡能跑,甚至48G卡也能勉强跑。
- 备选混元Hy4 INT4:如果对中文对话质量要求高,混元Hy4的INT4版本也可以。
- 框架选择:Ollama最省资源,但并发能力弱;vLLM资源利用率高,但配置复杂。
最后分享一个小技巧:如果显存实在紧张,可以用llama.cpp的CPU+GPU混合推理,把部分层放到CPU上跑。速度会慢很多,但至少能跑起来。适合POC验证阶段。
6.5 国产化环境适配
如果部署环境要求国产化,比如openEuler + 国产GPU:
- openEuler + NVIDIA:兼容性最好,vLLM和Ollama都能跑。
- 国产GPU:需要确认推理框架是否支持,目前vLLM对国产GPU的支持还在完善中。
- 模型选择:Qwen3.8的生态适配最广,国产化环境下优先考虑。
我在openEuler上实测Qwen3.8 27B,从驱动安装到vLLM跑通,大概花了半天时间,主要时间花在CUDA版本匹配上。一旦环境配好,后续部署就很顺了。
6.6 我的最终选型建议
如果只能选一个,我的建议是Qwen3.8 27B + vLLM + INT8量化。理由:
- 生态最完善,遇到问题容易找到解决方案。
- 工具调用能力最强,适合做Agent。
- 量化后质量保留度最好,INT8下几乎无损。
- 单卡能跑,多卡能扩,灵活性好。
GLM-5.3适合中文知识问答为主的场景,混元Hy4适合对话体验要求高的场景。三个模型没有绝对的优劣,关键看你的业务需求和技术栈。
我在实际使用中发现,很多团队纠结选哪个模型,其实不如先把部署流程跑通,用真实业务数据做一轮测试,让数据说话。模型迭代很快,今天的最优解明天可能就变了,但私有化部署的工程能力是长期有价值的。