Apple Silicon MacのPython環境を整備してみる (conda使わず)

アップデート

2022年3月現在、Python3.8系で問題なくなったので修正。

 

予備知識


現状手に入るApple Silicon MacのCPUはM1と呼ばれる。

$ sysctl -a machdep.cpu
machdep.cpu.brand_string: Apple M1
machdep.cpu.core_count: 8
machdep.cpu.cores_per_package: 8
machdep.cpu.logical_per_package: 8
machdep.cpu.thread_count: 8

 

CPUコアはARMであり、アーキテクチャ文字列はarm64である。

$ arch
arm64

 

Python2は2.7系、Python3は3.8系がインストールされている。

$ /usr/bin/python -V
Python 2.7.16
$ /usr/bin/python3 -V
Python 3.8.2

Python 3.8.9

 

Pythonの主要なパッケージのarm64対応は、Python3.9以降で行うとされている。

各種パッケージはPython3.8にも対応しているよう。

  • Scipy
  • Numpy

など。

 

Apple Silicon MacでのPython環境の整えかた


方針

以上の情報から、Python3.9以降を用いて環境構築を行うのが良さそうである。
システムのPython3を置き換えるのは困難なので、

  • pyenv等の仮想環境を用いる
  • HomebrewなどでPython3.9以降をインストールし、そちらを使うように環境変数等を整える。

などの対応が必要。ひとまずpyenvでPython3.9の仮想環境を作ってみた。venv好きの人はpyenvでPythonのバージョンだけ切り替えて、venvで仮想環境を作っても良い。

システムにプレインストールされているPython3.8を使えば問題ない。システムを汚したくなければvenvなどを使う。

 

手短に結論


ごく一部のパッケージだけ個別対処をすれば、実用上困らないレベルには達している。

 

素直にインストールできたもの


pip installで素直に入ったもの。ライブラリが必要とか、LDFLAGS, CFLAGSなどの設定が必要な場合もあるが、Apple Silicon特有の話ではないので省略する。

 

  • Jinja2
  • Keras-Preprocessing
  • Markdown
  • MarkupSafe
  • Pillow
  • PyQt5
  • PyQt5-sip
  • PyYAML
  • Pygments
  • Werkzeug
  • absl-py
  • ansible
  • appnope
  • astunparse
  • backcall
  • cached-property
  • cachetools
  • certifi
  • cffi
  • chardet
  • cmake
  • control
  • cryptography
  • cycler
  • cython
  • decorator
  • dill
  • easyesn
  • flask
  • flatbuffers
  • gast
  • google-auth
  • google-auth-oauthlib
  • google-pasta
  • graphviz
  • gsutil
  • h5py
  • haversine
  • hidapi
  • idna
  • imgaug
  • importlib-metadata
  • ipython
  • ipython-genutils
  • japanize_matplotlib
  • jedi
  • keras
  • kiwisolver
  • kociemba
  • labelimg
  • lxml
  • matplotlib
  • more-itertools
  • mpi4py
  • mxnet
  • mysql
  • mysqlclient
  • ntlm-auth
  • numpy
  • oauthlib
  • opencv-python
  • openpyxl
  • opt-einsum
  • optuna
  • packaging
  • paho-mqtt
  • pandas
  • parso
  • passlib
  • pexpect
  • pickleshare
  • plotly
  • poetry
  • prompt-toolkit
  • protobuf
  • ptyprocess
  • pyasn1
  • pyasn1-modules
  • pycodestyle
  • pycparser
  • pycwt
  • pydot
  • pyglet
  • pyknp
  • pyparsing
  • python-dateutil
  • pyusb
  • pywinrm
  • requests
  • requests-ntlm
  • requests-oauthlib
  • rsa
  • scikit-build
  • scikit-learn
  • scipy
  • selenium
  • setuptools
  • six
  • slidingwindow
  • sympy
  • tensorboard-plugin-wit
  • tensorflow-addons
  • tensorflow-estimator
  • tensorflow-metal
  • termcolor
  • torch
  • torchvision
  • tqdm
  • traitlets
  • typeguard
  • typing
  • typing-extensions
  • urllib3
  • wcwidth
  • wheel
  • wrapt
  • xlrd
  • xmltodict
  • yolov4
  • zipp

 

インストールに失敗したもの


以下のパッケージはpip installに失敗した(2021/9/7現在)。

 

  • PyQt5-Qt => No matching distribution found (まあ不要でしょう)
  • deeplabcut => intel-openmpが無い (Intel専用のよう)
  • grpcio => エラー
  • tensorboard => grpcioが必要
  • tensorflow-macos => grpcioが必要
  • tslearn => grpcioが必要
  • wxPython => エラー多数で諦めた
  • yolov5 => grpcioが必要

 

個別対処

 

grpcio


grpcioが入れられれば、他のいくつかも救える。

 

export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1
pip install grpcio


または

 

GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 pip install grpcio

 

tensorflow-addons


pypi.orgでwheelが配布されていないので、ソースビルドをする。
ビルドスクリプトApple Silicon非対応だったので、修正し、pull requestを出したら採用された。作ったwheelも置いておく。

既に対処版が配布されている。

 

  • pull requestの顛末 (ビルドの仕方も書いた)

github.com

 

  • Python3.9用にビルドしたwheel (zipしてある)

https://yamada.jo.sus.ac.jp/data/tensorflow_addons-0.14.0.dev0-cp39-cp39-macosx_11_0_arm64.whl

 

TensorFlowについて


Apple Siliconに限らず、Mac用のTensorFlowは、tensorflow-macosと、そのアドオンであるtensorflow-metalになった。
どちらもpip installでインストールできる。
tensorflow-macosだけでも動き、tensorflow-metalを入れるとGPUアクセラレーションが使えるようになる。metalはハード依存性の低い共通仕様であるが、tensorflow-metalでのGPUアクセラレーションは現時点ではApple Silicon内蔵GPUAMD(RADEON)のみ対応している。そのうちIntelとかも対応してくれるかも知れない。その前にIntel Macが無くなるかも知れないが。
試したところ、tensorflow-metalを入れるとかえって遅くなることもあるので、アプリ次第でtensorflow-metalを入れるかどうか判断することになる。

 

まとめ


自分的には困らない程度に環境が整った。