uvでPython仮想環境を作ってみた
uvとは
私が少し触った感想は めっちゃ早くて高機能なvenv + pip(pip-tools) です。
公式の説明を翻訳に投げた結果です。
-
Rust製のPythonパッケージインストーラとリゾルバー(依存関係を解決するもの)
-
従来の
pip
やpip-tools
のワークフローを置き換えることを目的としてる
下記にuvの特徴もいくつか示します。
- ⚡️ Rustで開発されており、高速かつ信頼性が高い、さらに使いやすい
-
pip
およびpip-tools
(pip-compileやpip-syncなど)よりも10〜100倍早い)
-
- 🐍 簡単にインストール可能
-
curl
,powershell
,pip
,pipx
,brew
-
- 💻 マルチプラットフォーム対応
- macOS, Linux, Windows
- 🧰 依存関係のバージョンオーバーライドや代替の解決戦略などを提供
- !? 衝突追跡リゾルバーによる最適なエラーメッセージを提供
- 🧪 上位10,000のPyPIパッケージに対して大規模テストを実施済み
uvが現在(v0.2.5時点で)対応しているPythonバージョンは3.8~3.12
になります。
uvインストール
私はM1チップのmacbook Airを使用しています。
brew
を使ってインストールしました。
brew install uv
インストールできたかの確認
$ uv -V
uv 0.2.5 # 出力結果
めちゃ簡単ですね✨
curlの場合
curl -LsSf https://astral.sh/uv/install.sh | sh
仮想環境作成
uvを使用して仮想環境を作成します。作成自体はとても簡単で、作業ディレクトリで以下のコマンドを入力するだけです。
[NAME]には仮想環境の名前を指定できます。何も指定しない場合は、デフォルトの.venv
と言う名前で作られます。
uv venv [NAME]
create & activate
$ uv venv
Using Python 3.10.0 interpreter at: /Users/xxx/.pyenv/versions/3.10.0/bin/python3
Creating virtualenv at: .venv
Activate with: source .venv/bin/activate
xxx:uv_test1(:|✔)
$ source .venv/bin/activate
(uv_test1) xxx:uv_test1(:|✔)
個人的にここでの速さの違いに驚きました。公式では以下のような比較結果となっています。
バージョン指定
私はpyenvを普段使用しているので、それに合わせてインストールしているインタプリタを指定しています。オプションは-p
や--python
になります。
$ uv venv -p /Users/xxx/.pyenv/versions/3.11.0
Using Python 3.11.0 interpreter at: /Users/xxx/.pyenv/versions/3.11.0/bin/python3
Creating virtualenv at: .venv
Activate with: source .venv/bin/activate
xxx:uv_test2(:|✔)
バージョン管理とかはRyeを使うといいんですかね、、よくわかってないです。
ただ、Ryeは今後uvに置き換わっていく、、?
pytorchをインストール
ここでは実際にpytorchをインストールしてみます。(時間かかるやつのイメージ)
uv pip install torch torchvision torchaudio
実行結果
$ uv pip install torch torchvision torchaudio --no-cache
Resolved 13 packages in 565ms
Downloaded 13 packages in 29.34s
Installed 13 packages in 242ms
+ filelock==3.14.0
+ fsspec==2024.5.0
+ jinja2==3.1.4
+ markupsafe==2.1.5
+ mpmath==1.3.0
+ networkx==3.3
+ numpy==1.26.4
+ pillow==10.3.0
+ sympy==1.12.1
+ torch==2.3.0
+ torchaudio==2.3.0
+ torchvision==0.18.0
+ typing-extensions==4.12.1
pipでもインストールしてタイム比較してみた
$ time uv pip install torch torchvision torchaudio --no-cache
...
uv pip install torch torchvision torchaudio --no-cache 4.17s user 5.12s system 29% cpu 31.199 total
$ time pip install torch torchvision torchaudio --no-cache
...
pip3 install torch torchvision torchaudio --no-cache 17.99s user 4.67s system 33% cpu 1:08.43 total
uv 31秒
pipの場合1分8秒
わー^ ^
パッケージ一覧表示
pip list
コマンドの前にuv
をつけることで、一覧を確認できます。
uv pip list
一覧
$ uv pip list
Package Version
----------------- --------
filelock 3.14.0
fsspec 2024.5.0
jinja2 3.1.4
markupsafe 2.1.5
mpmath 1.3.0
networkx 3.3
numpy 1.26.4
pillow 10.3.0
sympy 1.12.1
torch 2.3.0
torchaudio 2.3.0
torchvision 0.18.0
typing-extensions 4.12.1
pip compile + pip sync
uvではpip-tools
の機能も併用することができます。
pip-tools
とは、Python パッケージの依存関係管理を支援するためのコマンドラインツールセットであり、pip-compile
, pip-sync
の2つのコマンドで操作します。
- pip-compile
- 依存関係からバージョンを固定したrequirements.txtを作成
- pip-toolsの場合は、pyproject.toml, setup.cfg, setup.py, or requirements.inなどの別ファイルから依存関係を解決したrequirements.txtを作成します。
- pip-sync
- 作成したrequirements.txtからその環境に同期(インストール)します。
pip compile
先ほどインストールしたpytorch類のパッケージをcompileします。
$ uv pip freeze | uv pip compile - -o requirements.txt
一度フリーズ(標準出力)したものを入力としてcompileしている感じですかね。
requirements.txt
# This file was autogenerated by uv via the following command:
# uv pip compile - -o requirements.txt
filelock==3.14.0
# via torch
fsspec==2024.5.0
# via torch
jinja2==3.1.4
# via torch
markupsafe==2.1.5
# via jinja2
mpmath==1.3.0
# via sympy
networkx==3.3
# via torch
numpy==1.26.4
# via torchvision
pillow==10.3.0
# via torchvision
sympy==1.12.1
# via torch
torch==2.3.0
# via
# torchaudio
# torchvision
torchaudio==2.3.0
torchvision==0.18.0
typing-extensions==4.12.1
# via torch
個人的にそれぞれがなんのパッケージに依存しているかが書かれているのが感動しました✨
pip sync
compileで作成したrequirements.txtを元に、別のフォルダで仮想環境を作成してみます。
$ uv venv
$ source .env/bin/activate
$ uv pip sync requirements.txt
これらの実行速度の違いも顕著です。
リゾルバー(左)とインストール(右)
pip freeze
普通にpip freezeもできます
$ uv pip freeze > requirements.txt
感想
uvを使って仮想環境を作ってみました。
速いのはもちろんですが、新しく覚えるコマンドがほとんどなく、uv pip install
のように先頭にuv
をつけるだけで使えるのがいいですね。
いかに高機能で便利なツールでも、私自身使いこなせる自信がないので、簡単に始められて覚えることの少ないツールはありがたいです。
今後どのように進化していくかが楽しみです✨
参考サイト
Discussion