Mac Apple Silicon M1/M2 homebrew miniforge conda pytorch yolov5深度学习环境搭建并简单测试MPS GPU加速

Posted 喵喵扫描仪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mac Apple Silicon M1/M2 homebrew miniforge conda pytorch yolov5深度学习环境搭建并简单测试MPS GPU加速相关的知识,希望对你有一定的参考价值。

目录

开始安装

笔者使用的是一台M2版本的Macbook Air,虽然苹果作为深度学习的训练机不太合适,但是由于macbook作为打字机实在是无可挑剔,所以使用macbook调试一下pytorch的代码再放到集群上训练或者直接在mac上调试运行代码都是不错的体验,本文以在mac上直接调试yolov5为目标,大概记录一下步骤。

零,获取代理

这一步就是大家八仙过海各显神通的时候了😄
或者直接使用国内源安装,可以参考Homebrew国内如何自动安装(国内地址)(Mac & Linux)
以下过程都是基于有代理的情况下的安装过程,基本无痛

一,配置代理

总之开启代理后,除了浏览器可以走代理访问之外,还需要配置zsh和git走代理,否则homebrew的安装会比较痛苦。

配置zsh走代理

#首先创建~/.zshrc
vim ~/.zshrc

加入本地代理的端口地址,例如127.0.0.1:8080

function onproxy() 
    export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
    export http_proxy="http://127.0.0.1:8080"
    export https_proxy=$http_proxy
    export all_proxy=socks5://127.0.0.1:8080
    echo -e "\\033[32mproxy on!\\033[0m"


function offproxy()
    unset http_proxy
    unset https_proxy
    unset all_proxy
    echo -e "\\033[31mproxy off!\\033[0m"

然后source一下

source ~/.zshrc

运行一下onproxy开启代理(后面也要记得重启terminal的时候运行开一下,或者写到.zshrc里)

onproxy

测试一下是不是成功

curl -vv https://www.google.com

如果返回报文中有status 200 OK等字样就说明现在配置成功,但是ping依然是不能正常使用代理的,所以即便配置了代理,ping google还是不行的。

配置git走代理

将git也配置一下走代理:

git config --global http.proxy http://127.0.0.1:8080

完工!

二,安装homebrew

安装homebrew十分简单

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

执行完成后会提示你让你把homebrew添加到path中,按图中操作就可以

