用阿里云镜像安装指定 CUDA 版本的 PyTorch + 本地 wheel 缓存复用

在国内装 PyTorch,最烦的两件事:一是想精确锁定 CUDA 版本却总装错;二是同一个版本要在好几台机器、好几个虚拟环境里反复下载,既费时间又费流量。

这篇教程解决两个问题:用阿里云镜像安装指定 CUDA 版本的 PyTorch;以及把常用版本的 wheel 下载到本地一次,之后在任意环境离线复用

赶时间的话,直接抄下面这一段三条命令即可;想知道每一步为什么这么写,再往下看详解。

下面的 export${VAR//./} 等写法针对 bash / zsh(Linux、macOS)。Windows 请把 export 换成 set(cmd)或 $env:(PowerShell),路径用反斜杠。


速查:复制即用

# --- 配置(只改这一段)---
export CUDA_TAG=cu128                 # CUDA 标签:cu118 / cu121 / cu124 / cu128 …
export PY_VER=3.10                    # 目标 Python 版本
export TORCH_VER=2.7.1                # PyTorch
export TV_VER=0.22.1                  # torchvision
export TA_VER=2.7.1                   # torchaudio
export TORCH_MIRROR="https://mirrors.aliyun.com/pytorch-wheels/${CUDA_TAG}/"
export WHEEL_DIR="$HOME/data/wheels/torch${TORCH_VER//./}_${CUDA_TAG}_py${PY_VER//./}"

# --- A. 直接联网安装 ---
pip install torch==${TORCH_VER}+${CUDA_TAG} torchvision==${TV_VER}+${CUDA_TAG} torchaudio==${TA_VER}+${CUDA_TAG} \
  -f "$TORCH_MIRROR"

# --- B. 下载到本地(在临时环境里执行)---
conda create -y -n wheel_dl python=$PY_VER && conda activate wheel_dl
mkdir -p "$WHEEL_DIR"
python -m pip download --dest "$WHEEL_DIR" --only-binary=:all: -f "$TORCH_MIRROR" \
  torch==${TORCH_VER}+${CUDA_TAG} torchvision==${TV_VER}+${CUDA_TAG} torchaudio==${TA_VER}+${CUDA_TAG}
conda deactivate && conda remove -y -n wheel_dl --all

# --- C. 离线复用(在目标环境里执行)---
conda create -y -n myproj python=$PY_VER && conda activate myproj
pip install torch==${TORCH_VER}+${CUDA_TAG} torchvision==${TV_VER}+${CUDA_TAG} torchaudio==${TA_VER}+${CUDA_TAG} \
  --no-index -f "$WHEEL_DIR"

版本配套表:torch / torchvision / torchaudio / CUDA / Python

装 PyTorch 本质是凑一套配套版本:torch + torchvision + torchaudio 必须成套,再叠加一个该 torch 版本支持的 CUDA tag 和 Python 区间,少一处对不上就会装失败或运行报错。下表覆盖常用的 2.1~2.7(数据来自 PyTorch 官方 previous-versions 页与 torchvision 官方说明):

PyTorch torchvision torchaudio 可用 CUDA tag Python
2.7.1 0.22.1 2.7.1 cu118 / cu126 / cu128 3.9 – 3.13
2.7.0 0.22.0 2.7.0 cu118 / cu126 / cu128 3.9 – 3.13
2.6.0 0.21.0 2.6.0 cu118 / cu124 / cu126 3.9 – 3.12
2.5.1 0.20.1 2.5.1 cu118 / cu121 / cu124 3.9 – 3.12
2.5.0 0.20.0 2.5.0 cu118 / cu121 / cu124 3.9 – 3.12
2.4.1 0.19.1 2.4.1 cu118 / cu121 / cu124 3.8 – 3.12
2.3.1 0.18.1 2.3.1 cu118 / cu121 3.8 – 3.12
2.2.2 0.17.2 2.2.2 cu118 / cu121 3.8 – 3.11
2.1.2 0.16.2 2.1.2 cu118 / cu121 3.8 – 3.11

配套规律(方便推算表里没列出的 patch 版本):

  • torchvision 与 torch 同步递增:torch 2.5 → tv 0.20、2.6 → 0.21、2.7 → 0.22(次版本一起 +1),patch 号也对齐(torch 2.7.1 → tv 0.22.1)。
  • torchaudio 版本号与 torch 完全一致:torch 2.7.1 → torchaudio 2.7.1。

两个常用 CUDA tag 的反查:

  • cu128:torch 2.7.0 起才有,2.6 及更早没有。
  • cu118:torch 2.0 ~ 2.7 一路都支持,是兼容性最好的「老黄金」tag。

准备:把可变项抽成环境变量

上面那个配置块就是把「版本 / CUDA / 路径」这些会变的东西集中到一处,方便自己和别人改。几点说明:

  • CUDA_TAG 怎么选:看你的 NVIDIA 驱动支持的 CUDA 版本(nvidia-smi 右上角的 CUDA Version 是上限)。pip 装的 wheel 自带 CUDA 运行库,所以不需要预装 CUDA Toolkit,只要驱动够新即可。
  • torch / torchvision / torchaudio 三者版本要配套(如 2.7.1 / 0.22.1 / 2.7.1),否则会装不上或运行报错。
  • ${TORCH_VER//./} 是把 2.7.1 里的点去掉变成 271,只为让目录名好看、好区分。最终 WHEEL_DIR 会是类似 ~/data/wheels/torch271_cu128_py310 的样子。

方法一:直接安装指定 CUDA 版本的 PyTorch

最简单的形式(阿里云镜像 + -f 就能把范围限定到 cu128 这一目录):

pip install torch torchvision torchaudio -f "$TORCH_MIRROR"

精确锁版本,就把版本号写全:

pip install \
  torch==${TORCH_VER}+${CUDA_TAG} \
  torchvision==${TV_VER}+${CUDA_TAG} \
  torchaudio==${TA_VER}+${CUDA_TAG} \
  -f "$TORCH_MIRROR"

原理:

  • -f--find-links)把阿里云的 PyTorch wheel 目录当作下载源;该目录里就是 torch-2.7.1+cu128-cp310-...whl 这类文件。
  • +cu128 这个后缀(PEP 440 里的 local version)用来明确锁定 CUDA 12.8 的构建,避免 pip 选到别的 CUDA 版本(比如 PyPI 上的默认构建)。

建议先建一个干净环境再装,避免污染 base:

conda create -y -n myproj python=$PY_VER && conda activate myproj

装完验证:

import torch
print(torch.__version__)          # 2.7.1+cu128
print(torch.cuda.is_available())  # True
print(torch.version.cuda)         # 12.8

方法二:把 wheel 下载到本地,跨环境复用

适用场景:同一个 PyTorch 版本要在好几台机器 / 好几个虚拟环境里用。下载一次存到本地,以后直接离线安装,省时省流量(光是 nvidia-cudnn 这类依赖就有几百 MB)。

关键前提:Python 版本要对得上

wheel 文件名里带着 cp310(CPython 3.10)、linux_x86_64 这些标签,pip 只会安装与当前解释器、当前平台匹配的 wheel

所以:下载时要在「目标 Python 版本」的环境里下;复用时目标环境的 Python 版本也必须一致。这就是为什么下面两步都要先建对应版本的环境。

第一步:建临时环境 → 下载到本地

下载这步只是为了拿到「正确的 Python 版本」,环境本身用完就删,所以叫临时环境

# 1) 临时环境(只为锁定 Python 版本,下载完即删)
conda create -y -n wheel_dl python=$PY_VER
conda activate wheel_dl

# 2) 把 torch 全家桶 + 所有依赖下载到本地
mkdir -p "$WHEEL_DIR"
python -m pip download \
  --dest "$WHEEL_DIR" \
  --only-binary=:all: \
  -f "$TORCH_MIRROR" \
  torch==${TORCH_VER}+${CUDA_TAG} \
  torchvision==${TV_VER}+${CUDA_TAG} \
  torchaudio==${TA_VER}+${CUDA_TAG}

# 3) 下载完,删掉临时环境
conda deactivate
conda remove -y -n wheel_dl --all

不用 conda 的话,venv 也行(前提是系统里已装好对应版本的 Python):

python3.10 -m venv /tmp/wheel_dl && source /tmp/wheel_dl/bin/activate
#  …执行上面的 pip download…
deactivate && rm -rf /tmp/wheel_dl

这里 --only-binary=:all: 的作用是:强制只下预编译的 wheel,绝不退回去下源码包再本地编译。torch 这套依赖其实都有 wheel,多数时候加不加都一样;但它是给离线复用上的保险——万一某个依赖被下成源码包,到离线机器上用 --no-index 安装时就得现场编译(要编译器、可能还缺别的依赖),离线就废了。另外,pip download 默认会把 torch 的全部依赖numpypillow,以及 cu128 自带的 nvidia-* 库等)一并下载,所以 $WHEEL_DIR 是一个「自包含」目录。

