CUBE SUGAR CONTAINER

技術系のこと書きます。

Apple Silicon 版の Mac で Miniforge を使ってサードパーティ製のパッケージをインストールする

これを書いている現在 (2021-11)、Apple Silicon 版の Mac を使って Python の開発環境を整えようとすると、なかなかしんどい。 しんどさの主な要因は、サードパーティ製のパッケージが Apple Silicon をまだサポートしていない場合が多い点にある。

たとえば、Python で機械学習をしようと思ったら誰でも一度は使ったことがあるはずの scikit-learn もそのひとつ。 現在の最新バージョン (1.0.1) でも、Apple Silicon の環境では pip を使った正攻法ではインストールできない。 ただし、以下のドキュメントを読むとわかるとおり、Apple Silicon の環境でインストールする唯一の方法として Miniforge を使うことが挙げられている。

scikit-learn.org

Miniforge は、ざっくり言うと利用するリポジトリがデフォルトで conda-forge 1 になっている Miniconda と考えれば良い。 また、公式のリポジトリには An emphasis on supporting various CPU architectures (x86_64, ppc64le, and aarch64 including Apple M1). という文言がある。

github.com

話が少し脱線するけど、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 を使っておこうと思う。


  1. Anaconda 社ではなく、コミュニティが運営している Conda 形式のパッケージを配布するリポジトリ

  2. 大規模に利用していた企業が有償になったからといってコミュニティにフリーライドし始めるのが正しいのか、という話は別にあるとして

  3. まだ Wheel 形式のバイナリが提供されていないため、ソースコード配布物 (sdist) からビルドすることになる