写这篇东西的起因,是近期帮几个项目组把vllm部署从开发机迁到生产Ubuntu服务器,发现很多人卡在最开始的“ubuntu + conda + vllm”组合上:有的conda环境装完发现Python版本不对,有的一启动就报CUDA错误,还有的干脆在虚拟机上折腾半天GPU都识别不到。其实这套流程本身不复杂,但中间有大量“文档不会写但你一定会遇到”的细节,值得掰开揉碎讲一遍。
整篇内容围绕一件事展开:如何在Ubuntu系统上通过conda创建独立环境,把vllm装好并成功跑起大模型推理服务。我会把从零开始的环境准备、conda安装、镜像源配置、vllm安装、模型下载、启动参数、量化与缓存优化,再到生产环境常用的docker-compose方式,以及常见的排查链路全部过一遍。适合刚接触大模型部署的算法工程师,也适合要在服务器上把服务稳定跑起来的运维或后端同学。
1. 为什么不用系统Python直接装:先想清楚环境隔离这件事
很多人在Ubuntu上装vllm有个下意识反应:打开终端,直接pip install vllm。在刚装好的干净系统上,这也许能跑通,但用不了一个月就会后悔。vllm对Python版本、PyTorch版本、CUDA版本的耦合度非常高,而系统的Python往往由apt管理,动它可能会干扰系统工具链。更稳妥的做法是先用conda把环境隔离出来,再在隔离环境里装vllm。
1.1 vllm的依赖到底有多“挑剔”
vllm之所以对依赖敏感,是因为它依赖一个完整的推理运行时栈。你可以把vllm理解成一辆组装好的赛车:发动机是CUDA,变速箱是PyTorch,而vllm本身是底盘和电控系统。换任何一个部件版本,都可能影响整辆车的表现。
具体来看,vllm在编译时会链接特定版本的PyTorch、CUDA runtime以及flash-attention等算子库。如果你用系统Python,这个环境里可能已经装了某个版本的numpy、torch或者其他的科学计算包,pip在解决依赖时经常会“为了兼容现有包而选择旧版vllm”,或者反过来为了装新版vllm把环境搞乱。conda的价值就在这儿:它可以让你为vllm单独划一个干净的房间,房间里的Python、pip、lib都是可控的。
另外值得一提的是,vllm官方发布的预编译wheel包,通常会声明requires-python >=3.8,但要装较新版本(比如0.7.x及以后),建议直接用Python 3.10到3.12之间的版本。如果你拿Python 3.7去试,大概率会在安装阶段就收到“找不到匹配版本”的提示。
1.2 从驱动到CUDA到PyTorch的版本匹配链条
除了Python隔离,安装vllm前还要理清一条版本匹配链:
- GPU驱动:由NVIDIA驱动提供,负责与硬件通信,使用
nvidia-smi可以看到。 - CUDA:这里要注意区分驱动自带的CUDA Driver和真正用于编译运行的CUDA Toolkit。vllm运行时主要依赖Driver对应的CUDA版本兼容性,而pytorch的cuda版本则是通过pip安装到Python环境里的。
- PyTorch和vllm:PyTorch在编译时会选定一种CUDA版本变体,比如
cu121、cu124,vllm的wheel同样会针对这些变体发布。
链条关系大致是:GPU→NVIDIA驱动(决定允许的CUDA版本范围)→PyTorch的CUDA变体(在Python环境内)→vllm依赖的torch接口。实际使用中,驱动版本决定上限,只要驱动够新,常见的CUDA 12.1和12.4都可以跑。
所以整个安装流程的第一步不是装conda,而是装好NVIDIA驱动后先运行nvidia-smi确认驱动版本和顶部显示的CUDA Version。很多文档把conda放第一步是有误导性的——先有驱动可见,后面所有问题才有意义。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Ubuntu侧准备:Miniconda安装与国内镜像加速
Ubuntu上装conda,官方推荐Miniconda而不是完整版Anaconda,因为Miniconda体积小、默认环境干净,适合在服务器上用。下载位置建议直接使用清华大学开源软件镜像站或中科大镜像,直接从repo.anaconda.com下载在国内速度不稳定。
2.1 安装Miniconda时容易被跳过的两步
安装Miniconda的命令并不复杂,注意别漏掉两个细节:
bash复制wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
执行bash脚本后,一路按回车和输入yes即可。默认安装位置是$HOME/miniconda3。这一步有两个容易被跳过的点:
第一,安装脚本的最后会询问是否运行conda init来初始化shell。如果你选了no,安装完后输入conda经常会提示“command not found”。如果之前没选,可以手动执行source ~/miniconda3/bin/activate再运行conda init bash。
第二,如果你是给root用户或者某个服务账号安装,要留意PATH环境变量的变化。conda init会把conda的初始化代码写入~/.bashrc,但某些非交互式shell或者systemd服务里不会加载它。届时通过systemd拉起服务时,会直接报conda: command not found,需要在service文件里显式指定conda可执行文件的完整路径。
安装完成后,建议先做一次conda --version验证。如果终端还是找不到conda,请关闭并重新打开终端,或者执行source ~/.bashrc。
2.2 配置conda源、pip源,以及用conda-forge跳过版权坑
国内服务器安装conda后,第一件事是换镜像源。conda源和pip源是两个不同的体系,相互独立,都需要配置。
配置conda源是在用户目录下的.condarc文件中写入镜像地址。推荐使用阿里云、清华或中科大的Anaconda源。我这里以清华源为示例:
yaml复制channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
而pip源一般在~/.pip/pip.conf(如果没有就创建)里配置,比如用阿里云的镜像:
ini复制[global]
index-url = https://mirror
