kernels 0.18.2__tar.gz → 0.18.3__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.18.2 → kernels-0.18.3}/Cargo.lock +4 -4
- {kernels-0.18.2 → kernels-0.18.3}/PKG-INFO +1 -1
- {kernels-0.18.2 → kernels-0.18.3}/kernels/Cargo.toml +2 -2
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_func.py +62 -1
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_layer.py +20 -1
- {kernels-0.18.2 → kernels-0.18.3}/kernels/uv.lock +1 -1
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/Cargo.toml +1 -1
- {kernels-0.18.2 → kernels-0.18.3}/pyproject.toml +1 -1
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/kernelize.py +6 -3
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/layer.py +12 -3
- {kernels-0.18.2 → kernels-0.18.3}/Cargo.toml +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/README.md +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/README.md +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/pytest.ini +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/config.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/git.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/lib.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/lock.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/signing.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/version.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/conftest.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/kernel_locking/kernels.lock +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/kernel_locking/pyproject.toml +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/layer_locking/kernels.lock +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/layer_locking/pyproject.toml +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_archs.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_basic.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_benchmarks.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_benchmark.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_cache.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_describe_api.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_info.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_variants.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_config.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_digest.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_kernel_lock.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_metadata.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_version.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_deps.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_digest.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_doctest.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_entry_points.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_importer.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_interval_tree.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_kernel_locking.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_loaded_kernels.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_python_deps.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_resolver.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_status.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_trust_remote_code.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_tvm_ffi.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_user_agent.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_validate.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_variants.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_verify.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_versions.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/compat.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/deps.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/git_url.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/kernel_deps.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/mod.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/name.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/parse.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v1.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v2.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v3.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v4.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v5.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v6.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/digest.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/git.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/hf.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/lib.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/lock.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/metadata.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/python_dependencies.json +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/signing/mod.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/signing/receipt.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/version.rs +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/kernels-common/tests/data/legacy-sha-provenance.json +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/__init__.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/_rust.pyi +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/_system.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/_versions.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/_windows.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/archs.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/backends.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmark.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmarks/__init__.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmarks/activation.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmarks/attention.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmarks/layer_norm.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/__init__.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/benchmark.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/benchmark_graphics.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/cache.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/describe_api.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/download.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/info.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/lock.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/variants.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/verify_signature.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/versions.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/compat.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/deps.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/digest.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/hf_hub.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/importer.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/install.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/__init__.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/_interval_tree.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/device.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/func.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/globals.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/inspect.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/mode.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/repos.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/load.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/locking.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/python_depends.json +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/python_deps.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/resolver.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/status.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/validate.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/variants.py +0 -0
- {kernels-0.18.2 → kernels-0.18.3}/src/kernels/verify.py +0 -0
|
@@ -1058,7 +1058,7 @@ dependencies = [
|
|
|
1058
1058
|
|
|
1059
1059
|
[[package]]
|
|
1060
1060
|
name = "hf-kernel-builder"
|
|
1061
|
-
version = "0.18.
|
|
1061
|
+
version = "0.18.3"
|
|
1062
1062
|
dependencies = [
|
|
1063
1063
|
"base32",
|
|
1064
1064
|
"built",
|
|
@@ -1550,7 +1550,7 @@ dependencies = [
|
|
|
1550
1550
|
|
|
1551
1551
|
[[package]]
|
|
1552
1552
|
name = "kernel-abi-check"
|
|
1553
|
-
version = "0.18.
|
|
1553
|
+
version = "0.18.3"
|
|
1554
1554
|
dependencies = [
|
|
1555
1555
|
"cpp_demangle",
|
|
1556
1556
|
"eyre",
|
|
@@ -1581,7 +1581,7 @@ dependencies = [
|
|
|
1581
1581
|
|
|
1582
1582
|
[[package]]
|
|
1583
1583
|
name = "kernels-common"
|
|
1584
|
-
version = "0.18.
|
|
1584
|
+
version = "0.18.3"
|
|
1585
1585
|
dependencies = [
|
|
1586
1586
|
"base64",
|
|
1587
1587
|
"digest",
|
|
@@ -1603,7 +1603,7 @@ dependencies = [
|
|
|
1603
1603
|
|
|
1604
1604
|
[[package]]
|
|
1605
1605
|
name = "kernels-python"
|
|
1606
|
-
version = "0.18.
|
|
1606
|
+
version = "0.18.3"
|
|
1607
1607
|
dependencies = [
|
|
1608
1608
|
"eyre",
|
|
1609
1609
|
"kernels-common",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "kernels-python"
|
|
3
|
-
version = "0.18.
|
|
3
|
+
version = "0.18.3"
|
|
4
4
|
edition = "2024"
|
|
5
5
|
description = "Kernels data structures (Python bindings)"
|
|
6
6
|
homepage = "https://github.com/huggingface/kernels"
|
|
@@ -20,4 +20,4 @@ serde_json = "1"
|
|
|
20
20
|
|
|
21
21
|
[dependencies.kernels-common]
|
|
22
22
|
path = "../kernels-common"
|
|
23
|
-
version = "0.18.
|
|
23
|
+
version = "0.18.3"
|
|
@@ -300,6 +300,7 @@ def test_kernel_func_nested_dispatch(compile):
|
|
|
300
300
|
_bind_forward(inner._kernel_funcs["double_me"], TimesThree.forward)
|
|
301
301
|
|
|
302
302
|
if compile:
|
|
303
|
+
torch._dynamo.reset()
|
|
303
304
|
# We only need to know whether it's safe around get/set so the backend is not relevant
|
|
304
305
|
model = torch.compile(model, backend="eager", fullgraph=True)
|
|
305
306
|
|
|
@@ -318,9 +319,69 @@ def test_kernel_func_nested_compile_context(monkeypatch, num_inner, expected):
|
|
|
318
319
|
_bind_forward(inner._kernel_funcs["double_me"], TimesThree.forward)
|
|
319
320
|
|
|
320
321
|
# Mimic different compiled boundaries
|
|
321
|
-
|
|
322
|
+
# > Outer: 5 checks (get/set/reset + 2 dispatches); each Inner: 4 (get/set/reset + 1 dispatch)
|
|
323
|
+
# > Each final boundary is set to false (last inner, outer dispatch, outer reset)
|
|
324
|
+
compiling = iter([True] * (4 * num_inner + 2) + [False] * 3)
|
|
322
325
|
monkeypatch.setattr(torch.compiler, "is_compiling", lambda: next(compiling))
|
|
323
326
|
|
|
324
327
|
# Same as in `test_kernel_func_nested_dispatch` (just *3 once or twice)
|
|
325
328
|
x = torch.tensor(1.0)
|
|
326
329
|
torch.testing.assert_close(model(x), torch.tensor(expected))
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def test_kernel_func_compile_reuses_forward_across_instances():
|
|
333
|
+
models = [SurpriseMe() for _ in range(24)] # "num_hidden_layers"
|
|
334
|
+
|
|
335
|
+
for i, model in enumerate(models):
|
|
336
|
+
forward = AddOne.forward if i % 2 == 0 else TimesThree.forward
|
|
337
|
+
_bind_forward(model._kernel_funcs["surprise_me"], forward)
|
|
338
|
+
|
|
339
|
+
# Catch the graphs dynamo would create (including new ones created during recompiles)
|
|
340
|
+
graphs = []
|
|
341
|
+
|
|
342
|
+
def backend(gm, inputs):
|
|
343
|
+
graphs.append(gm)
|
|
344
|
+
return gm.forward
|
|
345
|
+
|
|
346
|
+
torch._dynamo.reset()
|
|
347
|
+
compiled = torch.compile(SurpriseMe.forward, backend=backend, fullgraph=True)
|
|
348
|
+
|
|
349
|
+
x = torch.arange(4).float()
|
|
350
|
+
for _ in range(2):
|
|
351
|
+
for i, model in enumerate(models):
|
|
352
|
+
expected = x + 1 if i % 2 == 0 else x * 3
|
|
353
|
+
torch.testing.assert_close(compiled(model, x), expected)
|
|
354
|
+
|
|
355
|
+
# One graph per implementation, not per private wrapper
|
|
356
|
+
assert len(graphs) == 2
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def test_kernel_func_compile_forward_switch():
|
|
360
|
+
a, b = SurpriseMe(), SurpriseMe()
|
|
361
|
+
a_func = a._kernel_funcs["surprise_me"]
|
|
362
|
+
b_func = b._kernel_funcs["surprise_me"]
|
|
363
|
+
|
|
364
|
+
_bind_forward(a_func, AddOne.forward)
|
|
365
|
+
_bind_forward(b_func, TimesThree.forward)
|
|
366
|
+
|
|
367
|
+
torch._dynamo.reset()
|
|
368
|
+
compiled = torch.compile(SurpriseMe.forward, backend="eager", fullgraph=True)
|
|
369
|
+
x = torch.arange(4).float()
|
|
370
|
+
|
|
371
|
+
torch.testing.assert_close(compiled(a, x), x + 1)
|
|
372
|
+
torch.testing.assert_close(compiled(b, x), x * 3)
|
|
373
|
+
|
|
374
|
+
# Switch A to B's implementation without affecting B
|
|
375
|
+
_bind_forward(a_func, TimesThree.forward)
|
|
376
|
+
torch.testing.assert_close(compiled(a, x), x * 3)
|
|
377
|
+
torch.testing.assert_close(compiled(b, x), x * 3)
|
|
378
|
+
|
|
379
|
+
# Restore the original forward
|
|
380
|
+
_bind_forward(a_func, type(a_func).forward)
|
|
381
|
+
torch.testing.assert_close(compiled(a, x), x)
|
|
382
|
+
torch.testing.assert_close(compiled(b, x), x * 3)
|
|
383
|
+
|
|
384
|
+
# Switch A back to its original kernel
|
|
385
|
+
_bind_forward(a_func, AddOne.forward)
|
|
386
|
+
torch.testing.assert_close(compiled(a, x), x + 1)
|
|
387
|
+
torch.testing.assert_close(compiled(b, x), x * 3)
|
|
@@ -1521,13 +1521,15 @@ def test_get_kernelized_layers_func(stub_kernel):
|
|
|
1521
1521
|
|
|
1522
1522
|
@pytest.fixture
|
|
1523
1523
|
def heterogeneous_gpus(monkeypatch):
|
|
1524
|
-
"""Pretend that device 0 has capability 7.5, device 1 has 9.0, and the current device is 0."""
|
|
1524
|
+
"""Pretend that we are on CUDA, device 0 has capability 7.5, device 1 has 9.0, and the current device is 0."""
|
|
1525
1525
|
state = {"current": 0}
|
|
1526
1526
|
capabilities = {0: (7, 5), 1: (9, 0)}
|
|
1527
1527
|
|
|
1528
1528
|
def get_device_capability(device=None):
|
|
1529
1529
|
return capabilities[state["current"] if device is None else device]
|
|
1530
1530
|
|
|
1531
|
+
monkeypatch.setattr(torch.version, "hip", None)
|
|
1532
|
+
monkeypatch.setattr(torch.version, "cuda", "12.8")
|
|
1531
1533
|
monkeypatch.setattr(torch.cuda, "get_device_capability", get_device_capability)
|
|
1532
1534
|
return state
|
|
1533
1535
|
|
|
@@ -1579,6 +1581,23 @@ def test_kernelize_device_index(stub_kernel, heterogeneous_gpus):
|
|
|
1579
1581
|
assert model[0]._kernel_repo == expected
|
|
1580
1582
|
|
|
1581
1583
|
|
|
1584
|
+
@pytest.mark.parametrize("is_rocm", [False, True])
|
|
1585
|
+
def test_kernelize_torch_device_rocm(stub_kernel, monkeypatch, is_rocm):
|
|
1586
|
+
monkeypatch.setattr(torch.version, "hip", "7.0" if is_rocm else None)
|
|
1587
|
+
monkeypatch.setattr(torch.version, "cuda", None if is_rocm else "12.8")
|
|
1588
|
+
monkeypatch.setattr(torch.cuda, "get_device_capability", lambda device=None: (9, 4))
|
|
1589
|
+
|
|
1590
|
+
repo_cuda = LayerRepository(repo_id="kernels-test/cuda", layer_name="StubLayer", version=1)
|
|
1591
|
+
repo_rocm = LayerRepository(repo_id="kernels-test/rocm", layer_name="StubLayer", version=1)
|
|
1592
|
+
mapping = {"StubLayer": {"cuda": repo_cuda, "rocm": repo_rocm}}
|
|
1593
|
+
|
|
1594
|
+
# ROCm devices use the `cuda` device type in Torch.
|
|
1595
|
+
model = nn.Sequential(StubLayer())
|
|
1596
|
+
with use_kernel_mapping(mapping, inherit_mapping=False):
|
|
1597
|
+
kernelize(model, mode=Mode.INFERENCE, device=torch.device("cuda", 0))
|
|
1598
|
+
assert model[0]._kernel_repo == (repo_rocm if is_rocm else repo_cuda)
|
|
1599
|
+
|
|
1600
|
+
|
|
1582
1601
|
def test_locked_repositories_are_picklable():
|
|
1583
1602
|
lockfile = Path(__file__).parent / "layer_locking" / "kernels.lock"
|
|
1584
1603
|
layer_repo = LockedLayerRepository("kernels-test/versions", layer_name="Version", lockfile=lockfile)
|
|
@@ -256,7 +256,7 @@ def kernelize(
|
|
|
256
256
|
_validate_device_type(device)
|
|
257
257
|
device_type = Device(type=device)
|
|
258
258
|
else:
|
|
259
|
-
device_type =
|
|
259
|
+
device_type = _device_type_from_torch(device.type)
|
|
260
260
|
|
|
261
261
|
assert isinstance(device_type, Device)
|
|
262
262
|
|
|
@@ -314,9 +314,12 @@ def _find_device(model: "nn.Module") -> Device:
|
|
|
314
314
|
except StopIteration:
|
|
315
315
|
raise ValueError("Cannot determine model device, provide as `device` argument to `kernelize`.")
|
|
316
316
|
|
|
317
|
-
|
|
317
|
+
return _device_type_from_torch(param.device.type)
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def _device_type_from_torch(dev_type: str) -> Device:
|
|
321
|
+
"""Map a Torch device type to a kernels device type. ROCm devices use the `cuda` device type in Torch."""
|
|
318
322
|
if dev_type == "cuda":
|
|
319
|
-
# Refine based on actual platform
|
|
320
323
|
if _is_rocm_platform():
|
|
321
324
|
return Device(type="rocm")
|
|
322
325
|
elif _is_cuda_platform():
|
|
@@ -576,7 +576,9 @@ def use_kernelized_func(*args: Callable):
|
|
|
576
576
|
name = getattr(fn, "__name__", None) or getattr(fn, "kernel_layer_name", None)
|
|
577
577
|
assert name is not None
|
|
578
578
|
|
|
579
|
-
|
|
579
|
+
# Private wrapper for eager, selected forward for compile
|
|
580
|
+
kernel_func = self._kernel_funcs[name]
|
|
581
|
+
active_kernel_funcs[id(fn)] = (kernel_func, kernel_func.forward.__func__)
|
|
580
582
|
|
|
581
583
|
token = _ACTIVE_KERNEL_FUNCS.set(active_kernel_funcs)
|
|
582
584
|
try:
|
|
@@ -828,6 +830,7 @@ def _rebuild_kernel_func(module_name: str, func_name: str):
|
|
|
828
830
|
|
|
829
831
|
|
|
830
832
|
def _create_func_module(func: Callable) -> Type["nn.Module"]:
|
|
833
|
+
import torch
|
|
831
834
|
from torch import nn
|
|
832
835
|
|
|
833
836
|
class Func(nn.Module):
|
|
@@ -838,8 +841,14 @@ def _create_func_module(func: Callable) -> Type["nn.Module"]:
|
|
|
838
841
|
def forward(self, *args, **kwargs):
|
|
839
842
|
# Dispatch global calls to the active model's private wrapper
|
|
840
843
|
if (active_kernel_funcs := _ACTIVE_KERNEL_FUNCS.get()) is not None:
|
|
841
|
-
if (
|
|
842
|
-
|
|
844
|
+
if (active_kernel_func := active_kernel_funcs.get(id(self))) is not None:
|
|
845
|
+
# Call the selected forward directly to avoid dynamo guards (private wrapper ids)
|
|
846
|
+
kernel_func, forward_func = active_kernel_func
|
|
847
|
+
if torch.compiler.is_compiling():
|
|
848
|
+
if forward_func is not type(self).forward:
|
|
849
|
+
return forward_func(self, *args, **kwargs)
|
|
850
|
+
else:
|
|
851
|
+
return kernel_func(*args, **kwargs)
|
|
843
852
|
|
|
844
853
|
return func(*args, **kwargs)
|
|
845
854
|
|
|
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
|
|
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
|
|
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
|