M1 Mac 安装 OpenCV 和 TensorFlow

今天(2022年3月25日)尝试在 M1 的 Mac 上安装了 OpenCV 和 TensorFlow,记录下过程。

安装顺序

安装过程可以分为以下过程:

  • 安装 Homebrew: 推荐;
  • 安装 conda: 必须;
  • 安装 OpenCV
  • 安装 TensorFlow

安装过程

安装 Homebrew

参考Homebrew国内如何自动安装(国内地址),在 zsh 中输入如下脚本:

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

接下来,推荐修改 Homebrew 的安装源,参考Mac 下 brew 切换为国内源,可以使用中科大或清华的源。

安装 conda

使用 Homebrow 安装 conda:

brew install miniforge

安装结束时会询问是否要出实话 zsh,选择 yes。
接下来创建并激活虚拟环境,接下来的工作都将在该环境下:

conda create --name cv python=3.9.10
conda activate cv

顺便说一句,要退出虚拟环境,运行 conda deactivate 即可。

如果之前没有修改 brew 源或由于某些网络原因,导致使用 brew 安装时造成超时等错误发生的,可以先把 sh 安装文件下载下来。下载文件可以从github上下载,注意当前文件名是 Miniforge3-4.12.0-0-MacOSX-arm64.sh。下载时可以使用带有断点续传功能的下载工具如 Neat Download Manager。 下载后执行:

brew install path_to_the_file

安装 OpenCV

执行:

conda install -c conda-forge opencv

测试下是否安装成功:

>>> import cv2 as cv
>>> print(cv.__version__)
4.5.5
>>> 

安装 TensorFlow

Apple 提供了官方教程Getting Started with tensorflow-metal PluggableDevice

conda install -c apple tensorflow-deps //安装依赖
python -m pip install tensorflow-macos 
python -m pip install tensorflow-metal

也可直接 pip install 因为通常 Mac 上环境变量里已有python。
如果 pip 安装时超时卡住失败的,也可以使用国内的镜像源或者使用 i 参数,如:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-macos 

不过说实话,我尝试执行上述命令后仍未成功安装。我依然是到镜像源网站(如这里)上把 whl 文件下载后再进行安装的。
接下来试一下是否安装成功:

% python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

Metal device set to: Apple M1

systemMemory: 16.00 GB
maxCacheSize: 5.33 GB

2022-03-25 22:12:55.809626: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:305] Could not identify NUMA node of platform GPU ID 0, defaulting to 0. Your kernel may not have been built with NUMA support.
2022-03-25 22:12:55.809811: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:271] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 0 MB memory) -> physical PluggableDevice (device: 0, name: METAL, pci bus id: <undefined>)
tf.Tensor(-265.03717, shape=(), dtype=float32)

结果返回了 tensor,表明安装成功!