はじめに
研究のために、ノートPC(MacBookPro M4max 48G)にPythonの開発環境を整えています。これまでは、Anacondaで環境構築していたのですが、Anaconda有償化にともない、uvでの環境整備に移行することにしていました。
理由あってDeepLabCut(DLC)でマウスの動画解析をしようと思い立ち、uvとpipでインストールしようとしたのですが、どうやっても無理でしたので、失敗の記録を残すとともに、conda/mambaを用いたApple Silicon MacへのDLCのインストールについて解説します。
DeepLabCutとは
DeepLabCut(DLC)とは、 スイス連邦工科大学ローザンヌ校(Swiss Federal Institute of Technology in Lausanne, École polytechnique fédérale de Lausanne (EPFL))のMackenzie W. Mathis教授の研究室で開発されているソフトウェアです。深層学習(ディープラーニング)技術を用いて、動物などの動画から特定の体の部位をマーカーなしで高精度に追跡・解析することができます。2018年にNature Neuroscience誌で発表されて以来、動物の動作測定のデファクトスタンダードとなっています。
uvでのDLCインストールの試み
DLCのウェブサイトではcondaを利用したインストールが推奨されています。しかし、conda環境とuv環境を混ぜたくなかったので、まずは、uv pipインストールを試みました。
筆者はHomebrewでベース環境を構築しているので、HDF5やbzip2などのパスの設定で少々手こずりましたが、環境変数を適切に設定するなどして、一つづつ解決していきました。そして、最後に残ったのがPyTablesの問題でした。
DLCはPyTables(tables 3.8.0)に依存関係があります。ところが、このtables 3.8.0が曲者で、色々とコンフリクトをおこします。それならばと、先にtables 3.8.0をpipインストールしようとすると、ビルド途中でエラーが出て進みません。
このtables 3.8.0問題には、いろんな人が直面しているようで、GitHubやStack Overflowのスレッドでもいくつか質問がありました。それで、肝心の解決方法はというと、condaでtables 3.8.0インストールする、というものでした。
これでは、せっかくuvで環境を切り分けているのに意味がありません。仕方がないので、conda環境でDLCをインストールしたところ、一発でインストールできました。
mambaによるconda環境の構築
Homebrewでminiforgeをインストールする。
$ brew install --cask miniforge
DLCのインストールと起動
推奨のインストール方法
DLCディレクトリで作業するものとする。
yamlファイルによる環境構築
$ conda env create -f DEEPLABCUT.yaml
$ conda activate DEEPLABCUT
DLCの起動
$ python -m deeplabcut gui
結論
環境は汚れるかもしれませんが、conda/mambaでインストールしましょう。
追記
Homebrewのminiforgeでmambaをインストールすると、パスを正しく認識してくれない場合があります。そんなときは、以下のコマンドでシェルに環境変数を追記します。
$ /opt/homebrew/bin/mamba shell init
.zshrc
に環境変数を書き込んでくれます。
Running `shell init`, which:
- modifies RC file: "/Users/xxxxx/.zshrc"
- generates config for root prefix: "/opt/homebrew/Caskroom/miniforge/base"
- sets mamba executable to: "/opt/homebrew/bin/mamba"
The following has been added in your "/Users/xxxxx/.zshrc" file
# >>> mamba initialize >>>
# !! Contents within this block are managed by 'mamba shell init' !!
export MAMBA_EXE='/opt/homebrew/bin/mamba';
export MAMBA_ROOT_PREFIX='/opt/homebrew/Caskroom/miniforge/base';
__mamba_setup="$("$MAMBA_EXE" shell hook --shell zsh --root-prefix "$MAMBA_ROOT_PREFIX" 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__mamba_setup"
else
alias mamba="$MAMBA_EXE" # Fallback on help from mamba activate
fi
unset __mamba_setup
# <<< mamba initialize <<<
忘れずに更新します。
$ source .zshrc