Skip to content

配环境

记录一下自己在配置pytorch环境时遇到的问题。全程使用Ubuntu命令行操作,可以远程操作服务器

env

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 
  1. 按ENTER浏览用户协议

  2. 之后一路选择yes, 环境会创建到~/miniconda3/envs

  3. 激活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

  4. 安装完成后,执行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

参考资料

  1. 用vscode打开一个文件夹
  2. Ctrl+Shift+P打开vsc的命令行
  3. 选择Python:Select Interpreter
  4. vsc会自动定位Python的位置 ~\miniconda3\envs\对应的版本,选择对应版本号和环境名称即可

设置好之后,每次启动vsc集成的终端时就会自动激活对应的环境。python代码也可以点击右上角一键运行了

conda环境打包

打包:

pip install conda-pack
conda pack -n my_env

如果该环境下有-e安装的包,则要使用--ignore-editable-packages,排除-e的包

conda pack -n my_env --ignore-editable-packages

之后会得到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快

临时换源:

pip install package_name -i https://mirrors.zju.edu.cn/pypi/web/simple

更新

pip install --upgrade package_name

pytorch安装

用pip

法一: 在index-url里面指定cuda版本(如12.1)

pip install torch==2.2.0 torchvision==0.17.0 --index-url https://download.pytorch.org/whl/cu121

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.... 可以手动指定具体版本号

conda install pytorch=1.10.0=py3.8_cuda11.3_cudnn8.2.0_0
pytorch和cudatoolkit版本对应

torchvision

torch和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安装比较快

pipx install uv
# 如果没有pipx, 先sudo apt install pipx

也可以用standalone installer,但网络不好的时候下的会比较慢

curl -LsSf https://astral.sh/uv/install.sh | sh

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 pip install -r requirements.txt #安装包,比pip快
#只安装包,不记录到项目配置文件

source .venv/bin/activate #激活环境

运行程序

uv run main.py
#等价于
source .venv/bin/activate && python main.py
#或
./.venv/bin/python main.py

项目管理

如果你是新项目,建议使用 uv 的项目管理模式,这样运行起来更强大:

  1. 初始化项目: uv init my_project
  2. 添加依赖: uv add package_name (这会自动更新 pyproject.toml 并安装包package_name)
  3. 运行: uv run main.py

uv和torch

  1. uv init
  2. 编辑 pyproject.toml 加入 [[tool.uv.index]]。

    [[tool.uv.index]]
    name = "pytorch-cu121"
    url = "https://download.pytorch.org/whl/cu121"
    explicit = true  # 建议加上这个,防止从这个源下载非 Torch 的包
    

  3. uv add torch torchvision --index 你的索引名。

    uv add torch torchvision torchaudio --index pytorch-cu121
    

为什么 uv 处理 Torch 这么快?

  1. 并行下载: uv 会同时下载 Torch 的多个分片。
  2. 链接机制: 如果你电脑上另一个项目也用了同一个版本的 Torch,uv 会直接从缓存创建硬链接(Hardlink),瞬间完成安装,不需要重新下载或解压。

系统cuda

有些pip包,如flash-attention需要用nvcc等编译

修改环境变量

export LD_LIBRARY_PATH=/usr/local/cuda-11.8:`${LD_LIBRARY_PATH}`

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。

# 确保当前环境已安装好对应版本的 torch
pip install -e . --no-build-isolation

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 ~/.bashrcsource ~/.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.(计算模式)是否为 DefaultExclusive
  • env | grep -i cuda:检查环境变量中是否意外设置了 MPS 相关路径或特定的显卡限制。
  • ls -la /tmp/nvidia-mps:确认该文件夹是否存在,并观察其所属用户(Owner)是谁。
  • ps -ef | grep mps:查看系统中是否正有 nvidia-cuda-mps-controlnvidia-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的情况):

pip install fair-esm  # latest release, OR

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, 因为可能链接到了别的版本,然后重新运行脚本看看有没有问题。

unset LD_LIBRARY_PATH

否则需要重新建立符号连接

  1. 把现有 /usr/local/cuda 移除并建立到正确 CUDA 版本的符号链接(CUDA-12.4 为例):

    sudo rm -f /usr/local/cuda
    sudo ln -s /usr/local/cuda-12.4 /usr/local/cuda
    

  2. 确认 nvcc(编译器)能正常报告版本:

    nvcc -V
    # 期望输出含 "Cuda compilation tools, release 12.4"
    

  3. 确保动态链接器能找到 CUDA 库,并刷新缓存(持久化做法):

    echo "/usr/local/cuda/lib64" | sudo tee /etc/ld.so.conf.d/cuda.conf
    sudo ldconfig
    

  4. 为当前 shell 临时设置 LD_LIBRARY_PATH(脚本/会话需要):

    export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$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

RuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory

一般是模型文件下载不完整 重新下载

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目录下各环境文件夹大小

cd ~/miniconda3/envs
du -sh *

工具 清理目标 核心命令 备注
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 删除作为依赖安装,但现在不再被任何包依赖的“孤儿”软件包。

Comments