[v0.3.1] uvã ãã§Pythonãããžã§ã¯ãã管çãã
ãã¥ãŒãªã³ã°ã®E2Eèªåé転ããŒã ã®å²©æ¿(@colum2131)ã§ãã
2024幎8æ20æ¥ã«uvã®ãã€ããŒããŒãžã§ã³ã0.3.0ã«ã¢ããããŒããããŸãããå ã ãpipã®ä»£æ¿ãšããŠèšèšãããŠããuvããPythonã®ããŒãžã§ã³ç®¡çããããã±ãŒãžç®¡çãŸã§è¡ãããšçºè¡šãããŸããã
以åã®2024幎7æã«ãŸãšããèšäºã§ã¯ã
å°æ¥çã«ã¯ãuvãRyeã«ä»£æ¿ããããã
ãšæžããŸããããå®éãRyeãPoetryãªã©ã®ä»£æ¿ãšããŠuvã®ã¿ã§Pythonã®ãããžã§ã¯ã管çãå¯èœã«ãªããŸãããRyeã§è¡ã£ãŠããæäœåæ§ã«uvã§å®è¡ã§ããããã«ãªã£ãå°è±¡ããããŸãã
ãã¥ãŒãªã³ã°ã®ã¡ã³ããŒã§ãç±å¿ãªuvãã¡ã³ããããããæ¬èšäºã§ã¯ãuvã®åºæ¬æäœãã䟿å©ãªæ©èœããŸãšããŸãã
1. uvã®åºæ¬æäœ
uvã®å ¬åŒããã¥ã¡ã³ãã¯uvã§æŽåãããŠããŸãã
1.1 uvã®install
å ¬åŒã®uv - Getting startedã«åŸã£ãŠã€ã³ã¹ããŒã«ããããšãã§ããŸããmac OSãŸãã¯Linuxã®å Žåã¯ä»¥äžã§ãã
curl -LsSf https://astral.sh/uv/install.sh | sh
ã€ã³ã¹ããŒã«åŸã«exec $SHELL -lãªã©ã§shellãåèªã¿èŸŒã¿ãè¡ããšuvãèµ·åã§ããŸããä»åçšããuvã®ããŒãžã§ã³ã¯ä»¥äžã§ãã
uv --version
> uv 0.3.1
ãŸããPyPIãããuvã®installãå¯èœã§ãã
pip install uv
pipx install uv
1.2 æ°èŠãããžã§ã¯ãã®åæå
Ryeåæ§ã«initã§æ°èŠãããžã§ã¯ããäœæããããšãã§ããŸããmy-projectã¯ä»»æã®ãããžã§ã¯ãåã§ããæ¢ã«äœæããããããžã§ã¯ãäžã«ããå Žåã¯uv initã ãã§äœæã§ããŸãã
uv init my-project
cd my-project
ãããšä»¥äžã®ãã£ã¬ã¯ããªæ§é ãäœæãããŠãpyproject.tomlãèªåã§çæãããŸãã
.
âââ README.md
âââ pyproject.toml
âââ src
âââ my_project
âââ __init__.py
pyproject.tomlã®äžèº«ã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã
[project]
name = "my-project"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
1.3 ããã±ãŒãžã®åæ
pyproject.tomlãããšã«ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã以äžã®ã³ãã³ããå®è¡ã§ããŸãã
uv sync
Ryeåæ§ã«ä»®æ³ç°å¢ãšããŠ.venvãäœæãããŠããŸããuv.lockãšããlockãã¡ã€ã«ãçæãããŸãããŸããå
šãŠã®ããã±ãŒãžãåã€ã³ã¹ããŒã«ããå Žåã¯uv sync --reinstall ã§å¯èœã§ãã
1.4 ä»®æ³ç°å¢ã®ã¢ã¯ãã£ããŒã
以äžã®ã³ãã³ãã§ä»®æ³ç°å¢ãæå¹åã§ããŸãã
. .venv/bin/activate
ç¡å¹åããå Žåã¯ä»¥äžãå®è¡ããŸãã
deactivate
1.5 PythonããŒãžã§ã³å€æŽ
Ryeåæ§ã«pinã³ãã³ãã§Pythonã®ããŒãžã§ã³ã倿Žããããšãå¯èœã§ãã.python-versionãã¡ã€ã«ãçæãããŸãã
uv python pin 3.10
ãŸãããããžã§ã¯ããåæåããéã«uv initã®åŒæ°ã«--pythonãŸãã¯-pã«ããŒãžã§ã³ãæå®ããã°è¯ãã§ãã
uv init my-project-3.10 -p 3.10
ãŸãã¯ãçŽæ¥pyproject.tomlã®requires-python = ">=3.10,<3.11"ã®ããã«æžãæããŠuv syncã§æŽæ°ããããšãå¯èœã§ãã
è©³çŽ°ãªæ å ±ã¯å ¬åŒã®uv - Python versionsãåç §ããŠãã ããã
1.6 ããã±ãŒãžã®è¿œå
uv addã§ããã±ãŒãžã远å ããããšãå¯èœã§ãã以äžã§numpyãã€ã³ã¹ããŒã«ããŸãã
uv add numpy
ããŒãžã§ã³ãæå®ããããšãå¯èœã§ãã
uv add "numpy==1.26.4"
uv removeã§ããã±ãŒãžãåãé€ãããšãå¯èœã§ãã
uv remove numpy
æ¢ã«requirements.txtãååšããå Žåã¯uv add -rããã€ã³ã¹ããŒã«ããããšãå¯èœã§ãã
uv add -r requirements.txt
ãŸãã --devã§éçºçšã®äŸåããã±ãŒãžãšããŠã€ã³ã¹ããŒã«ããããšãå¯èœã§ãã
uv add jupyterlab --dev
pyproject.tomlã§ã¯ä»¥äžã远å ãããŸãã
[tool.uv]
dev-dependencies = [
"jupyterlab>=4.1.6",
]
ã€ã³ã¹ããŒã«ããããã±ãŒãžã¯uv pip listã§ç¢ºèªã§ããŸãã
1.7 å®è¡
ä»®æ³ç°å¢ãæå¹åãããšãç¹å®ã®ã¹ã¯ãªãããå®è¡ããå Žåã¯uv runã§å®è¡å¯èœã§ããäŸãã° main.pyãšããŠä»¥äžã®ã¹ã¯ãªãããååšãããšãã
print("Hello!")
以äžã®ã³ãã³ãã§å®è¡ããããšãã§ããŸãã
uv run main.py
2. uvã®äŸ¿å©ãªæ©èœ
2.1 uv venvã«ããä»®æ³ç°å¢äœæ
uv initã§ãªããŠãä»®æ³ç°å¢ã ããäœæããããšãã§ããŸããåŒæ°ã§ã¿ãŒã²ãããã¹ãæå®ããããšãã§ããæå®ããªãå Žåã¯ã«ã¬ã³ããã£ã¬ã¯ããªã«.venvãäœæããŸããæ¢ã«ä»®æ³ç°å¢ãååšããå Žåã¯åé€ãããŠãæ°ããä»®æ³ç°å¢ãäœæããŸãã
uv venv my-project-venv
--pythonãŸãã¯-pã§Pythonã®ããŒãžã§ã³ãæå®ããããšãå¯èœã§ãã
uv venv -p 3.10
ããã±ãŒãžã远å ããå Žåã¯ãuv pip installã§ã€ã³ã¹ããŒã«ã§ããŸãã
uv pip install numpy
ã€ã³ã¹ããŒã«ããããã±ãŒãžã¯uv pip listã§ç¢ºèªã§ããŸãã
ãããã®äžé£ã®æäœã¯å ¬åŒã®uv - The pip interfaceãåç §ããŠãã ããã
2.2 uvxãå©çšããããŒã«ã®åŒã³åºã
uvxã¯ããŒã«ãã€ã³ã¹ããŒã«ããã«åŒã³åºãããšãå¯èœã§ããäŸãã°ãé«éãªPythonã®ãªã³ã¿ãŒããã³ã³ãŒããã©ãŒããã¿ãŒã§ããruffã以äžã§åŒã³åºãããšãå¯èœã§ãããªããäžèšã®ã³ãã³ãã¯uv tool run ruffãšåæ§ã®ãã®ã§ãã
uvx ruff
ç¹å®ã®ããŒãžã§ã³ã§å®è¡ããããšãã§ããŸãã
uvx ruff@0.3.0 check
uvx ruff@latest check
ç¹ã«ruffãªã©ã®å Žåããã®ãããžã§ã¯ãäžã®pyproject.tomlã®èšå®ãçšããŸããruffãmypyãªã©ã®èšå®ã¯ãã¡ããåèã«ããŠãã ããã
uvxã®è©³çްã¯å
¬åŒã®uv - Using toolsã確èªããŠãã ããã
2.3 PyPIã§å©çšã§ããªãããã±ãŒãžãã€ã³ã¹ããŒã«ãã
å ¬åŒã®uv - Specifying dependenciesã®Dependency sourcesã«èšèŒãããæ¹æ³ã§ãGitãURLãlocal wheelã®ãã¹ãªã©ãã€ã³ã¹ããŒã«ããããšãå¯èœã§ããäŸãã°ãURLã§ç¹å®ã®wheelãæå®ããå Žåã ãšä»¥äžã®ããã«ã§ããŸãã
uv add https://files.pythonhosted.org/packages/f7/29/13965af254e3373bceae8fb9a0e6ea0d0e571171b80d6646932131d6439b/setuptools-69.5.1-py3-none-any.whl
pyproject.tomlã«ã¯æ°ãã[tool.uv.sources]ã远å ãããŸãã
dependencies = [
"setuptools",
]
[tool.uv.sources]
setuptools = { url = "https://files.pythonhosted.org/packages/f7/29/13965af254e3373bceae8fb9a0e6ea0d0e571171b80d6646932131d6439b/setuptools-69.5.1-py3-none-any.whl" }
2.4 [tool.hatch.build.targets.wheel]ã«ããã¢ãžã¥ãŒã«ã¢ã¯ã»ã¹
Ryeåæ§ã«[tool.hatch.build.targets.wheel]ãpyproject.tomlã«èšèŒããŠããã£ã¬ã¯ããªæ§é ãæ°ã«ããããšãªãã¢ãžã¥ãŒã«ãimportããããšãå¯èœã«ãªããŸãã
[tool.hatch.build.targets.wheel]
packages = ["src/my_project", "src"]
2.5 CUDAäŸåã®PyTorchãã€ã³ã¹ããŒã«ããããã®extra-index-urlã®èšå®
Installing previous versions of PyTorchãåèã®ããšãCUDA versionã«ãã£URLãpyproject.tomlã®extra-index-urlã远å ããŸãã
[tool.uv]
extra-index-url = ["https://download.pytorch.org/whl/cu121"]
远å åŸã«ä»¥äžã®ã³ãã³ãã§CUDAäŸåã®PyTorchãã€ã³ã¹ããŒã«ããããšãå¯èœã§ãã
uv add "torch==2.4.0+cu121"
index-urlã«æå®ããããšãå¯èœã§ãããããã©ã«ãã§ "[https://pypi.org/simple](https://pypi.org/simple)"ãæå®ãããŠããŸããããåªå
床ãäžããããšãå¿
èŠãªç¶æ³ãªã以äžã®ããã«èšèŒããã°è¯ããã?ã§ãã詳现ã«ã€ããŠã¯uv - Settings#index-urlãåç
§ããŠãã ããã
[tool.uv]
index-url = "https://download.pytorch.org/whl/cu121"
extra-index-url = ["https://pypi.org/simple"]
find-linksã[tool.uv]ã§åæ§ã«èšå®å¯èœã§ãã
ãŸããã¢ãŒããã¯ãã£ããšã«ã€ã³ã¹ããŒã«ããããã±ãŒãžã倿Žããå Žåã¯ããã¡ãã®èšäºã匷ãåèã«ãªããŸããã
2.6 ä»ãœãããŠã§ã¢ãšã®é£æº
å ¬åŒã®uv - Integration guidesã«ãŠãDockerãGihub ActionãPre-commitãªã©ã«ãããuvãçµ±åããéã®ãã¹ããã©ã¯ãã£ã¹ãèšèŒãããŠããŸãã
2.7 flash-attentionãã€ã³ã¹ããŒã«ãã
flash-attentionã¯transformerã¢ãã«ãé«éã«åŠçããããã®æè¡ã§flash-attnãšããŠããã±ãŒãžåãããŠããŸãã
ãã¡ããuvã§installããæ¹æ³ã以äžã§ãŸãšããŸããã
3. ãããã«
ããããuvã ãã§Pythonã®ãããžã§ã¯ã管çãå®çµãããã§ããããããRyeãšæ¯èŒããŠuvã®è¯ãã£ãæ©èœãšããŠãcross-platform察å¿ããwheelã®URLãlockãã¡ã€ã«ã«çæãããŠããããšããããŸãããä»åã®ã¢ããããŒãã§Ryeãšåæ§ã®æäœæã§æ±ãããã®ã«ãªãããããããã¥ãŒãªã³ã°ã§ã¯Pythonã®ãããžã§ã¯ã管çã¯uvãäžå¿ã«äœ¿ã£ãŠãããšæããŸãã
ä»åã®ã¢ããããŒããå ¬åŒããã¥ã¡ã³ããå ¬éãããããããŸã ç¥ããªãæ©èœãããã䟿å©ãããªæ©èœã¯é©å®è¿œå ããŠãããŸãããŸãã玹ä»ããæ©èœã§èª€ãããããããããªããããã³ã¡ã³ãã§æããŠããã ãããšãããããã§ãã
Discussion