Apple M1 上安装tensorflow开发环境

文章目录

    • 说明
    • conda, minconda, miniforge的关系
      • Conda vs Pip
    • 安装步骤
    • 遇到的问题
      • tensorflow.keras没有正确安装上
    • 参考链接

说明

由于目前Anaconda没有支持arm架构的版本,在M1芯片Mac上安装的Anaconda是非常不稳定的,而且仅支持最高3.8版本的Python。而官网原生支持运行在arm架构上的Python版本为3.9.1,所以综合来讲我们只能寻找一种替代方案,那就是miniforge。

conda, minconda, miniforge的关系

Anaconda vs Miniconda vs Miniforge
他们的核心都是包含conda这一工具,来实现 python 环境(environment) 和 包(package) 管理的,(其实不仅仅可以用来管理python,很多语言R, Java, C都支持);然后就可以通过。
Anaconda 和 Miniconda 是一个公司的产品,商用是付费的,个人暂时免费;而Miniforge是由社区主导,用GitHub托管,完全免费。Miniconda 和 Miniforge 是差不多的产物,代表着轻量化,而Anaconda是完整版,就略显臃肿。

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

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

简言之,Anaconda = Miniconda + more packages。Anaconda 一般还包括一个图形界面,主要是多了一些基本的包,很省事,不用再单独安装了,但也有一些可能一直用不到,白白占用了空间。Miniconda 可以按需求安装库,但也可以借助conda install anaconda手动实现anaconda一样的 pre-installed package。一个是安装初期花费更多时间下载,一个是后期花更多时间单独安装。我个人倾向于 Miniconda,一切从简。

Miniforge 使用conda-forge 作为默认 channel,而 Miniconda 使用anaconda.org 作为默认channel。conda channels (源) 是 packages 存储的位置,也即是你是从哪个来源下载这个包,对应到conda内部处理则是下载文件的链接。因为不同源会有相同名字的包,因此必须指定来源,同时安装conda的时候也会有一个默认的channel。目前主流的就是 conda-forge,齐全且更新快。

结论:

Miniforge 比 Anaconda\Miniconda 更早支持了Apple M1芯片。2022年5月6日Anaconda官方宣布原生支持了Apple M1版本。在苹果官方的Tensorflow加速训练教程中也是推荐的Miniforge。

Conda vs Pip

conda package的来源在前面介绍过了,而pip的来源是 PyPI (Python Package Index)。pip是专门针对python打包而成的,属于wheels or source distributions,需要compiler来安装;而conda packages are binaries,因此包含例如C语言写的库,同时也不需要compilers。pip的没有严格的依赖冲突检查,而conda是会有严格的依赖冲突检查。

通常我们安装一个python包,直接用pip install 就行,但如果我们想要多个python环境,也就需要用到virtualenv;同时如果这个包没有不是 Python packages,是用C语言写的;这时候就需要Conda登场了,它同时解决了以上所有问题。

简言之,比较推荐的是用conda创建虚拟python环境,然后conda install pip后使用pip来安装需要的包,遇到不支持pip的,或者特殊编译的,可以根据开发者的说明使用conda进行安装。所以优先pip install,不行再conda install。
需要注意的是 pip 和 conda 安装包对象的名称可能是不一样的,例如conda - pytorch,pip - torch。

安装步骤

  1. brew install pyenv
  2. pyenv install --list
  3. pyenv install -v miniforge3-4.10.3-10
  4. pyenv local miniforge3-4.10.3-10
  5. conda install -c apple tensorflow-deps -y
  6. pip install tensorflow-macos==2.9.0
    注意:此处要安装2.9.0,如果装最新的2.11.0,则有些模块装不上,如tensorflow.keras
  7. 测试:
python -c "import tensorflow as tf; print(tf.config.list_physical_devices())"

正常会输出:

[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
  1. pip install tensorflow-metal==0.5.0
  2. 再次调用tf.config.list_physical_devices()测试 ,会看到:
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
  1. 测试tensorflow基本API,先安装pip install tensorflow-datasets
#! /usr/bin/env python3

import tensorflow as tf
import tensorflow_datasets as tfds


(ds_train, ds_test), ds_info = tfds.load(
    'mnist',
    split=['train', 'test'],
    shuffle_files=True,
    as_supervised=True,
    with_info=True,
)

def normalize_img(image, label):
  """Normalizes images: `uint8` -> `float32`."""
  return tf.cast(image, tf.float32) / 255., label

batch_size = 128

ds_train = ds_train.map(
    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(batch_size)
ds_train = ds_train.prefetch(tf.data.experimental.AUTOTUNE)


ds_test = ds_test.map(
    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds_test = ds_test.batch(batch_size)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.experimental.AUTOTUNE)


model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(32, kernel_size=(3, 3),
                 activation='relu'),
  tf.keras.layers.Conv2D(64, kernel_size=(3, 3),
                 activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
#   tf.keras.layers.Dropout(0.25),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
#   tf.keras.layers.Dropout(0.5),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=tf.keras.optimizers.Adam(0.001),
    metrics=['accuracy'],
)

model.fit(
    ds_train,
    epochs=12,
    validation_data=ds_test,
)

如果正常运行,就说明tensorflow环境已经搭建好了。

遇到的问题

tensorflow.keras没有正确安装上

参考链接

  • conda官网 https://docs.conda.io/projects/conda/en/latest/

  • 下载安装Anaconda: https://www.anaconda.com/products/distribution#Downloads

  • 下载安装Miniconda:https://docs.conda.io/en/latest/miniconda.html

  • 下载安装Miniforge:https://conda-forge.org/miniforge

你可能感兴趣的:(人工智能,tensorflow,python,Apple,M1)