これを書いている現在 (2021-11)、Apple Silicon 版の Mac を使って Python の開発環境を整えようとすると、なかなかしんどい。 しんどさの主な要因は、サードパーティ製のパッケージが Apple Silicon をまだサポートしていない場合が多い点にある。
たとえば、Python で機械学習をしようと思ったら誰でも一度は使ったことがあるはずの scikit-learn もそのひとつ。 現在の最新バージョン (1.0.1) でも、Apple Silicon の環境では pip を使った正攻法ではインストールできない。 ただし、以下のドキュメントを読むとわかるとおり、Apple Silicon の環境でインストールする唯一の方法として Miniforge を使うことが挙げられている。
Miniforge は、ざっくり言うと利用するリポジトリがデフォルトで conda-forge 1 になっている Miniconda と考えれば良い。
また、公式のリポジトリには An emphasis on supporting various CPU architectures (x86_64, ppc64le, and aarch64 including Apple M1).
という文言がある。
話が少し脱線するけど、Anaconda 社の運営する公式リポジトリは、現在では大規模な商用利用が有償になっている。 もし、まだ気づいていない人がいたら注意しよう。 その逃げ道としても、Miniforge は有力な選択肢と考えられる 2。
前述した conda-forge のリポジトリでは、コミュニティが Apple Silicon の環境向けにビルドした多数のバイナリパッケージを提供している。 そのため、正攻法でインストールしにくいパッケージもすんなりインストールできることが多い。
今回使った環境は次のとおり。
$ sw_vers ProductName: macOS ProductVersion: 12.0.1 BuildVersion: 21A559 $ uname -m arm64 $ sysctl machdep.cpu.brand_string machdep.cpu.brand_string: Apple M1 $ pyenv --version pyenv 2.2.2 $ conda -V conda 4.10.3
もくじ
下準備
今回は、個人的に使い慣れた Pyenv から Miniforge をインストールする手順にした。 とはいえ、別に公式からインストーラを落としてきて入れる方法でももちろん構わない。 むしろ、普段から Pyenv を使っていないのであれば、そちらの方がハマりにくいと思う。
Pyenv は Homebrew を使ってインストールする。
$ brew install pyenv
シェルは zsh を使っているので、~/.zshrc
に Pyenv の設定を追加する。
$ echo $SHELL /bin/zsh $ cat << 'EOF' >> ~/.zshrc if which pyenv >/dev/null 2>&1; then export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init --path)" eval "$(pyenv init -)" fi EOF $ source ~/.zshrc
Miniforge をインストールする
続いて、Pyenv から Miniforge をインストールする。
miniforge3
を指定すれば、Python3 版の最新の安定版が入るはず。
$ pyenv install miniforge3
インストールしたら、Pyenv で利用する Python 実行環境として miniforge3
を追加する。
$ cat << 'EOF' >> ~/.pyenv/version system miniforge3 EOF
これで conda
コマンドが使えるようになる。
$ conda -V conda 4.10.3
自動で base
環境をアクティベートしないように設定を投入しておく。
$ conda config --set auto_activate_base false
Miniforge を使って仮想環境を作る
仮想環境を作る手順は、一般的な Conda のやり方と変わらない。
まずは conda create
で仮想環境を作る。
$ conda create -y -n venv python=3.9
これで base
以外の環境が作られる。
$ conda env list # conda environments: # base * /Users/amedama/.pyenv/versions/miniforge3 venv /Users/amedama/.pyenv/versions/miniforge3/envs/venv
Conda のスクリプト類にパスを通すために conda init
を実行して設定を読み込む。
$ conda init zsh
$ source ~/.zshrc
これで conda activate
で仮想環境を切り替えられるようになる。
$ conda activate venv (venv) $ (venv) $ python -V Python 3.9.7
作った直後なので最低限のパッケージだけが入っている。
(venv) $ pip list Package Version ---------- ------- pip 21.3.1 setuptools 59.2.0 wheel 0.37.0
Miniforge でサードパーティ製のパッケージをインストールする
ここからが今回の本題で、前述した scikit-learn を conda install
でインストールしてみよう。
(venv) $ conda install -y scikit-learn
次のように、あっさりインストールできる。 ちなみに一緒に入った NumPy なんかも、現状では正攻法でインストールしようとするとつまずきやすい 3。
(venv) $ pip list Package Version ------------- ------- joblib 1.1.0 numpy 1.21.4 pip 21.3.1 scikit-learn 1.0.1 scipy 1.7.3 setuptools 59.2.0 threadpoolctl 3.0.0 wheel 0.37.0
もちろん、ちゃんと例外にならずインポートできる。
(venv) $ python -c "import sklearn"
LightGBM なんかも、このとおり。
(venv) $ conda install -y lightgbm
(venv) $ python -c "import lightgbm as lgb"
まとめ
将来的にはサードパーティ製のパッケージが徐々に Apple Silicon を公式でサポートしていって、Miniforge を使う必要性は薄れていくと思う。 とはいえ、それが一体いつなのかは分からない。 ひとまず、問題ないと感じられる日が来るまでは Apple Silicon 環境では Miniforge を使っておこうと思う。