2022 年在 Apple M1 上安装 TensorFlow 的正确方法是什么

Qiu*_*ang 69 python conda tensorflow apple-m1

当我尝试在 Apple M1 上安装 TensorFlow 时,遇到 4 个问题:

  1. Conda 自 2022 年 5 月 6 日起就支持 M1,但我在 google 上搜索的大多数文章都讨论了使用 Miniforge,例如,所以我觉得它们都有点过时了。

    1. 如何在 M1 Mac 上安装 TensorFlow(简单方法)
    2. AI - Apple Silicon Mac M1 原生支持 TensorFlow 2.8 GPU 加速
    3. 如何在 Apple M1 Pro 和 M1 Max 上设置 TensorFlow(也适用于 M1)
    4. 如何在 MacBook Pro M1 Pro 上轻松安装 TensorFlow 2.7
  2. 我使用最新的 conda 4.13 成功设置了我的 python 环境(3.8、3.9 和 3.10),但是当我尝试安装 tensorflow 时,出现错误“找不到tensorflow 的匹配发行版”(全部失败)。

    ERROR: Could not find a version that satisfies the requirement tensorflow (from versions: none)
    ERROR: No matching distribution found for tensorflow 
    
    Run Code Online (Sandbox Code Playgroud)

无法找到满足张量流要求的版本中的答案没有帮助。我在https://www.tensorflow.org/上也找不到有用的信息,实际上https://www.tensorflow.org/install刚刚说了pip install tensorflow

  1. 我试着跑pip install tensorflow-macos,结果成功了。我从上面的“也适用于 M1”文章中读到“ Apple 的 TensorFlow 分支称为“tensorflow-macos ””,尽管我找不到太多相关信息。例如,https://www.tensorflow.org/没有提及这一点。我还从https://developer.apple.com/forums/thread/686926发现有人点击了“错误:找不到tensorflow-macos 的匹配发行版”(但我没有)。

  2. 我谷歌搜索的所有文章,包括上面4篇文章和macOS Apple M1上的这个Tensorflow,都说我还需要运行以下2个命令

    conda install -c apple tensorflow-deps

    pip install tensorflow-metal

但我真的需要这样做吗?我无法从https://www.tensorflow.org/找到此信息。这两个包是tensorflow-deps什么tensorflow-metal

mer*_*erv 34

根据Apple 的官方指示(截至 2022 年 7 月 13 日),人们将使用以下 YAML 创建一个环境:

tf-metal-arm64.yaml

name: tf-metal
channels:
  - apple
  - conda-forge
dependencies:
  - python=3.9  ## specify desired version
  - pip
  - tensorflow-deps

  ## uncomment for use with Jupyter
  ## - ipykernel

  ## PyPI packages
  - pip:
    - tensorflow-macos
    - tensorflow-metal  ## optional, but recommended
Run Code Online (Sandbox Code Playgroud)

编辑以包含其他包。

创造环境

在创建环境之前,我们需要知道基础架构是什么。用 来检查这一点conda config --show subdir

本机 ( osx-arm64 ) 基础

如果您已经安装了本机osx-arm64 Miniforge 变体(我推荐Mambaforge),那么您可以使用以下命令创建:

mamba env create -n my_tf_env -f tf-metal-arm64.yaml
Run Code Online (Sandbox Code Playgroud)

注意:如果您没有 Mamba,则替换condamamba; 或者安装它以更快地解决问题:conda install -n base mamba.

模拟 ( osx-64 ) 基础

如果您没有本机base,那么您将需要覆盖该subdir设置:

## create env
CONDA_SUBDIR=osx-arm64 mamba env create -n my_tf_env -f tf-metal-arm64.yaml

## activate
mamba activate my_tf_env

## permanently set the subdir
conda config --env --set subdir osx-arm64
Run Code Online (Sandbox Code Playgroud)

请务必在安装或更新软件包之前激活环境。

  • 它是 Conda 的编译(快速)版本。 (3认同)
  • 感谢您回答我的问题,但为什么是曼巴?我对所有这些安装程序感到非常困惑,这就是我提出问题的原因之一。 (2认同)

Mat*_*hew 28