(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/xxx/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

然后就可以愉快的使用brew install了,就和ubuntu的apt install一样啦!

三,安装miniforge

有了homebrew安装miniforge就简单了

brew install miniforge

完成!

四,创建conda环境

首先初始化conda环境

conda init zsh

关闭terminal重新打开就能看到(base)环境已经启用

然后就是创建pytorch的conda环境

conda create -n torch python=3.8

创建完运行

conda activate torch

就可以开始使用专属的conda虚拟环境了。

五,安装pytorch

直接按照官网的安装,已经包含了MPS加速(MPS:Metal Performance Shaders)

# MPS acceleration is available on MacOS 12.3+
pip3 install torch torchvision torchaudio

完成!

六,运行yolov5

首先clone源码,安装依赖

git clone https://github.com/ultralytics/yolov5.git
pip install -r requirements.txt 

等待安装完毕

现在就可以开始测试检测图片了
我们在yolov5文件夹里创建一个imgs文件夹,里面放一张1.jpg的测试图像

如下图所示


然后运行

python detect.py --weights yolov5s.pt --source 'imgs/1.jpg'

过程中会自动下载yolov5s.pt的权重

然后将检测结果保存到yolov5/runs/detect/exp中

打开1.jpg看一下

检测成功,yolov5在MacBook上就跑起来了!环境初步搭建完成!

六,测试Apple Silicon的MPS GPU加速

测试yolov5的mps加速

由于pytorch可以跑cpu,所以我们还不知道苹果的mps gpu加速能否正常起作用,那我们来测试一下。

打开vscode,创建testyolov5mps.py,环境选择我们刚刚创建的conda环境torch,编辑一下

import torch

print(torch.backends.mps.is_available)
print(torch.backends.mps.is_built)

device = torch.device("mps" if torch.backends.mps.is_available else"cpu")

print(device)
exit()

运行一下

(torch) xx@xxx-MacBook-Air testyolov5 % python testyolov5mps.py 
<functools._lru_cache_wrapper object at 0x114d0f0d0>
<function is_built at 0x114d06ee0>
mps
(torch) xx@xxx-MacBook-Air testyolov5 % 

都有输出结果,并且device为mps,mps加速有效,我们接下来用yolov5的官方示例简单测试一下效果

import torch

print(torch.backends.mps.is_available)
print(torch.backends.mps.is_built)

device = torch.device("mps" if torch.backends.mps.is_available else"cpu")

print(device)
# exit()

# Model
model = torch.hub.load("ultralytics/yolov5", "yolov5s")  # or yolov5n - yolov5x6, custom
model.to(device)
# exit()
# Images
img = "https://ultralytics.com/images/zidane.jpg"  # or file, Path, PIL, OpenCV, numpy, list

# Inference
results = model(img)

# Results
results.print()  # or .show(), .save(), .crop(), .pandas(), etc.

结果发现报错了,如下

(torch) xx@xxx-MacBook-Air testyolov5 % python testyolov5mps.py
<functools._lru_cache_wrapper object at 0x140872160>
<function is_built at 0x140869f70>
mps
Using cache found in /Users/xx/.cache/torch/hub/ultralytics_yolov5_master
YOLOv5 🚀 2023-2-27 Python-3.8.16 torch-1.13.1 CPU

Fusing layers... 
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients
Adding AutoShape... 
Traceback (most recent call last):
  File "testyolov5mps.py", line 23, in <module>
    results.print()  # or .show(), .save(), .crop(), .pandas(), etc.
  File "/Users/xx/.cache/torch/hub/ultralytics_yolov5_master/models/common.py", line 825, in print
    LOGGER.info(self.__str__())
  File "/Users/xx/.cache/torch/hub/ultralytics_yolov5_master/models/common.py", line 831, in __str__
    return self._run(pprint=True)  # print results
  File "/Users/xx/.cache/torch/hub/ultralytics_yolov5_master/models/common.py", line 745, in _run
    for c in pred[:, -1].unique():
  File "/opt/homebrew/Caskroom/miniforge/base/envs/torch/lib/python3.8/site-packages/torch/_tensor.py", line 806, in unique
    return torch.unique(
  File "/opt/homebrew/Caskroom/miniforge/base/envs/torch/lib/python3.8/site-packages/torch/_jit_internal.py", line 485, in fn
    return if_false(*args, **kwargs)
  File "/opt/homebrew/Caskroom/miniforge/base/envs/torch/lib/python3.8/site-packages/torch/_jit_internal.py", line 485, in fn
    return if_false(*args, **kwargs)
  File "/opt/homebrew/Caskroom/miniforge/base/envs/torch/lib/python3.8/site-packages/torch/functional.py", line 877, in _return_output
    output, _, _ = _unique_impl(input, sorted, return_inverse, return_counts, dim)
  File "/opt/homebrew/Caskroom/miniforge/base/envs/torch/lib/python3.8/site-packages/torch/functional.py", line 791, in _unique_impl
    output, inverse_indices, counts = torch._unique2(
NotImplementedError: The operator 'aten::_unique2' is not currently implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS.
(torch) xx@xxx-MacBook-Air testyolov5 % 

发现模型中的aten::_unique2操作符没有mps实现,所以只能用fallback模式再试一下

PYTORCH_ENABLE_MPS_FALLBACK=1 python testyolov5mps.py

成功运行

(torch) xx@xxx-MacBook-Air testyolov5 % PYTORCH_ENABLE_MPS_FALLBACK=1 python testyolov5mps.py 
<functools._lru_cache_wrapper object at 0x10cb72160>
<function is_built at 0x10cb69f70>
mps
Using cache found in /Users/xx/.cache/torch/hub/ultralytics_yolov5_master
YOLOv5 🚀 2023-2-27 Python-3.8.16 torch-1.13.1 CPU

Fusing layers... 
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients
Adding AutoShape... 
image 1/1: 900x1200 8 persons, 2 sports balls
Speed: 58.2ms pre-process, 228.4ms inference, 24.2ms NMS per image at shape (1, 3, 480, 640)

可以看到推理时间228.4ms

如果我们注释掉model.to(device),使用cpu模式来跑

(torch) xx@xxx-MacBook-Air testyolov5 % python testyolov5mps.py 
<functools._lru_cache_wrapper object at 0x1248f2280>
<function is_built at 0x1248f20d0>
mps
Using cache found in /Users/xx/.cache/torch/hub/ultralytics_yolov5_master
YOLOv5 🚀 2023-2-27 Python-3.8.16 torch-1.13.1 CPU

Fusing layers... 
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients
Adding AutoShape... 
image 1/1: 900x1200 8 persons, 2 sports balls
Speed: 24.1ms pre-process, 82.8ms inference, 0.7ms NMS per image at shape (1, 3, 480, 640)

仅用了82.8ms就完成了推理,这边先不下结论,还需要再研究一下,不过可以看到mac的gpu加速还不是很完善。

测试resnet50的mps加速

既然yolov5网络太复杂有不支持mps的算子,那我们试试简单的resnet50

import torch
from PIL import Image
import torchvision.transforms as transforms
import numpy as np
import json
import requests
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
import time
# %matplotlib inline

# print(torch.backends.mps.is_available)
# print(torch.backends.mps.is_built)

device = torch.device("mps" if torch.backends.mps.is_available else"cpu")
#device = torch.device("cpu")
print(device)
# exit()

resnet50 = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_resnet50', pretrained=True)
utils = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_convnets_processing_utils')

resnet50.eval().to(device)

uris = ["/Users/xx/workspace/yolov5/imgs/1.jpg" for x in range(1024)]

batch = torch.cat(
    [utils.prepare_input_from_uri(uri) for uri in uris]
).to(device)

with torch.no_grad():
    start = time.time()
    output = resnet50(batch)
    end = time.time()
    # output = torch.nn.functional.softmax(output, dim=1)
    print("using  total time:s".format(device,end-start))

# results = utils.pick_n_best(predictions=output, n=5)
# print(results)

# for uri, result in zip(uris, results):
#     img = Image.open(requests.get(uri, stream=True).raw)
#     img = Image.open(uri)
#     img.thumbnail((256,256), Image.ANTIALIAS)
#     plt.imshow(img)
#     plt.show()
#     print(result)

分别用cpu和mps跑1024张图像,计算推理时间
结果

(torch) xx@xxx-MacBook-Air testyolov5 % python testresnetmps.py
mps
using mps total time:8.64146113395691s
(torch) xx@xxx-MacBook-Air testyolov5 % python testresnetmps.py
cpu
using cpu total time:85.01676988601685s

我们可以看到,推理1024张图使用mps 8.6秒,使用cpu花了85秒,快了10倍,确实有效。

对比测试1080ti,3700x

我们同样的代码用amd 3700x的纯cpu模式跑一下:

cpu
using cpu total time:41.04833006858826s

用cuda在1080ti上再跑一下,由于显存不够1024张分成两个batch来跑:

cuda
batch0infer
batch1infer
using cuda total time:2.7815260887145996s

3700x用时41秒,使用cuda只需要2.78秒

总结

devicedatamodel用时(秒)
Apple M2(8+10) (CPU)1024张 1 batchresnet50 cls85.02
Apple M2(8+10) (MPS)1024张 1 batchresnet50 cls8.64
AMD 3700X + 1080Ti (CPU)1024张 1 batchresnet50 cls41.05
AMD 3700X + 1080Ti (CUDA)1024张 2 batchresnet50 cls2.78

测试不是很完善,但是也能看个大概,5w战350w能有这个水平其实还可以。

Android Emulator 在 M1 mac/Apple Silicon 上卡住了加载屏幕

【中文标题】Android Emulator 在 M1 mac/Apple Silicon 上卡住了加载屏幕【英文标题】:Android Emulator stuck loading screen on M1 mac/ Apple Silicon 【发布时间】:2021-03-01 06:33:06 【问题描述】:

我已经在我的 M1 MacBook air 上下载了 Android Studio,但我无法运行模拟器,它只是给我一个错误。我搜索 Mac 的 Android Studio 要求,它说它需要 mac os 10.10 或更高版本以及至少 2 GB 磁盘空间和 4 GB 内存。谁有这个问题,我该如何解决?

我尝试下载arm image android studio,它卡在模拟器的加载屏幕上。

【问题讨论】:

解决了吗? 不行,我仍然无法在android studio上运行模拟器,我只能编码但不能运行 我在 Google 的问题跟踪器中找不到任何关于添加对此的支持的问题,所以我提交了一个。请给它加星标,我也很想看到这种支持。 issuetracker.google.com/issues/173766929 @YaSi 在 m1 Mac 上运行 Android Studio 没有遇到任何问题,我可以下载并运行 android studio,直到现在还没有强制停止应用程序,但遗憾的是我只能编码无法运行模拟器: (Visual Studio 也是一样,下载和运行都很流畅 @YaSi 打开应用也很快,只是第一次使用需要较长时间才能打开,因为应用需要使用Rosetta 2来转换 【参考方案1】:

截至目前(2020 年 11 月 19 日),任何虚拟化工具都不适用于新的 Apple M1 mac。因此,像 docker、模拟器等。不幸的是,我们可能需要等待一段时间才能完全支持。

【讨论】:

IDK 为什么这被否决了这是正确的答案... Docker 最近发布了它的 M1 版本。 docs.docker.com/docker-for-mac/apple-m1 这是错误的答案,模拟器从 2020 年 12 月 7 日开始工作 ***.com/a/65176907/1079990【参考方案2】:

好消息!

2021 年 7 月 28 日编辑 ? ?

Apple 芯片支持

Android Studio 北极狐 (2020.3.1) 有一个 arm64 发布版本可用 你可以在这里下载它https://developer.android.com/studio/archive

NDK遇到Unknown host CPU architecture: arm64可以解决here

测试结束!谢谢

2021 年 3 月编辑

我可以确认,此模拟器预览版可以正常运行 https://androidstudio.googleblog.com/2020/12/android-emulator-apple-silicon-preview.html

在博客中有一个指向private repo(2021 年 1 月 4 日)的链接。他们将 repo 移到了谷歌,在那里你可以找到 V3 https://github.com/google/android-emulator-m1-preview/releases

从 v3 开始,即使音频输出也可以工作(没有音频输入)

2021 年 2 月 4 日编辑

现在音频输入和输出可以正常工作https://github.com/741g/android-emulator-m1-preview/issues/10#issuecomment-773532762

2021 年 3 月编辑

您可以简单地使用其中一个,它开箱即用

好的,它有一些限制,但它可以工作

【讨论】:

你也在 M1 上运行这个吗? 当我理解正确的问题时:当然,它来自我的M1 请注意:repo 已移动,我更新了我的帖子 @hannesach,尝试测试版,但它仍然非常滞后,需要很长时间才能打开模拟器,希望他们能解决这个问题。 我在 M1 上的模拟器启动速度非常快。至少比我的 x86 旧 mac @ryantay 更快【参考方案3】:

在 8 月的发行说明中,您可以在 Arm 主机模拟器部分看到一个条目,其中他们说对 M1 的支持正在进行中。 检查以下链接: https://developer.android.com/studio/releases/emulator#emulator_for_arm64_hosts

【讨论】:

【参考方案4】:

截至今天,Android 模拟器已启动并正在开发 Apple Silicon,这是来自 googler 的工作演示

来源:https://twitter.com/GoogleLfy/status/1332474914398322689 以及这里的已知问题:https://androidstudio.googleblog.com/2020/12/android-emulator-apple-silicon-preview.html

我们可以期待在 2020 年底前稳定发布 这是关于同一个人的对话https://www.reddit.com/user/lfy_google/

【讨论】:

【参考方案5】:

Android studio 还没有发布 M1 macs 的修改版本,你正在运行的版本,最初是为 intel 芯片制作的,通过 rosetta2 运行。而且rosetta不支持虚拟化,所以你不能运行模拟器,但你可以做所有其他有小错误的编码工作,为了测试你的代码,你可以使用物理android设备,它工作得很好......请让我知道如果进一步存在问题...

【讨论】:

有android studio的beta预览版【参考方案6】:

这是由 Android 开发者 https://github.com/google/android-emulator-m1-preview 完成的工作模拟器 它就像一个魅力

【讨论】:

【参考方案7】:

我听说由于苹果芯片的 arm 架构,模拟器无法工作。使用电话进行调试可能是唯一的选择。我还听说 android studio 正在为 M1 进行更新。

【讨论】:

嗯,我搜索了 android 开发者网站,他们从不谈论对 m1 MacBook 的支持,我给谷歌发电子邮件但他们都没有回复我,客户支持如此糟糕,真的希望有如何解决的文档或支持m1 macbook 鉴于Arm64 Mac机刚刚发布,谷歌可能需要一段时间才能使其软件完全兼容新平台 Ic,但网站上应该有公告供开发者查看 在哪里可以找到关于 arm mac 上的 android studio 的新闻? @ryantay 在 Reddit 上,其中一位开发人员回复了一篇帖子,称他们知道这个问题,并且正在努力进行更新。【参考方案8】:

对于其他 ARM 设备,应该是指令集问题,这种情况你可以去你的 AS 的 AVD 管理器,在创建新的虚拟设备时,一定要下载带有arm64-v8a ABI的系统镜像,如下图所示。

对于 Mac M1 芯片,这些 arm64 映像无法解决问题,目前最好的方法是等待 Google 发布兼容映像。

【讨论】:

知道为什么这些没有出现在 Android Studio 中。我去的时候这个页面是空白的? 在推荐标签下怎么样? 我运行你让我下载的模拟器,模拟器出现了,但一直说要求目标设备上线,无法带我到主页 您可以尝试在 AVD Manager 中右键擦除虚拟设备的数据,然后重新运行项目。还要检查 SDK Manager -> SDK Tools 中的 Android Emulator 框 @PatrickGeng 你真的可以用这个镜像在 M1 机器上运行模拟器,还是你在猜测?【参考方案9】:

这里有 Mac M1 模拟器的初级测试版 github link

【讨论】:

【参考方案10】:

Android 已发布 M1 芯片组的测试版模拟器

请检查此想法以发布测试版

https://androidstudio.googleblog.com/2020/12/android-emulator-apple-silicon-preview.html?m=1

【讨论】:

【参考方案11】:

目前,Android Studio 仅支持 HAXM Intel 版本(与 ARM 处理器不兼容)的虚拟化来运行模拟器。但也许在接下来的几周内,他们可能会发布适用于苹果硅处理器的兼容版本。到那时,唯一的选择就是使用物理设备。

【讨论】:

【参考方案12】:

在下一个文档中有一个 Android Emulator Apple Silicon Preview https://androidstudio.googleblog.com/2020/12/android-emulator-apple-silicon-preview.html

【讨论】:

【参考方案13】:

android studio 对在 Apple Silicon 上运行的模拟器进行了粗略的初步预览。更多详细信息可在下面的此链接中找到

https://androidstudio.googleblog.com/2020/12/android-emulator-apple-silicon-preview.html

您也可以从 GitHub 下载 DMG 文件: https://github.com/741g/android-emulator-m1-preview

【讨论】:

【参考方案14】:

这是因为新的 M1 芯片在 arm 架构而不是 x86 上运行。 您必须下载其他图像选项卡中可用的 arm 兼容虚拟设备才能运行这些模拟器。

也试试这个:

    在 AVD Manager 中右键单击虚拟设备擦除数据,然后重新运行项目。 在 SDK 管理器 -> SDK 工具中选中 Android Emulator 框

【讨论】:

是的,我下载了手臂图像,但从上面的屏幕截图中可以看出它只是停留在加载屏幕上【参考方案15】:

从以下位置下载 android-emulator-m1-preview.dmg https://github.com/741g/android-emulator-m1-preview/releases

【讨论】:

以上是关于Mac Apple Silicon M1/M2 homebrew miniforge conda pytorch yolov5深度学习环境搭建并简单测试MPS GPU加速的主要内容,如果未能解决你的问题,请参考以下文章

在 Apple Silicon M1 Mac 上安装 Cryptography

Android Emulator 在 M1 mac/Apple Silicon 上卡住了加载屏幕

在具有 M1 芯片(基于 ARM 的 Apple Silicon)的 Mac 上安装较早版本的 Python(3.8 之前)失败

工程化系列支持Apple silicon的macOS平台工程编译环境搭建

从命令行检测 Apple Silicon

苹果M1/M2 Mac正式支持运行Win11