Rust製の爆速パッケージマネージャpixiをProxy環境下でも使いたい
はじめに
こんにちは、manuriya(@lTlanual)と申します。普段は航空写真や衛星画像を用いた深層学習モデルの開発を仕事としています。今回はRust製パッケージマネージャのpixiをProxy環境下で導入する手順とconda-forge/PyPIからのライブラリインストールの方法を解説します。
pixiとは?
prefix.devという企業の作ったクロスプラットフォーム/多プログラミング言語対応のパッケージマネージャです。実装にRustを使用しているため非常に高速に動作します。また、conda-forgeのライブラリをuvやpoetryのようにtomlやlockファイルを使ってプロジェクト単位で管理することが出来ます。
prefix.devのCEOはconda-forgeのコアメンバーかつmamba(condaをC++で再実装したパッケージマネージャ)の開発者です。下記の記事に詳しい情報が記載されているのでご興味のある方は読んでみると良いかと思います。
pixi導入の動機
以下の3点の条件を満たしていたので導入しました。
- conda-forgeからライブラリを取得できる
- 依存関係解決が高速である
- プロジェクト単位で仮想環境の管理ができる
背景
はじめににも記載の通り、普段は業務で衛星画像を使用した深層学習モデルの開発を行なっています。一般的には深層学習モデルの開発にはpytorchやtensorflowなどのフレームワークを用います。衛星画像には地図の座標情報、いわゆる地理空間情報を用いた処理を適用することもあるので、geopandasやGDALといった地理空間情報処理用のライブラリを導入する必要があります。それらライブラリの導入と管理にconda(miniconda)を用いていました。
地理空間情報がどういうものかについては下記の宙畑さんの記事がわかりやすいかと思います。大きく分けると画像などのラスターデータとポリゴンなどのベクターデータがあり、それらを使用することで特定座標に対する処理を行うことが出来ます。
poetryやuvの問題点
そもそもpoetryやuvを使わずcondaを使用していた理由ですが、GDALのインストールと管理がPyPIだと大変だからです。下記の記事にあるようにPyPI経由でGDALをインストールする際、Ubuntuの場合はaptでlibgdal-devを別途インストールし、バージョンの整合性を取っておく必要があります。
そうした際に
- 管理者権限がなくaptが使えないため環境構築ができない
- うっかりapt upgradeしてバージョンの整合性が取れなくなりエラーが発生する
といった問題が想定されます。そうした問題を避けるためGDALのバージョンを一括で管理可能なcondaを採用していました。
condaの問題点
ではcondaを使ってめでたしめでたしかと言うとそうではありません。個人的には以下の2点が問題であると感じています。
- 依存関係の解決速度が遅い
- プロジェクト単位で仮想環境の管理が難しい
一つ目の依存関係の解決速度についてですが、これはcondaの大部分がpython製であることに起因しています。mambaを適用することで解決速度は改善されましたがわざわざ別のライブラリを導入する必要があるのは面倒です。
二つ目のプロジェクト単位で環境構築が難しいという点についてですが、conda env create
で各プロジェクトに合わせた仮想環境を作ってしまえば実現はできます。ただしactivateする仮想環境をプロジェクト毎に覚えておく必要があり、poetryやuvのようなtomlやlockファイルによる管理が望ましいです。
pixiと各パッケージマネージャの比較
先ほども述べた通り、パッケージマネージャに求める条件は以下の3点です。
- conda-forgeからライブラリを取得できる
- 依存関係解決が高速である
- プロジェクト単位で仮想環境の管理ができる
各パッケージマネージャを求める条件に照らし合わせてみると以下のようになります。
パッケージマネージャ | conda-forge対応 | 依存関係解決速度 | プロジェクト単位での環境管理 |
---|---|---|---|
poetry | × | △ | ◯ |
uv | × | ◯ | ◯ |
conda | ◯ | △(mamba) | × |
pixi | ◯ | ◯ | ◯ |
求める条件を全て満たしているのがpixiでしたので、導入するに至りました。
導入手順
下記のissueの情報を元にして確認しております。
確認環境
item | version |
---|---|
Ubuntu | 22.04 |
pixi | 0.39.5 |
前提条件
- Proxy環境下と別にオンラインにアクセスできる環境がある
- conda-forgeとPyPIからライブラリの取得は出来る(=下記のURLにアクセス可能)
repository | URL |
---|---|
conda-forge | https://conda.anaconda.org/conda-forge |
PyPI | https://pypi.org/simple |
事前準備
下記2つのファイルを別途取得し、Proxy環境下に移動しておいてください。
- https://github.com/prefix-dev/pixi/releases/tag/v0.39.5のPlatformに応じたファイル
- https://github.com/prefix-dev/parselmouth/blob/main/files/compressed_mapping.json
pixiの導入
バイナリファイルの展開
落としてきた圧縮ファイルの中身を~/.pixi/bin
以下に展開してください。
tar -xzf pixi-x86_64-unknown-linux-musl.tar.gz -C ~/.pixi/bin
設定の記載
PATHの追加と補完機能を有効にするため下記を~/.bashrc
に記載します。
- 他のshellの方はこちらを参考にしてください
export PATH="$HOME/.pixi/bin:$PATH"
eval "$(pixi completion --shell bash)"
Proxyの適用
環境変数に設定するだけで適用されます(bashの場合を例示)。
export http_proxy=[proxyサーバー情報]
export https_proxy=[proxyサーバー情報]
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$https_proxy
プロジェクトの作成
pixi init
でプロジェクトの作成を行います。
pixi init [プロジェクト名]
conda-forgeからライブラリの取得
以下のコマンドでライブラリが取得できれば成功です。
pixi add [取得したいライブラリ名]
// 例
pixi add rich
✔ Added rich >=13.9.4,<14
PyPIのライブラリ取得のための設定
PyPIのライブラリを取得しようとすると下記のようなエラーが発生します。
pixi add --pypi [取得したいライブラリ名]
// 例
pixi add --pypi rich
Error:
× failed to download pypi name mapping
├─▶ Request failed after 3 retries
├─▶ error sending request for url (https://conda-mapping.prefix.dev/hash-v0/
│ d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4)
├─▶ client error (Connect)
╰─▶ unsuccessful tunnel
エラー内容を見るとhttps://conda-mapping.prefix.dev
にアクセスしようとしてエラーが発生しています。そのため~/.config/pixi/config.toml
に次のように記載して回避します。
[mirrors]
"https://conda-mapping.prefix.dev" = ["https://conda.anaconda.org/conda-forge"]
~/.config/pixi/config.toml
を変更してから実行します。
// 例
pixi add --pypi rich
Error:
× failed to download pypi mapping from https://raw.githubusercontent.com/prefix-dev/parselmouth/main/
│ files/compressed_mapping.json location
├─▶ Request failed after 3 retries
├─▶ error sending request for url (https://raw.githubusercontent.com/prefix-dev/parselmouth/main/files/
│ compressed_mapping.json)
├─▶ client error (Connect)
╰─▶ unsuccessful tunnel
今度はparselmouthのcompressed_mapping.jsonにアクセスしようとしてエラーが発生しています。parselmouthはprefix.devが開発したcondaのパッケージ名とPyPIのパッケージ名のマッピングを簡単に出来るようにするツールです。ちなみにparselmouthとはハリーポッターシリーズで登場するヘビ語(parseltangue)を話せる魔法使いを指す言葉だそうです。
そのため、事前にcompressed_mapping.jsonをダウンロードしてProxy環境内に持ってきておき、[プロジェクト名]/pixi.toml
のconda-pypi-map
に取得したJSONファイルのパスを記載することで、マッピングが可能になり解決することが出来ます。
[project]
...
channels = ["conda-forge"]
conda-pypi-map = {conda-forge = "/path/to/compressed_mapping.json"}
...
実際にpixi add --pypi [取得したいライブラリ名]
を実行することでライブラリの取得と[プロジェクト名]/pixi.toml
の[pypi-dependencies]
にライブラリの情報が追加されたのが確認できます。
pixi add --pypi rich
✔ Added rich >=13.9.4, <14
Added these as pypi-dependencies.
[project]
...
channels = ["conda-forge"]
conda-pypi-map = { "conda-forge" = "/path/to/compressed_mapping.json" }
...
[dependencies]
python = ">=3.13.1,<3.14"
[pypi-dependencies]
rich = ">=13.9.4, <14"
おわりに
以上の方法によりProxy環境下であってもpixiの導入とライブラリの取得が出来るようになりました。conda-forgeを使いつつモダンなプロジェクト管理ができるようになったおかげで、個人的には開発体験がとても向上したと感じています。地理空間情報界隈だけでなくconda-forgeを選択せざるを得なかった開発者の方はこれを機にpixiの導入を検討してみてはいかがでしょうか?
最後に現在、衛星データのコミュニティに参加しています。様々なバックグラウンドを持っている方々が参加されており、定期的に勉強会も開催しています。興味ある方はぜひご参加お願いします。
また衛星×AIに特化した活動としてSatAI.challenge(@sataichallenge)という活動があります。cvpaper.challengeのリモセンAIに特化したグループとなっており、積極的に発信しております。私自身は家庭都合で参加できていないのですが、こちらも合わせてご参加いただけたらと思います。
Discussion