Zhao Dongyu's Blog

A life which is unexamined is not worth living.

0%

Mac M1 安装 Tensorflow

近期在Mac M1上使用tensorflow,发现不能用了。报错:

The TensorFlow library was compiled to use AVX instructions, but these aren't available on your machine.

  • 尝试使用conda重新安装,报错如上;

  • docker搭建x86环境安装,报错非法指令;

官网说是从1.6版本以后,预编译二进制文件将使用AVX指令,导致有的CPU无法执行。

很烦人,以至于我都开始搜电脑主机准备搭建一个Ubuntu了。好在后来找到了解决方式:

删除现有conda

1. 检查 Conda 安装路径

通常,Conda 安装在以下路径之一:~/anaconda3 或 ~/miniconda3

如果不确定路径,可以运行以下命令来确认安装位置:

which condaconda info

在输出中查找 base environment 的路径。

2. 删除 Conda 文件

1. 删除安装目录:

rm -rf ~/anaconda3 rm -rf ~/miniconda3

根据实际路径选择其中一个。

2. 清理环境变量:

打开终端,编辑 ~/.zshrc(Mac 默认终端)或 ~/.bashrc 文件:

nano ~/.zshrc

删除与 Conda 相关的内容(例如 PATH 环境变量中的 anaconda3/bin 或 miniconda3/bin)。

3. 刷新环境变量:

source ~/.zshrc

3. 删除 Conda 配置文件

无论在哪个平台,Conda 的配置文件通常位于:

~/.condarc

删除该文件:

rm ~/.condarc

4. 检查是否完全删除

运行以下命令,确认 Conda 已被删除:

conda --version

如果显示 command not found,则已完全删除。

安装Miniforge

在 Mac M1/M2 等 Apple Silicon 上安装 TensorFlow 需要一些特殊的步骤,因为默认的 TensorFlow 版本可能不支持 ARM 架构。

步骤 1: 安装 Miniforge(推荐)

Miniforge 是 Conda 的轻量级版本,可以自动适配 Apple Silicon 架构。

1.1 下载 Miniforge

在终端中运行以下命令以下载并安装 Miniforge:

1
2
curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
bash Miniforge3-MacOSX-arm64.sh

按照提示完成安装。

1.2 激活环境

运行以下命令以激活 Conda 环境:

source ~/miniforge3/bin/activate

步骤 2: 创建新环境并安装 TensorFlow

1. 创建一个新的环境:

1
2
conda create -n tensorflow_env python=3.10 -y
conda activate tensorflow_env

2. 安装 TensorFlow for macOS:

1
2
3
conda install -c apple tensorflow-deps
python -m pip install tensorflow-macos
python -m pip install tensorflow-metal

说明: • tensorflow-macos 是为 macOS 专门优化的 TensorFlow 版本。 • tensorflow-metal 是用于加速 M1/M2 上 GPU 的插件。

步骤 3: 测试安装

运行以下 Python 脚本以测试安装是否成功:

import tensorflow as tf

检查 TensorFlow 是否可用

1
2
print("TensorFlow Version:", tf.__version__)
print("Is GPU available:", tf.config.list_physical_devices('GPU'))

如果输出类似以下内容,则安装成功:

TensorFlow Version: 2.x.x

Is GPU available: [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

Thanks for your support.