大模型这个东西,前两年还只是论文里的概念,今年已经变成很多公司和个人开发者手里的常规工具了。尤其是开源模型的崛起,类似Qwen、Llama、DeepSeek这些模型权重全部开放,让"自己部署一个私有大模型"从极客折腾变成了完全可行的工程实践。
我在这上面踩了不少坑,也终于把整套流程跑通了。如果你手里有一台Linux服务器,想把大模型部署上去自己用,或者想开放给公司内部调用,这篇文章基本能覆盖你从零到上线的大部分问题。
先说说这套东西到底是什么、能解决什么问题:在Linux服务器上部署大模型,本质就是把一个开源的大语言模型权重下载下来,用推理框架加载到GPU显存里,对外提供一套API接口,让业务代码可以像调用OpenAI那样调用你自己的模型。这样做的好处很多——数据不出内网、按量收费的API成本省掉、可以针对业务做定制微调,也不用担心第三方服务不稳定。
适合谁来参考?需要给团队搭建内网AI能力的后端工程师、做独立产品想集成AI能力的开发者,以及刚入坑大模型想了解部署这套流程的在校学生。哪怕你只有一台普通PC,显卡性能一般,文章里也会讲清楚怎么用CPU兜底或者用量化小模型凑合跑。
1. 先想清楚:在Linux服务器上部署大模型,到底在折腾什么
很多人第一次接触"大模型部署"这个概念会懵,觉得是不是要训练一个模型?不是。部署和训练完全是两码事。
训练是在海量数据上调整模型参数,需要几十甚至几百张GPU,跑几周到几个月。部署则是把已经训练好的模型权重加载进推理框架,用GPU做前向计算,响应一次次的请求。你只需要关心模型怎么加载、推理框架怎么配置、显存够不够、并发能不能撑住。
这背后涉及几个关键组件:
- 模型权重:开源社区下载的权重文件,比如Qwen2.5-7B-Instruct,参数量70亿,fp16精度下约占14GB显存。
- 推理框架:Ollama、vLLM、Transformers这类工具,负责把权重加载进显存、执行张量计算、把请求转成token再生成文本。
- API服务:把推理能力封装成HTTP接口,让外部系统通过OpenAI兼容的格式调用。
- 硬件资源:GPU是核心,如果没有GPU也可以用CPU硬扛,但速度会慢很多。
整个部署过程的核心矛盾,就是显存大小和模型大小之间的博弈。显存不够,模型就装不进去。模型太大,就得靠量化(用更低精度表示参数)来压缩体积。所以你会看到动不动就有人聊"q4_k_m""awq""gptq",本质上都是在用精度换显存。
我见过不少人在这一步就放弃,问"我的显卡只有8GB显存,能部署7B模型吗",答案是可以,但要用4bit量化。也有土豪直接上A100,直接跑70B模型。搞清楚自己的硬件边界,再决定用哪个模型,这是部署的第一步。
另外,Linux服务器相比Windows更适合部署大模型,原因很实际:NVIDIA驱动和CUDA生态在Linux下最完整,vLLM这些框架对Linux的支持最好,服务器环境也更接近生产环境。如果你用的是带NVIDIA显卡的Linux机器,下面的内容直接照着做就行。
2. 部署前的硬性准备:硬件、系统与基础环境
很多人在部署中翻车,不是因为模型选错了,而是环境没准备好。这一节把前置条件掰开讲清楚。
2.1 硬件选型:显存、内存、CPU如何估算
先给一个最朴素的显存估算公式:
模型显存占用 ≈ 参数量(B)× 精度字节数 × 1.2 到 1.5 的冗余系数
fp16精度下每个参数占2字节,所以:
- 7B模型:7 × 2 = 14GB,加上推理时的KV Cache和中间激活值,实际建议至少24GB显存。
- 13B模型:13 × 2 = 26GB,实际至少32GB。
- 70B模型:70 × 2 = 140GB,单卡基本没戏,需要多卡并行。
如果显存不够,就用量化。4bit量化下每个参数约0.5字节,7B模型只要大约4GB显存,8GB显卡也能跑起来。代价是效果有一定损耗,不过对于日常对话、文本生成这种场景,感知不明显。
内存方面,建议至少是模型显存占用的两倍。CPU要有一块像样的,因为部分算子会落到CPU上,瓶颈往往出现在数据加载和tokenize环节。至于GPU型号,消费级的RTX 4090(24GB)能舒服地跑7B-13B模型,专业级的A100/A800/H800则是大规模部署的选择。
2.2 系统与驱动:Ubuntu + NVIDIA驱动 + CUDA
推荐使用Ubuntu 20.04或22.04 LTS,稳定且社区资料多。全新服务器先升级系统并安装依赖:
apt update && apt upgrade -y apt install -y build-essential dkms linux-headers-$(uname -r)如果系统里没有NVIDIA驱动,最容易的方式是通过官方runfile或者apt安装。apt方式最省心:
apt install -y nvidia-driver-535 reboot重启后执行nvidia-smi,看到类似这样的输出就说明驱动正常:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 535.xxx Driver Version: 535.xxx CUDA Version: 12.2 | +-----------------------------------------------------------------------------+注意,nvidia-smi显示的CUDA Version是驱动支持的最高CUDA版本,不是当前环境装的CUDA。后面实际用CUDA,要么装完整的CUDA Toolkit,要么直接用pip装PyTorch时自带的CUDA依赖,后者省事很多。
2.3 Python环境:虚拟环境是必须的
很多模型和推理框架依赖不同版本的Python和PyTorch,直接装在系统里极容易冲突。强烈建议用conda或venv隔离环境。
conda安装简单,下载Miniconda后一路默认即可:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh source ~/.bashrc创建虚拟环境:
conda create -n llm python=3.10 -y conda activate llm后面所有跟模型相关的依赖,全部装在这个环境里,与系统隔离,出问题直接删环境重来,成本很低。
3. 模型量级与推理框架的匹配选择
模型选多大,框架选哪个,决定了你后续的体验。这一节我把常用组合和选型逻辑讲清楚。
3.1 本地最先试的Ollama:轻量、开箱即用
如果你的诉求是"最快速度跑起来",Ollama绝对是最优解。它把模型下载、推理引擎、API服务全部打包了,一条命令就能搞定。
安装:
curl -fsSL https://ollama.com/install.sh | sh下载模型并运行:
ollama run qwen2.5:7b这条命令会自动去拉取Qwen2.5-7B模型,然后进入交互式对话。关闭交互模式后,也可以用API:
curl http://localhost:11434/api/generate -d '{ "model": "qwen2.5:7b", "prompt": "你好" }'Ollama还内置了OpenAI兼容接口,端口是11434,格式为/v1/chat/completions,这意味着你原来写好的OpenAI SDK调用,只要把base_url改一下就能接过来。
Ollama适合个人开发和快速验证,它牺牲了一些高级控制项,比如不能精细调KV Cache策略、不能做pipeline并行,但对于中小流量完全够用。
3.2 更专业的vLLM:吞吐量优先
如果要把模型部署成一个正式的API服务,接受成百上千的并发请求,vLLM是更合适的选择。vLLM用了PagedAttention技术,显存利用率极高,吞吐量比常规推理实现高几倍。
安装:
pip install vllm启动Qwen2.5-7B:
python -m vllm.entrypoints.openai.api_server \ --model Qwen/Qwen2.5-7B-Instruct \ --served-model-name qwen2.5-7b \ --tensor-parallel-size 1 \ --host 0.0.0.0 \ --port 8000启动后,使用OpenAI SDK访问:
from openai import OpenAI client = OpenAI( api_key="EMPTY", base_url="http://your-server-ip:8000/v1" ) response = client.chat.completions.create( model="qwen2.5-7b", messages=[{"role": "user", "content": "你好"}] ) print(response.choices[0].message.content)vLLM的调优参数比较多,后面实操章节我会详细展开。
3.3 其他方案:Transformers、TGI、SGLang对比
| 框架 | 特点 | 适合场景 |
|---|---|---|
| Transformers | HuggingFace官方库,最通用,能跑所有模型 | 研究、调试、跑通流程 |
| vLLM | 高吞吐、PagedAttention、OpenAI兼容 | 生产环境API服务 |
| Ollama | 一键安装、内置模型仓库 | 个人开发、内网快速搭建 |
| TGI | HuggingFace出品,为生产优化 | 大规模生产、依赖HF生态 |
| SGLang | 新锐,高性能、结构化输出 | 需要高级推理控制,追求极致性能 |
选框架有个简单原则:能跑通就行选Ollama,要上生产选vLLM,搞学术实验选Transformers。不要一上来就折腾TGI和SGLang,除非你的业务场景确实需要它们的高级特性。
4. 实操:在Linux上完整部署一个开源模型(以Qwen2.5-7B-Instruct为例)
纸上谈兵聊完了,现在来真实的实操。我以Qwen2.5-7B-Instruct为例,分别用Ollama和vLLM两种方式部署一遍,全部命令都在Linux服务器上执行过。
4.1 用Ollama三步跑起来
第一步,安装Ollama:
curl -fsSL https://ollama.com/install.sh | sh安装脚本会自动检测系统和GPU,配置好systemd服务。
第二步,下载并运行模型:
ollama run qwen2.5:7b首次运行会显示下载进度,如果是国内服务器,下载速度可能会比较慢。实在慢的话可以配置国内镜像源,Ollama支持通过OLLAMA_HOST和镜像地址环境变量来优化。
第三步,测试API:
curl http://localhost:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5:7b", "messages": [{"role": "user", "content": "部署大模型需要注意什么"}] }'返回结果就是一个标准的JSON,包含assistant的回复内容。到这里,模型已经跑起来了,前后十分钟都不到。
4.2 用vLLM以OpenAI兼容接口部署
vLLM的安装需要Python环境,建议在conda环境里操作:
conda create -n vllm python=3.10 -y conda activate vllm pip install vllm如果服务器没有NVIDIA驱动,vLLM装完也是白搭,运行前一定先执行nvidia-smi确认GPU可见。
启动服务:
python -m vllm.entrypoints.openai.api_server \ --model /data/models/Qwen2.5-7B-Instruct \ --served-model-name qwen2.5-7b \ --tensor-parallel-size 1 \ --host 0.0.0.0 \ --port 8000这里我指定了本地路径/data/models/Qwen2.5-7B-Instruct,因为生产环境一般会先把模型权重download到本地,避免每次启动都去HuggingFace拉取。下载模型可以用modelscope或者huggingface-cli:
# 用modelscope下载(国内速度快) pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /data/models/Qwen2.5-7B-Instruct启动成功后,控制台会打印类似INFO: Started server process [xxxx]的字样,此时用curl测试:
curl http://localhost:8000/v1/models能返回模型列表就说明服务正常。
测试对话:
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5-7b", "messages": [{"role": "user", "content": "你好,介绍一下你自己"}], "temperature": 0.7, "max_tokens": 512 }'4.3 关键参数怎么调:max-model-len、gpu-memory-utilization、tensor-parallel-size
vLLM里最重要的三个参数,我一个个解释:
max-model-len
这个参数控制模型最大上下文长度。Qwen2.5-7B-Instruct支持最长32768个token的上下文,但是上下文越长,KV Cache占用显存就越大。如果你设置为32768,显存里有很大一部分要预留给Cache,能同时处理的并发请求就会减少。一般业务场景设8192足够,如果只是做简单问答,设4096更稳妥。
gpu-memory-utilization
这个参数控制vLLM最多使用显存的百分比,默认是0.9。如果服务器上还有其他进程,建议调低到0.7或0.8,防止OOM。我自己的经验是:专用推理服务器可以设0.95,既能利用显存又不至于让PyTorch分配失败;如果有其他服务共宿,老老实实0.8。
tensor-parallel-size
当模型单卡装不下时,设为2、4、8,表示用多少张GPU并行推理。这个参数不是越多越好,多卡并行会引入通信开销,只有模型大到单卡无法承载时才用得上。对7B模型来说,一张4090就够跑,千万别设成2,白白浪费卡。
一个我自己踩过的坑:vLLM默认会尝试从HuggingFace加载tokenizer和config,但如果服务器无法访问外网,会卡在下载阶段很久。解决办法是先手动把模型下载到本地,然后启动命令里直接指定本地路径。
5. 上线前后的性能调优与稳定性排查
模型跑起来了只是第一步,我在实际部署中还遇到过各种奇怪问题。这一节把调优思路和故障排查经验整理出来。
5.1 显存与并发:如何估算最大并发
上线前总会被问:这个服务能支撑多少并发?可以用一个粗略公式:
最大并发 ≈ (总显存 - 模型权重占用) / 每个请求的KV Cache大小
KV Cache大小跟模型大小、上下文长度、量化方式相关,很难精确计算,但可以用实测方式参考。
先用nvidia-smi看看空闲显存。假设总显存24GB,模型权重占14GB,剩余约10GB。如果每个请求平均输出512个token,上下文长度设4096,每个请求KV Cache大约占0.5-1GB,那并发大概在10-20之间。
想要提升并发,常见做法:
- 降低max-model-len,限制最大上下文,减少KV Cache预留。
- 使用量化模型,让模型权重占用更小,腾出更多显存给Cache。
- 增加GPU数量,用tensor-parallel-size或者多实例部署。
- 合理设置流式输出,而不是一次性等完整结果,减少峰值压力。
5.2 常见故障与排查方法速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| CUDA out of memory | 显存不足或碎片 | 调低gpu-memory-utilization、换量化模型、减少max-model-len |
| 模型下载慢/失败 | 网络问题 | 使用Modelscope镜像、或先下载到本地再加载 |
| API请求超时 | 并发高、模型推理慢 | 开启流式输出、增加GPU、限制max_tokens |
| Railway/云服务器端口不通 | 防火墙或安全组 | 检查云安全组入站规则,放行对应端口 |
| ImportError: libcublas.so | CUDA依赖缺失 | 安装PyTorch对应版本的CUDA依赖,pip install torch --index-url ... |
| Ollama启动后GPU不可用 | 驱动未装或权限不足 | 检查nvidia-smi,确认用户有权限访问GPU |
| 中文输出乱码 | 模型未正确加载tokenizer | 重试加载,确认模型路径正确,不要随意改加载方式 |
5.3 后台运行与开机自启
开发时可以前台跑,但生产环境必须让服务在后台稳定运行,服务器重启后也要自动拉起。
我习惯用systemd管理vLLM服务。新建一个service文件:
vim /etc/systemd/system/vllm.service内容如下:
[Unit] Description=vLLM API Server After=network.target [Service] User=root WorkingDirectory=/data Environment="PATH=/root/miniconda3/envs/vllm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin" ExecStart=/root/miniconda3/envs/vllm/bin/python -m vllm.entrypoints.openai.api_server \ --model /data/models/Qwen2.5-7B-Instruct \ --served-model-name qwen2.5-7b \ --tensor-parallel-size 1 \ --host 0.0.0.0 \ --port 8000 [Install] WantedBy=multi-user.target执行:
systemctl daemon-reload systemctl enable vllm systemctl start vllm systemctl status vllm查看日志用journalctl -u vllm -f,非常方便。
5.4 Linux运维实用命令清单
部署和排查过程中,下面这些命令我几乎每天都要用:
# 查看显存状态 nvidia-smi # 查看内存和swap free -h # 查看磁盘占用 df -h # 查看端口占用 lsof -i:8000 # 查看进程 ps aux | grep vllm top # 查看GPU进程 nvidia-smi --query-compute-apps=pid,used_memory --format=csv # 持续查看日志 journalctl -u vllm -f # 测API耗时 curl -w "time_total: %{time_total}s\n" -X POST http://localhost:8000/v1/chat/completions ...用得多了自然会记住,初期记不住也没关系,用的时候查就行。
6. 项目上线后的一些经验和后续扩展方向
前几节把部署流程和问题排查讲得比较透了,最后聊一点我自己的体会。
踩过几次坑之后,我最深的感受是:部署大模型的难点不在"跑起来",而在"稳定地跑下去"。跑起来只需要一条ollama run命令,但要让服务在业务流量下稳定不OOM、延迟可控、请求不超时,这才是真正的功夫。
一个很实用的经验:先小后大。第一次部署不要一上来就上70B模型,用7B模型跑通全链路,再换更大的模型。这个"全链路"包括模型加载、API调用、权限管理、日志监控、告警。很多问题在小模型上出现时更容易定位。
另外,有条件的话一定要做好监控。至少要看四类指标:
- GPU显存利用率:接近100%时说明模型权重大或并发高,及时扩容。
- GPU温度:长时间高温会降低性能甚至烧卡,注意散热。
- API响应延迟:P95延迟超过用户预期时,优化模型或提升硬件。
- 错误率:频繁超时或500错误,要查服务日志和GPU显存碎片。
后续扩展方向上,如果你想让模型更贴合业务,可以做领域微调,用LoRA在消费级显卡上也能跑;如果想让多个模型共享显存,可以用vLLM的多模型部署或者单独起多实例,按路由分发;如果要接入企业微信这类办公系统,把API用到的base_url指向你的服务就行,实际上大模型只是个后端,跟这些系统集成是很自然的事。
最后再分享一个小技巧:部署完成后,一定要在防火墙上限制端口访问权限,不要把8000端口直接裸奔到公网。用nginx做反向代理,加一层鉴权,这样既安全,负载均衡也更方便。
大模型部署并不是什么高不可攀的事,只要你有一台带NVIDIA显卡的Linux服务器,照着上面这些步骤走一遍,很快就能跑起来属于自己的模型服务。等真正跑通了,你会回来感谢自己按下回车那一刻的勇气。