Skip to content

Instantly share code, notes, and snippets.

@junkor-1011
Last active April 6, 2024 05:45
Show Gist options
  • Save junkor-1011/df4656563ce50733bfc1db4b0aecfe90 to your computer and use it in GitHub Desktop.
Save junkor-1011/df4656563ce50733bfc1db4b0aecfe90 to your computer and use it in GitHub Desktop.
mambaforgeによるPython環境構築

mambaforge(miniforge)によるPython環境構築

概要

システムでインストールするPython(aptやyum, dnfなどでインストールしたり管理するもの)だとバージョンの指定が出来なかったり、 使用するディストリビューションによって使えるバージョンや依存ライブラリに制限がかかり、所望の環境を作れないことがある。

MiniforgeおよびMambaforgeを使うことで、 使うLinuxディストリビューションに対する依存性を極力小さくして移植性・再現性を持たせつつ様々なケースでPython環境の構築が可能になる。

類似するツールとの比較

  • Anaconda
    • ライセンスの関係で商用利用に制限(有償)、デフォルト環境が大量のライブラリを含むためインストールサイズが巨大になる
  • miniconda
    • ミニマルかつCLIベースでの利用のみが想定されているAnaconda、といった感じ
    • defaultチャンネルはAnacondaリポジトリが設定されており、Anaconda同様商用利用には注意が必要

miniforgeはdefaultチャンネルがコミュニティベースのconda-forgeリポジトリ(商用利用の制限無し)に設定されているminiconda、といった感じで使用感に差が無い。 mambaforgeはminiforgeに更にcondaの代替コマンドであるmamba(condaコマンドと互換性があり、C++で実装されているため高速)を追加したもの、といった感じ。

使えるライブラリのバリエーションはAnaconda公式リポジトリよりもconda-forgeリポジトリの方が多く、 そういった意味でもminiforge / mambaforgeを使うと多様なユースケースを満たす環境構築が可能 (もっとも、Anaconda公式リポジトリ版の方が安定性が高いとかそういうことはありそう)

インストール

基本的に公式リポジトリの記載に従う

# Mambaforgeのインストール

# installerをダウンロード
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh"

# installerの実行(対話形式で色々聞かれるので、適宜答えていく)
bash Mambaforge-$(uname)-$(uname -m).sh

# ※インスールパスをデフォルトから変える場合
bash Mambaforge-$(uname)-$(uname -m).sh -p /path/to/mambaforge-install-dir

Miniforgeや、pypy版のものを使う場合は適宜URLおよびインスールスクリプトのファイル名を修正する。

スクリプト実行後、次に実行すべきコマンドが表示されるのでその指示に従うとインスールが完了する。

# mambaforgeのbase環境に入る。YOUR_SHELL_NAMEはbashやzshなど
eval "$(/path/to/<Mambaforgeのインスール場所>/bin/conda shell.YOUR_SHELL_NAME hook)"

# ↓で.bashrcや.zshrcが自動アップデートされる
conda init YOUR_SHELL_NAME # YOUR_SHELL_NAMEはbashやzshなど

ここまでの手順を実行すると、次からshellを開いたときに自動でmambaforgeのbase環境に入るようになる

システムのPythonをデフォルトで使いたい場合

個人的には普通にシステム標準のPythonをそのまま使いたいケースも多く、 上記の手順によって乗っ取られる感じになるのは避けたい場合がある。

こうした状況の場合、conda initによる.bashrc.zshrcの自動アップデートは行わない。 こうすれば普段はシステム標準のPythonがデフォルトで使われるままになる。 (mambaforgeにPATHが通っていないので、システム的にはインストールしていないのと同じ状態)

mambaforgeを使いたいときは、セットアップ用のスクリプトをsourceなどで読み込めば良い。 すなわち、

# bash, zsh
source /path/to/<Mambaforgeのインストールディレクトリ>/etc/profile.d/conda.sh
source /path/to/<Mambaforgeのインストールディレクトリ>/etc/profile.d/mamba.sh

によって、condaコマンドとmambaコマンドが使えるようになる。 なお、この段階では単にcondamambaが使えるだけで、まだPythonはシステム標準のままである。

この状態で

conda activate base

# mamba.shを読み込んでいればこちらでも可
mamba activate main

をすることでMambaforgeのbase環境に入り、PATHも書き換わってMambaforgeのPythonを優先して使うようになる。

