PyTorch-2.x入门教程:在Jupyter中运行第一个模型
1. 为什么选这个镜像?开箱即用的深度学习起点
你是不是也经历过这样的场景:想跑一个PyTorch模型,结果卡在环境配置上——装CUDA版本不对、pip源太慢、Jupyter打不开、matplotlib报错……折腾两小时,代码还没写一行。
这个叫PyTorch-2.x-Universal-Dev-v1.0的镜像,就是为解决这些问题而生的。它不是从零开始的手动搭建环境,而是基于官方PyTorch底包直接构建的“成品开发舱”:Python 3.10+、CUDA 11.8/12.1双支持(RTX 30/40系、A800/H800全兼容)、预装Pandas/Numpy/Matplotlib/JupyterLab等全套工具链,连Shell都配好了语法高亮和常用别名。
更关键的是——它干净。没有冗余缓存,没有冲突包,没有隐藏的依赖陷阱;阿里云和清华源已默认配置,pip install秒级响应;所有库版本经过实测协同,不会出现“torchvision装不上”或“matplotlib画不出图”的经典崩溃现场。
换句话说:你点开就能写模型,而不是点开先修电脑。
2. 环境验证:三步确认你的GPU真正在工作
别急着写import torch,先花30秒确认硬件和驱动已就绪。很多初学者的“模型不加速”,其实只是GPU根本没被识别。
2.1 终端里敲两行命令,看结果是否“诚实”
打开终端(Terminal),依次执行:
nvidia-smi你应该看到类似这样的输出(关键看右上角的GPU型号和显存使用):
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================================+======================+======================| | 0 NVIDIA RTX 4090 On | 00000000:01:00.0 On | N/A | | 36% 42C P0 127W / 450W | 212MiB / 24576MiB | 0% Default | +-----------------------------------------------------------------------------+再执行:
python -c "import torch; print(torch.cuda.is_available())"如果输出是True,恭喜——你的GPU已被PyTorch成功接管。
如果输出是False,请暂停,检查镜像是否启动时勾选了GPU资源(常见于云平台部署界面),不要往下硬跑CPU版。
小提醒:
torch.cuda.is_available()返回True≠ 模型一定用GPU。后续代码中必须显式调用.to('cuda'),这点新手极易忽略。
2.2 JupyterLab启动与内核确认
在镜像首页或终端中输入:
jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root复制终端输出的带token=的完整URL(形如http://127.0.0.1:8888/lab?token=xxx),粘贴进浏览器。进入后,新建一个Python Notebook。
在第一个cell里输入并运行:
import torch print("PyTorch版本:", torch.__version__) print("CUDA可用:", torch.cuda.is_available()) if torch.cuda.is_available(): print("当前设备:", torch.cuda.get_device_name(0))你会看到类似输出:
PyTorch版本: 2.3.0+cu121 CUDA可用: True 当前设备: NVIDIA RTX 4090这说明:环境、GPU、Jupyter三者已打通。你可以放心进入下一环节。
3. 写第一个模型:从随机数据到训练完成,不到20行
我们不从MNIST开始,也不加载预训练模型——就用纯随机生成的数据,搭一个最简但完整的训练流程:定义网络、准备数据、前向传播、计算损失、反向传播、更新参数。目的不是做任务,而是看清PyTorch 2.x的“心跳节奏”。
3.1 构建一个极简全连接网络
在新cell中输入以下代码(已适配PyTorch 2.x语法,无过时写法):
import torch import torch.nn as nn import torch.optim as optim import numpy as np # 定义模型:2层全连接,输入10维 → 隐藏层32维 → 输出1维(回归任务) class SimpleNet(nn.Module): def __init__(self): super().__init__() self.layer1 = nn.Linear(10, 32) self.layer2 = nn.Linear(32, 1) self.relu = nn.ReLU() def forward(self, x): x = self.relu(self.layer1(x)) x = self.layer2(x) return x # 初始化模型和优化器 model = SimpleNet() optimizer = optim.Adam(model.parameters(), lr=0.01) criterion = nn.MSELoss() # 将模型移到GPU(关键!否则全程CPU跑) if torch.cuda.is_available(): model = model.to('cuda') criterion = criterion.to('cuda')注意这三处细节:
nn.ReLU()是函数式API(F.relu)的模块化写法,更清晰;model.to('cuda')必须在定义完模型后立即执行,且损失函数也要.to('cuda');optim.Adam(...)直接传入model.parameters(),无需手动遍历。
3.2 生成模拟数据并训练5个epoch
继续在同一Notebook中新建cell:
# 生成1000个样本,每个样本10维特征 + 1维标签(随机但有线性关系) X = torch.randn(1000, 10) y_true = (X @ torch.randn(10, 1) + torch.randn(1000, 1) * 0.1) # 加点噪声 # 移到GPU if torch.cuda.is_available(): X, y_true = X.to('cuda'), y_true.to('cuda') # 训练循环 for epoch in range(5): optimizer.zero_grad() # 清空梯度(PyTorch 2.x仍需手动) y_pred = model(X) # 前向传播 loss = criterion(y_pred, y_true) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 更新参数 if epoch % 1 == 0: print(f"Epoch {epoch}, Loss: {loss.item():.4f}")运行后,你会看到类似输出:
Epoch 0, Loss: 1.2483 Epoch 1, Loss: 0.8721 Epoch 2, Loss: 0.5937 Epoch 3, Loss: 0.3825 Epoch 4, Loss: 0.2419损失持续下降,说明训练正在生效。这不是“Hello World”,而是真实神经网络的呼吸声。
为什么不用DataLoader?
初学阶段,torch.randn生成的数据足够暴露核心流程。等你熟悉了张量流动、梯度计算、设备迁移,再引入Dataset/DataLoader才不会迷失在封装里。
4. 可视化训练过程:用Matplotlib看懂“学习”发生了什么
光看数字不够直观。我们加3行代码,把每轮的loss画出来——这是你第一次“看见”模型在进步。
4.1 收集loss值并绘图
在训练循环上方,新增一个列表记录loss:
loss_history = []在训练循环内部,print语句前加一行:
loss_history.append(loss.item())训练结束后,插入新cell:
import matplotlib.pyplot as plt plt.style.use('seaborn-v0_8') # 使用预装的美化样式 plt.figure(figsize=(6, 4)) plt.plot(loss_history, 'o-', label='Training Loss', color='#2E86AB') plt.xlabel('Epoch') plt.ylabel('MSE Loss') plt.title('Model Training Progress') plt.grid(True, alpha=0.3) plt.legend() plt.show()你会看到一条清晰下降的曲线。这就是你亲手“教”模型的过程——没有黑箱,只有数学和代码。
小技巧:Jupyter中
plt.show()可省略,但显式写出更稳妥;plt.style.use('seaborn-v0_8')是镜像预装的美化方案,无需额外安装。
5. 模型保存与加载:让成果不随Notebook关闭而消失
训练完的模型,默认只存在内存里。关掉Jupyter,一切归零。下面教你两行代码永久保存:
5.1 保存模型权重(推荐方式)
# 保存模型状态字典(轻量、安全、跨平台) torch.save(model.state_dict(), "simple_net_weights.pth") print(" 模型权重已保存至 simple_net_weights.pth")5.2 加载并验证(新开一个Notebook测试)
# 新建Notebook,执行以下代码 import torch from pathlib import Path # 重新定义相同结构的模型 class SimpleNet(nn.Module): def __init__(self): super().__init__() self.layer1 = nn.Linear(10, 32) self.layer2 = nn.Linear(32, 1) self.relu = nn.ReLU() def forward(self, x): x = self.relu(self.layer1(x)) x = self.layer2(x) return x # 实例化并加载权重 model = SimpleNet() model.load_state_dict(torch.load("simple_net_weights.pth")) model.eval() # 切换到评估模式 # 测试推理 test_input = torch.randn(1, 10) if torch.cuda.is_available(): test_input = test_input.to('cuda') model = model.to('cuda') with torch.no_grad(): pred = model(test_input) print(" 加载成功,预测输出:", pred.item())输出类似加载成功,预测输出: -0.4218,说明模型已真正“记住”了学到的知识。
重要区别:
torch.save(model.state_dict(), ...)保存的是权重,体积小、安全性高;torch.save(model, ...)保存整个模型对象,包含类定义,但可能因路径/版本问题加载失败。初学者务必用前者。
6. 常见问题速查:新手踩坑,这里已有答案
刚上手时,90%的问题都高度重复。我们把高频报错和解法浓缩成一张表,按需查阅:
| 报错信息(部分截取) | 最可能原因 | 一句话解决 |
|---|---|---|
OSError: [Errno 12] Cannot allocate memory | Docker内存不足 | 在云平台设置中将内存调至8GB以上 |
ModuleNotFoundError: No module named 'torch' | 未激活正确Python环境 | 检查Jupyter右上角Kernel是否为Python 3 (ipykernel),非conda env或其他 |
RuntimeError: Expected all tensors to be on the same device | 输入张量和模型不在同一设备 | 所有tensor.to('cuda')和model.to('cuda')必须成对出现 |
AttributeError: 'NoneType' object has no attribute 'grad' | 忘记optimizer.zero_grad() | 在每次loss.backward()前必须清梯度 |
ImportError: libGL.so.1: cannot open shared object file | 缺少图形库(Matplotlib绘图报错) | 镜像已预装opencv-python-headless,确保不调用plt.show(block=True) |
终极建议:遇到报错,先复制完整错误信息,搜索关键词(如
Expected all tensors to be on the same device),99%能在PyTorch官方论坛或Stack Overflow找到匹配答案。别自己猜,高效复用社区智慧。
7. 下一步学什么?从“能跑”到“会调”的三步跃迁
你现在已具备PyTorch 2.x最核心的工程能力:环境验证、GPU调用、模型定义、训练循环、结果可视化、模型持久化。接下来,建议按此路径渐进:
7.1 第一步:用真实数据替换随机数据
- 下载一个CSV文件(比如房价预测数据集),用
pandas.read_csv()加载; - 用
torch.tensor()转成张量,注意dtype=torch.float32; - 替换训练循环中的
X和y_true,观察loss下降是否更“真实”。
7.2 第二步:加入数据加载器(DataLoader)
- 将数据封装为
torch.utils.data.Dataset子类; - 用
DataLoader实现自动分batch、shuffle、多进程加载; - 对比
batch_size=32和batch_size=128对训练速度和loss曲线的影响。
7.3 第三步:尝试一个经典小任务
- 用
torchvision.datasets.MNIST加载手写数字; - 修改网络输出为10维,损失函数换成
nn.CrossEntropyLoss; - 加入准确率计算:
pred.argmax(dim=1) == y_true; - 这是你迈向CV领域的第一块路标。
记住:所有复杂模型,都是由你刚刚写的那20行代码生长出来的。不必追求一步到位,每一次run cell的成功,都在加固你对深度学习底层逻辑的信任。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。