Skip to content

feat: make kernel loading work when offline mode ie enabled.#580

Merged
sayakpaul merged 8 commits into
mainfrom
offline-kernels
May 27, 2026
Merged

feat: make kernel loading work when offline mode ie enabled.#580
sayakpaul merged 8 commits into
mainfrom
offline-kernels

Conversation

@sayakpaul
Copy link
Copy Markdown
Member

Fixes #553

@HuggingFaceDocBuilderDev
Copy link
Copy Markdown

The docs for this PR live here. All of your documentation changes will be reflected on that endpoint. The docs are available until 30 days after the last update.

@sayakpaul sayakpaul marked this pull request as ready for review May 22, 2026 11:25
get_kernel("kernels-test-untrusted/ci-test-kernel", version=1, trust_remote_code=True)


def test_install_kernel_offline_with_revision(monkeypatch, local_kernel_path):
Copy link
Copy Markdown
Member

@danieldk danieldk May 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love these tests!

Comment thread kernels/src/kernels/utils.py Outdated
Comment thread kernels/src/kernels/utils.py Outdated
Comment thread kernels/src/kernels/utils.py Outdated
Comment thread kernels/src/kernels/utils.py Outdated
sayakpaul and others added 2 commits May 25, 2026 09:35
Comment thread kernels/src/kernels/utils.py Outdated
Comment thread kernels/src/kernels/utils.py Outdated
# Same local-cache resolution path used by `load_kernel`, which is
# always offline. Sharing the helper avoids the network dependency
# that `get_variants` would otherwise introduce.
return _resolve_local_variant_path(
Copy link
Copy Markdown
Member

@danieldk danieldk May 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't we load_kernel here and keep the body of _resolve_local_variant_path inside load_kernel? It would more clearly express the relation between the functions.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thought about it a bit but install_kernel returns Path, whereas load_kernel returns ModuleType. To recover the path from a module return by load_kernel(), we will have to do some kind of parsing.

Then the _import_from_path() utility also needs some changes.

The flow would become get_kernel -> install_kernel > load_kernel -> _import_from_path(repo_info=None) — that caches LoadedKernel(repo_info=None).

Then get_kernel does its own _import_from_path(variant_path, repo_info=RepoInfo(...)), hits the cache, and returns the module while silently discarding the actual repo_info.

As a result, get_loaded_kernels() would report repo_info=None for kernels loaded via get_kernel in offline mode which would be a regression, if not handled in _import_from_path.

I think the shared utility solution is a cleaner approach here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, got it, thanks!

Co-authored-by: Daniël de Kok <me@danieldk.eu>
@danieldk
Copy link
Copy Markdown
Member

Really nice! Let's get it merged to have it in the release that we'll do soon.

@github-actions
Copy link
Copy Markdown

Coverage report — kernels/

Measured on: Python 3.10 / Torch 2.12.0.
Other CI configurations are not included in this number.
Hardware-gated code paths (ROCm/XPU/NPU/Darwin/Windows) are excluded or unreachable on the Linux+CUDA runner.

Total coverage: 83.6% — threshold: 80% — ✅

Per-file breakdown
Name Stmts Miss Cover Missing
src/kernels/__init__.py 9 0 100%
src/kernels/_system.py 6 1 83% 10
src/kernels/_versions.py 63 7 89% 46, 49, 52-53, 56-57, 100
src/kernels/backends.py 194 55 72% 40, 44, 48-51, 68, 90, 108, 117, 121, 125-127, 148, 170, 181, 188-191, 201, 205-225, 233, 256-276
src/kernels/compat.py 8 1 88% 5
src/kernels/deps.py 54 4 93% 58-59, 79, 95
src/kernels/layer/__init__.py 6 0 100%
src/kernels/layer/_interval_tree.py 103 4 96% 23, 52, 147, 150
src/kernels/layer/device.py 48 14 71% 42, 47-49, 91, 96-98, 101, 149, 152, 155-157
src/kernels/layer/func.py 91 7 92% 72, 100, 154, 257, 263, 272, 290
src/kernels/layer/globals.py 5 0 100%
src/kernels/layer/kernelize.py 73 8 89% 255, 273, 281-282, 288, 292, 308-310
src/kernels/layer/layer.py 174 15 91% 156, 199, 205, 214, 306-307, 319, 328, 336, 347, 376, 380, 393, 446, 476
src/kernels/layer/mode.py 14 0 100%
src/kernels/layer/repos.py 130 34 74% 27, 33, 36-41, 61-62, 68, 71-74, 88, 92, 101-102, 108, 111-114, 121-122, 128, 131-134, 141-142, 148, 151-154, 235
src/kernels/lockfile.py 69 44 36% 37-98, 102-125
src/kernels/status.py 49 2 96% 23, 81
src/kernels/utils.py 281 54 81% 57, 69-73, 79-80, 205, 209, 212, 274, 299-300, 338, 367, 372, 406, 578, 581, 583, 589, 602-603, 624-631, 635-642, 650, 654-664, 668-675, 713, 717, 736, 738
src/kernels/variants.py 262 19 93% 56, 87, 108, 138, 247-248, 289, 291, 371-378, 384-390, 421-427, 439-445, 533-535
TOTAL 1639 269 84%

Updated by the Test kernels workflow on commit e8a97157e4a90c7dedebb83e45fecfb82df6e80e.

@sayakpaul sayakpaul merged commit b45883d into main May 27, 2026
70 checks passed
@sayakpaul sayakpaul deleted the offline-kernels branch May 27, 2026 08:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Offline kernel loading fails despite cached snapshot

3 participants