-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Document improvements to build-isolation setups #15326
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
72a475a
to
15ccd3f
Compare
15ccd3f
to
5df7509
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Love the examples! The flash attention one doesn't work, but I tested deep_ep and deep_gemm which all works!
```toml title="pyproject.toml" | ||
[project] | ||
name = "project" | ||
version = "0.1.0" | ||
description = "..." | ||
readme = "README.md" | ||
requires-python = ">=3.12" | ||
dependencies = ["flash-attn", "torch"] | ||
|
||
```console | ||
$ uv sync --extra compile | ||
+ cchardet==2.1.7 | ||
- cython==3.0.11 | ||
- setuptools==73.0.1 | ||
[tool.uv.extra-build-dependencies] | ||
flash-attn = [{ dependencies = ["torch"], match-runtime = true }] | ||
|
||
[tool.uv.extra-build-variables] | ||
flash-attn = { FLASH_ATTENTION_SKIP_CUDA_BUILD = "TRUE" } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This doesn't work:
ubuntu@costa-dev-worker-0:~/code/thirdparty/test_uv$ cat pyproject.toml
[project]
name = "project"
version = "0.1.0"
description = "..."
readme = "README.md"
requires-python = ">=3.12"
dependencies = ["flash-attn", "torch"]
[tool.uv.extra-build-dependencies]
flash-attn = [{ dependencies = ["torch"], match-runtime = true }]
[tool.uv.extra-build-variables]
flash-attn = { FLASH_ATTENTION_SKIP_CUDA_BUILD = "TRUE" }
ubuntu@costa-dev-worker-0:~/code/thirdparty/test_uv$ uv sync
warning: Failed to parse `pyproject.toml` during settings discovery:
TOML parse error at line 10, column 14
|
10 | flash-attn = [{ dependencies = ["torch"], match-runtime = true }]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
data did not match any variant of untagged enum ExtraBuildDependencyWire
error: Failed to parse: `pyproject.toml`
Caused by: TOML parse error at line 10, column 14
|
10 | flash-attn = [{ dependencies = ["torch"], match-runtime = true }]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
data did not match any variant of untagged enum ExtraBuildDependencyWire
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh thank you for trying this, there’s a typo 😩
5df7509
to
602d02f
Compare
I have put a minimal repro here: https://github.com/vwxyzjn/minimal-uv-deep-ep-gemm-installation/tree/main |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have some minor edits and, as you said, we probably want to find a better home for all this content, but let's just get this in and iterate from there since it's so important.
These are very nice improvements. Thanks a lot for everyone that worked on this! Another use case of "no-build-isolation" of the main project is that some build backends (like python-meson) allow to recompile files on the fly in editable installs. For this to work, naturally the build dependencies of the main project need to be available also at runtime. (More details at #10694 (comment)) |
Thanks @tobiasdiez! I can take a look and add some documentation for that. Can you give me a minimal |
|
||
You could run the following sequence of commands to sync `flash-attn`: | ||
The use of `extra-build-dependencies` and `extra-build-variables` are tracked in the uv cache, such | ||
that changes to these settings will not trigger a reinstall and rebuild of the affected packages. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a typo
that changes to these settings will not trigger a reinstall and rebuild of the affected packages. | |
that changes to these settings will trigger a reinstall and rebuild of the affected packages. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PR!!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [astral-sh/uv](https://github.com/astral-sh/uv) | patch | `0.8.11` -> `0.8.12` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>astral-sh/uv (astral-sh/uv)</summary> ### [`v0.8.12`](https://github.com/astral-sh/uv/blob/HEAD/CHANGELOG.md#0812) [Compare Source](astral-sh/uv@0.8.11...0.8.12) ##### Python - Add 3.13.7 - Improve performance of zstd in Python 3.14 See the [python-build-standalone release notes](https://github.com/astral-sh/python-build-standalone/releases/tag/20250818) for details. ##### Enhancements - Add an `aarch64-pc-windows-msvc` target for `python-platform` ([#​15347](astral-sh/uv#15347)) - Add fallback parent process detection to `uv tool update-shell` ([#​15356](astral-sh/uv#15356)) - Install non-build-isolation packages in a second phase ([#​15306](astral-sh/uv#15306)) - Add hint when virtual environments are included in source distributions ([#​15202](astral-sh/uv#15202)) - Add Docker images derived from `buildpack-deps:trixie`, `debian:trixie-slim`, `alpine:3.22` ([#​15351](astral-sh/uv#15351)) ##### Bug fixes - Reject already-installed wheels built with outdated settings ([#​15289](astral-sh/uv#15289)) - Skip interpreters that are not found on query ([#​15315](astral-sh/uv#15315)) - Handle dotted package names in script path resolution ([#​15300](astral-sh/uv#15300)) - Reject `match-runtime = true` for dynamic packages ([#​15292](astral-sh/uv#15292)) ##### Documentation - Document improvements to build-isolation setups ([#​15326](astral-sh/uv#15326)) - Fix reference documentation recommendation to use `uv cache clean` instead of `clear` ([#​15313](astral-sh/uv#15313)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS43Ni4wIiwidXBkYXRlZEluVmVyIjoiNDEuNzYuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
installed in the project environment _prior_ to installing the package itself. This can be achieved | ||
by separating out the build dependencies and the packages that require them into distinct extras. | ||
For example: | ||
To ensure that a build dependency matches the version of the package that is or will be installed in |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this also ensure that the package annotated with match-runtime = true
will only be built once? So in the example below (assuming that torch wouldn't ship wheels), would torch be built once as the build dependency of deepspeed and then another time to be installed in the main env? Or does uv cache the built of torch and reuses it?
I hope it is cached - in this case, match-runtime
might be also a very useful option to set for packages that take a long time to build. I can open a PR to add this if wished.
Sorry for taking so long to come back to you. Here is an example
This is just what you get with
In a real application you would now actually use cython to compile an extension etc, but for the sake of having a simple example let's ignore that. After Current workaround is:
So it's similar to the problems discussed in this PR, but the difference is that the Let me know if this is sufficient to understand the problem, or if you would prefer to have a full example that actually compiles something etc. |
Summary
There's a lot here (maybe it should go somewhere else?), but this is a complex topic and I wanted to include a lot of copy-pasteable examples for common cases.
Closes #10694.
Closes #13959.
Closes #15248.
Closes #15316.