🐍

uvでPython仮想環境を作ってみた

2024/06/04に公開

uvとは

私が少し触った感想は めっちゃ早くて高機能なvenv + pip(pip-tools) です。

https://astral.sh/blog/uv

公式の説明を翻訳に投げた結果です。

  • Rust製のPythonパッケージインストーラリゾルバー(依存関係を解決するもの)

  • 従来のpippip-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を使ってインストールしました。

terminal
brew install uv

インストールできたかの確認

terminal
$ uv -V
uv 0.2.5 # 出力結果

めちゃ簡単ですね✨

curlの場合

terminal
curl -LsSf https://astral.sh/uv/install.sh | sh

仮想環境作成

uvを使用して仮想環境を作成します。作成自体はとても簡単で、作業ディレクトリで以下のコマンドを入力するだけです。
[NAME]には仮想環境の名前を指定できます。何も指定しない場合は、デフォルトの.venvと言う名前で作られます。

ワークスペース
uv venv [NAME]

create & activate

terminal
$ 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(:|)

個人的にここでの速さの違いに驚きました。公式では以下のような比較結果となっています。
alt text

バージョン指定

私は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をインストールしてみます。(時間かかるやつのイメージ)

terminal
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でもインストールしてタイム比較してみた
uv
$ 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
pip
$ 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をつけることで、一覧を確認できます。

terminal
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-tools

pip compile
先ほどインストールしたpytorch類のパッケージをcompileします。

$ uv pip freeze | uv pip compile - -o requirements.txt

一度フリーズ(標準出力)したものを入力としてcompileしている感じですかね。

requirements.txt
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

これらの実行速度の違いも顕著です。

alt text
リゾルバー(左)とインストール(右)

pip freeze
普通にpip freezeもできます

$ uv pip freeze > requirements.txt

感想

uvを使って仮想環境を作ってみました。
速いのはもちろんですが、新しく覚えるコマンドがほとんどなく、uv pip installのように先頭にuvをつけるだけで使えるのがいいですね。
いかに高機能で便利なツールでも、私自身使いこなせる自信がないので、簡単に始められて覚えることの少ないツールはありがたいです。
今後どのように進化していくかが楽しみです✨

参考サイト

https://pypi.org/project/uv/

https://astral.sh/blog/uv

https://gihyo.jp/article/2024/03/monthly-python-2403

https://github.com/jazzband/pip-tools

Discussion