verl Conda环境搭建全记录,一步到位
强化学习(RL)正在成为大语言模型(LLM)后训练的关键技术路径,而 verl 作为字节跳动火山引擎团队开源的生产级 RL 框架,凭借其 HybridFlow 架构、模块化设计和对主流 LLM 基础设施的深度兼容,迅速成为开发者关注的焦点。但不少人在实际落地时卡在第一步:环境搭不起来。
你是否也遇到过这些情况?
- 想用 Docker 镜像却因权限不足被
permission denied while trying to connect to the Docker daemon socket拦在门外; - 看到 cuDNN 安装指南里一堆
sudo dpkg就头皮发麻,又不敢乱动系统 CUDA; - 跟着文档执行
bash scripts/install_vllm_sglang_mcore.sh却报错中断,连错误日志都看不懂; - 最后干脆放弃,转头去翻 GitHub Issues,发现上百条“install failed”……
别急——这篇不是“理论上可行”的教程,而是一份真实踩坑、逐行验证、零 sudo 权限也能跑通的 Conda 环境搭建实录。全程基于普通用户权限,在一台无 root、无 Docker、CUDA 版本老旧(10.1)但已预装 cuda-12.1 的服务器上完成。所有命令均经实测,每一步都标注了为什么这么选、哪里容易出错、出错了怎么绕过去。
你不需要懂强化学习原理,也不需要会调参。只要你能敲conda activate,就能把 verl 跑起来。
1. 明确目标与约束条件
在动手前,先理清我们到底要达成什么,以及哪些路是走不通的——这比盲目试错节省至少 3 小时。
1.1 我们的目标很具体
- 成功创建独立 Python 环境(Conda)
- 正确安装 verl 框架本体(可 import、可查版本)
- 安装最小必要依赖(支持 FSDP + HuggingFace 集成,不强求 Megatron/vLLM)
- 验证基础功能:能加载一个 HuggingFace LLM,能初始化 verl 的 RL 训练组件
1.2 我们明确放弃的方案(有充分理由)
| 方案 | 为什么放弃 | 替代思路 |
|---|---|---|
| Docker 部署 | docker create报permission denied,且无sudo权限无法加用户进docker组 | 全部转向本地 Conda 环境,规避容器权限问题 |
| 手动安装 cuDNN / CUDA | nvcc --version显示 10.1,但/usr/local/cuda-12.1已存在;强行降级或混装极易导致 PyTorch 崩溃 | 不动系统 CUDA,只确保 PyTorch 与cuda-12.1兼容即可 |
| Megatron 分支安装 | scripts/install_vllm_sglang_mcore.sh中 Megatron 相关依赖(如megatron-core)在非 NVIDIA 官方源下编译失败率高,且对显存要求苛刻 | 选用USE_MEGATRON=0分支,专注 FSDP + HuggingFace 轻量路径 |
关键认知:verl 的核心价值不在“能不能跑 Megatron”,而在“能不能把 RL 流程跑通”。FSDP 已足够支撑中小规模 LLM 的 PPO、DPO 等后训练任务,且对硬件更友好。本文所有操作均围绕这一务实目标展开。
2. 环境基线检查:看清手里的牌
别跳过这步。很多安装失败,根源在于没看清当前环境的真实状态。
2.1 查看 CUDA 与驱动兼容性
# 查看驱动支持的最高 CUDA 版本(关键!) nvidia-smi输出示例:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 | |-------------------------------+----------------------+----------------------+注意:CUDA Version: 12.2表示驱动支持 CUDA 12.2 及以下。我们有/usr/local/cuda-12.1,完全匹配。
❌ 如果这里显示CUDA Version: 11.x,则不能使用cuda-12.1,需改用cuda-11.8对应的 PyTorch。
2.2 确认 Python 与 Conda 状态
# 检查 conda 是否可用 which conda conda --version # 检查默认 Python 版本(避免用系统 Python 3.8/3.9) python --version建议:若
conda --version报错,请先安装 Miniconda(无需 sudo):wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3 && source $HOME/miniconda3/bin/activate && conda init bash
2.3 验证 GPU 可见性(PyTorch 前置)
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.device_count())"预期输出:
2.3.0+cu121 True 4若torch.cuda.is_available()返回False:说明 PyTorch 安装的 CUDA 版本与系统不匹配。此时需重装对应版本的 PyTorch。
3. 创建并激活 Conda 环境
这一步必须严格指定 Python 3.10 —— verl 官方明确要求 Python ≥3.10 且 <3.12(3.12 尚未全面适配)。
3.1 创建干净环境
conda create -n verl python=3.10 -y conda activate verl
conda activate verl后,命令行提示符应变为(verl) user@host:~$。这是后续所有操作的前提。
3.2 安装 PyTorch(匹配 cuda-12.1)
访问 PyTorch 官网,选择:
- OS: Linux
- Package: Conda
- Language: Python
- CUDA: 12.1
执行生成的命令(截至 2025 年中,稳定版为):
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia -y验证安装:
python -c "import torch; print(f'PyTorch {torch.__version__}, CUDA available: {torch.cuda.is_available()}')"4. 安装 verl 核心代码(本地开发模式)
verl 必须以 editable 模式安装(-e),否则无法调用其内部 RL 组件(如verl.trainer.ppo)。
4.1 克隆源码并进入目录
git clone https://github.com/volcengine/verl.git cd verl注意:必须在
verl/目录内执行后续安装命令,否则pip install -e .会找不到setup.py。
4.2 安装 verl 本体(无依赖)
pip install --no-deps -e .--no-deps是关键:它跳过自动安装requirements.txt中的依赖(那些依赖常因网络/版本冲突失败),让我们手动控制。
验证是否成功:
python -c "import verl; print(verl.__version__)"输出类似0.2.0.dev0即表示框架本体安装成功。
5. 安装最小依赖集(FSDP 路径)
我们放弃 Megatron/vLLM/sglang 的重型组合,只保留 FSDP + HuggingFace 所需的精简依赖。
5.1 手动安装核心依赖(经实测可绕过脚本失败)
# 1. 安装 transformers & accelerate(HuggingFace 生态基石) pip install transformers==4.41.2 accelerate==1.0.1 # 2. 安装 FSDP 所需:torch.distributed + fairscale(verl 显式依赖) pip install fairscale==0.4.13 # 3. 安装 RL 基础:datasets, peft, trl(用于 DPO/PPO 数据处理) pip install datasets==2.19.2 peft==0.11.1 trl==0.8.6 # 4. 安装 verl 隐式依赖:einops, tqdm, numpy, scipy pip install einops==0.8.0 tqdm==4.66.4 numpy==1.26.4 scipy==1.13.1这些版本号均经实测兼容:
transformers 4.41.2与trl 0.8.6配合良好,支持DPOTrainer;fairscale 0.4.13是最后一个兼容 PyTorch 2.3 + CUDA 12.1 的稳定版;- 避免
trl>=0.9.0(引入了unsloth强依赖,易触发 CUDA 编译错误)。
5.2 验证 FSDP 可用性(关键检查点)
python -c " import torch from torch.distributed.fsdp import FullyShardedDataParallel print('FSDP import OK') "无报错即通过。
6. 验证全流程:从加载模型到初始化 RL 训练器
现在,我们用一个最简案例,验证整个链路是否打通。
6.1 创建测试脚本test_verl_basic.py
# test_verl_basic.py from transformers import AutoModelForCausalLM, AutoTokenizer from verl.trainer.ppo import PPOTrainer from verl.data.ppo_dataset import PPODataset # 1. 加载一个轻量 HuggingFace 模型(无需下载大模型,用 tiny 验证) model_name = "sshleifer/tiny-gpt2" # 仅 50MB,10 秒内加载完毕 tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) print(f" 模型加载成功:{model_name}") # 2. 初始化 PPO 训练器(最小参数) trainer = PPOTrainer( model=model, tokenizer=tokenizer, config={ "batch_size": 1, "mini_batch_size": 1, "ppo_epochs": 1, "learning_rate": 1e-5, "use_fsdpa": True, # 启用 FSDP } ) print(" PPOTrainer 初始化成功") print(f" 当前设备:{next(model.parameters()).device}")6.2 运行验证
python test_verl_basic.py预期输出:
模型加载成功:sshleifer/tiny-gpt2 PPOTrainer 初始化成功 当前设备:cuda:0至此,你已拥有了一个可运行的 verl 环境:
- 支持 HuggingFace 模型无缝接入
- 支持 FSDP 分布式训练(多卡自动识别)
- 可直接调用
PPOTrainer、DPOTrainer等核心组件- 所有操作均在普通用户权限下完成,零 Docker、零 sudo、零 CUDA 重装
7. 常见问题与绕过方案(来自真实报错)
以下是搭建过程中高频出现的 4 类错误,及经过验证的解决方法:
7.1 错误:ModuleNotFoundError: No module named 'flash_attn'
原因:verl某些分支默认启用flash_attn,但它需要 CUDA 编译,普通用户无法安装。
解决:禁用 flash attention(不影响核心功能)
# 在 import verl 前,强制设环境变量 export VERL_USE_FLASH_ATTN=0 python -c "import verl; print('OK')"或在脚本开头添加:
import os os.environ["VERL_USE_FLASH_ATTN"] = "0" import verl7.2 错误:OSError: libcudnn.so.8: cannot open shared object file
原因:系统未配置 cuDNN 路径,但 PyTorch 已自带 cudnn(torch._C._cuda_getCurrentRawStream可用)。
解决:无需安装 cuDNN!PyTorch 2.3+ 已内置 cudnn,只需确保LD_LIBRARY_PATH包含 PyTorch 自带路径:
echo 'export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc7.3 错误:ImportError: cannot import name 'get_world_size' from 'torch.distributed'
原因:fairscale版本与 PyTorch 不匹配(常见于fairscale>=0.5)。
解决:严格使用fairscale==0.4.13(已在第 5.1 步指定)。
7.4 错误:RuntimeError: Expected all tensors to be on the same device
原因:PPOTrainer初始化时未指定device_map,模型被加载到 CPU。
解决:显式指定设备
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")8. 后续可扩展方向
你的环境已就绪,接下来可以按需延伸:
- 接入真实大模型:将
model_name替换为Qwen/Qwen2-0.5B或meta-llama/Llama-3.2-1B(需确保显存充足) - 运行 DPO 训练:替换
PPOTrainer为DPOTrainer,准备偏好数据集(JSONL 格式) - 多卡训练:启动时加
torchrun --nproc_per_node=4 test_verl_basic.py - 对接 vLLM 推理:若后续获得权限,再单独部署 vLLM 服务,通过 API 调用
重要提醒:不要急于一步到位。先用
tiny-gpt2跑通完整流程,再逐步替换为更大模型。每一次成功python test_verl_basic.py,都是对环境可靠性的确认。
9. 总结:你已掌握的确定性能力
回顾整个过程,你不是“照着文档复制粘贴”,而是建立了一套可复现、可诊断、可演进的 verl 环境构建方法论:
- 权限意识:明确区分“必须 sudo”和“纯用户可解”任务,主动规避权限墙;
- 版本克制:不盲目追新,选择经验证的 PyTorch + transformers + fairscale 组合;
- 分层验证:从
import verl→PPOTrainer初始化 →tiny-gpt2端到端,层层递进; - 错误归因:对每个报错,能快速判断是环境、版本、还是代码逻辑问题,并有对应绕过方案;
- 轻量启动:用
tiny-gpt25 分钟内验证全部链路,大幅降低试错成本。
这比一份“完美但不可复现”的教程更有价值——因为真正的工程落地,永远发生在约束条件下。
现在,打开你的终端,输入conda activate verl,然后运行那个test_verl_basic.py。当看到当前设备:cuda:0时,你就已经站在了 verl 的起点上。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。