若干手間だが、普段はシステム標準のPythonを使いつつ、必要に応じてスポットでcondaを使いたいときはこのようなやり方ができる

基本的な使用方法

要するにcondaコマンド(mambaコマンド)の使い方。

デフォルトチャンネルがconda-forgeに設定されているだけでminicondaやAnacondaと全く同じなので、 その辺りのリファレンスや解説記事の内容がそのまま使える。

公式リファレンス:

個人的に優先度の高い?コマンドを一応まとめておく

なお、Mambaforgeであればmambaコマンドが使えるので、以下の手順においてcondamambaにしてもそのまま同じように動作する

conda仮想環境

参考:

base環境はあまり汚さず、用途ごとに使い捨てのconda仮想環境を作成・管理する方がメンテナンス上良いことが多い。

アドホックな感じで使う環境であれば、

conda create -n <作成するconda仮想環境名> python=<使いたいバージョン> (+その他使いたいライブラリ)

のような感じで作れる

例えば、

# python 3.9系を使用し、はじめにjupyterlabをインストールしておきたい
conda create -n py39-jupyter python=3.9 jupyterlab

# これも↑と同じ
conda create -n py39-jupyter python==3.9.* jupyterlab

===をライブラリ名の後に付けることでバージョンを指定出来る。==の方が詳細で、SemVerのパッチバージョンまで指定する。 また、ワイルドカード*も指定出来る。

作成済みのconda仮想環境の一覧を見るには

conda info --env

を実行する。

作成したconda仮想環境を有効にするには、

conda activate <conda仮想環境名>

とする。

パッケージのアップデートなどは、

# 依存関係の解決に時間かかるので、使えるならconda -> mambaに置き換えたほうが快適かもしれない

# パッケージの追加
conda install <パッケージ名>

# パッケージの削除
conda uninstall <パッケージ名>

# パッケージのアップデート
conda update <パッケージ名>

などと出来る。

ただし、環境作成後に上記のコマンドを多数繰り返していくと再現性が取りづらくなりがちで、 意図しないタイミングで壊れることもあるので真面目にメンテナンスする環境ではあまり推奨しない。

yamlファイルを使ったconda仮想環境の作成

事前に一定のフォーマットに沿って記述されたyamlファイルを用意しておき、 それを読み込むことで環境を作成出来る。 yamlファイルをgitなどでバージョン管理しておくことで、どのようにしてその仮想環境を作ったのかが相対的に管理しやすくなるので個人的には推奨

yamlファイルは既存の環境からエクスポートしたもの(後述)が使える他、以下のように最低限の条件を指定出来る。

# create-env-example.yaml

# name: 作成されるconda仮想環境の名前になる
name: jupyter-example
# channesls: miniforge/mambaforgeではデフォルトがconda-forgeなので無くても同じ挙動になるが、移植性のため一応書いておく
channels:
  - conda-forge
# dependencies: condaでインストールするライブラリ(依存関係は自動で解決され、インストールされる)。必要に応じて詳細にバージョンを指定できる。
dependencies:
  - python==3.10.9
  - jupyterlab
  - pandas
  - numpy
  - matplotlib
  - seaborn
  - pyarrow
  - polars
  # pipで入れたいものがある場合は以下も記述
  - pip
  - pip:
    # ↓のライブラリはpipでインストールされる
    - python-language-server[all]
    - pyls-black
    - pyls-isort
    - pyls-mypy
    - yapf

↑のように用意したyamlファイルを使って、公式リファレンスのようにして

# yamlファイル名は実際に使うものの名前に置き換える
conda env create -f create-env-example.yaml

のようにconda仮想環境を作成できる

conda仮想環境のexport

pip freezeのconda版と言える。 現在の仮想環境の状況を完全に再現するための情報をexportすることができ、ここで生成したyamlファイルをgitなどで管理することで追跡性や再現性を高めることが出来る。

例えば、

# 現在の環境をexport
conda env export > env_freeze.yaml

# 仮想環境名を指定
conda env export -n <conda仮想環境名> > env_freeze.yaml

のようにするとenv_freeze.yamlに環境を書き出すことが出来る。 (依存関係も含めた全てのライブラリに関して、詳細なバージョン情報に加えてリポジトリやビルドバージョン?なども記述されている)