我为此奋斗了几个小时。https://developer.apple.com/metal/tensorflow-plugin/上的当前说明指定使用 Miniconda,可概括为:

conda create -y --name cv python
conda activate cv
conda install -y -c apple tensorflow-deps
python -m pip install tensorflow-macos tensorflow-metal
Run Code Online (Sandbox Code Playgroud)

截至 2023 年 1 月,这些说明充满了问题:

  • 症状:您运行时conda install -c apple tensorflow-deps期望获得当前版本 (2.10.0) ,但conda list tensorflow-deps显示tensorflow-deps 2.9.0

原因:Apple的tensorflow-deps包v2.10.0依赖于numpy >=1.23.2,<1.23.3。Anaconda 中没有这样的 numpy 版本(只有 conda-forge)。Anaconda 的依赖解析默默地回退到旧版本的tensorflow-deps。当您继续按照说明操作时,这将导致更多问题。

  • 症状:你运行conda install -c apple tensorflow-deps==2.10.0并得到了UnsatisfiableError: The 以下规范被发现彼此不兼容

原因:同上,但至少Anaconda已经告诉你了。它没有提到不兼容是什么,因为这会有所帮助。

  • 症状:“运行时错误:针对 API 版本 0x10 编译模块,但此版本的 numpy 为 0xf”

原因:如果您安装了tensorflow-deps 2.9.0(或者由于上述原因Anaconda为您安装了它),您将获得numpy 1.22.3。当您 时pip install tensorflow-macos tensorflow-metal,您将获得tensorflow-macos 2.11.0 和tensorflow-metal 0.7.0,其中一个或两个与numpy 1.22.3 二进制不兼容。

  • 症状:2023-01-22 15:16:23.209301:W tensorflow/core/framework/op_kernel.cc:1830] OP_REQUIRES 在 xla_ops.cc:418 处失败:NOT_FOUND:找不到带有 id 的注册平台

问题:TensorFlow 2.11 引入了优化器和可插拔架构之间的不兼容性。您可以使用 TF 2.11,但您需要使用旧版优化器。

解决方案

我找到了使用 Anaconda 在 Apple Silicon 上安装 GPU 加速 TF 的 3 个选项。

它将帮助您的调试获得一个最小的测试脚本,例如 https://developer.apple.com/metal/tensorflow-plugin/中的测试脚本,即:

import tensorflow as tf

cifar = tf.keras.datasets.cifar100
(x_train, y_train), (x_test, y_test) = cifar.load_data()
model = tf.keras.applications.ResNet50(
    include_top=True,
    weights=None,
    input_shape=(32, 32, 3),
    classes=100,)

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(optimizer="adam", loss=loss_fn, metrics=["accuracy"])
model.fit(x_train, y_train, epochs=5, batch_size=64)
Run Code Online (Sandbox Code Playgroud)

这样您就可以通过运行TF_MLC_LOGGING=1 python tf_arch_test.py和观察 Activity Monitor 来检查 GPU 使用情况。虽然感觉笔记本电脑的哪一侧正在燃烧你的腿可以作为 GPU 使用情况的有用指标,但它并不总是可靠的。

修复 #1:添加 conda-forge 作为通道,在代码中使用旧版优化器。

conda config --add channels conda-forge
conda config --set channel_priority strict 
 
conda create -y --name cv
conda activate cv
conda install -y -c apple tensorflow-deps
python -m pip install tensorflow-macos
python -m pip install tensorflow-metal

python --version
conda list|grep -E '(tensorflow|numpy)'

TF_MLC_LOGGING=1 python tf_arch_test.py
Run Code Online (Sandbox Code Playgroud)

你会得到:

Python 3.10.8
numpy                     1.23.2          py310h127c7cf_0    conda-forge
tensorflow-deps           2.10.0                        0    apple
tensorflow-estimator      2.11.0                   pypi_0    pypi
tensorflow-macos          2.11.0                   pypi_0    pypi
tensorflow-metal          0.7.0                    pypi_0    pypi
Run Code Online (Sandbox Code Playgroud)

您将需要修改代码才能使用旧优化器之一。例如:

