本文主要介绍在Apple M1的Mac os12.x系统下面,安装tensorflow并配置pycharm环境的过程。

本文主要介绍在Apple M1的Mac os12.x系统下面,安装tensorflow并配置pycharm环境的过程。


安装说明

硬件和系统说明

系统介绍如下,设备是搭载M1芯片的macOS为12.2.1的系统环境.

还有值得说明的就是,在M1芯片带来巨大性能革新的同时,也带来了诸多生态上面的不足问题。

例如就在这个tensorflow的安装上面,我们需要注意的不仅有M1的arm架构和其他主流芯片架构在通常出现的不兼容问题,还有mac系统版本上面的问题。

在macOS上面使用tensorflow的说明

要知道在macOS12.x之前版本上面使用tensorflow,我们只能使用它的cpu训练功能。

但是,现在好了,macOS12.x基础上支持安装tensorflow的插件来开启macOS的GPU训练功能。


环境准备

miniforge安装

anaconda是什么?

首先,我们就认识anaconda是什么。anaconda是为机器学习或者数据分析提供一套最简单方式使用方式的工具集,它里面集成了许多我们机器时需要用到库(eg: numpy、pandas),并且还包含了一些简单的python开发环境工具。

因此,除开它提供的那套工具之外,我们可以把Anaconda看成是Python环境的一个简单的封装,在这个环境里面为我们提供一些常用的基础库,以及更好用python包的管理工具,比如conda等。

M1适配比较好的python集成开发环境 m1芯片能运行pycharm吗_tensorflow

miniconda是什么?

在anaconda 提供的环境里面,我们可以看到提供了丰富的各种工具和包。但是很多时候这些功能对于我们的来讲都是冗余的。因此,也就有了更精简的版本miniconda,miniconda代表的是轻量化。

(老手) Miniconda = Python + conda (with minimal dependencies, like openssl, ncurses...)

(新手) Anaconda = Python + conda + meta package (about 160 Python pkgs, like curl, numpy, pandas...)

为什么又选择miniforge呢?$^2$

miniforge可以看成是moniconda的一个功能类似的开源产品,它使用了conda-forge的channel(包源),不同是的它比起anaconda官方对Apple M1的支持更好。

比如,后面我们在安装tensroflow的插件时候就会遇到的问题,使用anaconda就会报错。


tensroflow安装


Step1: 安装miniforge3

  • 如果之前有安装anaconda环境,一定要先卸载干净$^3$,再安装。
# 1 安装anaconda卸载工具anaconda-clean
conda install anaconda-clean
# 2 执行anaconda-clean
anaconda-clean
# 3 删除相关文件或配置
# 3.1 删除隐藏备份文件夹
rm -r /Users/[当前用户名]/.anaconda_backup/
# 3.2 删除anaconda3文件夹
rm -rf /anaconda3
# 3.3 删除环境变量配置
vi ~/.bash_profile
# 3.4 删除其他相关隐藏文件
rm -rf ~/.condarc ~/.conda ~/.continuum

这里值得注意的一点是,在步骤3.2中需要删除的以下配置。

删除重启系统,可以通过 conda -V命令来验证anaconda是否卸载成功。

chmod +x ~/Downloads/Miniforge3-MacOSX-arm64.sh
sh ~/Downloads/Miniforge3-MacOSX-arm64.sh
source ~/miniforge3/bin/activate

执行上述命令之后,安装提示进行安装,然后可以通过命令conda -V来查看是否安装成功。

miniforge3安装之后环境变量是通过zshrc文件进行配置的,可以通过vi ~/.zshrc查看,要确环境安装的miniforge3在用户目录下面,否则使用的时候可能实现权限的问题。


Step2: conda的基本使用

  • 虚拟环境介绍

通过参考,tensorflow官方安装教程,可以看到使用pip方式安装的时,更为推荐的是创建虚拟环境安装。

那随之而产生一些疑问,什么是虚拟环境,如何创建虚拟环境,以及如何通过创建虚拟环境安装tensorflow等一系列问题。

什么是虚拟环境?

理解清楚这个问题,可以让初学者对于python这一工具有更佳深刻的理解。

如果是macOS用户,可能会通常都会python这个系统环境的问题有更深刻的困惑?通常macOS都自带一个python环境,然而这个环境是2.7版本的,这个版本已经很难满足我们的日常需要。因此,我们不得不去下载一个更新的python来满足我们的日常使用,这样就造成了一个多个版本python环境共存一个主机的问题。

如果是Java程序员的话,做个类比,python的虚拟环境就像是JDK和本地MAVEN的仓库的集合。它里面提供了像JDK一样的python基础语言环境,还提供了使用像maven一样可以支持管理包的一个工具pip。

