1. 问题背景

  • 七月底原来的 Win10 笔记本跑深度学习项目 Demo 调试的时候,由于温度过高没有及时发现,意外烧了电脑主板。去维修也无果,索性直接用教育优惠下单了一台 MacBook Pro(M1 Pro芯片)。原项目要求搭配 Python 3.6+Tensorflow 1.15.0+keras 2.3.1 ,同时由于原来的 Win10本是搭载了 NVIDIA MX150 显卡,同时安装了 CUDA 10.1 + cuDNN 7.6
  • 然而新款的 MacBook Pro(M1 Pro芯片)本身自带的最低版本的 Python3.8.x,仅支持 tensorflow 2.x。于是考虑通过最新版本的 Anaconda (截至2022.8月已原生适配了M1 Pro芯片),但是下载完发现最低支持的 Python 版本为 3.9.x。无奈只好转向其他途径,寻找方法,终于在一篇文章里找到了可行的方法。

M1 Pro(Apple Silicon)安装TensorFlow 1.X版本

2. 解决方法

  • 总体方法:借助 Docker 构建 python3.5.10tensorflow1.11.0 的镜像,在 Pycharm 中使用该环境即可。
  • 安装 Docker:注意选择 Apple Silicon 版本。
  • 安装 Pycharm:注意选择 Apple Silicon 版本。

3. Docker Hub

  • 拉取 arm64 版本的 python3.5.10docker 镜像。
    注意选择 3.5.10-buster 版本,不要选择 slim 版本(精简版)。
    Docker Hub
  • 在 MacBook Pro 终端输入镜像拉取指令:docker pull python:3.5.10-buster
  • 在 docker dashboard 的 Images 里面可以看到该镜像。
  • 点击 run,在 Containers 里面创建对应的容器。
  • Containers 里面创建对应的容器那一行点击 命令行 图标,开启命令行工具。

至此,我们有了一个 python3.5.10 的基本环境了。
⭐ 注:在刚打开的容器的命令行里输入 python -V 可查看当前环境的 python 版本。

4. h5py

由于 Tensorflow 依赖 h5py,而 h5py 依赖 HDF5。因此,我们必须先编译安装HDF5 ,否则使用 pip 安装 h5py 会报错。
⭐ 在第三步打开的 docker 命令行 内执行如下操作。

  • 从官网下载HDF5源码包:
wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.5/src/hdf5-1.10.5.tar.gz
  • 进入下载目录解压源码包:
tar -zxvf hdf5-1.10.5.tar.gz
  • 进入解压文件夹,执行配置、编译和安装:
cd hdf5-1.10.5/
./configure --prefix=/usr/include/hdf5
make
make install
  • 更新安装源:
apt-get update

安装vim(镜像中没安装):

apt-get install vim
  • 配置环境变量:
vim ~/.bashrc
* 在末尾加上两行:
* 				export PATH=$PATH:/usr/include/hdf5/bin
* 				export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/include/hdf5/lib
  • 使配置生效:
bash ~/.bashrc
  • 安装 Cpython,解决层层依赖问题:
pip install Cython
  • 安装 protobuf(需要指定版本,最新版只支持3.7+):
    原博主是安装的 3.20.1 版本,而我实际安装的时候发现找不到 3.20 的版本,因此安装了 3.19.x
pip install protobuf==3.20.1
  • 升级(可能) pip、wheel、setuptools:
pip install --upgrade pip setuptools wheel
  • 安装 libhdf5-dev (如果还报错的话):
apt-get install libhdf5-dev
  • 安装 h5py:
pip3 install h5py

至此,h5py 安装完毕!

5. Tensorflow 1.11.0

由于官方没有提供基于 arm 架构的 Tensorflow 1.x 版,只能在 GitHub 上找第三方编译的版本。
这里使用的是 tensorflow1.11.0 aarch64 版本。
tensorflow-1.11.0-cp35-none-linux_aarch64.whl

  • 执行如下执行,下载 .whl 文件:
wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.11.0/tensorflow-1.11.0-cp35-none-linux_aarch64.whl
  • 安装 tensorflow 1.11.0:
pip install tensorflow-1.11.0-cp35-none-linux_aarch64.whl

至此,tensorflow 1.11.0 安装完毕!

6. 打包新镜像

接下来,需要将操作完的容器打包成新镜像。
⭐ 注意:接下来需要切换到系统命令行,而不是前序步骤的 docker 命令行了!

docker commit [OPTIONS] CONTAINER(容器名称或者ID) [REPOSITORY[:TAG]]
-a : 提交的镜像作者
-c : 使用 Dockerfile 指令来创建镜像
-m : 描述
-p : 在 commit 时,将容器暂停

示例:
打包一个新镜像,其作者是 htl,容器名称为 silly_swartz
tensorflow:1.11.0 中的 tensorflowREPOSITORY1.11.0TAG

docker commit -a htl -m "python3.5.10&tensorflow1.11.0" silly_swartz tensorflow:1.11.0

此时,可以在 docker 的 Images 内看到打包成功的新镜像,其 NAMEtensorflowTAG1.11.0

7. 连接 Pycharm

在 Pycharm 中,选择 Preferences -> Project:xxx(xxx为你的项目名) -> Python Interpreter
下拉框里选择 show all,选择 docker ,再选择刚创建的镜像(Server:Docker,Image name:tensorflow:1.11.0,Python interpreter path:python)。

至此,Python 3.5 + Tensorflow 1.11.0 环境就配置好了!
⭐ 注:可以写几行代码测试一下配置的环境是否为 Python 3.5

import sys
import tensorflow as tf


if __name__ == '__main__':
	print(sys.version)
	print(tf.__version__)

可以发现显示:

3.5.10(default, Sep 10 2020, 16:55:48)
[GCC 8.3.0]
1.11.0