Add lazy-loading for extras packages#641
Conversation
|
This pull request has merge conflicts that must be resolved before it can be |
e1e9203 to
5e4ee86
Compare
876cc30 to
8156271
Compare
## Summary Clean up some `__init__` package code and move uvloop config to `__init__`. ## Details This clean up was originally a part of #641 but as that PR is blocked I decided to split it out. Removing the transformers logging config does not seem to have any real affect; I do not get logs either way. Importing any huggingface libraries incurs a significant time cost so this is a prereq to improving CLI responsiveness. Additionally uvloop should be configured as early as possible so moved the setup to `__init__`. --- - [x] "I certify that all code in this PR is my own, except as noted below." ## Use of AI - [ ] Includes AI-assisted code completion - [ ] Includes code generated by an AI application - [ ] Includes AI-generated tests (NOTE: AI written tests should have a docstring that includes `## WRITTEN BY AI ##`)
|
This PR is currently blocked on "Lazy load in |
## Summary Fixes spawn and forkserver multi-process contexts. ## Details I was hoping that after #647 we could switch to `forkserver` by default. However it turns out that `forkserver` and `spawn` will import the calling processes entrypoint (E.g. `__main__.py`) so we run into the same blocker as #641. However, I was able to confirm that striping every heavy import out of `__main__.py` solves the issue. So we should be good to switch in v0.7.0. On my machine there is about a ~10s overhead for `forkserver` and slightly more for `spawn`, which is not the worst for a default. However, the overhead may be more on other systems: ### `time guidellm benchmark run --profile poisson --rate 5 --data prompt_tokens=128,output_tokens=128 --max-seconds 30 --outputs json` | Context | real | user | sys | | ---------- | --------- | --------- | -------- | | Fork | 0m37.874s | 0m17.356s | 0m1.883s | | Forkserver | 0m47.344s | 0m14.862s | 0m0.860s | | Spawn | 0m49.515s | 1m51.230s | 0m8.915s | ### `time guidellm benchmark run --profile concurrent --rate 400 --data prompt_tokens=128,output_tokens=128 --max-seconds 30 --outputs json` | Context | real | user | sys | | ---------- | --------- | --------- | --------- | | Fork | 0m39.324s | 0m37.602s | 0m5.623s | | Forkserver | 0m49.609s | 0m19.710s | 0m1.311s | | Spawn | 0m50.399s | 2m9.724s | 0m11.374s | ### `time guidellm benchmark run --profile concurrent --rate 400 --data prompt_tokens=128,output_tokens=128 --max-seconds 120 --outputs json` | Context | real | user | sys | | ---------- | --------- | --------- | --------- | | Fork | 2m15.309s | 1m42.911s | 0m15.957s | | Forkserver | 2m25.964s | 0m38.891s | 0m2.802s | | Spawn | 2m27.454s | 3m24.325s | 0m22.531s | ## Test Plan Set `GUIDELLM__MP_CONTEXT_TYPE=forkserver` and confirm benchmarks run. --- - [x] "I certify that all code in this PR is my own, except as noted below." ## Use of AI - [x] Includes AI-assisted code completion - [ ] Includes code generated by an AI application - [ ] Includes AI-generated tests (NOTE: AI written tests should have a docstring that includes `## WRITTEN BY AI ##`)
|
This is now an official feature in Python 3.15! Unfortunately since its a new keyword we won't be able to adopt it until 3.15 becomes our minimal supported version in half-a-decade from now. |
8156271 to
765b158
Compare
|
This pull request has merge conflicts that must be resolved before it can be |
2c06bd3 to
c9a1a81
Compare
8c858ee to
7048da2
Compare
jaredoconnell
left a comment
There was a problem hiding this comment.
I tested it and it properly worked with vLLM installed with the vLLM backend.
Signed-off-by: Samuel Monson <smonson@redhat.com>
Signed-off-by: Samuel Monson <smonson@redhat.com>
Signed-off-by: Samuel Monson <smonson@redhat.com>
`torch` seems to break when it encounters lazy ImportErrors Signed-off-by: Samuel Monson <smonson@redhat.com>
Generated-by: claude-code Sonnet 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com>
Generated-by: claude-code Sonnet 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com>
This reverts commit e31862e. Signed-off-by: Samuel Monson <smonson@redhat.com>
Generated-by: claude-code Sonnet 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com>
Generated-by: claude-code Sonnet 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com>
Generated-by: claude-code Opus 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com>
Generated-by: claude-code Opus 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com>
Generated-by: claude-code Opus 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com>
7048da2 to
7dea6a0
Compare
|
@Mergifyio queue |
Merge Queue Status
This pull request spent 5 minutes 41 seconds in the queue, including 5 minutes 11 seconds running CI. Required conditions to merge
|
## TODO - [ ] ~Pending upstream change: scientific-python/lazy-loader#168 upstream seems dead so the module has been pulled in-house. - [ ] ~Support for soft extras (E.g. `perf` group)~ deferred - [ ] ~Lazy load in `__main__.py` to improve CLI responsiveness~ deferred - [ ] Docs cleanup (howto create a lazy module, do's and don'ts) - [ ] Actually test vLLM python (loading of vLLM tested but not a full run) ## Summary Lazy loads extras submodules in order to defer import errors to the time of use. ## Details TODO ## Test Plan Without vLLM: 1. Run `guidellm benchmark run --help` and observe no errors 2. Run `uv run guidellm benchmark run --backend vllm_python --model test` and observe error with helpful message With vLLM: 1. Run `guidellm benchmark run --help` and observe no errors 2. Run `uv run guidellm benchmark run --backend vllm_python --model test ...` and observe successful benchmark 3. Run `tox -re test-e2e` and observe that tests pass (Previously they would fail when vLLM was installed due to load times) ## Related Issues - Replaces vllm-project#636 --- - [x] "I certify that all code in this PR is my own, except as noted below." ## Use of AI - [x] Includes AI-assisted code completion - [ ] Includes code generated by an AI application - [ ] Includes AI-generated tests (NOTE: AI written tests should have a docstring that includes `## WRITTEN BY AI ##`) --- # git log commit 19d8aad Author: Samuel Monson <smonson@redhat.com> Date: Tue May 19 17:49:25 2026 -0400 Pull in custom lazy_load package as submodule Signed-off-by: Samuel Monson <smonson@redhat.com> commit de50d31 Author: Samuel Monson <smonson@redhat.com> Date: Mon Jun 1 19:50:10 2026 -0400 Minor type fix Signed-off-by: Samuel Monson <smonson@redhat.com> commit 6066364 Author: Samuel Monson <smonson@redhat.com> Date: Tue Mar 17 16:33:04 2026 -0400 Switch to lazy-loading for extras packages Signed-off-by: Samuel Monson <smonson@redhat.com> commit 591a160 Author: Samuel Monson <smonson@redhat.com> Date: Wed Mar 18 16:58:33 2026 -0400 Use AttributeError for failed optionals `torch` seems to break when it encounters lazy ImportErrors Signed-off-by: Samuel Monson <smonson@redhat.com> commit 79bcd7d Author: Samuel Monson <smonson@redhat.com> Date: Wed May 20 17:42:54 2026 -0400 LazyModule which loads module attributes individually Generated-by: claude-code Sonnet 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com> commit 812acf6 Author: Samuel Monson <smonson@redhat.com> Date: Wed May 20 17:50:37 2026 -0400 Fix unit tests Generated-by: claude-code Sonnet 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com> commit 5a81cc2 Author: Samuel Monson <smonson@redhat.com> Date: Thu May 21 10:50:04 2026 -0400 Revert "LazyModule which loads module attributes individually" This reverts commit e31862e. Signed-off-by: Samuel Monson <smonson@redhat.com> commit 8a00c01 Author: Samuel Monson <smonson@redhat.com> Date: Mon Jun 1 20:05:32 2026 +0000 Split lazy loading from functionality Generated-by: claude-code Sonnet 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com> commit b309ac4 Author: Samuel Monson <smonson@redhat.com> Date: Mon Jun 1 21:08:01 2026 +0000 Cleanup tests after split Generated-by: claude-code Sonnet 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com> commit 7106bf8 Author: Samuel Monson <smonson@redhat.com> Date: Mon Jun 1 22:35:47 2026 +0000 Implement nested lazy loading Generated-by: claude-code Opus 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com> commit fccdcd7 Author: Samuel Monson <smonson@redhat.com> Date: Tue Jun 2 00:09:19 2026 +0000 Switch attribute interface to a named tuple Generated-by: claude-code Opus 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com> commit 7dea6a0 Author: Samuel Monson <smonson@redhat.com> Date: Tue Jun 2 00:47:11 2026 +0000 Add type stubs Generated-by: claude-code Opus 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com> --------- Generated-by: claude-code Opus 4.6 Generated-by: claude-code Sonnet 4.6 Signed-off-by: Samuel Monson <smonson@redhat.com> Signed-off-by: SkiHatDuckie <SkiHatDuckie@gmail.com>
TODO
Pending upstream change: Support lazy importing submodules inupstream seems dead so the module has been pulled in-house.attachscientific-python/lazy-loader#168Support for soft extras (E.g.deferredperfgroup)Lazy load indeferred__main__.pyto improve CLI responsivenessSummary
Lazy loads extras submodules in order to defer import errors to the time of use.
Details
TODO
Test Plan
Without vLLM:
guidellm benchmark run --helpand observe no errorsuv run guidellm benchmark run --backend vllm_python --model testand observe error with helpful messageWith vLLM:
guidellm benchmark run --helpand observe no errorsuv run guidellm benchmark run --backend vllm_python --model test ...and observe successful benchmarktox -re test-e2eand observe that tests pass (Previously they would fail when vLLM was installed due to load times)Related Issues
Use of AI
## WRITTEN BY AI ##)git log
commit 19d8aad
Author: Samuel Monson smonson@redhat.com
Date: Tue May 19 17:49:25 2026 -0400
commit de50d31
Author: Samuel Monson smonson@redhat.com
Date: Mon Jun 1 19:50:10 2026 -0400
commit 6066364
Author: Samuel Monson smonson@redhat.com
Date: Tue Mar 17 16:33:04 2026 -0400
commit 591a160
Author: Samuel Monson smonson@redhat.com
Date: Wed Mar 18 16:58:33 2026 -0400
commit 79bcd7d
Author: Samuel Monson smonson@redhat.com
Date: Wed May 20 17:42:54 2026 -0400
commit 812acf6
Author: Samuel Monson smonson@redhat.com
Date: Wed May 20 17:50:37 2026 -0400
commit 5a81cc2
Author: Samuel Monson smonson@redhat.com
Date: Thu May 21 10:50:04 2026 -0400
commit 8a00c01
Author: Samuel Monson smonson@redhat.com
Date: Mon Jun 1 20:05:32 2026 +0000
commit b309ac4
Author: Samuel Monson smonson@redhat.com
Date: Mon Jun 1 21:08:01 2026 +0000
commit 7106bf8
Author: Samuel Monson smonson@redhat.com
Date: Mon Jun 1 22:35:47 2026 +0000
commit fccdcd7
Author: Samuel Monson smonson@redhat.com
Date: Tue Jun 2 00:09:19 2026 +0000
commit 7dea6a0
Author: Samuel Monson smonson@redhat.com
Date: Tue Jun 2 00:47:11 2026 +0000
Generated-by: claude-code Opus 4.6
Generated-by: claude-code Sonnet 4.6
Signed-off-by: Samuel Monson smonson@redhat.com