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.
Files changed (55) hide show
  1. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/PKG-INFO +1 -1
  2. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/pyproject.toml +1 -1
  3. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/utils.py +36 -1
  4. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/PKG-INFO +1 -1
  5. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/SOURCES.txt +1 -0
  6. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_basic.py +4 -4
  7. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_layer.py +3 -3
  8. kernels-0.14.0.dev1/tests/test_loaded_kernels.py +102 -0
  9. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/README.md +0 -0
  10. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/setup.cfg +0 -0
  11. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/__init__.py +0 -0
  12. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/_system.py +0 -0
  13. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/_versions.py +0 -0
  14. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/_windows.py +0 -0
  15. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/backends.py +0 -0
  16. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmark.py +0 -0
  17. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmarks/__init__.py +0 -0
  18. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmarks/activation.py +0 -0
  19. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmarks/attention.py +0 -0
  20. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/benchmarks/layer_norm.py +0 -0
  21. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/__init__.py +0 -0
  22. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/benchmark.py +0 -0
  23. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/benchmark_graphics.py +0 -0
  24. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/check.py +0 -0
  25. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/cli/versions.py +0 -0
  26. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/compat.py +0 -0
  27. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/deps.py +0 -0
  28. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/__init__.py +0 -0
  29. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/_interval_tree.py +0 -0
  30. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/device.py +0 -0
  31. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/func.py +0 -0
  32. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/globals.py +0 -0
  33. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/kernelize.py +0 -0
  34. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/layer.py +0 -0
  35. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/mode.py +0 -0
  36. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/layer/repos.py +0 -0
  37. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/lockfile.py +0 -0
  38. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/metadata.py +0 -0
  39. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/python_depends.json +0 -0
  40. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/status.py +0 -0
  41. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels/variants.py +0 -0
  42. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/dependency_links.txt +0 -0
  43. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/entry_points.txt +0 -0
  44. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/requires.txt +0 -0
  45. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/src/kernels.egg-info/top_level.txt +0 -0
  46. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_benchmarks.py +0 -0
  47. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_deps.py +0 -0
  48. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_doctest.py +0 -0
  49. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_func.py +0 -0
  50. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_interval_tree.py +0 -0
  51. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_kernel_locking.py +0 -0
  52. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_status.py +0 -0
  53. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_tvm_ffi.py +0 -0
  54. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_user_agent.py +0 -0
  55. {kernels-0.14.0.dev0 → kernels-0.14.0.dev1}/tests/test_variants.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kernels
3
- Version: 0.14.0.dev0
3
+ Version: 0.14.0.dev1
4
4
  Summary: Download compute kernels
5
5
  Author-email: Daniel de Kok <daniel@huggingface.co>, David Holtz <david@huggingface.co>
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kernels"
3
- version = "0.14.0.dev0"
3
+ version = "0.14.0.dev1"
4
4
  description = "Download compute kernels"
5
5
  authors = [
6
6
  { name = "Daniel de Kok", email = "daniel@huggingface.co" },
@@ -52,7 +52,42 @@ _loaded_kernels: dict[Path, LoadedKernel] = {}
52
52
 
53
53
 
54
54
  def get_loaded_kernels() -> list[LoadedKernel]:
55
- """Returns a copy of the loaded kernels registry (see `kernels.utils.LoadedKernel` NamedTuple)."""
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kernels
3
- Version: 0.14.0.dev0
3
+ Version: 0.14.0.dev1
4
4
  Summary: Download compute kernels
5
5
  Author-email: Daniel de Kok <daniel@huggingface.co>, David Holtz <david@huggingface.co>
6
6
  License: Apache-2.0
@@ -46,6 +46,7 @@ tests/test_func.py
46
46
  tests/test_interval_tree.py
47
47
  tests/test_kernel_locking.py
48
48
  tests/test_layer.py
49
+ tests/test_loaded_kernels.py
49
50
  tests/test_status.py
50
51
  tests/test_tvm_ffi.py
51
52
  tests/test_user_agent.py
@@ -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() == "1"
155
+ assert kernel.version() == 1
156
156
  kernel = get_kernel("kernels-test/versions", version=2)
157
- assert kernel.version() == "2"
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() == "1"
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() == "2"
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() == "0.2.0"
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() == "1"
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() == "2"
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