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.
Files changed (126) hide show
  1. {kernels-0.18.2 → kernels-0.18.3}/Cargo.lock +4 -4
  2. {kernels-0.18.2 → kernels-0.18.3}/PKG-INFO +1 -1
  3. {kernels-0.18.2 → kernels-0.18.3}/kernels/Cargo.toml +2 -2
  4. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_func.py +62 -1
  5. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_layer.py +20 -1
  6. {kernels-0.18.2 → kernels-0.18.3}/kernels/uv.lock +1 -1
  7. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/Cargo.toml +1 -1
  8. {kernels-0.18.2 → kernels-0.18.3}/pyproject.toml +1 -1
  9. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/kernelize.py +6 -3
  10. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/layer.py +12 -3
  11. {kernels-0.18.2 → kernels-0.18.3}/Cargo.toml +0 -0
  12. {kernels-0.18.2 → kernels-0.18.3}/README.md +0 -0
  13. {kernels-0.18.2 → kernels-0.18.3}/kernels/README.md +0 -0
  14. {kernels-0.18.2 → kernels-0.18.3}/kernels/pytest.ini +0 -0
  15. {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/config.rs +0 -0
  16. {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/git.rs +0 -0
  17. {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/lib.rs +0 -0
  18. {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/lock.rs +0 -0
  19. {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/signing.rs +0 -0
  20. {kernels-0.18.2 → kernels-0.18.3}/kernels/rust/version.rs +0 -0
  21. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/conftest.py +0 -0
  22. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/kernel_locking/kernels.lock +0 -0
  23. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/kernel_locking/pyproject.toml +0 -0
  24. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/layer_locking/kernels.lock +0 -0
  25. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/layer_locking/pyproject.toml +0 -0
  26. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_archs.py +0 -0
  27. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_basic.py +0 -0
  28. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_benchmarks.py +0 -0
  29. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_benchmark.py +0 -0
  30. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_cache.py +0 -0
  31. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_describe_api.py +0 -0
  32. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_info.py +0 -0
  33. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_cli_variants.py +0 -0
  34. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_config.py +0 -0
  35. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_digest.py +0 -0
  36. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_kernel_lock.py +0 -0
  37. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_metadata.py +0 -0
  38. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_data_version.py +0 -0
  39. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_deps.py +0 -0
  40. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_digest.py +0 -0
  41. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_doctest.py +0 -0
  42. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_entry_points.py +0 -0
  43. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_importer.py +0 -0
  44. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_interval_tree.py +0 -0
  45. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_kernel_locking.py +0 -0
  46. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_loaded_kernels.py +0 -0
  47. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_python_deps.py +0 -0
  48. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_resolver.py +0 -0
  49. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_status.py +0 -0
  50. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_trust_remote_code.py +0 -0
  51. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_tvm_ffi.py +0 -0
  52. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_user_agent.py +0 -0
  53. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_validate.py +0 -0
  54. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_variants.py +0 -0
  55. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_verify.py +0 -0
  56. {kernels-0.18.2 → kernels-0.18.3}/kernels/tests/test_versions.py +0 -0
  57. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/compat.rs +0 -0
  58. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/deps.rs +0 -0
  59. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/git_url.rs +0 -0
  60. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/kernel_deps.rs +0 -0
  61. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/mod.rs +0 -0
  62. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/name.rs +0 -0
  63. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/parse.rs +0 -0
  64. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v1.rs +0 -0
  65. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v2.rs +0 -0
  66. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v3.rs +0 -0
  67. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v4.rs +0 -0
  68. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v5.rs +0 -0
  69. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/config/v6.rs +0 -0
  70. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/digest.rs +0 -0
  71. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/git.rs +0 -0
  72. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/hf.rs +0 -0
  73. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/lib.rs +0 -0
  74. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/lock.rs +0 -0
  75. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/metadata.rs +0 -0
  76. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/python_dependencies.json +0 -0
  77. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/signing/mod.rs +0 -0
  78. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/signing/receipt.rs +0 -0
  79. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/src/version.rs +0 -0
  80. {kernels-0.18.2 → kernels-0.18.3}/kernels-common/tests/data/legacy-sha-provenance.json +0 -0
  81. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/__init__.py +0 -0
  82. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/_rust.pyi +0 -0
  83. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/_system.py +0 -0
  84. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/_versions.py +0 -0
  85. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/_windows.py +0 -0
  86. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/archs.py +0 -0
  87. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/backends.py +0 -0
  88. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmark.py +0 -0
  89. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmarks/__init__.py +0 -0
  90. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmarks/activation.py +0 -0
  91. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmarks/attention.py +0 -0
  92. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/benchmarks/layer_norm.py +0 -0
  93. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/__init__.py +0 -0
  94. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/benchmark.py +0 -0
  95. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/benchmark_graphics.py +0 -0
  96. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/cache.py +0 -0
  97. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/describe_api.py +0 -0
  98. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/download.py +0 -0
  99. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/info.py +0 -0
  100. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/lock.py +0 -0
  101. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/variants.py +0 -0
  102. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/verify_signature.py +0 -0
  103. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/cli/versions.py +0 -0
  104. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/compat.py +0 -0
  105. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/deps.py +0 -0
  106. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/digest.py +0 -0
  107. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/hf_hub.py +0 -0
  108. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/importer.py +0 -0
  109. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/install.py +0 -0
  110. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/__init__.py +0 -0
  111. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/_interval_tree.py +0 -0
  112. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/device.py +0 -0
  113. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/func.py +0 -0
  114. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/globals.py +0 -0
  115. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/inspect.py +0 -0
  116. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/mode.py +0 -0
  117. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/layer/repos.py +0 -0
  118. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/load.py +0 -0
  119. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/locking.py +0 -0
  120. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/python_depends.json +0 -0
  121. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/python_deps.py +0 -0
  122. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/resolver.py +0 -0
  123. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/status.py +0 -0
  124. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/validate.py +0 -0
  125. {kernels-0.18.2 → kernels-0.18.3}/src/kernels/variants.py +0 -0
  126. {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.2"
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.2"
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.2"
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.2"
1606
+ version = "0.18.3"
1607
1607
  dependencies = [
1608
1608
  "eyre",
1609
1609
  "kernels-common",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kernels
3
- Version: 0.18.2
3
+ Version: 0.18.3
4
4
  Requires-Dist: huggingface-hub>=1.32.0
5
5
  Requires-Dist: packaging>=20.0
6
6
  Requires-Dist: pyyaml>=6
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "kernels-python"
3
- version = "0.18.2"
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.2"
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
- compiling = iter([True, True, False])
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)
@@ -1457,7 +1457,7 @@ wheels = [
1457
1457
 
1458
1458
  [[package]]
1459
1459
  name = "kernels"
1460
- version = "0.18.2"
1460
+ version = "0.18.3"
1461
1461
  source = { editable = "." }
1462
1462
  dependencies = [
1463
1463
  { name = "huggingface-hub" },
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "kernels-common"
3
- version = "0.18.2"
3
+ version = "0.18.3"
4
4
  edition = "2024"
5
5
  description = "Code shared by kernel-builder and kernels"
6
6
  homepage = "https://github.com/huggingface/kernels"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kernels"
3
- version = "0.18.2"
3
+ version = "0.18.3"
4
4
  description = "Download compute kernels"
5
5
  authors = [
6
6
  { name = "Daniel de Kok", email = "daniel@huggingface.co" },
@@ -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 = Device(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
- dev_type = param.device.type
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
- active_kernel_funcs[id(fn)] = self._kernel_funcs[name]
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 (kernel_func := active_kernel_funcs.get(id(self))) is not None:
842
- return kernel_func(*args, **kwargs)
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