V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ZekeChin
V2EX  ›  macOS

也许是一个 M 芯片上 3A 大作的原因

  •  
  •   ZekeChin · 2023-10-18 23:07:08 +08:00 · 2511 次点击
    这是一个创建于 395 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因

    今天逛 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')
    
    5 条回复    2023-10-19 18:40:09 +08:00
    tianshilei1992
        1
    tianshilei1992  
       2023-10-18 23:49:52 +08:00 via iPhone
    Metal 就是烂,特别是拿来做 computation…如果仔细研究过 AIR 的话,就会发现这玩意儿根本就不是为 computation 设计的…
    ZekeChin
        2
    ZekeChin  
    OP
       2023-10-19 09:04:13 +08:00
    @tianshilei1992 是这样嘛 我其实是想说 metal 再 AMD 显卡上和 M1 上的差别的
    tianshilei1992
        3
    tianshilei1992  
       2023-10-19 12:21:25 +08:00 via iPhone
    @ZekeChin 哦哦哦 Apple Neural Engine 能跑很多 ooerators 了
    neopenx
        4
    neopenx  
       2023-10-19 13:35:16 +08:00
    metal 是兼容 amd gpu ,但是 mps 在 kernel 上是单独实现的。通过 assert 可以发现 M1 走的是 A14 的 kernel 。也就也是说 apple 的工程师大概率就是摆烂写个巨慢的 kernel 给 AMD gpu ,尤其是卷积这种吃架构优化的,只要保证计算结果的正确性就好了。
    ZekeChin
        5
    ZekeChin  
    OP
       2023-10-19 18:40:09 +08:00
    @neopenx 喔~ 扫嘎原来是这个样子
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2214 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:33 · PVG 09:33 · LAX 17:33 · JFK 20:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.