它和Java开发的区别在于,python通过虚拟环境的创建功能能够自动的生成一个制定python版本的基础环境,然后就是这些虚拟环境之前都是互相隔离的,包与包之间也是互不干扰的。在Java里面,似乎我们就从不管这些,我们经常使用都是同一个Maven,顶多进行一些依赖包源的配置,然后基本上是改变它的本地repo的,相当于它的包都是放在一块的。

为什么有python虚拟环境?

我认为还是和它的设计风格相关,python本身就是一个轻量级的语言。并且实验性质很强的一个语言环境,它的用户有着对于新版本新功能更多的需求,它的库更新迭代也是特别快。因此,它需要一个能够更好的管理实验环境的功能。而Java更多面向落地的应用,针对这些应用来讲更多的还是强调它的稳定性。因此,它的依赖库更多的都是随着基于语言环境更新的。

  • conda基本的使用

前面我们知道了conda是一类似pip一样的包管理工具,但它的功能远不及此。对它更贴切的描述应该是python环境管理工具。

比如我们前面安装miniforge3之后,我们就会看我们的终端变了。如图,(base)就是conda为我们创建的一个默认环境,conda里面的设计都是贯彻了python虚拟环境的。它带来的好处就是,可以更加方便的使用不同的虚拟环境满足不同的需求。

conda基本命令

# conda基本命令
conda -V
conda -h

# conda虚拟环境操作
conda info --envs		#列出当前虚拟环境
conda create -n tf26 python==3.9 # 创建python3.9名字为tf26的虚拟环境,注意这里可以灵活指定自己的python版本
conda activate tf26  # 激活tf26环境,其实有点git切换分支的感觉
conda remove -name tf26 --all # 删除虚拟环境


step3: tensorflow安装

1、切换到自己的tf26环境

conda activate tf26

2、安装tensorflow-deps

conda install -c apple tensorflow-deps #安装最新版本
# conda install -c apple tensorflow-deps==2.6.0 # 安装指定版本依赖

详细安装步骤参考:apple开发者官网:Getting Started with tensorflow-metal PluggableDevice

3、安装tensorflow-macos

python -m pip install tensorflow-macos

4、安装tensorflow-metal插件

python -m pip install tensorflow-metal

5、验证安装效果

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

出现一下结果,即安装成功:


pycharm配置

  • command + ,快捷键打开Preferences,选择Project -> Python Interpreter;
  • 在上图右侧点击⚙️,选择add,来到以下界面,然后选择左侧conda enviroment,然后选择已有环境,配置我们刚才已经安装好tensorflow的环境即可。

M1适配比较好的python集成开发环境 m1芯片能运行pycharm吗_虚拟环境_02

  • 至此,我们的tensroflow在pycharm中的配置也已经完成,我们可以测试一下,能够正常使用。


tensorflow入门案例

以下是tensorflow官网的tensorflow入门案例,照片分类训练

  • 代码
import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])


model.fit(x_train, y_train, epochs=5)

model.evaluate(x_test,  y_test, verbose=2)
  • 运行结果
Metal device set to: Apple M1

systemMemory: 16.00 GB
maxCacheSize: 5.33 GB

2022-07-28 10:54:57.919635: 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-07-28 10:54:57.919888: 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>)
2022-07-28 10:54:58.477466: W tensorflow/core/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz
Epoch 1/5
2022-07-28 10:54:58.867887: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.
1875/1875 [==============================] - 11s 4ms/step - loss: 0.2914 - accuracy: 0.9152
Epoch 2/5
1875/1875 [==============================] - 8s 4ms/step - loss: 0.1374 - accuracy: 0.9586
Epoch 3/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.1015 - accuracy: 0.9694
Epoch 4/5
1875/1875 [==============================] - 8s 4ms/step - loss: 0.0811 - accuracy: 0.9749
Epoch 5/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.0683 - accuracy: 0.9786
2022-07-28 10:55:43.420308: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.
313/313 - 1s - loss: 0.0734 - accuracy: 0.9784 - 1s/epoch - 3ms/step

Process finished with exit code 0


参考

  1. 2022最新Apple M1/Mac M1 配置安装Tensorflow环境方法(亲测可用):https://zhuanlan.zhihu.com/p/474212619
  2. 一文解释conda,pip,anaconda,miniconda,miniforge:https://zhuanlan.zhihu.com/p/518926990
  3. mac 下anaconda彻底删除卸载:
  4. venv --- 创建虚拟环境:https://docs.python.org/zh-cn/3/library/venv.html
  5. tensroflow官方教程-使用 pip 安装 TensorFlow:https://tensorflow.google.cn/install/pip?hl=zh-cn
  6. Getting Started with tensorflow-metal PluggableDevice:https://developer.apple.com/metal/tensorflow-plugin/
  7. tensroflow官方教程-初学者的 TensorFlow 2.0 教程:https://tensorflow.google.cn/tutorials/quickstart/beginner?hl=zh-cn