今天逛 pytorch 帖子的时候发现
有个哥们问: 为啥 intel 的 mac 上不用显卡加速?
后面回答:intel 一直可以跟 m 系列芯片一样啊 能使用mps
进行加速 mps
是基于 mac 的 metal 开发的
Metal Performance Shaders 。就是不知道为什么一直没人说
随后就随便搓了个 torch 模型 测试能力 (代码在最后)
不是很严谨的测试 大家看个乐呵
实验结果:
推理设备 | 简单的 tqdm 统计时间 |
---|---|
5600XT----(mps) | [01:04<00:00, 1.54it/s] |
12600k----(cpu) | [00:45<00:00, 2.20it/s] |
M1---------(mps) | [00:20<00:00, 4.80it/s] |
M1---------(cpu) | [01:23<00:00, 1.20it/s] |
3090-------(cuda) | [00:08<00:00, 11.48it/s] |
macbook air 的 M1 什么功耗 能有 3090 三分之一的速度
5600XT 又是什么功耗 跟 M1 的 cpu 一个水平😂
所以根据这个不是很严谨的实验能否说 之前的 metal 真的太烂了?如有不妥 请斧正
确实不是特别懂就是看到 5600xt 这个速度也太拉垮了 所以来问问大家🙏
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from tqdm import tqdm
# 定义 CNN
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 13 * 13, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 13 * 13)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# 随机生成数据
batch_size = 64
channels = 3
height = 64
width = 64
net = SimpleCNN()
# 在这里选择推理 类型
device = torch.device("cpu")
net = net.to(device)
inputs = torch.randn(batch_size, channels, height, width).to(device)
labels = torch.randint(0, 10, (batch_size,)).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 训练
for epoch in tqdm(range(100)):
running_loss = 0.0
for i in range(20):
# 清零梯度缓冲区
optimizer.zero_grad()
# 前向传播,反向传播,优化
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
print('Finished Training')
1
tianshilei1992 2023-10-18 23:49:52 +08:00 via iPhone
Metal 就是烂,特别是拿来做 computation…如果仔细研究过 AIR 的话,就会发现这玩意儿根本就不是为 computation 设计的…
|
2
ZekeChin OP @tianshilei1992 是这样嘛 我其实是想说 metal 再 AMD 显卡上和 M1 上的差别的
|
3
tianshilei1992 2023-10-19 12:21:25 +08:00 via iPhone
@ZekeChin 哦哦哦 Apple Neural Engine 能跑很多 ooerators 了
|
4
neopenx 2023-10-19 13:35:16 +08:00
metal 是兼容 amd gpu ,但是 mps 在 kernel 上是单独实现的。通过 assert 可以发现 M1 走的是 A14 的 kernel 。也就也是说 apple 的工程师大概率就是摆烂写个巨慢的 kernel 给 AMD gpu ,尤其是卷积这种吃架构优化的,只要保证计算结果的正确性就好了。
|