なお、yamlファイルを使ったconda仮想環境の作成でこのyamlファイルを使用できるが、仮想環境名のnameやインストールパスのprefixなどは適宜変更や削除(prefix)したりすると良い

conda仮想環境の削除

reference - remove

conda remove -n <conda仮想環境名> --all

その他参考リンクなど

Pipenv, Poetryとの連携

condaはパッケージ管理ツールとしては機能が貧弱だったり、conda仮想環境は結構ファットな感じでストレージもかさみがちだったり、といったデメリットもあるので、 conda仮想環境を使わずにpipenvやpoetryで環境構築をしたい場合も普通に結構ある。

ただ、これらのツールで管理出来る対象は基本的にpipでインストール出来るライブラリである。使用するPythonのバージョンの制約条件も記述出来るが、そのバージョンのPythonを用意するのは別途自分でやらないといけない。

pyenvを使うことでもこの課題は解消出来るが、pyenvで指定したPythonのインストールを行うと依存ライブラリの関係でWarningなどが出て大変なこともある。

別解としてmambaforgeなどを使うことでも対処出来るので紹介しておく。

共通したアプローチとして、所望のPythonのバージョンのなるべくミニマルなconda仮想環境を作っておき、その環境のpythonを使ってvenvの仮想環境を作る、といったものになる。

準備(共通)

例えばPython3.9系でやるとして、以下のようなyamlファイルを作成する

# create-env-py39.yaml
name: py39
channels:
  - conda-forge
dependencies:
  - python=3.9
  - pipenv
  - poetry
  - pip

mambaforgeのbase環境に入り、上記のyamlファイルから仮想環境を作成してactivateする

# conda仮想環境作成
conda env create -f create-env-py39.yaml

# conda仮想環境のactivate
conda activate py39

Pipenvプロジェクトの作成

プロジェクトを作成するディレクトリに移動し、

# conda仮想環境をactivateしておく(今回の例だとpy39)

# venv仮想環境をプロジェクト直下に作る設定でpipenvプロジェクトを開始する
PIPENV_VENV_IN_PROJECT=true pipenv install

なお、pyenvなどでインストールした他のバージョンのpythonがあると、そちらで勝手に仮想環境を作り始めることがある。そうした場合は面倒だがPipfile以下のような感じで修正し、

# Pipfile(抜粋)
[requires]
python_version = "3.9" # <- ここを所望のバージョンに直す

ついで既に作成済みの.venvを一回消去してからpipenv installをやり直す。

内部的にmambaforgeのPythonを参照している.venvをプロジェクト直下に作ることで、以降はconda activate不要となる。 すなわち、プロジェクト作成以降はcondaではなくシステムでインストールしたpipenvを普通に使えば良い。 (むしろmambaforgeは無効にしておくと良い)

# conda activateはせず、システムのPython, pipenvを使う

pipenv install <package-name>
pipenv install --dev <package-name>
pipenv shell
# (...)

Poetryプロジェクトの作成

プロジェクトを作成するディレクトリに移動し、以下のコマンドを実行

# conda仮想環境をactivateしておく(今回の例だとpy39)

# venv仮想環境を作成
python -m venv .venv # この.venvはmambaforgeのpythonを参照する

# poetryプロジェクトを作成
poetry init # 対話形式で色々聞かれるので適宜返答する

以降はcondaではなくシステムでインストールしたpoetryを使ってこのプロジェクトを管理する。

# conda activateはせず、システムのPython, poetryを使う

poetry add <package-name>
poetry add --group dev <package-name>
poetry shell
# (...)
# name: 作成されるconda仮想環境の名前になる
name: jupyter-example
# channesls: miniforge/mambaforgeではデフォルトがconda-forgeなので無くても同じ挙動になるが、移植性のため一応書いておく
channels:
- conda-forge
# dependencies: condaでインストールするライブラリ(依存関係は自動で解決され、インストールされる)。必要に応じて詳細にバージョンを指定できる。
dependencies:
- python==3.10.9
- jupyterlab
- pandas
- numpy
- matplotlib
- seaborn
- pyarrow
- polars
# pipで入れたいものがある場合は以下も記述
- pip
- pip:
# ↓のライブラリはpipでインストールされる
- python-language-server[all]
- pyls-black
- pyls-isort
- pyls-mypy
- yapf
name: py39
channels:
- conda-forge
dependencies:
- python=3.9
- pipenv
- poetry
- pip
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment