环境安装与开发姿势:CPU、CUDA、ROCm、MPS 怎么选
学 PyTorch,第一个门槛不是模型。是环境。环境装错,代码还没开始跑,报错已经堆满屏。 这一章只讲一件事:把 PyTorch 环境一次性讲清楚。不是背安装命令,而是看懂安装背后的逻辑。 因为命令会随着版本变化。逻辑不会。你只要能判断 C
学 PyTorch,第一个门槛不是模型。是环境。环境装错,代码还没开始跑,报错已经堆满屏。
这一章只讲一件事:把 PyTorch 环境一次性讲清楚。不是背安装命令,而是看懂安装背后的逻辑。
因为命令会随着版本变化。逻辑不会。你只要能判断 CPU、CUDA、ROCm、MPS 该选谁,后面的训练、调试、部署才不会乱。
一、PyTorch 安装,真正安装的是什么
很多人以为安装 PyTorch 就是:pip install torch。
不对。真正安装的是一个“带后端能力的 torch 包”。它可能是 CPU 构建,也可能是 CUDA 构建,也可能是 ROCm 构建。Mac 上的 MPS 则走 Apple Metal 后端。
所以,安装 PyTorch 不是问“装哪个版本”。而是先问:你的计算要交给谁执行?CPU?NVIDIA GPU?AMD GPU?还是 Apple Silicon 的 Metal GPU?
二、CPU 版:最稳,最慢,最适合起步
CPU 版适合三类场景:刚入门、写教程、先跑通代码。
它的优点是简单。不依赖显卡,不依赖驱动,不挑机器。只要 Python 环境正常,基本能跑。
它的缺点也明显:慢。小模型能忍,大模型直接劝退。
# CPU 环境验证
import torch
x = torch.rand(5, 3)
print(x)
print(x.device) # cpu
记住一句话:CPU 版适合把路打通,不适合把大模型训起来。
三、CUDA 版:NVIDIA 显卡的主流路线
只要你是 NVIDIA 显卡,深度学习训练优先考虑 CUDA。
CUDA 版 PyTorch 的关键不在“有没有显卡”,而在四件事是否匹配:PyTorch 构建、CUDA 运行时、NVIDIA 驱动、GPU 架构。
最常见的坑是:机器明明有 NVIDIA 显卡,torch.cuda.is_available() 却返回 False。多数时候,不是模型错了,是环境链路断了。
# CUDA 环境验证
import torch
print(torch.__version__)
print(torch.version.cuda)
print(torch.cuda.is_available())
if torch.cuda.is_available():
print(torch.cuda.get_device_name(0))
x = torch.rand(5, 3, device="cuda")
print(x.device)
官方安装页的做法是:在选择器里按操作系统、包管理器、Python 和 Compute Platform 生成安装命令。不要复制旧文章里的固定命令。
四、ROCm 版:AMD 显卡路线,先看兼容
AMD 显卡不是不能做深度学习。它走 ROCm。
但 ROCm 对系统、显卡型号、驱动版本的要求更严格。尤其是生产环境,建议优先考虑 Docker。AMD 官方文档也把预装 PyTorch、ROCm 和依赖的 Docker 镜像作为推荐方式。
# ROCm 环境下,Python API 仍然常用 torch.cuda 语义
import torch
print(torch.version.hip) # ROCm 构建通常会有值
print(torch.cuda.is_available()) # ROCm 下也沿用 cuda API 语义
注意:ROCm 版里很多 Python 层 API 仍然叫 torch.cuda。这不是写错,而是 PyTorch 为了减少上层代码差异,沿用了相近语义。
五、MPS 版:Apple Silicon 的本地加速
如果你是 M1、M2、M3、M4 系列 Mac,可以用 MPS 后端。MPS 基于 Apple Metal,适合本地训练、调试、小规模实验。
但不要把 MPS 当成 CUDA 的完全替代。它能加速很多模型,但算子覆盖、性能表现、内存行为和 CUDA 不完全一样。
# MPS 环境验证
import torch
if torch.backends.mps.is_available():
device = torch.device("mps")
else:
device = torch.device("cpu")
x = torch.ones(5, device=device)
print(x.device)
MPS 里要分清两个问题:这个 torch 包有没有编进 MPS?当前机器和系统能不能真正启用 MPS?前者看 is_built,后者看 is_available。
六、源码级看一眼:is_available() 不是魔法
环境排查不要只看表面。我们直接看源码思路。
CUDA 的 is_available 大体分两层:第一层看这个 PyTorch 是否编译了 CUDA 支持;第二层调用底层 C++ 接口检查设备数量。
# torch/cuda/__init__.py 核心逻辑简化
def _is_compiled():
return hasattr(torch._C, "_cuda_getDeviceCount")
def is_available():
if not _is_compiled():
return False
return torch._C._cuda_getDeviceCount() > 0
这就解释了为什么 False 不等于“你没有显卡”。它可能只是当前 torch 包根本不是 CUDA 构建。
MPS 的逻辑更直接:is_built 看构建能力,is_available 看运行时是否可用。
# torch/backends/mps/__init__.py 核心逻辑简化
def is_built():
return torch._C._has_mps
def is_available():
return torch._C._mps_is_available()
七、为什么 CUDA 报错经常“慢半拍”
GPU 操作不是普通 Python 函数。PyTorch 调用 GPU 时,很多操作会先进入队列,然后由 GPU 异步执行。
这就会出现一个现象:真正出错的地方,可能不是报错显示的那一行。因为错误是在 GPU 后面执行时才暴露出来。
调试时可以临时设置 CUDA_LAUNCH_BLOCKING=1,让 GPU 操作同步执行。这样报错位置更接近真实原因。
# Linux / macOS
CUDA_LAUNCH_BLOCKING=1 python train.py
# Windows PowerShell
$env:CUDA_LAUNCH_BLOCKING=1
python train.py
八、显存不是你以为的那样释放
很多人看到 nvidia-smi 显示显存没降,就以为 PyTorch 没释放。
实际上,PyTorch 有 CUDA caching allocator。它会缓存释放后的显存块,让下一次分配更快。
所以,显存排查要分清两个概念:Tensor 真正占用的显存,和 PyTorch 缓存管理器保留的显存。
# 显存观察
import torch
print(torch.cuda.memory_allocated() / 1024**2, "MB")
print(torch.cuda.memory_reserved() / 1024**2, "MB")
# 释放未使用缓存,不会释放仍被 Tensor 占用的显存
torch.cuda.empty_cache()
memory_allocated 看 Tensor 正在占多少;memory_reserved 看缓存分配器总共管着多少。不要只盯 nvidia-smi。
九、开发环境的正确姿势
不要把所有项目都装进一个 Python。
一个项目一个虚拟环境。一个后端一套依赖。CPU、CUDA、ROCm 不要混在一个环境里反复覆盖。
真正工程化的 PyTorch 项目,必须能复现环境。否则同一份代码,今天能跑,明天就炸。
十、常见问题,一张图排查
环境问题不要凭感觉修。按症状定位,速度最快。
十一、总结
• 第一,先选硬件后端,再复制安装命令。
• 第二,CPU 版最稳,CUDA 版最主流,ROCm 要看兼容,MPS 适合 Mac 本地调试。
• 第三,安装成功不等于 GPU 可用,必须用代码验证。
• 第四,is_available 返回 False 时,优先排查 wheel、驱动、设备可见性。
• 第五,显存和 CUDA 报错有异步与缓存机制,不能只看表面。
下一章开始进入 PyTorch 的真正核心:Tensor。Tensor 是所有模型、梯度、参数和计算图的起点。
相关推荐
LangChain 系列:从 0 搭一个企业知识库问答系统
这一章不再单讲一个组件,而是把前面所有 RAG 组件合起来:从文件上传,到向量入库,再到用户提问、检索证据、模型回答、日志追踪。 01 先搞清楚:企业知识库问答不是 Demo Demo 只要能回答。企业系统要能上传、能解析、能检索、能引用、
Tensor:PyTorch 世界里的一切都是张量
1. Tensor 是 PyTorch 的基本单位 PyTorch 里,模型吃进去的是 Tensor,参数保存的是 Tensor,梯度也是 Tensor,GPU 上跑的还是 Tensor。 你可以把 Tensor 理解成“加强版数组”。但这
Rerank 与上下文压缩:为什么召回 TopK 后还要重排?
RAG 最容易踩的坑,不是“没有召回”。 而是召回了一堆看起来相关、实际会干扰模型的资料。 所以,成熟的 RAG 链路不会把 TopK 直接塞进 Prompt。 它会先召回,再重排,再压缩。 1. 为什么召回 TopK 后还要重排? 向量召
LangChain 系列之Retriever:RAG 的核心不是生成,而是检索
01 前言 Retriever 是 RAG 的入口。它接收一个 query,返回一组 List[Document]。模型不是先出场,资料先出场。 前面几章我们讲了 Loader、Splitter、Embedding、VectorStore。
PyTorch 到底是什么?为什么它能成为深度学习主流框架
很多人学 PyTorch,一上来就背 API。结果代码能跑,报错不会查,性能不会调,模型为什么能训练也说不清。 这一章先解决一个问题:PyTorch 不是“一个深度学习库”,它是一整套把数据、模型、梯度、GPU 和工程训练串起来的系统。 一
Vector Store:FAISS、Chroma、Milvus、Qdrant、ES 怎么选?
1、Vector Store 不是普通数据库 普通数据库更擅长精确匹配。你查订单号,它能准。你查用户 ID,它也能准。 但 RAG 场景不是这么问的。用户不会说“我要第 32 页第 5 段”。用户只会问:“合同里违约责任怎么写?”、“三安光
阅读补充
一句话看懂
学 PyTorch,第一个门槛不是模型。是环境。环境装错,代码还没开始跑,报错已经堆满屏。 这一章只讲一件事:把 PyT
事件背景
这篇内容围绕“环境安装与开发姿势”展开,热闻岛基于公开信息整理事件背景、主要进展与可继续关注的方向。
事件时间线
发布
相关信息进入公开传播
更新
热闻岛对内容进行整理与补充。
看点
- · 环境安装与开发姿势的最新进展是什么
- · 相关信息对用户或行业会带来哪些影响
- · 后续是否会有新的回应或处理结果
后续关注
- · 后续官方回应或权威通报
- · 相关主体的进一步说明
- · 事件对普通用户和平台传播的持续影响
免责声明:本文仅代表作者观点,不构成投资建议、法律建议、医疗建议。财经类内容尤其需要注意风险;爆料类信息请以权威通报为准。
评论 (0)
登录后即可发表评论
去登录