kernels-bot commited on
Commit
f82fe12
·
verified ·
1 Parent(s): 164b09f

Uploaded using `kernel-builder`.

Browse files
README.md CHANGED
@@ -11,14 +11,13 @@ This is the repository card of kernels-community/aiter-rope that has been pushed
11
  # make sure `kernels` is installed: `pip install -U kernels`
12
  from kernels import get_kernel
13
 
14
- kernel_module = get_kernel("kernels-community/aiter-rope", version=2)
15
- __kernel_metadata__ = kernel_module.__kernel_metadata__
16
 
17
- __kernel_metadata__(...)
18
  ```
19
 
20
  ## Available functions
21
- - `__kernel_metadata__`
22
  - `RotateStyle`
23
  - `apply_rotary_transformers`
24
  - `rope_cached_fwd`
 
11
  # make sure `kernels` is installed: `pip install -U kernels`
12
  from kernels import get_kernel
13
 
14
+ kernel_module = get_kernel("kernels-community/aiter-rope", version=3)
15
+ RotateStyle = kernel_module.RotateStyle
16
 
17
+ RotateStyle(...)
18
  ```
19
 
20
  ## Available functions
 
21
  - `RotateStyle`
22
  - `apply_rotary_transformers`
23
  - `rope_cached_fwd`
build/torch-rocm/__init__.py CHANGED
@@ -8,8 +8,8 @@ the ROCm entry of ``_KERNEL_MAPPING["rotary_pos_emb"]`` with zero model-side
8
  changes.
9
  """
10
 
11
- import torch
12
-
13
  from .rope import (
14
  RotateStyle,
15
  rope_cached_fwd,
@@ -22,17 +22,7 @@ __kernel_metadata__ = {
22
  }
23
 
24
 
25
- def _to_sbhd(t: torch.Tensor) -> torch.Tensor:
26
- # transformers passes attention tensors as (batch, heads, seq, head_dim);
27
- # AITER's kernels operate in (seq, batch, heads, head_dim).
28
- return t.permute(2, 0, 1, 3).contiguous()
29
-
30
-
31
- def _to_bhsd(t: torch.Tensor) -> torch.Tensor:
32
- return t.permute(1, 2, 0, 3)
33
-
34
-
35
- def apply_rotary_transformers(q, k, cos, sin, position_ids=None, unsqueeze_dim=1):
36
  """Apply NEOX-style RoPE to ``q`` and ``k``.
37
 
38
  Signature mirrors ``kernels-community/rotary``'s ``apply_rotary_transformers``
