Repository navigation
Conversation
|
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. |
vasqu
left a comment
There was a problem hiding this comment.
Works for me locally at least 🫡 just 1 question and I guess Daniel or David need to review either way
|
|
||
| spec = importlib.util.spec_from_file_location(metadata.id, file_path) | ||
| # Hub revisions can share a build ID but must have separate Python submodules. | ||
| import_name = f"{metadata.id}_{repo_info.revision}" if repo_info is not None else metadata.id |
There was a problem hiding this comment.
does repo info always include a revision, e.g. is a version resolved to a revision?
There was a problem hiding this comment.
Yup:
kernels/kernels/src/kernels/_versions.py
Lines 204 to 235 in 1bec2d3
For local kernel, this is handled differently, i.e., no repo_info, of course.
|
|
||
| spec = importlib.util.spec_from_file_location(metadata.id, file_path) | ||
| # Hub revisions can share a build ID but must have separate Python submodules. | ||
| import_name = f"{metadata.id}_{repo_info.revision}" if repo_info is not None else metadata.id |
There was a problem hiding this comment.
We shouldn't do this. The identifier from the metadata should be unique. This will still not solve it in contexts where we do not have a revision.
There was a problem hiding this comment.
But it doesn't seem to be 👀
|
Closing because the kernel used in the reproducer doesn't follow the the requirements. |
Coverage report —
|
| Name | Stmts | Miss | Cover | Missing |
|---|---|---|---|---|
| src/kernels/__init__.py | 14 | 0 | 100% | |
| src/kernels/_system.py | 6 | 1 | 83% | 10 |
| src/kernels/_versions.py | 130 | 14 | 89% | 53, 59-60, 63-64, 102, 165-170, 199, 219 |
| src/kernels/archs.py | 56 | 1 | 98% | 94 |
| src/kernels/backends.py | 214 | 62 | 71% | 42, 46, 50-53, 70, 92, 110, 119, 123, 127-129, 150, 159, 163, 167-169, 190, 201, 203, 210-213, 222, 226, 230-250, 258, 281-301 |
| src/kernels/compat.py | 9 | 1 | 89% | 5 |
| src/kernels/deps.py | 70 | 1 | 99% | 56 |
| src/kernels/hf_hub.py | 63 | 2 | 97% | 21, 23 |
| src/kernels/importer.py | 45 | 5 | 89% | 80, 86, 89, 103-104 |
| src/kernels/install.py | 21 | 7 | 67% | 76-100 |
| 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 | 85 | 6 | 93% | 90, 115, 191, 311, 338, 368 |
| src/kernels/layer/globals.py | 5 | 0 | 100% | |
| src/kernels/layer/kernelize.py | 82 | 8 | 90% | 259, 297, 305-306, 312, 316, 332-334 |
| src/kernels/layer/layer.py | 309 | 22 | 93% | 211, 258, 285, 416, 437, 444-447, 453-454, 556-557, 578, 586, 597, 637, 641, 654, 708, 738, 813 |
| src/kernels/layer/mode.py | 14 | 0 | 100% | |
| src/kernels/layer/repos.py | 144 | 42 | 71% | 27, 33, 36-43, 63-64, 70, 73-76, 90, 94, 103-104, 110, 113-116, 123-124, 130, 133-136, 143-144, 150, 153-156, 163-164, 170, 173-176, 257 |
| src/kernels/load.py | 71 | 2 | 97% | 338, 378 |
| src/kernels/locking.py | 89 | 64 | 28% | 35-83, 91-98, 102-125, 137, 152-159, 165-175, 179-186 |
| src/kernels/python_deps.py | 58 | 6 | 90% | 59-60, 64-65, 101, 104 |
| src/kernels/resolver.py | 158 | 1 | 99% | 231 |
| src/kernels/status.py | 50 | 2 | 96% | 25, 79 |
| src/kernels/validate.py | 88 | 5 | 94% | 9, 100, 167, 190-191 |
| src/kernels/variants.py | 278 | 17 | 94% | 65, 96, 117, 147, 256-257, 299-302, 304, 388-394, 400-406, 455-461 |
| src/kernels/verify.py | 127 | 6 | 95% | 46, 202-204, 318-319 |
| TOTAL | 2343 | 293 | 87% |
Updated by the Test kernels workflow on commit 1bec2d37c3602a324cf8fe91e95b7c632921da1d.
Refer to https://huggingface.slack.com/archives/C090JN2P8NB/p1791497365338479.
If we load the same kernel from different revisions, the output modules aren't different.
(reproducer from @vasqu)
It happens because:
modulewith itsmetadata.idas the key insys.modules:kernels/kernels/src/kernels/importer.py
Line 88 in 2e4510a
At this point, the package registration is done and the
<metadata.id>.layerssubmodule (when available of course).sys.modules[metadata.id], but leaves the existing.layersentry.from . import layersreuses that cached submodule. Python caches imports by module name.To avoid this collision, this PR proposes to add
repo_info.revisionto build the module key that would go intosys.modules.