Python 3.10.8
numpy                     1.23.2          py310h127c7cf_0    conda-forge
tensorflow-deps           2.10.0                        0    apple
tensorflow-estimator      2.11.0                   pypi_0    pypi
tensorflow-macos          2.11.0                   pypi_0    pypi
tensorflow-metal          0.7.0                    pypi_0    pypi
Run Code Online (Sandbox Code Playgroud)

修复#2:添加 conda-forge 作为通道,固定版本号以避免可插入架构问题。

conda config --add channels conda-forge
conda config --set channel_priority strict 
 
conda create -y --name cv
conda activate cv
conda install -y -c apple tensorflow-deps==2.10.0
python -m pip install tensorflow-macos==2.10.0
python -m pip install tensorflow-metal==0.6.0

python --version
conda list|grep -E '(tensorflow|numpy)'

Run Code Online (Sandbox Code Playgroud)

你会得到:

Python 3.10.8
numpy                     1.23.2          py310h127c7cf_0    conda-forge
tensorflow-deps           2.10.0                        0    apple
tensorflow-estimator      2.10.0                   pypi_0    pypi
tensorflow-macos          2.10.0                   pypi_0    pypi
tensorflow-metal          0.6.0                    pypi_0    pypi
Run Code Online (Sandbox Code Playgroud)

修复 #3:不要添加 conda-forge,将版本号固定到最后实际有效的版本号:

model.compile(
    optimizer=tf.keras.optimizers.legacy.Adam(learning_rate=1e-3),
    loss=loss_fn,
    metrics=["accuracy"],
)
Run Code Online (Sandbox Code Playgroud)

你会得到:

Python 3.10.9
numpy                     1.22.3          py310hdb36b11_0
numpy-base                1.22.3          py310h5e3e9f0_0
tensorflow-deps           2.9.0                         0    apple
tensorflow-estimator      2.9.0                    pypi_0    pypi
tensorflow-macos          2.9.2                    pypi_0    pypi
tensorflow-metal          0.5.1                    pypi_0    pypi
Run Code Online (Sandbox Code Playgroud)


Les*_*rel 8

首先,TensorFlow并不正式支持Mac M1。他们不分发为 Mac M1(及其特定的 arm64 架构)预编译的软件包,因此该tensorflow-macos软件包由 Apple 维护。据我所知,TensorFlow 只发布了适用于 x86(Linux、Windows、Mac)和 Raspberry PI(arm64)的官方轮子。

苹果正在使用 Tensorflow 中的特定插件来使该框架与 MacOS 的图形堆栈 Metal 兼容。换句话说,他们正在利用Tensorflow 的 PluggableDevice API编写代码,将 TensorFlow 操作转换为 M1 的 GPU 可以理解的代码。

这两个包分别包含:

  • tensorflow-deps在arm64上运行Tensorflow的依赖项,即python、和。我相信这更像是一个便利包。numpygrpcioh5py
  • tensorflow-metal:一个使 TensorFlow 能够在metalMacOS 的着色器 API 上运行的插件(相当于其他平台上的 Vulkan 或 DirectX12 的低级 API)。如果您习惯在 Nvidia GPU 上运行 TensorFlow,您可以将其视为 CUDA 的替代品。

如果没有该tensorflow-metal软件包,TensorFlow 将无法利用 M1 的 GPU,但仍然能够在 CPU 上运行代码。


Nik*_*tak 8

    \n
  1. 下载并安装\xc2\xa0Conda env:
  2. \n
\n

https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh

\n
chmod +x ~/Downloads/Miniforge3-MacOSX-arm64.sh\nsh ~/Downloads/Miniforge3-MacOSX-arm64.sh\nsource ~/miniforge3/bin/activate\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 安装 TensorFlow 依赖项:

    \n

    conda install -c 苹果tensorflow-deps

    \n
  2. \n
  3. 安装基础 TensorFlow:

    \n
  4. \n
\n
python -m pip install tensorflow-macos\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 安装基础 TensorFlow-metal:

    \n

    python -m pip 安装tensorflow-metal

    \n
  2. \n
  3. 创建Conda环境:

    \n
  4. \n
\n
conda create -n tensorflow-env tensorflow\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. conda 激活tensorflow-env
  2. \n
\n

  • 我想我已经说得很清楚了 我不想要 miniforge (3认同)