@@ -41,37 +31,26 @@ def apply_rotary_transformers(q, k, cos, sin, position_ids=None, unsqueeze_dim=1
41
 
42
  Args:
43
  q, k: ``(batch, heads, seq, head_dim)``.
44
- cos, sin: ``(batch, seq, head_dim // 2)`` — pre-``unsqueeze`` form.
45
- position_ids, unsqueeze_dim: accepted for API parity; the kernel reads
46
- positions from the already-computed ``cos`` / ``sin``.
 
47
 
48
  Returns:
49
  ``(q_embed, k_embed)`` in the same shape as ``q``, ``k``.
50
  """
51
- q_sbhd = _to_sbhd(q)
52
- k_sbhd = _to_sbhd(k)
53
-
54
- # Cached path expects (seq, 1, 1, head_dim/2). Take batch index 0 — for the
55
- # standard (unpadded, equal-length) inference case all batch rows share the
56
- # same cos/sin since they come from the same position_ids.
57
- cos_freqs = cos[0].unsqueeze(1).unsqueeze(1).contiguous()
58
- sin_freqs = sin[0].unsqueeze(1).unsqueeze(1).contiguous()
59
 
60
- common = dict(
61
- rotate_style=int(RotateStyle.NEOX),
62
- reuse_freqs_front_part=True,
63
- nope_first=False,
64
- )
65
- q_out_sbhd = rope_cached_fwd(q_sbhd, cos_freqs, sin_freqs, **common)
66
- k_out_sbhd = rope_cached_fwd(k_sbhd, cos_freqs, sin_freqs, **common)
67
 
68
- return _to_bhsd(q_out_sbhd), _to_bhsd(k_out_sbhd)
 
69
 
70
 
71
  __all__ = [
72
  "__kernel_metadata__",
73
  "RotateStyle",
74
  "apply_rotary_transformers",
 
75
  "rope_cached_fwd",
76
  "rope_cached_fwd_inplace",
77
  ]
 
8
  changes.
9
  """
10
 
11
+ from . import layers
12
+ from .layers import _apply_rotary
13
  from .rope import (
14
  RotateStyle,
15
  rope_cached_fwd,
 
22
  }
23
 
24
 
25
+ def apply_rotary_transformers(q, k, cos, sin, unsqueeze_dim=1):
 
 
 
 
 
 
 
 
 
 
26
  """Apply NEOX-style RoPE to ``q`` and ``k``.
27
 
28
  Signature mirrors ``kernels-community/rotary``'s ``apply_rotary_transformers``
 
31
 
32
  Args:
33
  q, k: ``(batch, heads, seq, head_dim)``.
34
+ cos, sin: ``(batch, seq, head_dim)`` or ``(batch, seq, head_dim // 2)`` — pre-``unsqueeze``
35
+ form. Rows may hold different positions (e.g. left padding).
36
+ unsqueeze_dim: accepted for API parity; the kernel reads positions from
37
+ the already-computed ``cos`` / ``sin``.
38
 
39
  Returns:
40
  ``(q_embed, k_embed)`` in the same shape as ``q``, ``k``.
41
  """
42
+ return _apply_rotary(q, k, cos, sin)
 
 
 
 
 
 
 
43
 
 
 
 
 
 
 
 
44
 
45
+ # Add torch compile support for functions
46
+ apply_rotary_transformers.can_torch_compile = True
47
 
48
 
49
  __all__ = [
50
  "__kernel_metadata__",
51
  "RotateStyle",
52
  "apply_rotary_transformers",
53
+ "layers",
54
  "rope_cached_fwd",
55
  "rope_cached_fwd_inplace",
56
  ]
build/torch-rocm/_ops.py CHANGED
@@ -4,7 +4,10 @@ def get_backend() -> str:
4
  """Detect the backend by inspecting torch."""
5
  import torch
6
 
7
- if hasattr(torch, "neuron"):
 
 
 
8
  # Needs to be sorted before specific Torch builds, since Neuron
9
  # extension can be loaded into e.g. CUDA Torch builds.
10
  return "neuron"
@@ -22,7 +25,7 @@ def get_backend() -> str:
22
 
23
  def _find_ops_name() -> str:
24
  kernel_name = "aiter_rope"
25
- unique_id = "6c454e0"
26
  backend = get_backend()
27
  return f"_{kernel_name}_{backend}_{unique_id}"
28
 
 
4
  """Detect the backend by inspecting torch."""
5
  import torch
6
 
7
+ acc = torch.accelerator.current_accelerator() if hasattr(torch, "accelerator") else None
8
+ if acc is not None and acc.type == "tpu":
9
+ return "tpu"
10
+ elif hasattr(torch, "neuron"):
11
  # Needs to be sorted before specific Torch builds, since Neuron
12
  # extension can be loaded into e.g. CUDA Torch builds.
13
  return "neuron"
 
25
 
26
  def _find_ops_name() -> str:
27
  kernel_name = "aiter_rope"
28
+ unique_id = "75dc872"
29
  backend = get_backend()
30
  return f"_{kernel_name}_{backend}_{unique_id}"
31
 
build/torch-rocm/aiter_rope/__init__.py DELETED
@@ -1,26 +0,0 @@
1
- import ctypes
2
- import importlib.util
3
- import sys
4
- from pathlib import Path
5
- from types import ModuleType
6
-
7
-
8
- def _import_from_path(file_path: Path) -> ModuleType:
9
- # We cannot use the module name as-is, after adding it to `sys.modules`,
10
- # it would also be used for other imports. So, we make a module name that
11
- # depends on the path for it to be unique using the hex-encoded hash of
12
- # the path.
13
- path_hash = "{:x}".format(ctypes.c_size_t(hash(file_path.absolute())).value)
14
- module_name = path_hash
15
- spec = importlib.util.spec_from_file_location(module_name, file_path)
16
- if spec is None:
17
- raise ImportError(f"Cannot load spec for {module_name} from {file_path}")
18
- module = importlib.util.module_from_spec(spec)
19
- if module is None:
20
- raise ImportError(f"Cannot load module {module_name} from spec")
21
- sys.modules[module_name] = module
22
- spec.loader.exec_module(module) # type: ignore
23
- return module
24
-
25
-
26
- globals().update(vars(_import_from_path(Path(__file__).parent.parent / "__init__.py")))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
build/torch-rocm/layers.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+
4
+ from .rope import RotateStyle, rope_cached_fwd, rope_cached_positions_fwd
5
+
6
+
7
+ def _to_sbhd(t: torch.Tensor) -> torch.Tensor:
8
+ # transformers passes attention tensors as (batch, heads, seq, head_dim);
9
+ # AITER's kernels operate in (seq, batch, heads, head_dim).
10
+ return t.permute(2, 0, 1, 3).contiguous()
11
+
12
+
13
+ def _to_bhsd(t: torch.Tensor) -> torch.Tensor:
14
+ return t.permute(1, 2, 0, 3)
15
+
16
+
17
+ def _apply_rotary(q, k, cos, sin):
18
+ q_sbhd = _to_sbhd(q)
19
+ k_sbhd = _to_sbhd(k)
20
+
21
+ common = dict(
22
+ rotate_style=int(RotateStyle.NEOX),
23
+ reuse_freqs_front_part=True,
24
+ nope_first=False,
25
+ )
26
+ batch, seq_len, dim = cos.shape
27
+ if batch == 1:
28
+ # All batch rows share the same positions: index cos / sin by sequence position.
29
+ cos_freqs = cos[0].unsqueeze(1).unsqueeze(1).contiguous()
30
+ sin_freqs = sin[0].unsqueeze(1).unsqueeze(1).contiguous()
31
+ q_out_sbhd = rope_cached_fwd(q_sbhd, cos_freqs, sin_freqs, **common)
32
+ k_out_sbhd = rope_cached_fwd(k_sbhd, cos_freqs, sin_freqs, **common)
33
+ else:
34
+ # Rows can have different positions (e.g. left padding). The kernel ignores the batch
35
+ # stride of cos / sin, so flatten them into a (batch * seq, dim) table and look up row
36
+ # `b * seq_len + s` for token `s` of batch row `b`.
37
+ cos_freqs = cos.reshape(batch * seq_len, 1, 1, dim).contiguous()
38
+ sin_freqs = sin.reshape(batch * seq_len, 1, 1, dim).contiguous()
39
+ positions = (
40
+ torch.arange(batch * seq_len, device=cos.device).view(batch, seq_len).t()
41
+ )
42
+ q_out_sbhd = rope_cached_positions_fwd(
43
+ q_sbhd, cos_freqs, sin_freqs, positions, **common
44
+ )
45
+ k_out_sbhd = rope_cached_positions_fwd(
46
+ k_sbhd, cos_freqs, sin_freqs, positions, **common
47
+ )
48
+
49
+ return _to_bhsd(q_out_sbhd), _to_bhsd(k_out_sbhd)
50
+
51
+
52
+ class apply_rotary_transformers(nn.Module):
53
+ can_torch_compile: bool = True
54
+
55
+ def forward(self, q, k, cos, sin, unsqueeze_dim=1):
56
+ return _apply_rotary(q, k, cos, sin)
57
+
58
+
59
+ __all__ = ["apply_rotary_transformers"]
build/torch-rocm/metadata.json CHANGED
@@ -1,23 +1,37 @@
1
  {
2
  "name": "aiter-rope",
3
- "id": "_aiter_rope_rocm_6c454e0",
4
- "version": 1,
 
5
  "license": "MIT",
6
  "python-depends": [],
 
7
  "backend": {
8
  "type": "rocm"
9
  },
10
  "digest": {
11
  "algorithm": "sha256",
12
  "files": {
13
- "__init__.py": "uKLbHUQRYd9TNj3e4I6pzZIF7fCkJTDGkvy+Lk5mPLY=",
14
  "_kernels/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
15
  "_kernels/rope.py": "yYQRz0fxK1CuTYD9rolVEDXvy3YnS6775IxceH1fNow=",
16
- "_ops.py": "mUuGk14iTuP13crGxZjXmyaJ0XUEKEYKd1MGGwUG4q4=",
17
- "aiter_rope/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY=",
18
  "rope.py": "DmzekBurit+Ow9BGR0Zgc76MjAolYQ6q8mEckVLbtj0=",
 
19
  "utils/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
20
  "utils/logger.py": "CXuJZCBzQDTrW80OyJ2IuhbHhayLy12Ake1KGxiuYIA="
21
  }
 
 
 
 
 
 
 
 
 
 
 
22
  }
23
  }
 
1
  {
2
  "name": "aiter-rope",
3
+ "id": "_aiter_rope_rocm_75dc872",
4
+ "version": 3,
5
+ "kernels-minver": "0.14.0",
6
  "license": "MIT",
7
  "python-depends": [],
8
+ "kernel-depends": [],
9
  "backend": {
10
  "type": "rocm"
11
  },
12
  "digest": {
13
  "algorithm": "sha256",
14
  "files": {
15
+ "__init__.py": "gAAL6hzdsMrvo9+VsICnOKdEmfcUz+36zXMsKIrqUaI=",
16
  "_kernels/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
17
  "_kernels/rope.py": "yYQRz0fxK1CuTYD9rolVEDXvy3YnS6775IxceH1fNow=",
18
+ "_ops.py": "gm05aB4Ir8V0bf2AtYzCQi9i17iXw2tuvvG/l0S2zj8=",
19
+ "layers.py": "zBFYJlQHjvOEt4NinTCPWpq+koKgCmvleZBYxtHcqro=",
20
  "rope.py": "DmzekBurit+Ow9BGR0Zgc76MjAolYQ6q8mEckVLbtj0=",
21
+ "symbols.json": "K4bGp833woarg6DmDk5UiGGhchv+eqEFBok1Cj1vpN4=",
22
  "utils/__init__.py": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
23
  "utils/logger.py": "CXuJZCBzQDTrW80OyJ2IuhbHhayLy12Ake1KGxiuYIA="
24
  }
25
+ },
26
+ "provenance": {
27
+ "kernel-builder": {
28
+ "version": "0.18.0-dev0",
29
+ "commit": "11a92c0d8289d94d8c660933285d0c1986076e3b",
30
+ "dirty": false
31
+ },
32
+ "kernel": {
33
+ "commit": "75dc87202fed59700d26e6269fbdaf203586b16a",
34
+ "dirty": false
35
+ }
36
  }
37
  }
build/torch-rocm/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHdDCCBvmgAwIBAgIUWhjs2+DXFcCWF6IwGYoItfUE/rcwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNjE4MDY0MDA3WhcNMjYwNjE4MDY1MDA3WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHSkIxaesK3br4WHBSmr+z/CF4djDePDfUKihLJjBzFzybh1UJlzoyXgDXkbYYu/K7AQNdcAcd256RqU6OZshXqOCBhgwggYUMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUnPZck8NYqiR9yToAQLPac5jkrzcwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdQYDVR0RAQH/BGswaYZnaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL3NpZ24tb2xkLWJ1aWxkcy55YW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDhhNmJlN2JjNzc1NjVhZDY1YzhhZTJkZWI0NTY0ODJmZjZhYTUwZWQwHQYKKwYBBAGDvzABBAQPU2lnbiBvbGQgYnVpbGRzMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wdwYKKwYBBAGDvzABCQRpDGdodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1vbGQtYnVpbGRzLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoOGE2YmU3YmM3NzU2NWFkNjVjOGFlMmRlYjQ1NjQ4MmZmNmFhNTBlZDAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzB3BgorBgEEAYO/MAESBGkMZ2h0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9zaWduLW9sZC1idWlsZHMueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg4YTZiZTdiYzc3NTY1YWQ2NWM4YWUyZGViNDU2NDgyZmY2YWE1MGVkMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwZAYKKwYBBAGDvzABFQRWDFRodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvYWN0aW9ucy9ydW5zLzI3NzQxNDY0ODQyL2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5OnJlZjpyZWZzL2hlYWRzL21haW4wgYoGCisGAQQB1nkCBAIEfAR6AHgAdgDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAZ7ZdVqqAAAEAwBHMEUCIANtbwnmbJLS/lrlb5rgby2NvpWGzVeZFCpOu0BoU8YZAiEAgO1a/KYOdboXZ36h6OtO6IAo/4muul43Jn8f6NCsuiEwCgYIKoZIzj0EAwMDaQAwZgIxAOumX7bTZlCwsLhZLNfmAnzSQiaTDZN9Eq3N/kH0Rm9Dcm7iHDgbay0Yl0ZTLGUnewIxALBYK05kB0lKByNOiMhQq2PeoAtwuUtbFhbPV59DCbBajGzgdCmyijtX57WzhrwYtg=="},"tlogEntries":[{"logIndex":"1857726717","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1781764807","inclusionPromise":{"signedEntryTimestamp":"MEQCIAeleagjphKMx3fu4zTP4ICE6VRY5erbojs60u90tULeAiAhXnqCAW/PZnu03SxcGjE711JMaTvpWeHGKICtQMkLhw=="},"inclusionProof":{"logIndex":"1735822455","rootHash":"re5TZsP/nSZf9c3ZarmuN2VdQdrBG0HXvatlYbt2Pc0=","treeSize":"1735822480","hashes":["0taHlWGjIMz/f4NJnNPKGKP5eENRgCaG2n44W4epirQ=","pHwZWrEAlsrxH1KfrlWR7X5Zdr+nV8KXVm570gAx1CE=","ZsZcnEYpWJjgNYivyzPhFFyg7r2oAgo8LfSyIHKnbLc=","/svf1yAp4wiz4jWWQD3DeXdOB48KdRsVlIUAvLZiwMo=","cryJVrUr/AmrXbpxgvbDyipQSVFhEtNvqgsV0A3ngyk=","9/A9DdtHQJoDbrziLAO9h4wH5tdgxi8gRtD4diye+zk=","1T+N1dBJlpDwIkiAVJsu/zLSxvECXOJbMNptHug4/JI=","7umFV6+0738P7v9WO6X9BpY1SIcNI/fpHKyctlZdKkw=","NKlDXs3aVJHqDhGms9QBmtbY3ff/YyjTF5AhLJRB9Rc=","c9dDWxQB1DqD05FI+m7j6723qqz66g/f1FjHOJFgwaY=","dQ0vp6bTINknlH62FrclrEUfkH7k78NIxh1bWpWHr/8=","gAXtVb4czMvijEVHzLZvy9CiZR4I3EjGJKutWKb8sus=","kQ24bHYwEfgDFlQ+Tj4EY+dUxV0UU4uH+etf0vVNbbY=","sWDh7SjDHbJf3HWKGRxiURh6iIYrOzn4Zs37yIij6OA=","x7kXd4VRJvVmTHoSla2KyPQdKvGKDX26/7ST9OONR78=","U8wMiVDzFlmyqT7Nw1RSZYU9+fftsSkRhjpbyXnXUk8=","mqM7J+i75IpuD09QejiUBjeH85AZa+fSm4RXXFmj3lI=","72FC5FYLhxB4a4iiC956o0B/fT54ip4R41vsw2QBKtU=","lYGQ9ibwC8+smMkPQ6TchJm3H9Nc/aTYLfdRacGFChw=","daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=","DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n1735822480\nre5TZsP/nSZf9c3ZarmuN2VdQdrBG0HXvatlYbt2Pc0=\n\n— rekor.sigstore.dev wNI9ajBFAiAcbfbGE1sTd+GgCVwp4/DUilq4yAq7oF6F1alx4cYXOwIhAJtz5cT86gbo8Z6x2aeGee6YxoY92uzo3U0oEELLgL0u\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI5ZWZjYzUyYzlkZTkzNmQwZTdlYzFhMmI5MmI3NzcxNWNiY2E1NjhlYWJhZDBjOTgzOGVkYTUzZGFmY2VlZGE5In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJR1Z3bTNSazljMFQ1bDhHZHpRSDY1bEtMamJETEtITmpoZ1JNRDFzc3JjK0FpRUEzRVZTNU9ZSEtmL3dkaTg0YlN3dEExMUtoUUxzeHRVMDZSYVhhRWVYQi9FPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGtSRU5EUW5adFowRjNTVUpCWjBsVlYyaHFjeklyUkZoR1kwTlhSalpKZDBkWmIwbDBabFZGTDNKamQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxUlRSTlJGa3dUVVJCTTFkb1kwNU5hbGwzVG1wRk5FMUVXVEZOUkVFelYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZJVTJ0SmVHRmxjMHN6WW5JMFYwaENVMjF5SzNvdlEwWTBaR3BFWlZCRVpsVkxhV2dLVEVwcVFucEdlbmxpYURGVlNteDZiM2xZWjBSWWEySlpXWFV2U3pkQlVVNWtZMEZqWkRJMU5sSnhWVFpQV25Ob1dIRlBRMEpvWjNkbloxbFZUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZ1VUZwakNtczRUbGx4YVZJNWVWUnZRVkZNVUdGak5XcHJjbnBqZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSUldVUldVakJTUVZGSUwwSkhjM2RoV1ZwdVlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU0wNXdXakkwZEdJeWVHdE1WMG94Q21GWGVHdGplVFUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTlVKbmIzSkNaMFZGUVZsUEwwMUJSVUpDUTNSdlpFaFNkMk42YjNZS1RETlNkbUV5Vm5WTWJVWnFaRWRzZG1KdVRYVmFNbXd3WVVoV2FXUllUbXhqYlU1MlltNVNiR0p1VVhWWk1qbDBUVUk0UjBOcGMwZEJVVkZDWnpjNGR3cEJVVWxGUlZoa2RtTnRkRzFpUnpreldESlNjR016UW1oa1IwNXZUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUkdob1RtMUtiRTR5U21wT2VtTXhDazVxVm1oYVJGa3hXWHBvYUZwVVNtdGFWMGt3VGxSWk1FOUVTbTFhYWxwb1dWUlZkMXBYVVhkSVVWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlVGVXliRzRLWW1sQ2RtSkhVV2RaYmxad1lrZFNlazFEYzBkRGFYTkhRVkZSUW1jM09IZEJVVlZGU0Zkb01Wb3laSEJpYldSdFdWZE9iRXd5ZEd4amJUVnNZa2hOZEFwWk1qbDBZbGhXZFdGWVVqVk5RakJIUTJselIwRlJVVUpuTnpoM1FWRlpSVVF6U214YWJrMTJZVWRXYUZwSVRYWmlWMFp3WW1wQk4wSm5iM0pDWjBWRkNrRlpUeTlOUVVWSlFrTXdUVXN5YURCa1NFSjZUMms0ZG1SSE9YSmFWelIxV1ZkT01HRlhPWFZqZVRWdVlWaFNiMlJYU2pGak1sWjVXVEk1ZFdSSFZuVUtaRU0xYW1JeU1IZGtkMWxMUzNkWlFrSkJSMFIyZWtGQ1ExRlNjRVJIWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFpoU0ZadVdqSnNkUXBhTWxwb1dUSlZkbUV5Vm5saWJWWnpZM2t4YW1JeU1YUmtWelZ3WkVocmRreHRaSEJrUjJneFdXazVNMkl6U25KYWJYaDJaRE5OZG1NeWJHNWlhVEYyQ21KSFVYUlpibFp3WWtkU2VreHViR2hpVjNoQlkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5SR2RIUTJselIwRlJVVUpuTnpoM1FWRnZSVXRuZDI4S1QwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkZwRVFXSkNaMjl5UW1kRlJRcEJXVTh2VFVGRlRFSkJNRTFETTA1c1lrZFpkR0ZIT1hwa1IxWnJUVVZCUjBOcGMwZEJVVkZDWnpjNGQwRlJkMFZOWjNkM1lVaFNNR05JVFRaTWVUbHVDbUZZVW05a1YwbDFXVEk1ZEV3eWFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk5SR2RIUTJselIwRlJVVUlLWnpjNGQwRlJNRVZMWjNkdlQwZEZNbGx0VlROWmJVMHpUbnBWTWs1WFJtdE9hbFpxVDBkR2JFMXRVbXhaYWxFeFRtcFJORTF0V20xT2JVWm9UbFJDYkFwYVJFRm1RbWR2Y2tKblJVVkJXVTh2VFVGRlQwSkNSVTFFTTBwc1dtNU5kbUZIVm1oYVNFMTJZbGRHY0dKcVFXRkNaMjl5UW1kRlJVRlpUeTlOUVVWUUNrSkJkMDFEYWtWM1RucEZNRTU2VlRGTmFtdDNUR2RaUzB0M1dVSkNRVWRFZG5wQlFrVkJVV2RFUWpWdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5Xb0tZakl3ZG1GSVZtNWFNbXgxV2pKYWFGa3lWWGRIUVZsTFMzZFpRa0pCUjBSMmVrRkNSVkZSUzBSQlozbE9WR041VFVSak1FMTZRak5DWjI5eVFtZEZSUXBCV1U4dlRVRkZVMEpIYTAxYU1tZ3daRWhDZWs5cE9IWmFNbXd3WVVoV2FVeHRUblppVXpsdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2Q2t4WFRuWmlWekV4WW0xc01HVlRPSFZhTW13d1lVaFdhVXd6WkhaamJYUnRZa2M1TTJONU9YcGhWMlIxVEZjNWMxcERNV2xrVjJ4eldraE5kV1ZYUm5RS1lrVkNlVnBYV25wTU1taHNXVmRTZWt3eU1XaGhWelIzVDBGWlMwdDNXVUpDUVVkRWRucEJRa1YzVVhGRVEyYzBXVlJhYVZwVVpHbFplbU16VGxSWk1RcFpWMUV5VGxkTk5GbFhWWGxhUjFacFRrUlZNazVFWjNsYWJWa3lXVmRGTVUxSFZtdE5RMFZIUTJselIwRlJVVUpuTnpoM1FWSlJSVVYzZDFKa01qbDVDbUV5V25OaU0yUm1Xa2RzZW1OSFJqQlpNbWQzV2tGWlMwdDNXVUpDUVVkRWRucEJRa1pSVWxkRVJsSnZaRWhTZDJONmIzWk1NbVJ3WkVkb01WbHBOV29LWWpJd2RtRklWbTVhTW14MVdqSmFhRmt5VlhaaE1sWjVZbTFXYzJONU1XcGlNakYwWkZjMWNHUklhM1paVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBKTXdwT2VsRjRUa1JaTUU5RVVYbE1Na1l3WkVkV2RHTklVbnBNZWtWM1JtZFpTMHQzV1VKQ1FVZEVkbnBCUWtablVVbEVRVnAzWkZkS2MyRlhUWGRTWjFsTENrdDNXVUpDUVVkRWRucEJRa2RCVVRSRVJGcDVXbGhDZGs5dGFERmFNbVJ3WW0xa2JWbFhUbXhNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVUtUMjVLYkZwcWNIbGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMmRaYjBkRGFYTkhRVkZSUWpGdWEwTkNRVWxGWmtGU05rRklaMEZrWjBSa1VGUkNjUXA0YzJOU1RXMU5Xa2hvZVZwYWVtTkRiMnR3WlhWT05EaHlaaXRJYVc1TFFVeDViblZxWjBGQlFWbzNXbVJXY1hGQlFVRkZRWGRDU0UxRlZVTkpRVTUwQ21KM2JtMWlTa3hUTDJ4eWJHSTFjbWRpZVRKT2RuQlhSM3BXWlZwR1EzQlBkVEJDYjFVNFdWcEJhVVZCWjA4eFlTOUxXVTlrWW05WVdqTTJhRFpQZEU4S05rbEJieTgwYlhWMWJEUXpTbTQ0WmpaT1EzTjFhVVYzUTJkWlNVdHZXa2w2YWpCRlFYZE5SR0ZSUVhkYVowbDRRVTkxYlZnM1lsUmFiRU4zYzB4b1dncE1UbVp0UVc1NlUxRnBZVlJFV2s0NVJYRXpUaTlyU0RCU2JUbEVZMjAzYVVoRVoySmhlVEJaYkRCYVZFeEhWVzVsZDBsNFFVeENXVXN3Tld0Q01HeExDa0o1VGs5cFRXaFJjVEpRWlc5QmRIZDFWWFJpUm1oaVVGWTFPVVJEWWtKaGFrZDZaMlJEYlhscGFuUllOVGRYZW1oeWQxbDBaejA5Q2kwdExTMHRSVTVFSUVORlVsUkpSa2xEUVZSRkxTMHRMUzBLIn19fX0="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgNrfAj3vjxJoLOUfMT1Ep5PdeHtibnF5ri+pZJYkcHOkCFQCUXx4BUSzpo3snvwl25ZIbzisbqhgPMjAyNjA2MTgwNjQwMDdaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHbMIIB1wIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDYxODA2NDAwN1owLwYJKoZIhvcNAQkEMSIEICxPCJGtc03vMIquM+LlcxyjXzJ0BMc6pmOA4mLxiexgMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRnMGUCMCwz8uKd52cHzKS58YJ7LS9HZt2L/ruWXzXlKltHEpWUeR5UswAYYNJbfwXOsynWVQIxAK67Fe8iyTkPa0G18zy6RTrQKPs4khRjd815luzpy4mNh5GnHMpHav+ugXAywX7XUQ=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"nvzFLJ3pNtDn7Borkrd3FcvKVo6rrQyYOO2lPa/O7ak="},"signature":"MEUCIGVwm3Rk9c0T5l8GdzQH65lKLjbDLKHNjhgRMD1ssrc+AiEA3EVS5OYHKf/wdi84bSwtA11KhQLsxtU06RaXaEeXB/E="}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHKjCCBrGgAwIBAgIUbXdUKLuTdTaIeb6xQimh5N//pcUwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYxMDE1MTMwMTM4WhcNMjYxMDE1MTMxMTM4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5VQVh7aCebBd+vxipqIkoM4xo7o2BpfR8U+A8KMq89aSG8bjDFAJHHYnArkgIq+DMRKlhRNxHo1ATEOPZW/5l6OCBdAwggXMMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAfBgNVHSMEGDAWgBTf0+nPViQRlvmo2OkoVaLGLhhkPzBrBgNVHREBAf8EYTBfhl1odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3MvYnVpbGQueWFtbEByZWZzL2hlYWRzL21haW4wOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAfBgorBgEEAYO/MAECBBF3b3JrZmxvd19kaXNwYXRjaDA2BgorBgEEAYO/MAEDBCg3NWRjODcyMDJmZWQ1OTcwMGQyNmU2MjY5ZmJkYWYyMDM1ODZiMTZhMBMGCisGAQQBg78wAQQEBUJ1aWxkMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wbQYKKwYBBAGDvzABCQRfDF1odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3MvYnVpbGQueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABCgQqDCg3NWRjODcyMDJmZWQ1OTcwMGQyNmU2MjY5ZmJkYWYyMDM1ODZiMTZhMBsGCisGAQQBg78wAQsEDQwLc2VsZi1ob3N0ZWQwQAYKKwYBBAGDvzABDAQyDDBodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkwOAYKKwYBBAGDvzABDQQqDCg3NWRjODcyMDJmZWQ1OTcwMGQyNmU2MjY5ZmJkYWYyMDM1ODZiMTZhMB8GCisGAQQBg78wAQ4EEQwPcmVmcy9oZWFkcy9tYWluMBoGCisGAQQBg78wAQ8EDAwKMTA3MTQ3NTUyOTAuBgorBgEEAYO/MAEQBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZTAYBgorBgEEAYO/MAERBAoMCDI1NzIwNzQzMG0GCisGAQQBg78wARIEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wARMEKgwoNzVkYzg3MjAyZmVkNTk3MDBkMjZlNjI2OWZiZGFmMjAzNTg2YjE2YTAhBgorBgEEAYO/MAEUBBMMEXdvcmtmbG93X2Rpc3BhdGNoMGQGCisGAQQBg78wARUEVgxUaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5L2FjdGlvbnMvcnVucy8zODczODQwMzI1Mi9hdHRlbXB0cy8xMBYGCisGAQQBg78wARYECAwGcHVibGljMEYGCisGAQQBg78wARgEOAw2cmVwbzpodWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTpyZWY6cmVmcy9oZWFkcy9tYWluMIGJBgorBgEEAdZ5AgQCBHsEeQB3AHUA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGhP6dqvAAABAMARjBEAiATP5FQsuJx7iW9sOZxTCs4uPQi4VpaRDL/9bVwM8zCugIgXFTFjvHDDAHXgf+0kkxk8c/Sf+RBKU6aUJFSAl2Nuz0wCgYIKoZIzj0EAwMDZwAwZAIwdpoiurluYPeMZiUS1uyuPY3PmwmdozC0qkFdPC5n+CtIScljfaou2OpcrPdMrdT6AjBAfaBB1DnWJZ0TE5+vqJSNT51ZllD+252+l01FTrsevtkcZXFHKIeP4kc7NIXcGug="}, "tlogEntries":[{"logIndex":"3265115829", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"hashedrekord", "version":"0.0.1"}, "integratedTime":"1792069299", "inclusionPromise":{"signedEntryTimestamp":"MEQCIAVvGb2X6kI30n2fcxZyhucPrr6f1zIeaPcoOQ7vuH4FAiAG2rUfZT45k3wB+ivttoGIwmczxFW+GMhQhTwEt36Vgg=="}, "inclusionProof":{"logIndex":"3143211567", "rootHash":"pK++q//g2X+OuMn4Qj3k3CUFqRxESgjoWb8/I8OB3Yc=", "treeSize":"3143212072", "hashes":["Jx7k/CcM5Fo9HpsqXClPokkBcsDY9cNv7+zxF2Rezn8=", "BDUgdnLy3Al4oOhoSq0MyKINDHL1UHBPkgsG2oXVC4s=", "TD2hihKDa37Etj2VmxAzHV8bNg+hGo5XkbuCpYL66HI=", "EL2QBkn2rbWngsymhjC65NqALjIbXE7YCC8TIsDpoO8=", "SXTN5IW3/Wz9zSQFJG0norvKNgv61h40AT5tK1SIRVQ=", "t7Kny/CQbqSamG4jq2atkGEsEZ32V/JBxtNuRz+cMV0=", "A4/HN5YngqqSt0RnOrOfX9NSRCNqSJIOebxXmSKTCUo=", "ogpabfc4+qc0RtvTiCw1UZPvbnCJ7zWXXxn+wOO2b4s=", "Nh+lHJQV5ZKjP0oymULoAZSircoT1aNciU+Dy0n92Ns=", "kanScaUMu3oovcpXU+n4V4+XMqK617PqPbCGTAc163Y=", "MDbcS0VEa7B8s8WOjsCKbFnuBIj1sW8arOlzcE+aG6k=", "ikeWt1/T+/lPfWDHN/iIwRg16hZhLoQookV/PfhHJmg=", "skdxDoj4OksXFthBSnEyVwAkSgTAz50Y03RmF3owKUE=", "YST9UcC2yDVf0221NpPaFVssxDtJwd5A6xG22zFXmVM=", "LP6BTpxPzicOkaS60mAty4jrWi73RhnKSj4SrV6UBFY=", "kpBXa6sUMkPmVdqAWh9+xCWs/0gnrC2GfG1BpcaAyQo=", "rU+ZpvDacgve7+vOPaS0JDxbccLiAu+LY13cH5uD/SY=", "sXH0gh8geYB71VBLrtd+Lu9cS4Xoh9llXDl8Xuq21lc=", "PQ6v5GPoAO3EwkpvBOXnLQ/4/LhH4/jzBp6ICB4PyEQ=", "wk2tYV/zs2FUIlhL9YQeUw8UqKbqhapvz1h7jtdeQWw=", "gg9GNApNke3+zNhl4tsWtmIycCFrOMCB3lys6XuSQNQ=", "NlOclldmKPA1tMKIskqHAwuQDYHp31YwpK+OOMrMccc=", "qxzHanAzz57SDdmJe0B7bJK72NTIBbwEMGBBKvDOROw=", "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n3143212072\npK++q//g2X+OuMn4Qj3k3CUFqRxESgjoWb8/I8OB3Yc=\n\n— rekor.sigstore.dev wNI9ajBGAiEA8qmYp41+nBQoYZu3ClE7psslAmJ80kNrmYnEsOzdBPICIQCb5r4dM6UoHVZAv/7B5OqoA6v7ja6psnqJ5h8bbZTMtg==\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI4ZjUyYjgyNWRmZWRkOTMxMTdkNDkxNWI5NmM2YTE5NWZiOGM0NTA0OWMwZTJjOTkyMjAwYjExODE2OGZmZmNhIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJQjFjVU1RYU44MklZVERXUlBYbnlrVjV4dW1jWDFlaEE5bk9VamRLSGpHY0FpQkZsbmdpVzVkUmdnWmxxc1NBRkIwY2o2dUo2VnpmWEFwSGVBNVlTd0x1ZVE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaExha05EUW5KSFowRjNTVUpCWjBsVllsaGtWVXRNZFZSa1ZHRkpaV0kyZUZGcGJXZzFUaTh2Y0dOVmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFUlRGTlZFMTNUVlJOTkZkb1kwNU5hbGw0VFVSRk1VMVVUWGhOVkUwMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVUxVmxGV2FEZGhRMlZpUW1RcmRuaHBjSEZKYTI5Tk5IaHZOMjh5UW5CbVVqaFZLMEVLT0V0TmNUZzVZVk5IT0dKcVJFWkJTa2hJV1c1QmNtdG5TWEVyUkUxU1MyeG9VazU0U0c4eFFWUkZUMUJhVnk4MWJEWlBRMEprUVhkbloxaE5UVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFuSkNaMDVXU0ZKRlFrRm1PRVZaVkVKbWFHd3hiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWMllUSldlV0p0Vm5OamVURnFZakl4ZEdSWE5YQmtTR3QyVEcxa2NHUkhhREZaYVRrellqTktjZ3BhYlhoMlpETk5kbGx1Vm5CaVIxRjFaVmRHZEdKRlFubGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMDlSV1V0TGQxbENRa0ZIUkhaNlFVSkJVVkZ5Q21GSVVqQmpTRTAyVEhrNU1HSXlkR3hpYVRWb1dUTlNjR0l5TlhwTWJXUndaRWRvTVZsdVZucGFXRXBxWWpJMU1GcFhOVEJNYlU1MllsUkJaa0puYjNJS1FtZEZSVUZaVHk5TlFVVkRRa0pHTTJJelNuSmFiWGgyWkRFNWEyRllUbmRaV0ZKcVlVUkJNa0puYjNKQ1owVkZRVmxQTDAxQlJVUkNRMmN6VGxkU2FncFBSR041VFVSS2JWcFhVVEZQVkdOM1RVZFJlVTV0VlRKTmFsazFXbTFLYTFsWFdYbE5SRTB4VDBSYWFVMVVXbWhOUWsxSFEybHpSMEZSVVVKbk56aDNDa0ZSVVVWQ1ZVb3hZVmQ0YTAxRGMwZERhWE5IUVZGUlFtYzNPSGRCVVZWRlNGZG9NVm95WkhCaWJXUnRXVmRPYkV3eWRHeGpiVFZzWWtoTmRGa3lPWFFLWWxoV2RXRllValZOUWpCSFEybHpSMEZSVVVKbk56aDNRVkZaUlVRelNteGFiazEyWVVkV2FGcElUWFppVjBad1ltcEJOMEpuYjNKQ1owVkZRVmxQTHdwTlFVVkpRa013VFVzeWFEQmtTRUo2VDJrNGRtUkhPWEphVnpSMVdWZE9NR0ZYT1hWamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcUNtSXlNSGRpVVZsTFMzZFpRa0pCUjBSMmVrRkNRMUZTWmtSR01XOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaFNGWnVXakpzZFZveVdtZ0tXVEpWZG1FeVZubGliVlp6WTNreGFtSXlNWFJrVnpWd1pFaHJka3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsbHVWbkJpUjFGMVpWZEdkQXBpUlVKNVdsZGFla3d5YUd4WlYxSjZUREl4YUdGWE5IZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1EyZFJjVVJEWnpOT1YxSnFUMFJqZVUxRVNtMWFWMUV4Q2s5VVkzZE5SMUY1VG0xVk1rMXFXVFZhYlVwcldWZFplVTFFVFRGUFJGcHBUVlJhYUUxQ2MwZERhWE5IUVZGUlFtYzNPSGRCVVhORlJGRjNUR015Vm5NS1dta3hiMkl6VGpCYVYxRjNVVUZaUzB0M1dVSkNRVWRFZG5wQlFrUkJVWGxFUkVKdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5XcGlNakIyWVVoV2JncGFNbXgxV2pKYWFGa3lWWFpoTWxaNVltMVdjMk41TVdwaU1qRjBaRmMxY0dSSWEzZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JGRlJjVVJEWnpOT1YxSnFDazlFWTNsTlJFcHRXbGRSTVU5VVkzZE5SMUY1VG0xVk1rMXFXVFZhYlVwcldWZFplVTFFVFRGUFJGcHBUVlJhYUUxQ09FZERhWE5IUVZGUlFtYzNPSGNLUVZFMFJVVlJkMUJqYlZadFkzazViMXBYUm10amVUbDBXVmRzZFUxQ2IwZERhWE5IUVZGUlFtYzNPSGRCVVRoRlJFRjNTMDFVUVROTlZGRXpUbFJWZVFwUFZFRjFRbWR2Y2tKblJVVkJXVTh2VFVGRlVVSkRRVTFJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx2WkZka2JtRlhOVzVhYlVacUNscFVRVmxDWjI5eVFtZEZSVUZaVHk5TlFVVlNRa0Z2VFVORVNURk9la2wzVG5wUmVrMUhNRWREYVhOSFFWRlJRbWMzT0hkQlVrbEZXSGQ0WkdGSVVqQUtZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTW1neFdqSmtjR0p0WkcxWlYwNXNUREowYkdOdE5XeGlTRTEwV1RJNWRHSllWblZoV0ZJMVRIazFiZ3BoV0ZKdlpGZEpkbVF5T1hsaE1scHpZak5rZWt3eVNqRmhWM2hyVEc1c2FHSlhlRUZqYlZadFkzazViMXBYUm10amVUbDBXVmRzZFUxRVowZERhWE5IQ2tGUlVVSm5OemgzUVZKTlJVdG5kMjlPZWxacldYcG5NMDFxUVhsYWJWWnJUbFJyTTAxRVFtdE5hbHBzVG1wSk1rOVhXbWxhUjBadFRXcEJlazVVWnpJS1dXcEZNbGxVUVdoQ1oyOXlRbWRGUlVGWlR5OU5RVVZWUWtKTlRVVllaSFpqYlhSdFlrYzVNMWd5VW5Cak0wSm9aRWRPYjAxSFVVZERhWE5IUVZGUlFncG5OemgzUVZKVlJWWm5lRlZoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlV3eVJtcGtSMngyWW01TmRtTnVWblZqZVRoNlQwUmplazlFVVhkTmVra3hUV2s1YUdSSVVteGlXRUl3WTNrNGVFMUNXVWNLUTJselIwRlJVVUpuTnpoM1FWSlpSVU5CZDBkalNGWnBZa2RzYWsxRldVZERhWE5IUVZGUlFtYzNPSGRCVW1kRlQwRjNNbU50Vm5kaWVuQnZaRmRrYmdwaFZ6VnVXbTFHYWxwVE9YSmFXRXAxV2xkNGVreFhUblppVnpFeFltMXNNR1ZVY0hsYVYxazJZMjFXYldONU9XOWFWMFpyWTNrNWRGbFhiSFZOU1VkS0NrSm5iM0pDWjBWRlFXUmFOVUZuVVVOQ1NITkZaVkZDTTBGSVZVRXpWREIzWVhOaVNFVlVTbXBIVWpSamJWZGpNMEZ4U2t0WWNtcGxVRXN6TDJnMGNIa0taME00Y0Rkdk5FRkJRVWRvVURaa2NYWkJRVUZDUVUxQlVtcENSVUZwUVZSUU5VWlJjM1ZLZURkcFZ6bHpUMXA0VkVOek5IVlFVV2swVm5CaFVrUk1Md281WWxaM1RUaDZRM1ZuU1dkWVJsUkdhblpJUkVSQlNGaG5aaXN3YTJ0NGF6aGpMMU5tSzFKQ1MxVTJZVlZLUmxOQmJESk9kWG93ZDBObldVbExiMXBKQ25wcU1FVkJkMDFFV25kQmQxcEJTWGRrY0c5cGRYSnNkVmxRWlUxYWFWVlRNWFY1ZFZCWk0xQnRkMjFrYjNwRE1IRnJSbVJRUXpWdUswTjBTVk5qYkdvS1ptRnZkVEpQY0dOeVVHUk5jbVJVTmtGcVFrRm1ZVUpDTVVSdVYwcGFNRlJGTlN0MmNVcFRUbFExTVZwc2JFUXJNalV5SzJ3d01VWlVjbk5sZG5Scll3cGFXRVpJUzBsbFVEUnJZemRPU1ZoalIzVm5QUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In19fX0="}], "timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyDADAgEAMIICvwYJKoZIhvcNAQcCoIICsDCCAqwCAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgcELCMkxy4161valhsS1rMhWB8kyjTTubw329ZoF5u38CFDm/nZzoh/hxcCTfvDoD8EJT7z7pGA8yMDI2MTAxNTEzMDEzOVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdowggHWAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYxMDE1MTMwMTM5WjAvBgkqhkiG9w0BCQQxIgQgxesJ/tuHMpuFnm6w/fBpm95vSfafICD5ya0sk0wzGoswgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGYwZAIwHOF2vjsSWHjTatqUUsKpwONxezvk/Z4V3orC5NHsgbMvpvgSazPQWaxBjSxZZgOWAjAuh+2v3k9XL9DzmxAmlpL6vlr1R1ZsDEU8iWNO9EQz+ITgmEX4MNDx3Wg0qr9xiFk="}]}}, "messageSignature":{"messageDigest":{"algorithm":"SHA2_256", "digest":"j1K4Jd/t2TEX1JFblsahlfuMRQScDiyZIgCxGBaP/8o="}, "signature":"MEQCIB1cUMQaN82IYTDWRPXnykV5xumcX1ehA9nOUjdKHjGcAiBFlngiW5dRggZlqsSAFB0cj6uJ6VzfXApHeA5YSwLueQ=="}}
build/torch-rocm/symbols.json ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "module": "_aiter_rope_rocm_75dc872",
4
+ "functions": [
5
+ {
6
+ "name": "apply_rotary_transformers",
7
+ "qualname": "apply_rotary_transformers",
8
+ "module": "_aiter_rope_rocm_75dc872",
9
+ "kind": "function",
10
+ "doc": "Apply NEOX-style RoPE to ``q`` and ``k``.\n\nSignature mirrors ``kernels-community/rotary``'s ``apply_rotary_transformers``\nso this kernel can be a drop-in replacement under the ``\"rocm\"`` entry of\ntransformers' ``_KERNEL_MAPPING[\"rotary_pos_emb\"]``.\n\nArgs:\n q, k: ``(batch, heads, seq, head_dim)``.\n cos, sin: ``(batch, seq, head_dim)`` or ``(batch, seq, head_dim // 2)`` — pre-``unsqueeze``\n form. Rows may hold different positions (e.g. left padding).\n unsqueeze_dim: accepted for API parity; the kernel reads positions from\n the already-computed ``cos`` / ``sin``.\n\nReturns:\n ``(q_embed, k_embed)`` in the same shape as ``q``, ``k``.",
11
+ "signature": {
12
+ "parameters": [
13
+ {
14
+ "name": "q",
15
+ "kind": "POSITIONAL_OR_KEYWORD",
16
+ "default": null,
17
+ "annotation": null
18
+ },
19
+ {
20
+ "name": "k",
21
+ "kind": "POSITIONAL_OR_KEYWORD",
22
+ "default": null,
23
+ "annotation": null
24
+ },
25
+ {
26
+ "name": "cos",
27
+ "kind": "POSITIONAL_OR_KEYWORD",
28
+ "default": null,
29
+ "annotation": null
30
+ },
31
+ {
32
+ "name": "sin",
33
+ "kind": "POSITIONAL_OR_KEYWORD",
34
+ "default": null,
35
+ "annotation": null
36
+ },
37
+ {
38
+ "name": "unsqueeze_dim",
39
+ "kind": "POSITIONAL_OR_KEYWORD",
40
+ "default": "1",
41
+ "annotation": null
42
+ }
43
+ ],
44
+ "return_annotation": null
45
+ }
46
+ },
47
+ {
48
+ "name": "rope_cached_fwd",
49
+ "qualname": "rope_cached_fwd",
50
+ "module": "_aiter_rope_rocm_75dc872.rope",
51
+ "kind": "function",
52
+ "doc": null,
53
+ "signature": {
54
+ "parameters": [
55
+ {
56
+ "name": "x",
57
+ "kind": "POSITIONAL_OR_KEYWORD",
58
+ "default": null,
59
+ "annotation": "torch.Tensor"
60
+ },
61
+ {
62
+ "name": "cos",
63
+ "kind": "POSITIONAL_OR_KEYWORD",
64
+ "default": null,
65
+ "annotation": "torch.Tensor"
66
+ },
67
+ {
68
+ "name": "sin",
69
+ "kind": "POSITIONAL_OR_KEYWORD",
70
+ "default": null,
71
+ "annotation": "torch.Tensor"
72
+ },
73
+ {
74
+ "name": "rotate_style",
75
+ "kind": "POSITIONAL_OR_KEYWORD",
76
+ "default": null,
77
+ "annotation": "int"
78
+ },
79
+ {
80
+ "name": "reuse_freqs_front_part",
81
+ "kind": "POSITIONAL_OR_KEYWORD",
82
+ "default": null,
83
+ "annotation": "bool"
84
+ },
85
+ {
86
+ "name": "nope_first",
87
+ "kind": "POSITIONAL_OR_KEYWORD",
88
+ "default": null,
89
+ "annotation": "bool"
90
+ },
91
+ {
92
+ "name": "transpose_output",
93
+ "kind": "POSITIONAL_OR_KEYWORD",
94
+ "default": "False",
95
+ "annotation": "bool"
96
+ }
97
+ ],
98
+ "return_annotation": null
99
+ }
100
+ },
101
+ {
102
+ "name": "rope_cached_fwd_inplace",
103
+ "qualname": "rope_cached_fwd_inplace",
104
+ "module": "_aiter_rope_rocm_75dc872.rope",
105
+ "kind": "function",
106
+ "doc": null,
107
+ "signature": {
108
+ "parameters": [
109
+ {
110
+ "name": "x",
111
+ "kind": "POSITIONAL_OR_KEYWORD",
112
+ "default": null,
113
+ "annotation": "torch.Tensor"
114
+ },
115
+ {
116
+ "name": "cos",
117
+ "kind": "POSITIONAL_OR_KEYWORD",
118
+ "default": null,
119
+ "annotation": "torch.Tensor"
120
+ },
121
+ {
122
+ "name": "sin",
123
+ "kind": "POSITIONAL_OR_KEYWORD",
124
+ "default": null,
125
+ "annotation": "torch.Tensor"
126
+ },
127
+ {
128
+ "name": "rotate_style",
129
+ "kind": "POSITIONAL_OR_KEYWORD",
130
+ "default": null,
131
+ "annotation": "int"
132
+ },
133
+ {
134
+ "name": "reuse_freqs_front_part",
135
+ "kind": "POSITIONAL_OR_KEYWORD",
136
+ "default": null,
137
+ "annotation": "bool"
138
+ },
139
+ {
140
+ "name": "nope_first",
141
+ "kind": "POSITIONAL_OR_KEYWORD",
142
+ "default": null,
143
+ "annotation": "bool"
144
+ },
145
+ {
146
+ "name": "transpose_output",
147
+ "kind": "POSITIONAL_OR_KEYWORD",
148
+ "default": "False",
149
+ "annotation": "bool"
150
+ }
151
+ ],
152
+ "return_annotation": null
153
+ }
154
+ }
155
+ ],
156
+ "layers": [
157
+ {
158
+ "name": "apply_rotary_transformers",
159
+ "qualname": "apply_rotary_transformers",
160
+ "module": "_aiter_rope_rocm_75dc872.layers",
161
+ "kind": "class",
162
+ "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
163
+ "signature": {
164
+ "parameters": [
165
+ {
166
+ "name": "args",
167
+ "kind": "VAR_POSITIONAL",
168
+ "default": null,
169
+ "annotation": "Any"
170
+ },
171
+ {
172
+ "name": "kwargs",
173
+ "kind": "VAR_KEYWORD",
174
+ "default": null,
175
+ "annotation": "Any"
176
+ }
177
+ ],
178
+ "return_annotation": "None"
179
+ },
180
+ "attributes": {
181
+ "has_backward": null,
182
+ "can_torch_compile": true
183
+ }
184
+ }
185
+ ]
186
+ }