第二步:建目标环境 → 离线安装

到任意机器上,先建一个同样 Python 版本的环境,再从本地目录离线装:

# 1) 目标环境(Python 版本必须和下载时一致)
conda create -y -n myproj python=$PY_VER
conda activate myproj

# 2) 完全离线安装:--no-index 让 pip 只在本地目录里找包
pip install \
  torch==${TORCH_VER}+${CUDA_TAG} \
  torchvision==${TV_VER}+${CUDA_TAG} \
  torchaudio==${TA_VER}+${CUDA_TAG} \
  --no-index \
  -f "$WHEEL_DIR"

-f 指向哪儿都行 —— 可以是 ~/data/wheels/...,也可以是放进项目仓库里的相对路径,例如:

pip install torch==2.7.1+cu128 torchvision==0.22.1+cu128 torchaudio==2.7.1+cu128 \
  --no-index -f external/wheels/torch271_cu128_py310/

复用的三条硬约束

  • Python 版本要一致:py310 的 wheel 装不进 3.9 / 3.11 的环境。
  • 操作系统 / 架构要一致:linux_x86_64 的 wheel 不能用在 macOS / Windows / ARM。
  • 正因如此,目录名里带上 py310cu128,一眼就能区分该用哪一份。

小贴士

  • 依赖下载慢?(可选提速) torch 三件套靠 -f 从阿里云下,但 numpynvidia-* 等普通依赖默认走官方 PyPI。如果你连 PyPI 慢,给命令再加一个 -i https://mirrors.aliyun.com/pypi/simple/,让依赖也走国内镜像。要是你本来下得就快(或已全局配过镜像),不加完全没问题。
  • 机器上有多个 Python 时,把 pip 换成 python -m pip 更稳妥,能确保用的是当前环境的 pip。
  • 如果阿里云某个 CUDA 标签缺包,可改用 PyTorch 官方源:--index-url https://download.pytorch.org/whl/${CUDA_TAG}。注意:官方源用 --index-url,阿里云这个目录用 -f,两者不一样。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