pixi は次世代 Python パッケージマネージャ。

  • conda, mamba の置き換えが可能
    • 仮想環境をつくり、conda/mamba (=conda-forge) のパッケージおよび pip (=PyPI) のパッケージを一括で管理することができる。
    • uvuv pip と異なり、環境内に本物と同じ pip コマンドをそのまま入れることができるので問題も発生しにくい
  • conda-forge からダウンロードできる幅広いツールを入れることができる
  • global 環境にインストールすることによりどこでもコマンドを実行できるようになるため、apt, homebrew のような役割も果たせる。
    • global というが、すべてのファイルは $HOME/.pixi に落とされるので、パッケージはユーザーごとに管理される。
    • pixi 公式のインストールスクリプトは、本質的にはこのディレクトリを作りこのディレクトリにパスを通している
    • なのでこのディレクトリ自体を消すだけで pixi 全体がアンインストールされる。簡単!

パッケージを global 環境にインストール

上に書いたように pixi はホーム以下にパッケージを落とすので、ここで言う global とはシステム全体という意味ではなく「ユーザー全体」「特定のプロジェクト内だけではない」という意味。

インストールするには pixi global install xxx 。インストールしたコマンドは $HOME/.pixi/bin にバイナリが配置されるのでこれを PATH に加える。

conda-forge が丸ごと使えるので有名どころはインストールできる。

  • nvim, fish, fzf, yazi, fd, zellij など
  • fd が fd-find になっていたりと、パッケージ名とがコマンド名が違うことが時々あるので conda-forge を検索する。
    • ex. pixi search '*fd*'fd-find を見つけた後、 pixi search fd-find をすると詳細な情報を見られる

環境のバックアップ・復元

インストールされたシェルツールのリストは $HOME/.pixi/manifests/pixi-global.toml に保存されている。これをバックアップしておけば、新しい PC にコピーしてきて

pixi global sync

で開発環境をすぐに再現することができる。

cf. pixi global でシェルツールを華麗に管理する

conda/mamba を置き換え、仮想環境マネージャとして使う

Conda と比較したときのコマンドの対応表が Conda/Mamba - Pixi by prefix.dev にある。
シナリオごとにまとめ直すと以下のとおり

仮想環境の作り方

pixi init env_name
cd env_name && pixi shell # env_name環境での新たなシェルを起動。
pixi add python=3.12 # バージョンは好きに選ぶ。
pixi run python3 ...

PyPI パッケージのインストール方法

cf. Conda & PyPI - Pixi

pixi run python3 -m ensurepip # これでpip3が使えるようになる。`which pip3` で同様に確認する。これを行った上で……
pixi run pip3 installl ... # ……これでpipを使ってインストールできる。または……
pixi add numpy==1.26 --pypi # これがpixiの推奨するPyPIパッケージのインストール方法。依存関係がすべて pyproject.toml or pixi.toml に置かれる

troubleshoot: git url, index-url などを pixi で指定して管理する

TODO

この辺の内容はまだ書きかけ

pixi add 'xxx @ yyy.whl' みたいに書くこともできるが、pixi.toml での記法を覚えてしまって直接書きこむほうが速い。cf. Pixi Manifest - Pixi

pip install git+https://github.com/EasternJournalist/utils3d.git@9a4eb15e4021b67b12c460c7057d642626897ec8
pip install xformers==0.0.27.post2 --index-url https://download.pytorch.org/whl/cu118
pip install kaolin -f https://nvidia-kaolin.s3.us-east-2.amazonaws.com/torch-2.1.0_cu118.html

上記のようなコマンドはそれぞれ以下のように書くとよい

[pypi-dependencies]
utils3d = { git = "https://github.com/EasternJournalist/utils3d.git", rev = "9a4eb15e4021b67b12c460c7057d642626897ec8" }
xformers = {"==0.0.27.post2", index = "https://download.pytorch.org/whl/cu118"}
kaolin = "*"
 
