在M1上装tensorflow就是一个大坑,但我还遇到了个连环坑:本来一直用的都正常的服务器环境对一个新程序出了点问题,竟然会因为改一下数据集里单个文件的名字就跑出不一样的结果,折腾了一个多礼拜都无解,结果让组里同学帮忙本地跑了一下发现竟然一切正常,压力直接给到服务器这边。结果我大概查了一下发现M1的mac也可以正常使用tensorflow了就打算也本地装一下然后跑跑看,结果一路踩坑不说,折腾了整整两个小时好不容易装上了,正要去组里汇报一下结果突然意识到我的error一直发生在数据预处理也就是浮点化的那一步,根本没有到tensorflow那一步,如果可以成功把数据浮点化之后只要把浮点化的记录文件传到服务器里的tf环境再训练就行了,所以其实我的本地机器学习环境一直是够用的,所以也就是说折腾了半天装了个M1的tensorflow等于白装。于是想着时间不能白浪费了,就整理一下写篇文章吧。
从安装到配置整个过程中感觉能踩的坑都让我踩到了,各种疑难杂症也是百度+google双管其下各种尝试,最终到成功看到tf版本号,希望自己的这个经验能帮到大家。
由于本人也刚入门CS不到两年,入门深度学习半年,对于环境方面的理论还是很薄弱(基本没有),有些解决办法无奈也无法追究原因,所以本文仅以解决问题为目的。
安装Miniforge3
首先我们需要安装Miniforge来管理环境。Miniforge3是一个anaconda开源的社区子版本,支持ARM版本,也是基于conda来管理环境,所以使用方法上完全一样,所以并没有学习成本。
首先去github官网选择Apple Silicon版下载:https://github.com/conda-forge/miniforge/#download
得到一个脚本文件:Miniforge3-MacOSX-arm64.sh
终端cd到脚本的所在路径,然后
bash Miniforge3-MacOSX-arm64.sh
然后Miniforge就安装好了。
此时需要配置环境变量,在~/.bash_profile中加入:
export PATH="/Users/这里是你的用户名/miniforge3/bin:$PATH"
然后去~/.zshrc加入:
source ~/.bash_profile
这里如果你之前已经配置过其他环境了比如anaconda,这句话是存在的,不需要再重复添加。
此时可以在环境中检查一下环境是否正确,具体步骤是:
# 激活conda环境
conda activate
# 进入python交互
python
此时显示的结果如果有“packaged by conda-forge”就说明目前在miniforge的环境中了,就可以继续下一步了。
(base) shawn@MacBook-Pro-4 ~ % python
Python 3.9.10 | packaged by conda-forge | (main, Feb 1 2022, 21:27:43)
[Clang 11.1.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
此时还可以检查一下目前的conda环境。
shawn@MacBook-Pro-4 ~ % conda info --env
# conda environments:
#
/Users/shawn/anaconda3
base * /Users/shawn/miniforge3
可以看到miniforge3的默认base环境把anaconda的环境给顶掉了,所以默认的activate就只可以去到miniforge的base环境,而无法去到anaconda的base环境。
配置tf环境
刚才的检查可以看到环境里默认的python是3.9.10,但是目前的apple版tensorflow 2.4.0只可以兼容python 3.8,所以我们要新建一个python 3.8 的环境,由于都是conda,和之前用anaconda的方法是一样的:
conda create -n m1tf python=3.8
(里面m1tf是环境的名字,自己取什么都可以)
然后进入到环境安装tensorflow for apple 2.4.0,
conda activate m1tf
pip install --upgrade --force --no-dependencies https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_addons_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl
看到这句话就放心了:
Successfully installed tensorflow-addons-macos-0.1a3 tensorflow-macos-0.1a3
怎么可能真的放心。
由于是一个全新的一个环境,tensorflow的一系列依赖都是缺失的,或者版本不匹配的,所以如果尝试测试版本,会产生报错:
>>> import tensorflow as tf
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/shawn/miniforge3/envs/m1tf/lib/python3.8/site-packages/tensorflow/__init__.py", line 38, in <module>
import six as _six
ModuleNotFoundError: No module named 'six'
于是就需要补全依赖。
补全依赖
理论上看到缺什么补什么就行了,但是由于是arm版本的tf,而且版本并不是最新的,所以这就造成很多依赖包需要特定版本,或者报找不到包的error。而且有些依赖包本身还存在依赖,这就造成了整体非常混乱,报错极多。
所以我在这里贴出我尝试出来的一个顺序,按照这个顺序安装大概率是不会报错的,除了依赖我还安装了一些常用必需包 ,有的包需要pip install安装,有的包得用conda install安装,至于为什么我也不知道,全是试出来的,记得也要全程在m1tf环境下安装:
conda install 以下:
pandas
matplotlib
scikit-learn
jupyterlab
然后需要把pip升级到最新版,然后用pip安装以下
pip install 以下:
wheel
setuptools
cached-property
six
pip会自动检查依赖,所以在这期间即使有报错如下:
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
tensorflow-macos 0.1a3 requires absl-py~=0.10, which is not installed.
tensorflow-macos 0.1a3 requires astunparse~=1.6.3, which is not installed.
... ...
也是不需要担心的,只要下面有这句话:
Successfully installed 这里是你要安装的包的名字
就说明你要安装的包装成功了。
pip install 继续以下:
absl-py
astunparse==1.6.3
flatbuffers==1.12.0
gast==0.3.3
google-pasta==0.2
wrapt~=1.12.1
以上都是安装pip检查出的依赖的顺序安装,在这之后的包就无法正常安装了,但是此时我们要把剩下的列表复制粘贴出来,后面需要用到,因为使用conda安装时是不会检查其他包的依赖情况的。
大概是只剩下这四个,但是要以个人的为准:
tensorflow-macos 0.1a3 requires grpcio~=1.32.0, which is not installed.
tensorflow-macos 0.1a3 requires h5py~=2.10.0, which is not installed.
tensorflow-macos 0.1a3 requires numpy~=1.19.2, which is not installed.
tensorflow-macos 0.1a3 requires tensorboard~=2.3, which is not installed.
在装这些包之前,我们需要先把numpy装好,我使用的是conda安装,因为我的pip强制让我安装最新版,但是tf2.4匹配的numpy需要时1.19.2:
conda install numpy==1.19.2
这里如果你conda也安装指定版本失败,可以尝试conda uninstall和/或pip uninstall彻底卸载掉已有的numpy,再重试就可以解决。
numpy安装好之后,使用conda install把之前复制粘贴出来的那一份依赖表报错中的包全部安装一遍,此时就大功告成了。
写到这里想到,在安装依赖卡住后,通过安装numpy解决了问题,是否说明如果先把numpy安装好,后面的依赖就可以一个一个全部安装好了呢,但是由于我没有真的去尝试这个可能,所以就没有把“先安装numpy”作为解决办法,而是仅仅保留了我安装成功的路线。同时我也不清楚会不会不同电脑遇到不同的情况,总之由于是一个全新的环境,安装依赖的过程会非常繁琐,不过只有仔细看缺少哪些,在卡住后调整安装顺序,最后肯定可以全部补全。
检查
检查的话直接在python交互中操作:
>>> import tensorflow as tf
>>> tf.__version__
'2.4.0-rc0'