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.2Python 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の顛末 (ビルドの仕方も書いた)
- 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内蔵GPUとAMD(RADEON)のみ対応している。そのうちIntelとかも対応してくれるかも知れない。その前にIntel Macが無くなるかも知れないが。
試したところ、tensorflow-metalを入れるとかえって遅くなることもあるので、アプリ次第でtensorflow-metalを入れるかどうか判断することになる。
まとめ
自分的には困らない程度に環境が整った。