[pypi-options]
index-url = "https://pypi.org/simple"
find-links = [{url = "https://nvidia-kaolin.s3.us-east-2.amazonaws.com/torch-2.4.0_cu121.html"}]

チャンネルを指定する

TODO

この辺の内容はまだ書きかけ

conda install pytorch==2.4.0 torchvision==0.19.0 pytorch-cuda=12.1 -c pytorch -c nvidia のように channel 優先度を指定してインストールするコマンドをよく見る。
pixi では pixi workspace channel add conda-forge nvidia として事前にチャンネル優先順位を指定する。
pixi.toml に

[workspace]
channels = ["pytorch", "nvidia", "conda-forge"]

のように追加されているはず。

pixi で CUDA を管理する にあるが基本的に conda-forge が優先でいいんじゃなかろうか。その場合チャンネルを指定する必要はない(pixi ではデフォルトでチャンネルは conda-forge が最優先なので)

conda-forge では CUDA 12, 13 以上推奨, 11 以下は nvidia channel の方がメンテナンスが手厚い印象です.
細かいところでは, 他の package との cuda version を調整するための  cuda-version meta package が conda-forge 版で対応していたり, C/C++ compiler が  c/cxx-compiler のような meta package が付属します.

代表的なチャンネルの例

pytorch channel は deprecated なので今後は使わない。昔のものを再現するときには使ってもいいが。例:

[workspace]
channels = ["pytorch", "nvidia/label/cuda-12.1.0", "nvidia", "conda-forge"]
 
[dependencies]
pytorch = "2.4.0.*"
pytorch-cuda = "12.1.*"
cuda = "==12.1"
  • pytorch で pytorch のバージョンを指定し、pytorch-cuda で GPU 機能を使えるようにするのが pytorch channel の流儀
    • pytorch-cuda パッケージがないと pytorch が CPU 版になる。さらに cuda パッケージで対応する cuda をインストール
    • nvidia/label/cuda-12.1.0 は cuda パッケージが特定のバージョンの cuda を落とすようにするためのチャンネル

……が、素直に PyPI のパッケージを落としてくるほうが楽

[pypi-dependencies]
torch = {version = "==2.4.0", index = "https://download.pytorch.org/whl/cu121"}
torchvision = "==0.19.0"

もしくは、conda-forge 一神教の教義に従うのなら、

[workspace]
authors = ["Shu Nakamura <snakamura@vision.ist.i.kyoto-u.ac.jp>"]
channels = ["conda-forge"]
name = "test"
platforms = ["linux-64"]
version = "0.1.0"
 
[system-requirements]
# ソルバーの __cuda エラーを回避し、GPUパッケージの選択を許可する設定
cuda = "12.1"
 
[dependencies]
python = "3.10.*"
# pixiでCUDAツールキット(nvccやライブラリ群)を環境内に引っ張ってくる
cuda-toolkit = "12.1.*"
# conda-forgeのPyTorchは、環境内のCUDAバージョンに合わせてGPU版が自動選択される
pytorch = "2.5.*"

このようなエラーが出るのは、pixiでは指定順上位のchannelでパッケージが見つかったが特定のバージョンが見つからなかった場合、サイレントで下位のchannelにフォールバックするのではなく明示的にエラーを出す ようになっているから。
libnvjitlink = {channel = "nvidia"} のようにチャンネルを明示的に指定して解決
`

仮想環境を起動する

pixi shell # デフォルトpixi環境でシェルを起動。または……
cd env_name && pixi shell # ……env_name環境での新たなシェルを起動。
python3 ... # コマンドを実行

もし conda activate のように、既存のシェルを保ったまま仮想環境に入りたい場合は

eval "$(pixi shell-hook)"

とする。(Shell - Pixi by prefix.dev)

または、上で何度かやっているように

pixi run python3 ...

のようにすることで、直接仮想環境でプログラムを実行することができる。

環境を一度消してやり直す

pixi clean -e env_name

さらに詳しく

より詳しい pixi の活用法について、以下が参考になる

pixi.tomlとpyproject.tomlの使い分け

anacondaのchannelについて