不自己搓轮子了,还是调包好(
记录 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 torchx = 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 torchtorch.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 nnimport torchimport numpy as npx = 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()} " )