配环境
记录一下自己在配置pytorch环境时遇到的问题。全程使用Ubuntu命令行操作,可以远程操作服务器
conda
安装conda
先到miniconda的官网找到对应的下载链接,然后用wget安装。
- 如果下载速度很慢,可以用镜像源, 找到-latest-linux x86_64
wget https://mirrors.zju.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
-
按ENTER浏览用户协议
-
之后一路选择yes, 环境会创建到~/miniconda3/envs
-
激活conda的设置``` Do you wish to update your shell profile to automatically initialize conda? This will activate conda on startup and change the command prompt when activated. If you'd prefer that conda's base environment not be activated on startup, run the following command when conda is activated:
conda config --set auto_activate_base false
You can undo this by running conda init --reverse $SHELL? [yes|no]
出现这个的时候,选择yes 这样启动终端时会自动激活conda
-
安装完成后,执行source ~/.bashrc 重启终端,最左边会出现(base)字样,说明安装完成
建立环境
conda create -n [环境名称] python=[版本号]
接着重启终端。然后才能激活环境
conda activate [环境名称]
换源
Info
mirrors.zju.edu.cn目前只支持校园内网访问,外网访问时会自动重定向到清华源
以zju源为例
conda config --add channels https://mirrors.zju.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.zju.edu.cn/anaconda/cloud/conda-forge
conda config --add channels https://mirrors.zju.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.zju.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.zju.edu.cn/anaconda/pkgs/main/
或者直接vim .condarc
结合vscode和conda
- 用vscode打开一个文件夹
- Ctrl+Shift+P打开vsc的命令行
- 选择Python:Select Interpreter
- vsc会自动定位Python的位置
~\miniconda3\envs\对应的版本,选择对应版本号和环境名称即可
设置好之后,每次启动vsc集成的终端时就会自动激活对应的环境。python代码也可以点击右上角一键运行了
conda环境打包
打包:
如果该环境下有-e安装的包,则要使用--ignore-editable-packages,排除-e的包
之后会得到my_env.tar.gz文件
重建:
mkdir ~/miniconda3/envs/my_env
tar -xzvf my_env.tar.gz -C ~/miniconda3/envs/my_env
conda env list #查看结果
Warning
如果在环境中混用pip和conda安装包,conda打包的时候有部分包会被漏掉,因此重建之后需要手动pip install缺失的包
pip
pip查找包并安装的速度一般比conda快
临时换源:
更新
pytorch安装
用pip
法一: 在index-url里面指定cuda版本(如12.1)
pip 安装 SSL/连接报错
现象:
在使用 pip 安装包时(特别是从 download.pytorch.org),出现 SSLError、UNEXPECTED_EOF_WHILE_READING 或连接重置。
通用解决方案:
在命令中显式添加 --trusted-host 信任该域名,并建议增加超时时间。
codeBash
# 模板
pip install <package_name> --index-url <url> --trusted-host <host_domain> --default-timeout=1000
# 示例:安装 PyTorch
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 --trusted-host download.pytorch.org --default-timeout=1000
用conda(不推荐)
conda install pytorch=[版本号]=[具体名字]
注意源自动匹配的版本可能不对。要检查名字后面不是带着_cpu, 而是_cuda11.3_cudnn.... 可以手动指定具体版本号
torchvision
如果源自动匹配的不对,可以离线安装或者手动指定版本:
wget https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/linux-64/torchvision-0.11.1-py38_cu113.tar.bz2
conda install --offline torchvision-0.11.1-py38_cu113.tar.bz2
终端中运行 conda install 命令后一直显示“Solving environment: \ ”_conda一直在solving environment-CSDN博客
uv
安装uv
用pypi安装比较快
也可以用standalone installer,但网络不好的时候下的会比较慢
uv处理原有的pip/conda项目
uv venv #在当前目录下创建虚拟环境(.venv)
#如果需要指定python版本
uv venv --python 3.10 #前提是系统里有python 3.10
#如果系统里没有指定的python版本,可以利用uv python install下载,再用uv venv安装
uv python install 3.8
uv venv --python 3.8
安装依赖
运行程序
项目管理
如果你是新项目,建议使用 uv 的项目管理模式,这样运行起来更强大:
- 初始化项目: uv init my_project
- 添加依赖: uv add package_name (这会自动更新 pyproject.toml 并安装包package_name)
- 运行: uv run main.py
uv和torch
- uv init
-
编辑 pyproject.toml 加入 [[tool.uv.index]]。
-
uv add torch torchvision --index 你的索引名。
为什么 uv 处理 Torch 这么快?
- 并行下载: uv 会同时下载 Torch 的多个分片。
- 链接机制: 如果你电脑上另一个项目也用了同一个版本的 Torch,uv 会直接从缓存创建硬链接(Hardlink),瞬间完成安装,不需要重新下载或解压。
系统cuda
有些pip包,如flash-attention需要用nvcc等编译
修改环境变量
in _lazy_init torch._C._cuda_init() RuntimeError: No CUDA GPUs are available
检查CUDA_VISIBLE_DEVICES, 一般来讲是编号和卡的数量不匹配
Build Isolation
现象:
系统已安装了正确版本的 PyTorch(如 CUDA 11.8),但在编译项目(pip install -e .)时,报错提示检测到的 CUDA 版本(系统 nvcc)与 PyTorch 编译版本不一致(通常是 pip 自动在临时环境下载了最新的 CUDA 12.x 版 PyTorch)。
原因:
pip 默认启用“构建隔离”(Build Isolation),会创建一个临时的虚拟环境并安装最新依赖,忽略了用户当前环境中已配置好的包。
通用解决方案:
添加 --no-build-isolation 参数,强制 pip 使用当前环境中已安装的 PyTorch。
NVIDIA MPS
当在多用户共享的服务器上运行 PyTorch 时,如果遇到 Error 805: MPS client failed to connect to the MPS control daemon 报错,通常是因为系统环境变量或默认设置尝试连接一个由其他用户启动、且当前用户无权访问的 NVIDIA MPS 服务,导致 torch.cuda.is_available() 返回 False。
NVIDIA MPS(Multi-Process Service)是一种允许多个进程同时共享单块 GPU 资源的技术(比如,在一个卡上运行多个占用资源很少的小进程)。它通过一个后台守护进程(Daemon)来统一调度显卡任务。在默认情况下,MPS 会在 /tmp/nvidia-mps 路径下创建一个通信管道。如果实验室的其他同学开启了 MPS,这个文件夹的所有权就属于该同学。当你启动 CUDA 程序时,驱动会自动检测到这个路径并尝试连接,但由于权限不足,连接会立即失败并抛出 805 错误。
如果由于他人开启 MPS 导致你无法使用显卡,最简单的解决方法是“逻辑隔离”。通过设置环境变量强制让你的程序去一个不存在的路径寻找 MPS,从而触发驱动的自动降级机制,使其回退到正常的非 MPS 模式。你可以在终端执行以下操作,或将其添加到 ~/.bashrc 和 ~/.zshrc 中以永久生效:
- 执行
export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps-$USER-fake。 - 这行代码会将 MPS 管道指向一个以你用户名命名的虚假路径,避开了默认的冲突路径。
- 修改配置后,记得执行
source ~/.bashrc或source ~/.zshrc使其生效。
如果你确实需要使用 MPS 功能,为了不干扰实验室的其他同学,应当建立私有的 MPS 环境。这需要你手动指定私有的管道和日志路径,确保不占用默认的 /tmp/nvidia-mps 位置:
- 设置私有变量:
export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps-$USER。 - 设置日志路径:
export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-mps-log-$USER。 - 创建对应目录:
mkdir -p $CUDA_MPS_PIPE_DIRECTORY $CUDA_MPS_LOG_DIRECTORY。 - 启动服务:
nvidia-cuda-mps-control -d。 - 注意:开启 MPS 通常需要显卡处于独占模式(Exclusive Process),这可能需要管理员权限。使用完毕后请务必执行
echo quit | nvidia-cuda-mps-control关闭服务,否则该显卡将一直处于独占状态,导致他人无法正常使用。
在排查此类问题时,以下命令是定位故障的关键工具:
nvidia-smi:检查显卡状态、当前显存占用以及Compute M.(计算模式)是否为Default或Exclusive。env | grep -i cuda:检查环境变量中是否意外设置了 MPS 相关路径或特定的显卡限制。ls -la /tmp/nvidia-mps:确认该文件夹是否存在,并观察其所属用户(Owner)是谁。ps -ef | grep mps:查看系统中是否正有nvidia-cuda-mps-control或nvidia-cuda-mps-server进程在运行。sudo dmesg | grep -i "NVRM":查看系统内核日志,确认是否发生了硬件层面的报错(如 Xid 错误),这有助于判断是软件配置问题还是驱动/硬件故障。
各种包的安装
vllm
GPU - vLLM 记得加上--extra-index-url https://download.pytorch.org/whl/cu128 (换成对应的cuda版本)
ESM和ESMFold
ESM和ESMFold都已经封装成了包,直接pip install,不需要clone代码
ESM(只需要语言模型当encoder的情况):
ESMFold要容易踩坑一些:
pip install "fair-esm[esmfold]"
# OpenFold and its remaining dependency
pip install 'dllogger @ git+https://github.com/NVIDIA/dllogger.git'
pip install 'openfold @ git+https://github.com/aqlaboratory/openfold.git@4b41059694619831a7db195b7e0988fc4ff3a307'
但是这样pip源匹配的cudatoolkit版本容易出问题。建议用官方给的conda
conda env create -f environment.yml
pip install "fair-esm[esmfold]"
pip install 'openfold @ git+https://github.com/aqlaboratory/openfold.
grounding dino
现象:
在编译过程中(Running build_ext),出现大量的 C++ 错误,例如 at::Tensor::type() is deprecated 或 no suitable conversion function。
原因:
当前安装的 PyTorch 版本过高(如 2.1+),移除了旧版 C++ API,而项目代码较旧,未适配新版 PyTorch。
通用解决方案:
降级 PyTorch 到兼容性更好的版本(推荐 2.0.1),而不是手动修改 C++ 源码。
法二:
pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 torchaudio==2.0.2+cu118 -f https://download.pytorch.org/whl/torch_stable.html
torch的其他问题
ImportError: ... libcusparse.so.12: undefined symbol: __nvJitLinkComplete_12_4
表明你的程序正在寻找 CUDA 12.4 版本的 JIT 链接器符号,但你当前环境中的 nvidia-nvjitlink-cu12 版本过低(可能低于 12.4),导致 cusparse 加载失败。
首先尝试先去掉环境里其他的系统cuda, 因为可能链接到了别的版本,然后重新运行脚本看看有没有问题。
否则需要重新建立符号连接
-
把现有 /usr/local/cuda 移除并建立到正确 CUDA 版本的符号链接(CUDA-12.4 为例):
-
确认 nvcc(编译器)能正常报告版本:
-
确保动态链接器能找到 CUDA 库,并刷新缓存(持久化做法):
-
为当前 shell 临时设置 LD_LIBRARY_PATH(脚本/会话需要):
如希望长期生效,可把上面一行加入用户的 ~/.bashrc 或系统环境文件。
import torch出现 undefined symbol: iJIT_NotifyEvent
pip install mkl==2024.0.0 不能2024.1及之后的版本,参考
nvcc fatal : Unsupported gpu architecture 'compute_89'
系统CUDA版本,需要>=11.8
RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling
cublasGemmEx( handle, opa, opb, m, n, k, &falpha, a, CUDA_R_16F, lda, b, CUDA_R_16F, ldb, &fbeta, c, CUDA_R_16F, ldc, CUDA_R_32F, CUBLAS_GEMM_DFALT_TENSOR_OP)
动态链接库问题解决方案, unset LD_LIBRARY_PATH即可
def einsum(tensor: Tensor, pattern: str, /) -> Tensor:SyntaxError: invalid syntax
参考issue, 应该安装einops=0.6.1
一般是模型文件下载不完整 重新下载
matplotlib 教程 openfold安装: [BUG] another local installation problem from openfold: ModuleNotFoundError: No module named 'scripts' . · Issue #6 · kyegomez/AlphaFold3
scikit-learn: pip安装scikit-learn失败过程和解决方法_pip install sklearn-CSDN博客
import sru 卡住,实际上是出现无限循环
参考https://github.com/asappresearch/sru/issues/196
解决方法:删除~/.cache/torch_extensions文件夹 然后重新import,会出现以下warning,但不影响使用
UserWarning: Just-in-time loading and compiling the CUDA kernels of SRU was unsuccessful. Got the following error:
cannot open shared object file: No such file or directory
warnings.warn("Just-in-time loading and compiling the CUDA kernels of SRU was unsuccessful. "
pip install torch-cluster包 build很慢
解决方法:因为只是慢,所以耐心等待一般都能跑出来的,不用着急 似乎这里有更快的方法 参考
biopython版本问题 部分函数找不到 importError: cannot import name 'three_to_one' from 'Bio.PDB.Polypeptide'
解决方法: 搜索biopython.org three_to_one, 发现这个函数在biopython 1.75里面有,而本地安装的版本没有. pip修改版本
ninja: build stopped: subcommand failed. subprocess.CalledProcessError: Command '['ninja', '-v']' returned non-zero exit status 1.
这不是根本问题。是由于gcc,g++等编译出错而产生的,要往上查看报错信息
detectron2: pytorch 1.11.0. cuda 11.3. 记得编译之前修改LD_LIBRARY_PATH, 如果改完还出现问题, rm -rf build 再重新编译
清理包缓存
查看conda目录下各环境文件夹大小
| 工具 | 清理目标 | 核心命令 | 备注 |
|---|---|---|---|
| Conda | 包缓存(Tarballs, 索引) | conda clean --all |
推荐。 清理所有下载的安装包、缓存文件和锁文件,不影响现有环境。 |
| Conda | 未使用包 | conda clean --packages |
清理未被任何现有环境引用的旧版依赖包。 |
| Conda | 废弃环境 | conda env remove --name <env_name> |
彻底删除不再使用的整个环境,释放大量空间。 |
| pip | 下载缓存 | pip cache purge |
推荐。 清理下载的 wheel 和源码包缓存 ($HOME/.cache/pip)。 |
| pip | 手动清理 | rm -rf $(pip cache dir) |
当 pip cache 命令不可用时的备用方案。 |
| APT | 已安装包的 .deb 文件 | sudo apt clean |
清理 /var/cache/apt/archives/ 下已安装的 .deb 包,保持最新索引。 |
| APT | 孤儿依赖 | sudo apt autoremove |
删除作为依赖安装,但现在不再被任何包依赖的“孤儿”软件包。 |