Pytorch安装与hello world

不自己搓轮子了,还是调包好(

  • 记录 Pytorch 的安装,踩了点坑
  • 以及 CUDA
  • 和 Python 的安装

起因

主要是打 MCM 需要学点 ML 和数据分析,一直知道 Pytorch 和 Tensorflow,但是一直没有去学,正好这个机会学习一下,之前 Tensorflow 装出 PTSD 了,还是换 modern 一点的 pytorch 吧。

安装 Python

首先是根据 Pytorch 官网上面给出的说明

Currently, PyTorch on Windows only supports Python 3.9-3.12; Python 2.x is not supported.

于是装了 3.12.7 的 py,py 的安装很简单,没什么特别的,记得挑版本就行,python-3.12.7

安装 CUDA

  • 现在的 Nvidia 驱动会自动带上 CUDA 的 dll,但是缺少nvcc等工具,所以还是得手动装一下

在 Pytorch 官网上,Stable 支持的 CUDA 是 11.8 12.1 12.4,但是我的显卡驱动比较新已经有 12.6 的 CUDA 了,一开始我尝试装 12.4 版本的 CUDA 没有成功,也懒得先删了 12.6 版本再装 12.4 于是就装了 12.6 的 CUDA,经过测试并没有问题,可能是小版本区别不大,向下兼容了。

cuda-download这里下 CUDA,win11 这边可以参考下图选择下载项

cuda-download

这里的 Installer Type 的 local 和 network 应该指从网络加载和本地解压,Nvidia 下载服务器国内还快的,可以选择 network,安装时下载,这样安装包小一点,但是安装可能会慢一点。

具体的安装套路可以看这上面的cuda-installation-guide-microsoft-windows
其实装的时侯也直接默认精简安装就行,说是精简安装,其实是全都安装。(完全不精简

安装 Pytorch

进入正题。
根据官方的安装指南pytorch-locally-install,选完平台和包管理复制命令直接安装就行,我这边选择的是通过 pip

install-options

但是实际上,由于国内访问 pytorch 的网站很慢,这个下载 whl 下载的时间非常长,不能接受,于是想到了通过 Tsinghua 的 Pypi 镜像

1
2
pip3 config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
pip3 install torch torchvision torchaudio

不过很不幸,这样装是没有用滴,因为 Tsinghua 好像只有 CPU 版本,如果你要使用 CUDA,还是得从官方下。

所以怎么解决呢,希腊奶,尝试使用更高级的网络技术,通过边缘计算加速下载

pip-install

验证 Pytorch 安装

  • 根据官方给的方法
input
1
2
3
import torch
x = torch.rand(5, 3)
print(x)

执行此代码可以获得一个 5 * 3 的随机初始化 Tensor, 类似下面的输出

output
1
2
3
4
5
tensor([[0.3380, 0.3845, 0.3217],
[0.8337, 0.9050, 0.2650],
[0.2979, 0.7141, 0.9069],
[0.1449, 0.1132, 0.1375],
[0.4675, 0.3947, 0.1426]])

验证 Pytorch 的 CUDA 调用

  • 根据官方给的方法
input
1
2
import torch
torch.cuda.is_available()

随后你应该得到True的输出,表示 CUDA 可被 Pytorch 调用

跑个 hello world

  • 可以参考官方的 tutorial 也可以像我这个一样,撸一个简单的线性回归(Linear Regression)模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import torch.nn as nn
import torch
import numpy as np

x = np.array([i for i in range(11)], dtype=np.float32).reshape(-1, 1)
y = np.array([2 * i + 1 for i in range(11)], dtype=np.float32).reshape(-1, 1)
print(x.shape, y.shape)


class DNN(nn.Module):
def __init__(self, input_dim, output_dim):
super(DNN, self).__init__()
self.linear = nn.Linear(input_dim, output_dim)

def forward(self, x):
return self.linear(x)


device = (
"cuda"
if torch.cuda.is_available()
else "mps" if torch.backends.mps.is_available() else "cpu"
)
print(f"Using {device} device")
dnn = DNN(1, 1)
dnn.to(device)
print(dnn)
lr = 0.05
epochs = int(1e4)
optimizer = torch.optim.Adam(dnn.parameters(), lr=lr)
criterion = nn.MSELoss()
inputs = torch.from_numpy(x).to(device)
labels = torch.from_numpy(y).to(device)
for epoch in range(epochs):
optimizer.zero_grad()
outputs = dnn(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
if epoch % 1000 == 0:
print(f"epoch: {epoch} loss: {loss.item()}")
print(
f"test: x = 1, y = 2 * x + 1 = 3, predict value: {dnn(torch.from_numpy(np.array([1], dtype=np.float32).reshape(-1,1)).to(device)).item()}"
)