当前位置:   article > 正文

【PyTorch】使用 Mac GPUs (Apple silicon GPUs) 训练模型_macbookpro pytorch gpu测试

macbookpro pytorch gpu测试

根据 PyTorch 官网的文章 Introducing Accelerated PyTorch Training on Mac1 ,从 PyTorch v1.12 release 开始支持使用 Apple silicon GPUs 加速训练模型。所以要在 Mac 上加速需要1.12或更新的版本。

文章中还给出了 M1 Ultra 在模型训练/推理时相比仅使用 CPU 训练的速度差距:

我的 Mac 芯片是 Apple M2 Pro,GPU 性能比 M1 Ultra 差一大截,但可能还是要比 CPU 快一些的。

M1 Ultra 的浮点运算速度大约是 M2 Pro 的 3 倍。

作为对比(数据来源:www.techpowerup.com):

  • RTX 3060 12GB FP16/FP32: 12.74 TFLOPS FP64: 199.0 GFLOPS
  • RTX 3090 24GB FP16/FP32: 35.58 TFLOPS FP64: 556.0 GFLOPS
  • RTX 4080 16GB FP16/FP32: 48.74 TFLOPS FP64: 761.5 GFLOPS
  • RTX 4090 24GB FP16/FP32: 82.58 TFLOPS FP64: 1,290 GFLOPS

芯片:Apple M2 Pro
软件:conda 22.11.1, Python 3.9.6, PyTorch Version: 2.1.0.dev20230328

先查看一下 torch 能不能调用到 Apple silicon GPUs:

>>> import torch
>>> torch.backends.mps.is_available()
True
>>> torch.backends.mps.is_built()
True
  • 1
  • 2
  • 3
  • 4
  • 5

可以在创建 tensor 时使用 device 参数来设置数据保存到 mps 中:

>>> import torch
>>> device = torch.device("mps")
>>> a = torch.randn((), device=device, dtype=torch.float)
>>> a
tensor(0.2838, device='mps:0')
  • 1
  • 2
  • 3
  • 4
  • 5

也可以使用 .to(device) 把 CPU 上运算的 tensor 移动到 GPU 上:

>>> a = torch.tensor([1,2])
>>> a
tensor([1, 2])
>>> a.to(device)
tensor([1, 2], device='mps:0')
  • 1
  • 2
  • 3
  • 4
  • 5

运行一个完整的示例2,如果没有遇到错误,就说明可以正常使用了:

import torch
import math

dtype = torch.float
device = torch.device("mps")

# Create random input and output data
x = torch.linspace(-math.pi, math.pi, 2000, device=device, dtype=dtype)
y = torch.sin(x)

# Randomly initialize weights
a = torch.randn((), device=device, dtype=dtype)
b = torch.randn((), device=device, dtype=dtype)
c = torch.randn((), device=device, dtype=dtype)
d = torch.randn((), device=device, dtype=dtype)

learning_rate = 1e-6
for t in range(2000):
    # Forward pass: compute predicted y
    y_pred = a + b * x + c * x ** 2 + d * x ** 3

    # Compute and print loss
    loss = (y_pred - y).pow(2).sum().item()
    if t % 100 == 99:
        print(t, loss)

    # Backprop to compute gradients of a, b, c, d with respect to loss
    grad_y_pred = 2.0 * (y_pred - y)
    grad_a = grad_y_pred.sum()
    grad_b = (grad_y_pred * x).sum()
    grad_c = (grad_y_pred * x ** 2).sum()
    grad_d = (grad_y_pred * x ** 3).sum()

    # Update weights using gradient descent
    a -= learning_rate * grad_a
    b -= learning_rate * grad_b
    c -= learning_rate * grad_c
    d -= learning_rate * grad_d


print(f'Result: y = {a.item()} + {b.item()} x + {c.item()} x^2 + {d.item()} x^3')
  • 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

  1. https://pytorch.org/blog/introducing-accelerated-pytorch-training-on-mac/ ↩︎

  2. https://towardsdatascience.com/installing-pytorch-on-apple-m1-chip-with-gpu-acceleration-3351dc44d67c ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/394553
推荐阅读
相关标签
  

闽ICP备14008679号