kernels 0.14.0.dev0__tar.gz → 0.14.0.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/PKG-INFO +1 -1
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/pyproject.toml +1 -1
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/utils.py +36 -1
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/PKG-INFO +1 -1
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/SOURCES.txt +1 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_basic.py +4 -4
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_layer.py +3 -3
- kernels-0.14.0.dev1/tests/test_loaded_kernels.py +102 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/README.md +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/setup.cfg +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/__init__.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/_system.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/_versions.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/_windows.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/backends.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmark.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmarks/__init__.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmarks/activation.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmarks/attention.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmarks/layer_norm.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/__init__.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/benchmark.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/benchmark_graphics.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/check.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/versions.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/compat.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/deps.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/__init__.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/_interval_tree.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/device.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/func.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/globals.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/kernelize.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/layer.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/mode.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/repos.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/lockfile.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/metadata.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/python_depends.json +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/status.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/variants.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/dependency_links.txt +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/entry_points.txt +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/requires.txt +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/top_level.txt +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_benchmarks.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_deps.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_doctest.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_func.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_interval_tree.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_kernel_locking.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_status.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_tvm_ffi.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_user_agent.py +0 -0
- {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_variants.py +0 -0
|
@@ -52,7 +52,42 @@ _loaded_kernels: dict[Path, LoadedKernel] = {}
|
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
def get_loaded_kernels() -> list[LoadedKernel]:
|
|
55
|
-
"""
|
|
55
|
+
"""
|
|
56
|
+
Return a snapshot of every kernel that has been loaded into the current process.
|
|
57
|
+
|
|
58
|
+
Each entry is a `kernels.utils.LoadedKernel` dataclass with fields:
|
|
59
|
+
|
|
60
|
+
- `kernel_id` (`str`): unique identifier used as the `sys.modules` key
|
|
61
|
+
for this variant (either `metadata.id` or a hash-suffixed module name).
|
|
62
|
+
- `module` (`ModuleType`): the imported kernel module.
|
|
63
|
+
- `module_name` (`str`): the kernel's module name.
|
|
64
|
+
- `repo_infos` (`kernels.utils.RepoInfos | None`): populated only for
|
|
65
|
+
kernels loaded via `get_kernel`. Loaders that work from a local path
|
|
66
|
+
(`get_local_kernel`) or a lockfile (`get_locked_kernel`, `load_kernel`)
|
|
67
|
+
leave this as `None`.
|
|
68
|
+
|
|
69
|
+
`RepoInfos` has `repo_id`, `revision`, and `backend` fields. `backend`
|
|
70
|
+
reflects the value passed by the caller — it is `None` when the caller
|
|
71
|
+
relied on backend auto-detection.
|
|
72
|
+
|
|
73
|
+
The returned list is a new list; mutating it does not affect the registry.
|
|
74
|
+
|
|
75
|
+
> [!NOTE]
|
|
76
|
+
> These arguments might be renamed / changed a bit.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
`list[LoadedKernel]`: one entry per distinct kernel variant path
|
|
80
|
+
loaded in this process.
|
|
81
|
+
|
|
82
|
+
Example:
|
|
83
|
+
```python
|
|
84
|
+
from kernels import get_kernel, get_loaded_kernels
|
|
85
|
+
|
|
86
|
+
get_kernel("kernels-community/activation", version=1)
|
|
87
|
+
for loaded in get_loaded_kernels():
|
|
88
|
+
print(loaded.module_name, loaded.repo_infos)
|
|
89
|
+
```
|
|
90
|
+
"""
|
|
56
91
|
return list(_loaded_kernels.values())
|
|
57
92
|
|
|
58
93
|
|
|
@@ -152,9 +152,9 @@ def test_version_old():
|
|
|
152
152
|
|
|
153
153
|
def test_version():
|
|
154
154
|
kernel = get_kernel("kernels-test/versions", version=1)
|
|
155
|
-
assert kernel.version() ==
|
|
155
|
+
assert kernel.version() == 1
|
|
156
156
|
kernel = get_kernel("kernels-test/versions", version=2)
|
|
157
|
-
assert kernel.version() ==
|
|
157
|
+
assert kernel.version() == 2
|
|
158
158
|
|
|
159
159
|
with pytest.raises(ValueError, match="Version 0 not found, available versions: 1, 2.*"):
|
|
160
160
|
kernel = get_kernel("kernels-test/versions", version=0)
|
|
@@ -163,13 +163,13 @@ def test_version():
|
|
|
163
163
|
def test_version_outdated_warning(caplog):
|
|
164
164
|
with caplog.at_level(logging.WARNING, logger="kernels._versions"):
|
|
165
165
|
kernel = get_kernel("kernels-test/versions", version=1)
|
|
166
|
-
assert kernel.version() ==
|
|
166
|
+
assert kernel.version() == 1
|
|
167
167
|
assert "You are using version 1 of 'kernels-test/versions', but version 2 is available." in caplog.text
|
|
168
168
|
|
|
169
169
|
caplog.clear()
|
|
170
170
|
with caplog.at_level(logging.WARNING, logger="kernels._versions"):
|
|
171
171
|
kernel = get_kernel("kernels-test/versions", version=2)
|
|
172
|
-
assert kernel.version() ==
|
|
172
|
+
assert kernel.version() == 2
|
|
173
173
|
assert "but version" not in caplog.text
|
|
174
174
|
|
|
175
175
|
|
|
@@ -1108,7 +1108,7 @@ def test_layer_versions(device):
|
|
|
1108
1108
|
}
|
|
1109
1109
|
):
|
|
1110
1110
|
version = kernelize(version, device=device, mode=Mode.INFERENCE)
|
|
1111
|
-
assert version() ==
|
|
1111
|
+
assert version() == 2
|
|
1112
1112
|
|
|
1113
1113
|
with use_kernel_mapping(
|
|
1114
1114
|
{
|
|
@@ -1122,7 +1122,7 @@ def test_layer_versions(device):
|
|
|
1122
1122
|
}
|
|
1123
1123
|
):
|
|
1124
1124
|
version = kernelize(version, device=device, mode=Mode.INFERENCE)
|
|
1125
|
-
assert version() ==
|
|
1125
|
+
assert version() == 1
|
|
1126
1126
|
|
|
1127
1127
|
with use_kernel_mapping(
|
|
1128
1128
|
{
|
|
@@ -1136,7 +1136,7 @@ def test_layer_versions(device):
|
|
|
1136
1136
|
}
|
|
1137
1137
|
):
|
|
1138
1138
|
version = kernelize(version, device=device, mode=Mode.INFERENCE)
|
|
1139
|
-
assert version() ==
|
|
1139
|
+
assert version() == 2
|
|
1140
1140
|
|
|
1141
1141
|
with use_kernel_mapping(
|
|
1142
1142
|
{
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from dataclasses import fields
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from kernels import get_kernel, get_loaded_kernels, get_local_kernel, install_kernel
|
|
6
|
+
from kernels.utils import LoadedKernel, RepoInfos, _loaded_kernels
|
|
7
|
+
|
|
8
|
+
_REPO_ID = "kernels-community/relu"
|
|
9
|
+
_PACKAGE_NAME = "relu"
|
|
10
|
+
_VERSION = 1
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.fixture
|
|
14
|
+
def fresh_registry():
|
|
15
|
+
"""Snapshot the process-wide registry, run the test with a clean one, restore on teardown."""
|
|
16
|
+
saved = _loaded_kernels.copy()
|
|
17
|
+
_loaded_kernels.clear()
|
|
18
|
+
yield
|
|
19
|
+
_loaded_kernels.clear()
|
|
20
|
+
_loaded_kernels.update(saved)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_dataclass_shape():
|
|
24
|
+
assert tuple(f.name for f in fields(LoadedKernel)) == (
|
|
25
|
+
"kernel_id",
|
|
26
|
+
"module",
|
|
27
|
+
"module_name",
|
|
28
|
+
"repo_infos",
|
|
29
|
+
)
|
|
30
|
+
assert tuple(f.name for f in fields(RepoInfos)) == (
|
|
31
|
+
"repo_id",
|
|
32
|
+
"revision",
|
|
33
|
+
"backend",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_get_loaded_kernels_returns_copy(fresh_registry):
|
|
38
|
+
kernel = get_kernel(_REPO_ID, version=_VERSION, backend="cpu")
|
|
39
|
+
|
|
40
|
+
snapshot = get_loaded_kernels()
|
|
41
|
+
assert len(snapshot) == 1
|
|
42
|
+
|
|
43
|
+
snapshot.clear()
|
|
44
|
+
snapshot.append("garbage") # type: ignore[arg-type]
|
|
45
|
+
|
|
46
|
+
again = get_loaded_kernels()
|
|
47
|
+
assert len(again) == 1
|
|
48
|
+
assert again[0].module is kernel
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_get_kernel_registers_loaded_kernel(fresh_registry):
|
|
52
|
+
kernel = get_kernel(_REPO_ID, version=_VERSION, backend="cpu")
|
|
53
|
+
|
|
54
|
+
loaded = get_loaded_kernels()
|
|
55
|
+
assert len(loaded) == 1
|
|
56
|
+
|
|
57
|
+
entry = loaded[0]
|
|
58
|
+
assert entry.module is kernel
|
|
59
|
+
assert entry.module_name == _PACKAGE_NAME
|
|
60
|
+
assert entry.repo_infos is not None
|
|
61
|
+
assert entry.repo_infos.repo_id == _REPO_ID
|
|
62
|
+
assert isinstance(entry.repo_infos.revision, str) and entry.repo_infos.revision
|
|
63
|
+
assert entry.repo_infos.backend == "cpu"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_repeated_get_kernel_is_cached(fresh_registry):
|
|
67
|
+
first = get_kernel(_REPO_ID, version=_VERSION, backend="cpu")
|
|
68
|
+
second = get_kernel(_REPO_ID, version=_VERSION, backend="cpu")
|
|
69
|
+
|
|
70
|
+
assert first is second
|
|
71
|
+
assert len(get_loaded_kernels()) == 1
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_get_local_kernel_registers_with_null_repo_infos(fresh_registry):
|
|
75
|
+
# Populate the HF cache via get_kernel, grab the variant path it registered,
|
|
76
|
+
# then clear the registry and exercise get_local_kernel against that path.
|
|
77
|
+
get_kernel(_REPO_ID, version=_VERSION, backend="cpu")
|
|
78
|
+
(variant_path,) = list(_loaded_kernels.keys())
|
|
79
|
+
|
|
80
|
+
_loaded_kernels.clear()
|
|
81
|
+
|
|
82
|
+
kernel = get_local_kernel(variant_path, _PACKAGE_NAME, backend="cpu")
|
|
83
|
+
|
|
84
|
+
loaded = get_loaded_kernels()
|
|
85
|
+
assert len(loaded) == 1
|
|
86
|
+
|
|
87
|
+
entry = loaded[0]
|
|
88
|
+
assert entry.module is kernel
|
|
89
|
+
assert entry.module_name == _PACKAGE_NAME
|
|
90
|
+
assert entry.repo_infos is None
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_install_kernel_plus_import_does_not_set_repo_infos(fresh_registry):
|
|
94
|
+
# install_kernel alone does not import; it returns a path. Any loader
|
|
95
|
+
# that does not go through get_kernel must leave repo_infos as None.
|
|
96
|
+
package_name, variant_path = install_kernel(_REPO_ID, revision="main", backend="cpu")
|
|
97
|
+
assert package_name == _PACKAGE_NAME
|
|
98
|
+
assert get_loaded_kernels() == []
|
|
99
|
+
|
|
100
|
+
get_local_kernel(variant_path, package_name, backend="cpu")
|
|
101
|
+
(entry,) = get_loaded_kernels()
|
|
102
|
+
assert entry.repo_infos is None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|