kernels-bot commited on
Commit
c92a451
·
verified ·
1 Parent(s): 7afd7cd

Uploaded using `kernel-builder`.

Browse files
build/torch212-cxx11-xpu20253-x86_64-linux/{_flash_attn2_xpu_48628c8.abi3.so → _flash_attn2_xpu_addf474.abi3.so} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:d944372f8e08f194c6b640a70deb0b2f0f841aaaae539c29bea1cf9dd0de3b32
3
  size 82767456
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:64d7b6e1285f329e31a58540572921d429e528b21079ed45f37335b6dfc46616
3
  size 82767456
build/torch212-cxx11-xpu20253-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _flash_attn2_xpu_48628c8
3
- ops = torch.ops._flash_attn2_xpu_48628c8
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_flash_attn2_xpu_48628c8::{op_name}"
 
1
  import torch
2
+ from . import _flash_attn2_xpu_addf474
3
+ ops = torch.ops._flash_attn2_xpu_addf474
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_flash_attn2_xpu_addf474::{op_name}"
build/torch212-cxx11-xpu20253-x86_64-linux/flash_attn2/__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/torch212-cxx11-xpu20253-x86_64-linux/metadata.json CHANGED
@@ -1,9 +1,10 @@
1
  {
2
  "name": "flash-attn2",
3
- "id": "_flash_attn2_xpu_48628c8",
4
  "version": 3,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
 
7
  "backend": {
8
  "type": "xpu"
9
  },
@@ -11,21 +12,20 @@
11
  "algorithm": "sha256",
12
  "files": {
13
  "__init__.py": "pbZ3riEB3GTIymdTvC7023ydYDWalnxEy+Lq0DGeZoQ=",
14
- "_flash_attn2_xpu_48628c8.abi3.so": "2UQ3L44I8ZTGtkCnDesLLw+EGqquU5wpvqHPndDeOzI=",
15
- "_ops.py": "zVRoWO0O+mOL89u4s8J7kxKLvZW+ewcqO+IFZDwlRrw=",
16
  "bert_padding.py": "gF1EmsdJ+HpQ86MRQ4VxDw+Sb/RVISdQALdNnoByHlw=",
17
- "flash_attn2/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY=",
18
  "flash_attn_interface.py": "pJrnUxC+7qEqFh1C1YbjYggC9FfoG3dblU+XlwaJkEs="
19
  }
20
  },
21
  "provenance": {
22
  "kernel-builder": {
23
  "version": "0.17.0-dev0",
24
- "sha": "81580bb92577f2f7228661ca2a221fc052375709",
25
  "dirty": false
26
  },
27
  "kernel": {
28
- "sha": "48628c85b95373bc84cd2448009320bdfb5d0d37",
29
  "dirty": false
30
  }
31
  }
 
1
  {
2
  "name": "flash-attn2",
3
+ "id": "_flash_attn2_xpu_addf474",
4
  "version": 3,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
7
+ "kernel-depends": [],
8
  "backend": {
9
  "type": "xpu"
10
  },
 
12
  "algorithm": "sha256",
13
  "files": {
14
  "__init__.py": "pbZ3riEB3GTIymdTvC7023ydYDWalnxEy+Lq0DGeZoQ=",
15
+ "_flash_attn2_xpu_addf474.abi3.so": "ZNe24ShfMp4xpYVAVykh1CnlKLIQee1F83M1tt/EZhY=",
16
+ "_ops.py": "SVHrptG44fRcqKQon5TkM+QCjGVH3iHyvzLL07Qz0nY=",
17
  "bert_padding.py": "gF1EmsdJ+HpQ86MRQ4VxDw+Sb/RVISdQALdNnoByHlw=",
 
18
  "flash_attn_interface.py": "pJrnUxC+7qEqFh1C1YbjYggC9FfoG3dblU+XlwaJkEs="
19
  }
20
  },
21
  "provenance": {
22
  "kernel-builder": {
23
  "version": "0.17.0-dev0",
24
+ "commit": "7d2828e6592de641b44fb8eb896719101a2ab2fb",
25
  "dirty": false
26
  },
27
  "kernel": {
28
+ "commit": "addf4741fafb55b4c101b15985dfaeea7c7c2f3a",
29
  "dirty": false
30
  }
31
  }
build/torch212-cxx11-xpu20253-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHTTCCBtKgAwIBAgIUfs9HZa0v+VlXl9Zxm4v3+nIPoAIwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODI1MjIxNDA2WhcNMjYwODI1MjIyNDA2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvtnaK6HG9D/03uZ+Wg6ORSP1xnBa7g86Fcy88fgF6YJXNuRtvkVQLF2MAWZahlj+tf6WMWHc6VxrGMmhrB5XxaOCBfEwggXtMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUzUAa+JlriqiBSJT/X61ut5tHiHgwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoNDg2MjhjODViOTUzNzNiYzg0Y2QyNDQ4MDA5MzIwYmRmYjVkMGQzNzATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoNDg2MjhjODViOTUzNzNiYzg0Y2QyNDQ4MDA5MzIwYmRmYjVkMGQzNzAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoNDg2MjhjODViOTUzNzNiYzg0Y2QyNDQ4MDA5MzIwYmRmYjVkMGQzNzAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDQ4NjI4Yzg1Yjk1MzczYmM4NGNkMjQ0ODAwOTMyMGJkZmI1ZDBkMzcwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMzI4NjY1MTUwNDkvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABoDr84f8AAAQDAEgwRgIhANcbTccP/GHmYZcSDahKhuU7euWEIlnPxEHpacB5vxZnAiEAy9cKSreZyvIAx3RraQFfT+dWLt5+Rx/977+GIhMT6P8wCgYIKoZIzj0EAwMDaQAwZgIxAI3aA1zMGF6fUMHQdRDo9r9vw6YOqt4Fz2mRxMoxmZYLzL0mr3sSg5xWaD77mNqhbAIxAIJIQTOTuPk1kEdeYc7KSI2/Iw2O7/CYlpd5drCi1Mrgfhh95sEcHlb2Pcj76VgjAQ=="}, "tlogEntries":[{"logIndex":"2590357548", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"hashedrekord", "version":"0.0.1"}, "integratedTime":"1787696046", "inclusionPromise":{"signedEntryTimestamp":"MEUCIGT38kuDUIOmP1hV0NabY6dhPV3f4SH23k0sj0B0bq10AiEAzitWpliMqKeAIxTY0rQBaWaiXtJ2sCYRxx/9XeaVylE="}, "inclusionProof":{"logIndex":"2468453286", "rootHash":"HY4n5jGyE02bEXoQwngpPk9rEXTPMX9nXg+TR0KC5+8=", "treeSize":"2468453853", "hashes":["8GI4Y6CGczytbd3ycNhfyhsnLSfE2pAF9kKxGgE17fM=", "MES02DmiMNMQhybferUcMiXbmXGza8QdVz+9NUxyjeE=", "R4GUPCT4SQCWm8FswwjUlUJuAt0X6ZTRTtkZFOpN300=", "w4WsrCQvwZjnwASfsDi+/eW8eVqatHKKTLYSZUaGy6I=", "H0LlODb17yaQDS8c3LM8fBkH6cRWck6VtAv/W3cI1qU=", "v38am3Vs4UqFbgGFh0nqzON8BaIi9Q6MzCoLoYx4hDM=", "WMonbrUou3+7CtGOqLjaUIndXZFG3HMTwk+zhjPa+3M=", "s03ctnnWvdDIR8dZRFUppW/TOFJedRNbtQE1q1babCM=", "uTE42l0AY2ByOeVa6MU3TqHPcprNNJxA97B4m3cmBuw=", "ePMutn+MjGUUIblWyVZp6jIJnSyQIqNbXyJX1nTCrcQ=", "gYyXw/QtjPIhTVns6VgbkjY8XfvLofS0pnA5w6JTRTA=", "Ef+1rZRMCKhmMI0bIukmb7Rh2thmpHEa6Jh3uDbw9LE=", "9Ig8wD4Zx4XvGjEbUwCh9No0uW9LIBWUoCBOct/J6Ro=", "HUFO1iI2zGePW4TepX7FLnF6/8SD78gfNHmYGapyNDk=", "NsZbZ7dueOWTnMcv5u0eTw8G4Osptfs+WNsjJscd7xo=", "xSLcv7DXmPdroYqRxhky419R7g3pxrBi7oQQS6ss7EM=", "CC5iK0YZS8oHpGoRj50mLGEKhW1UNOwgAyCKIiVoU+c=", "b80/J/68RC8/tx5xRdlKk6MmTpZiVRotquWBrE/z1pI=", "SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=", "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2468453853\nHY4n5jGyE02bEXoQwngpPk9rEXTPMX9nXg+TR0KC5+8=\n\n— rekor.sigstore.dev wNI9ajBEAiBvDLeaVfknAy59C7m11DlercydgmJGHnXHZiJJk+aTmQIgSoG36V8ObQd/9SUBNux8Pox+Vx7x/x2JyWq6adBB0E4=\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI3YWRkNWM4YmFlMWE3NDI2ZWE2MTlkOGUwZjZmNmQ2MzRhYTNmZmEyNzMyZTBlYzUyYWZlZmEyZGFiZTczZDVhIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJRzBUdmE2UGZZVXluRFVKVHBLZ0NNSUkzYVRtN3VqZjJucnpvWTgyeExBSUFpQWdWOXY0V1QyZDgvVXZVTnJ5TFhEU3NXaUdsNFlvODYxTENqZFdjWWdtbWc9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFVWRU5EUW5STFowRjNTVUpCWjBsVlpuTTVTRnBoTUhZclZteFliRGxhZUcwMGRqTXJia2xRYjBGSmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFU1RGTmFrbDRUa1JCTWxkb1kwNU5hbGwzVDBSSk1VMXFTWGxPUkVFeVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVYyZEc1aFN6WklSemxFTHpBemRWb3JWMmMyVDFKVFVERjRia0poTjJjNE5rWmplVGdLT0dablJqWlpTbGhPZFZKMGRtdFdVVXhHTWsxQlYxcGhhR3hxSzNSbU5sZE5WMGhqTmxaNGNrZE5iV2h5UWpWWWVHRlBRMEptUlhkbloxaDBUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlY2VlVGaENpdEtiSEpwY1dsQ1UwcFVMMWcyTVhWME5YUklhVWhuZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU9SR2N5VFdwb2FrOUVWbWxQVkZWNlRucE9hVmw2WnpCWk1sRjVDazVFVVRSTlJFRTFUWHBKZDFsdFVtMVphbFpyVFVkUmVrNTZRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDVFWnpKTmFtaHFUMFJXYVU5VVZYcE9lazVwV1hwbk1Ga3lVWGxPUkZFMFRVUkJOVTE2U1hjS1dXMVNiVmxxVm10TlIxRjZUbnBCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDVFWnpKTmFtaHFUMFJXYVU5VVZYcE9lazVwV1hwbk1Ga3lVWGtLVGtSUk5FMUVRVFZOZWtsM1dXMVNiVmxxVm10TlIxRjZUbnBCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUlJORTVxU1RRS1dYcG5NVmxxYXpGTmVtTjZXVzFOTkU1SFRtdE5hbEV3VDBSQmQwOVVUWGxOUjBwcldtMUpNVnBFUW10TmVtTjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOZWtrMFRtcFpNVTFVVlhkT1JHdDJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwZDFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT1VKSWMwRUtaVkZDTTBGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtOUVjamcwWmpoQlFVRlJSQXBCUldkM1VtZEphRUZPWTJKVVkyTlFMMGRJYlZsYVkxTkVZV2hMYUhWVk4yVjFWMFZKYkc1UWVFVkljR0ZqUWpWMmVGcHVRV2xGUVhrNVkwdFRjbVZhQ25sMlNVRjRNMUp5WVZGR1psUXJaRmRNZERVclVuZ3ZPVGMzSzBkSmFFMVVObEE0ZDBObldVbExiMXBKZW1vd1JVRjNUVVJoVVVGM1dtZEplRUZKTTJFS1FURjZUVWRHTm1aVlRVaFJaRkpFYnpseU9YWjNObGxQY1hRMFJub3liVko0VFc5NGJWcFpUSHBNTUcxeU0zTlRaelY0VjJGRU56ZHRUbkZvWWtGSmVBcEJTVXBKVVZSUFZIVlFhekZyUldSbFdXTTNTMU5KTWk5SmR6SlBOeTlEV1d4d1pEVmtja05wTVUxeVoyWm9hRGsxYzBWalNHeGlNbEJqYWpjMlZtZHFDa0ZSUFQwS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}], "timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgNI4N+s9hVJq49yKlF9PhBIRhicYfvAgPUqUBaV6DKkwCFELk5W4OwHAkdDBt1Q1ZaO34SY3PGA8yMDI2MDgyNTIyMTQwNlowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwODI1MjIxNDA2WjAvBgkqhkiG9w0BCQQxIgQgVnd2g8DCZLwEJ7sn9cHBBzlDNctqSAQMagw/F45MesgwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIwGgMKk6gAv07oK5Ietg7lTzUU7N8ZCiNULzKmEBmMHi9bZ6YVZD74paiuaIfpiNC1AjEAqAZW4s6CHpp5KCzUV4h10C1nwmPEy1SPviiOYYcLwUr6acRVnU+RJpwHZw0M1FkO"}]}}, "messageSignature":{"messageDigest":{"algorithm":"SHA2_256", "digest":"et1ci64adCbqYZ2OD29tY0qj/6JzLg7FKv76LavnPVo="}, "signature":"MEQCIG0Tva6PfYUynDUJTpKgCMII3aTm7ujf2nrzoY82xLAIAiAgV9v4WT2d8/UvUNryLXDSsWiGl4Yo861LCjdWcYgmmg=="}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHSjCCBtGgAwIBAgIUVTa8y1Xybi5D+nCJTWFshhUiFVwwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODI3MTMyOTA4WhcNMjYwODI3MTMzOTA4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQzL6HCTom4pvJOcNPgNjQn2yCDGgf7vCUxfG85xAvvpOKt7DA3LRK1FjRrbnV+INLa0RgbJrCwfWW1w4c4//R6OCBfAwggXsMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUUJyBDNdp18hMHlyw70g5PkrOfGkwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKGFkZGY0NzQxZmFmYjU1YjRjMTAxYjE1OTg1ZGZhZWVhN2M3YzJmM2EwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMzMwNDUzNzY3MDkvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABoENo+rkAAAQDAEcwRQIgIXpuP6TAeOHZvHfBo9La+MXCpKQDUKNKATJeLkNV6P0CIQCwBliFgKIZAqCdt9MlPwi1qWSKreUvEQFs/tbupFMlXTAKBggqhkjOPQQDAwNnADBkAjBAw/LnY8X4sYU1DqR9hALhDItAGydTgVz+RLlS34mIf5niaMZD+LuLBZW7v1quayACMCTWPcrYlY0Ppp2Qq1ujh1jVHgGuWsi3xKHCUtSrUl3aq4wg/MwBrtVkDCERxlJrnQ=="}, "tlogEntries":[{"logIndex":"2617572038", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"hashedrekord", "version":"0.0.1"}, "integratedTime":"1787837348", "inclusionPromise":{"signedEntryTimestamp":"MEYCIQCQwt2nL89816qoyp7DoXnsbVBWjNohKAC/S9/XUEg0+AIhANrFyrCbNcyFo8XNMrGJPPXJu7/syWw+b/GfgxBINdoV"}, "inclusionProof":{"logIndex":"2495667776", "rootHash":"j05MSPdUNPSikgA9O8mp0jZbqnMLzD32Q8SRZVRENrY=", "treeSize":"2495667781", "hashes":["fsfAXOUgX/5QABdLsITZ7494mqXMeH2f2Xww3d9d9s0=", "H8VAzYC5pacHvvYbfgrfs0ql4jAv3zeDGDP6DYPCw54=", "s8ml1XQ0qOzrRrbt4urr/eW2GJ8T0Ko9QVRzcuY5WvI=", "/6o7MZIufK03bD8F4EOaA+yxokO5bSxXQ41rqgYa1kA=", "yQO+lU+BYjw/StER3vXQ6duMOiQ2Mz17sRtmuvpn/Bo=", "sdN13MFQdkXvb2RAPpo3BH3EkaXyw1DShsTDIhmR7B0=", "j7l7RGwr5raxJ54dpK82R1803gTyHGwThtKMyJFCjQ4=", "y7L1qSm2rUs3AbT5z7Z+6M/cB6RvBvdAY4eFQpirFHU=", "cJ2q4pCEl+jR0nHuBAA73o7IPjVizVSrluQzXi4wDMM=", "FpSw22a4rFmHTsWm0qhNgotKKqE0bytfDjyfXj4VEds=", "QutiLOAfQukwHVQ717gM+94FF/5Giel82kbXkTx/F8w=", "7TfDCaMWgEwSJEZd/e33b24919rF4IDJLmbqNNRNhZs=", "0HfdxDt/zGugZLIuHasrdLEW9s8OaTykSSqBEDFQXdw=", "SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=", "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2495667781\nj05MSPdUNPSikgA9O8mp0jZbqnMLzD32Q8SRZVRENrY=\n\n— rekor.sigstore.dev wNI9ajBGAiEA05AvHkD5t2ly9FW+GrsrkcdYXVkg+loi4WzFRY6DhekCIQC68rgfq9se601a7wowHYZGoqxDBR2vFPpUP531rTCs8w==\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI5ODg0NWM3MDE3NTliNmQyM2Y1YTA1ODY1ZWJhYWRmZDhkMGUxZGU3NjI1Y2YyYjUyYjAwZjkzM2ZkY2RiZDI5In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUURLemEwUngzTHd3OHhPUVArbTV1NWJlY3VMUlRpMDNiWWQ3SlZmQmF2V2d3SWdXZVFVajBRWVhIdFc1Yms3YlZoOUwyYVFVVUU0WEJRMDhxZkJ3bUd2Z0lRPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRha05EUW5SSFowRjNTVUpCWjBsVlZsUmhPSGt4V0hsaWFUVkVLMjVEU2xSWFJuTm9hRlZwUmxaM2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFU1ROTlZFMTVUMVJCTkZkb1kwNU5hbGwzVDBSSk0wMVVUWHBQVkVFMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZSZWt3MlNFTlViMjAwY0haS1QyTk9VR2RPYWxGdU1ubERSRWRuWmpkMlExVjRaa2NLT0RWNFFYWjJjRTlMZERkRVFUTk1Va3N4Um1wU2NtSnVWaXRKVGt4aE1GSm5Za3B5UTNkbVYxY3hkelJqTkM4dlVqWlBRMEptUVhkbloxaHpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZWU25sQ0NrUk9aSEF4T0doTlNHeDVkemN3WnpWUWEzSlBaa2RyZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOVpWMUpyV21wUk0wNUVSbTFaVjFwcFRsUldhVTVIVFhoTlJFWnBDazFVVlRWUFJGWnJXbTFHYkZwWFJUTlplbVJxVFcxWmVsbFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMWxYVW10YWFsRXpUa1JHYlZsWFdtbE9WRlpwVGtkTmVFMUVSbWxOVkZVMVQwUldhMXB0Um13S1dsZEZNMWw2WkdwTmJWbDZXVlJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMWxYVW10YWFsRXpUa1JHYlZsWFdtbE9WRlpwVGtkTmVFMUVSbWtLVFZSVk5VOUVWbXRhYlVac1dsZEZNMWw2WkdwTmJWbDZXVlJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwZEdhMXBIV1RBS1RucFJlRnB0Um0xWmFsVXhXV3BTYWsxVVFYaFpha1V4VDFSbk1WcEhXbWhhVjFab1RqSk5NMWw2U20xTk1rVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOZWsxM1RrUlZlazU2V1ROTlJHdDJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwWjFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT0VKSWIwRUtaVUZDTWtGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtOUZUbThyY210QlFVRlJSQXBCUldOM1VsRkpaMGxZY0hWUU5sUkJaVTlJV25aSVprSnZPVXhoSzAxWVEzQkxVVVJWUzA1TFFWUktaVXhyVGxZMlVEQkRTVkZEZDBKc2FVWm5TMGxhQ2tGeFEyUjBPVTFzVUhkcE1YRlhVMHR5WlZWMlJWRkdjeTkwWW5Wd1JrMXNXRlJCUzBKblozRm9hMnBQVUZGUlJFRjNUbTVCUkVKclFXcENRWGN2VEc0S1dUaFlOSE5aVlRGRWNWSTVhRUZNYUVSSmRFRkhlV1JVWjFaNksxSk1iRk16TkcxSlpqVnVhV0ZOV2tRclRIVk1RbHBYTjNZeGNYVmhlVUZEVFVOVVZ3cFFZM0paYkZrd1VIQndNbEZ4TVhWcWFERnFWa2huUjNWWGMya3plRXRJUTFWMFUzSlZiRE5oY1RSM1p5OU5kMEp5ZEZaclJFTkZVbmhzU25KdVVUMDlDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}], "timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgOmQiRrBkSwkJZoSN+tAWDpRv3CFXWwqmWionBuFsmEMCFHY397S5ZfMdKj+5GYvQWiZ5zuGLGA8yMDI2MDgyNzEzMjkwOFowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdwwggHYAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwODI3MTMyOTA4WjAvBgkqhkiG9w0BCQQxIgQgLABlZ40h6xdjQbSnKoWwvYa5+SPhUBYX7kXowDLFF4kwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGgwZgIxALkM2WKlDmoq4/866wtycJF8KxS2OfsFKgKl7YIGQ/98p/ZL/OHgd/erFlVLemmQcQIxAOrfpsqVNfpnJUGHlMmmpYqhSSYx9+GFAck+9JZfHVFTrUXuhbJIcjnB28wYR0fLcw=="}]}}, "messageSignature":{"messageDigest":{"algorithm":"SHA2_256", "digest":"mIRccBdZttI/WgWGXrqt/Y0OHediXPK1KwD5M/3NvSk="}, "signature":"MEUCIQDKza0Rx3Lww8xOQP+m5u5becuLRTi03bYd7JVfBavWgwIgWeQUj0QYXHtW5bk7bVh9L2aQUUE4XBQ08qfBwmGvgIQ="}}
build/torch213-cxx11-xpu20260-x86_64-linux/_flash_attn2_xpu_addf474.abi3.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fac509d05c2115a0b4484bf0d417b7d6997751cc436a2f8bda5b51c176907d91
3
+ size 152778384
build/torch213-cxx11-xpu20260-x86_64-linux/_ops.py CHANGED
@@ -1,9 +1,9 @@
1
  import torch
2
- from . import _flash_attn2_xpu_48628c8
3
- ops = torch.ops._flash_attn2_xpu_48628c8
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
- return f"_flash_attn2_xpu_48628c8::{op_name}"
 
1
  import torch
2
+ from . import _flash_attn2_xpu_addf474
3
+ ops = torch.ops._flash_attn2_xpu_addf474
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
  """
7
  Prefix op by namespace.
8
  """
9
+ return f"_flash_attn2_xpu_addf474::{op_name}"
build/torch213-cxx11-xpu20260-x86_64-linux/flash_attn2/__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/torch213-cxx11-xpu20260-x86_64-linux/metadata.json CHANGED
@@ -1,9 +1,10 @@
1
  {
2
  "name": "flash-attn2",
3
- "id": "_flash_attn2_xpu_48628c8",
4
  "version": 3,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
 
7
  "backend": {
8
  "type": "xpu"
9
  },
@@ -11,21 +12,20 @@
11
  "algorithm": "sha256",
12
  "files": {
13
  "__init__.py": "pbZ3riEB3GTIymdTvC7023ydYDWalnxEy+Lq0DGeZoQ=",
14
- "_flash_attn2_xpu_48628c8.abi3.so": "jOQM+1zeUdrb0h5lwPyVkD7LomXAMPc6jpBnjZ8B7Ic=",
15
- "_ops.py": "zVRoWO0O+mOL89u4s8J7kxKLvZW+ewcqO+IFZDwlRrw=",
16
  "bert_padding.py": "gF1EmsdJ+HpQ86MRQ4VxDw+Sb/RVISdQALdNnoByHlw=",
17
- "flash_attn2/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY=",
18
  "flash_attn_interface.py": "pJrnUxC+7qEqFh1C1YbjYggC9FfoG3dblU+XlwaJkEs="
19
  }
20
  },
21
  "provenance": {
22
  "kernel-builder": {
23
  "version": "0.17.0-dev0",
24
- "sha": "81580bb92577f2f7228661ca2a221fc052375709",
25
  "dirty": false
26
  },
27
  "kernel": {
28
- "sha": "48628c85b95373bc84cd2448009320bdfb5d0d37",
29
  "dirty": false
30
  }
31
  }
 
1
  {
2
  "name": "flash-attn2",
3
+ "id": "_flash_attn2_xpu_addf474",
4
  "version": 3,
5
  "license": "BSD-3-Clause",
6
  "python-depends": [],
7
+ "kernel-depends": [],
8
  "backend": {
9
  "type": "xpu"
10
  },
 
12
  "algorithm": "sha256",
13
  "files": {
14
  "__init__.py": "pbZ3riEB3GTIymdTvC7023ydYDWalnxEy+Lq0DGeZoQ=",
15
+ "_flash_attn2_xpu_addf474.abi3.so": "+sUJ0FwhFaC0SEvw1Be31pl3UcxDai+L2ltRwXaQfZE=",
16
+ "_ops.py": "SVHrptG44fRcqKQon5TkM+QCjGVH3iHyvzLL07Qz0nY=",
17
  "bert_padding.py": "gF1EmsdJ+HpQ86MRQ4VxDw+Sb/RVISdQALdNnoByHlw=",
 
18
  "flash_attn_interface.py": "pJrnUxC+7qEqFh1C1YbjYggC9FfoG3dblU+XlwaJkEs="
19
  }
20
  },
21
  "provenance": {
22
  "kernel-builder": {
23
  "version": "0.17.0-dev0",
24
+ "commit": "7d2828e6592de641b44fb8eb896719101a2ab2fb",
25
  "dirty": false
26
  },
27
  "kernel": {
28
+ "commit": "addf4741fafb55b4c101b15985dfaeea7c7c2f3a",
29
  "dirty": false
30
  }
31
  }
build/torch213-cxx11-xpu20260-x86_64-linux/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHSzCCBtGgAwIBAgIUZzN8/l7PLTGz00+1lOy94b7vLSEwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODI1MjIxNDEwWhcNMjYwODI1MjIyNDEwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETXzqBR02lVQVvd/wMJ4OPVmB5D8zH0rIYfe1uaYNqPlrWk/tKav9CYIkBzEIr4EikvzT99cpc5jPi5oes97zNKOCBfAwggXsMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUXVRqLETGcQdVKfRpcrH/uf5Ut/4wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoNDg2MjhjODViOTUzNzNiYzg0Y2QyNDQ4MDA5MzIwYmRmYjVkMGQzNzATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoNDg2MjhjODViOTUzNzNiYzg0Y2QyNDQ4MDA5MzIwYmRmYjVkMGQzNzAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoNDg2MjhjODViOTUzNzNiYzg0Y2QyNDQ4MDA5MzIwYmRmYjVkMGQzNzAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKDQ4NjI4Yzg1Yjk1MzczYmM4NGNkMjQ0ODAwOTMyMGJkZmI1ZDBkMzcwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMzI4NjY1MTUwNDkvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABoDr88fMAAAQDAEcwRQIgexe2xSN/b0P3UiSVnQ4FvEmc863FQefVp6M6bSY/p/ECIQCAXmGgziZdb1P0QDyvYtrl+82v9NOM8xakigxH8a2MiTAKBggqhkjOPQQDAwNoADBlAjEAlJ7WHysbCDbiBkb/6SiBNR8SpXTg+IV7s4576NR9gVl16Qxi6aQpXKHR1zfKv/6fAjBJ0OcVHkAglrkghVdYKn7LaGGGPzJMykhN5iQCscLTNeyF2KF4dXGQJaL9ibKPB/4="}, "tlogEntries":[{"logIndex":"2590358730", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"hashedrekord", "version":"0.0.1"}, "integratedTime":"1787696050", "inclusionPromise":{"signedEntryTimestamp":"MEQCIA6PYh1QR82RSOlCojaq6aE7ektpcJUQqptVTIPjIE/fAiBZZhI2UmdAcCOGP728e/32pMhuyINHYDSvOit4YXcmMA=="}, "inclusionProof":{"logIndex":"2468454468", "rootHash":"7Uh/DgUoIlfTr02V1ltAafGsWfWitbK3XH0TNxhYAng=", "treeSize":"2468454681", "hashes":["dX1V/6yUUaaqiFeMmo7EQtB/yJn7sPGzdugkNaFpsYA=", "uGlKC0KsfO3A6NKpOFtH3/5+Nwt3P48mg1pzN2b3zMc=", "xmcbjENXsZ7R7dPuABR2kYXPq9qdDAF9j8EMOLp+5rY=", "o2HO6eUoWhcceEg3AFSj+UR9N5dk2RJ6fRoA+P0l7kw=", "OWQdHSpT6gnkDNZfJg79PVMCJ4FIR8BuiTe85fkNMSM=", "Cq5j54rWEXM3J7eNj5J0P4HTrw/dyuhFNNdtMSLrYlI=", "Yw3TwlOY3YHx1sQj1KYz2+ELbm0WYbGvrZPQ402kE+Q=", "+ZVusEieBjARHEH8KvBFz9pLBdcFUimgnNSzeXj+Yxo=", "YFRkHUJlETLSe7kvzT9HsMIy0+MSp5AOUABR7MvIo8U=", "2calF+jfHS7zjHVtCVnNwCibYR/GkkAXdJeLlcEkmxk=", "HUFO1iI2zGePW4TepX7FLnF6/8SD78gfNHmYGapyNDk=", "NsZbZ7dueOWTnMcv5u0eTw8G4Osptfs+WNsjJscd7xo=", "xSLcv7DXmPdroYqRxhky419R7g3pxrBi7oQQS6ss7EM=", "CC5iK0YZS8oHpGoRj50mLGEKhW1UNOwgAyCKIiVoU+c=", "b80/J/68RC8/tx5xRdlKk6MmTpZiVRotquWBrE/z1pI=", "SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=", "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2468454681\n7Uh/DgUoIlfTr02V1ltAafGsWfWitbK3XH0TNxhYAng=\n\n— rekor.sigstore.dev wNI9ajBFAiA7ErRmNKhcUIR8XlLgu0eGfXoXiElJeCAUbolHPeFeIgIhAKfEuMvzREI5i4FDVIBjCbvNkjFjTNdW55DBD/SmhDdi\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI1ZDQ1NDBiZGM0ZDFmNmQ3OGVlMjJmYzhhZWIwODAyYTc1ZDY1MGE0OTczNTAzNTA1YzQ0ZTQ3ZDkxMTFkYzkyIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJQzNKL1NmZjdGSHIyQmtDdnlOKytYYThpbTJ6MEFRRUJtYWU0Y2FKeDcyY0FpRUE1WE5nVWMxREJuUXhpRjQvWWY2U1docW9zY1ZTL0NlY0ZtbmxRQVFQWWlJPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRla05EUW5SSFowRjNTVUpCWjBsVlducE9PQzlzTjFCTVZFZDZNREFyTVd4UGVUazBZamQyVEZORmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFU1RGTmFrbDRUa1JGZDFkb1kwNU5hbGwzVDBSSk1VMXFTWGxPUkVWM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZVV0hweFFsSXdNbXhXVVZaMlpDOTNUVW8wVDFCV2JVSTFSRGg2U0RCeVNWbG1aVEVLZFdGWlRuRlFiSEpYYXk5MFMyRjJPVU5aU1d0Q2VrVkpjalJGYVd0MmVsUTVPV053WXpWcVVHazFiMlZ6T1RkNlRrdFBRMEptUVhkbloxaHpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZZVmxKeENreEZWRWRqVVdSV1MyWlNjR055U0M5MVpqVlZkQzgwZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOU9SR2N5VFdwb2FrOUVWbWxQVkZWNlRucE9hVmw2WnpCWk1sRjVDazVFVVRSTlJFRTFUWHBKZDFsdFVtMVphbFpyVFVkUmVrNTZRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMDVFWnpKTmFtaHFUMFJXYVU5VVZYcE9lazVwV1hwbk1Ga3lVWGxPUkZFMFRVUkJOVTE2U1hjS1dXMVNiVmxxVm10TlIxRjZUbnBCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMDVFWnpKTmFtaHFUMFJXYVU5VVZYcE9lazVwV1hwbk1Ga3lVWGtLVGtSUk5FMUVRVFZOZWtsM1dXMVNiVmxxVm10TlIxRjZUbnBCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwUlJORTVxU1RRS1dYcG5NVmxxYXpGTmVtTjZXVzFOTkU1SFRtdE5hbEV3VDBSQmQwOVVUWGxOUjBwcldtMUpNVnBFUW10TmVtTjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOZWtrMFRtcFpNVTFVVlhkT1JHdDJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwWjFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT0VKSWIwRUtaVUZDTWtGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtOUVjamc0WmsxQlFVRlJSQXBCUldOM1VsRkpaMlY0WlRKNFUwNHZZakJRTTFWcFUxWnVVVFJHZGtWdFl6ZzJNMFpSWldaV2NEWk5ObUpUV1M5d0wwVkRTVkZEUVZodFIyZDZhVnBrQ21JeFVEQlJSSGwyV1hSeWJDczRNblk1VGs5Tk9IaGhhMmxuZUVnNFlUSk5hVlJCUzBKblozRm9hMnBQVUZGUlJFRjNUbTlCUkVKc1FXcEZRV3hLTjFjS1NIbHpZa05FWW1sQ2EySXZObE5wUWs1U09GTndXRlJuSzBsV04zTTBOVGMyVGxJNVoxWnNNVFpSZUdrMllWRndXRXRJVWpGNlprdDJMelptUVdwQ1Nnb3dUMk5XU0d0QloyeHlhMmRvVm1SWlMyNDNUR0ZIUjBkUWVrcE5lV3RvVGpWcFVVTnpZMHhVVG1WNVJqSkxSalJrV0VkUlNtRk1PV2xpUzFCQ0x6UTlDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}], "timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyzADAgEAMIICwgYJKoZIhvcNAQcCoIICszCCAq8CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgQa2tF1ixf9EP7wqSFyeea+o5Mn15aIW2Cm9owil/RiMCFQCiO0IPazqj2CJ5R54EqNFC7VSOrBgPMjAyNjA4MjUyMjE0MTBaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHcMIIB2AIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDgyNTIyMTQxMFowLwYJKoZIhvcNAQkEMSIEIKoFe2H/KnTQ7RQcJJmV02zxYS+JtGkUGQhmSrSs/Yy+MIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRoMGYCMQDh92GstUUFQ3ZBG5MWpTr2v5tasN9C6GFFz1Wku7/csXNLcTQb+Gn7yeQ78nXKITkCMQD94g+nqasneNTJj8wupfLTaxvgMt5JP/VE8KXJl46ZXZ0w5FtZ9e1Vy7GAlyC3qBs="}]}}, "messageSignature":{"messageDigest":{"algorithm":"SHA2_256", "digest":"XUVAvcTR9teO4i/IrrCAKnXWUKSXNQNQXETkfZER3JI="}, "signature":"MEUCIC3J/Sff7FHr2BkCvyN++Xa8im2z0AQEBmae4caJx72cAiEA5XNgUc1DBnQxiF4/Yf6SWhqoscVS/CecFmnlQAQPYiI="}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHSjCCBtCgAwIBAgIUKPZ/RWC5tnYrUcBQ2fS7v/zFG7QwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODI3MTMyOTA5WhcNMjYwODI3MTMzOTA5WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEp8NkHQqSCY41BTuS9n3MpvVlYXvMH0vyFivqtFm1fcyVSKkmZb/6cqtN/XEl8m10eAFonl28qUB1qTfuLFcaRaOCBe8wggXrMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUdbTYACqXqdoCYGFZzQVzIEG5IWkwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKGFkZGY0NzQxZmFmYjU1YjRjMTAxYjE1OTg1ZGZhZWVhN2M3YzJmM2EwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMzMwNDUzNzY3MDkvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABoENo/jAAAAQDAEYwRAIgBADB5ZtcSl78fyaQsMHt5JzhymIngwlCH9HKxQ3yp84CIAdUZY7Bh8CFm10iGrGzFpgFvpcanJzubipCkuvFduvRMAoGCCqGSM49BAMDA2gAMGUCMEAIwzwyNjx9tgnAtWh8NhWxFufB9eBMAdUP8SWcEqPps6GCzxpbvxUOx/3Uqdej4QIxAJdx8Pw+Bpa5MDHWLfxhotqdbYBmZsWID5aHAyDCnkH9wx3ULTQdaDLzzPpgF99ghg=="}, "tlogEntries":[{"logIndex":"2617572055", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"hashedrekord", "version":"0.0.1"}, "integratedTime":"1787837349", "inclusionPromise":{"signedEntryTimestamp":"MEQCIGls/Lkq+p0oRCqZ3T2lfGMcx2RdZSGgFrsjhkctxli9AiBLehXWtNQD6kv+hEyj6Cq4A6xy0G1wO3jNhV6SFrilmw=="}, "inclusionProof":{"logIndex":"2495667793", "rootHash":"6v8IdT9eJfGegOUhMjg34xaS37dQXiwi47dEhq4SL7s=", "treeSize":"2495667797", "hashes":["klWFm9UuB4V4SSVtUegftSmz8SbscSKeeAAIiNTMujM=", "D+pvKe8RAF8RDfgB2mzgE4bgcRgEfEmPB4O9/teujbY=", "RX0+kNjlukzOSV66P5fn8+mmQ5Z30cB4MJiZZoK1Wtk=", "Lhw1vdwRawiUJ/dPxHffbv9XBcSypB/nWrLlA1nobGk=", "/6o7MZIufK03bD8F4EOaA+yxokO5bSxXQ41rqgYa1kA=", "yQO+lU+BYjw/StER3vXQ6duMOiQ2Mz17sRtmuvpn/Bo=", "sdN13MFQdkXvb2RAPpo3BH3EkaXyw1DShsTDIhmR7B0=", "j7l7RGwr5raxJ54dpK82R1803gTyHGwThtKMyJFCjQ4=", "y7L1qSm2rUs3AbT5z7Z+6M/cB6RvBvdAY4eFQpirFHU=", "cJ2q4pCEl+jR0nHuBAA73o7IPjVizVSrluQzXi4wDMM=", "FpSw22a4rFmHTsWm0qhNgotKKqE0bytfDjyfXj4VEds=", "QutiLOAfQukwHVQ717gM+94FF/5Giel82kbXkTx/F8w=", "7TfDCaMWgEwSJEZd/e33b24919rF4IDJLmbqNNRNhZs=", "0HfdxDt/zGugZLIuHasrdLEW9s8OaTykSSqBEDFQXdw=", "SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=", "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2495667797\n6v8IdT9eJfGegOUhMjg34xaS37dQXiwi47dEhq4SL7s=\n\n— rekor.sigstore.dev wNI9ajBFAiAf3gsVtzcEo/g2Dk0sw7YbnatFfttM412R7PxqPpmvQAIhAJM12PrU6PCSqE+n2sT8s1NiAVpiMYXiOhOeWIH+j7FE\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIwNmU1ZWFlNjYyYTlmMTMzYzIyYjIwZjY4ZWM2YTU1NzYxNDlhOGFiMDcyZGIxYTc4Zjc5NWI2OTY2YTI3NjVjIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJSGY5Y0Njd2l3RjBUQkFzQ01ncFhiTFQ3ZjdFNWtyQjV5Q1lTNVFiM2JSZUFpQjkzb0dDNE5Fckd6SER4UFdKUXZSbjhJLzR5RlFOcFNJS0M2eTdZaUVEQ0E9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFRha05EUW5SRFowRjNTVUpCWjBsVlMxQmFMMUpYUXpWMGJsbHlWV05DVVRKbVV6ZDJMM3BHUnpkUmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFU1ROTlZFMTVUMVJCTlZkb1kwNU5hbGwzVDBSSk0wMVVUWHBQVkVFMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZ3T0U1clNGRnhVME5aTkRGQ1ZIVlRPVzR6VFhCMlZteFpXSFpOU0RCMmVVWnBkbkVLZEVadE1XWmplVlpUUzJ0dFdtSXZObU54ZEU0dldFVnNPRzB4TUdWQlJtOXViREk0Y1ZWQ01YRlVablZNUm1OaFVtRlBRMEpsT0hkbloxaHlUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZrWWxSWkNrRkRjVmh4Wkc5RFdVZEdXbnBSVm5wSlJVYzFTVmRyZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOVpWMUpyV21wUk0wNUVSbTFaVjFwcFRsUldhVTVIVFhoTlJFWnBDazFVVlRWUFJGWnJXbTFHYkZwWFJUTlplbVJxVFcxWmVsbFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMWxYVW10YWFsRXpUa1JHYlZsWFdtbE9WRlpwVGtkTmVFMUVSbWxOVkZVMVQwUldhMXB0Um13S1dsZEZNMWw2WkdwTmJWbDZXVlJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMWxYVW10YWFsRXpUa1JHYlZsWFdtbE9WRlpwVGtkTmVFMUVSbWtLVFZSVk5VOUVWbXRhYlVac1dsZEZNMWw2WkdwTmJWbDZXVlJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwZEdhMXBIV1RBS1RucFJlRnB0Um0xWmFsVXhXV3BTYWsxVVFYaFpha1V4VDFSbk1WcEhXbWhhVjFab1RqSk5NMWw2U20xTk1rVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOZWsxM1RrUlZlazU2V1ROTlJHdDJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwVVZsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTTjBKSWEwRUtaSGRDTVVGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtOUZUbTh2YWtGQlFVRlJSQXBCUlZsM1VrRkpaMEpCUkVJMVduUmpVMnczT0daNVlWRnpUVWgwTlVwNmFIbHRTVzVuZDJ4RFNEbElTM2hSTTNsd09EUkRTVUZrVlZwWk4wSm9PRU5HQ20weE1HbEhja2Q2Um5CblJuWndZMkZ1U25wMVltbHdRMnQxZGtaa2RYWlNUVUZ2UjBORGNVZFRUVFE1UWtGTlJFRXlaMEZOUjFWRFRVVkJTWGQ2ZDNrS1RtcDRPWFJuYmtGMFYyZzRUbWhYZUVaMVprSTVaVUpOUVdSVlVEaFRWMk5GY1ZCd2N6WkhRM3A0Y0dKMmVGVlBlQzh6VlhGa1pXbzBVVWw0UVVwa2VBbzRVSGNyUW5CaE5VMUVTRmRNWm5ob2IzUnhaR0paUW0xYWMxZEpSRFZoU0VGNVJFTnVhMGc1ZDNnelZVeFVVV1JoUkV4NmVsQndaMFk1T1dkb1p6MDlDaTB0TFMwdFJVNUVJRU5GVWxSSlJrbERRVlJGTFMwdExTMEsifX19fQ=="}], "timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgBbBA7AfYtloUfwQouZyVDqfOz1ZObw/QVkT15bUaHiECFEHCONyq1yKeeDqEVVKQhRofvEoKGA8yMDI2MDgyNzEzMjkwOVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwODI3MTMyOTA5WjAvBgkqhkiG9w0BCQQxIgQgcaHTgsBZbqd886Nb/27zuBVVcLF9vJFt3zZtVjdusPQwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIxAJ/L6zK3J7ZTTgyL5/aviwhaA/b+2sVhJl80Yt6BJSQdTfByj8IXCefG9mZTa8b9bAIwBRHyJJ6gKH0o3eoLRCSJn8CbdocIj5oNCc83+Qt9ER3Ama4RfurLGnZP/1as8nFL"}]}}, "messageSignature":{"messageDigest":{"algorithm":"SHA2_256", "digest":"BuXq5mKp8TPCKyD2jsalV2FJqKsHLbGnj3lbaWaidlw="}, "signature":"MEQCIHf9cCcwiwF0TBAsCMgpXbLT7f7E5krB5yCYS5Qb3bReAiB93oGC4NErGzHDxPWJQvRn8I/4yFQNpSIKC6y7YiEDCA=="}}
build/torch214-cxx11-xpu20261-x86_64-linux/__init__.py ADDED
@@ -0,0 +1,412 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ import torch
4
+
5
+ from ._ops import ops as flash_attn_ops
6
+ from .flash_attn_interface import (
7
+ flash_attn_func,
8
+ flash_attn_kvpacked_func,
9
+ flash_attn_qkvpacked_func,
10
+ flash_attn_varlen_func,
11
+ flash_attn_varlen_kvpacked_func,
12
+ flash_attn_varlen_qkvpacked_func,
13
+ flash_attn_with_kvcache,
14
+ )
15
+
16
+ __all__ = [
17
+ # High-level API (with autograd support)
18
+ "flash_attn_func",
19
+ "flash_attn_kvpacked_func",
20
+ "flash_attn_qkvpacked_func",
21
+ "flash_attn_varlen_func",
22
+ "flash_attn_varlen_kvpacked_func",
23
+ "flash_attn_varlen_qkvpacked_func",
24
+ "flash_attn_with_kvcache",
25
+ # Low-level ops (no autograd)
26
+ "fwd",
27
+ "varlen_fwd",
28
+ "bwd",
29
+ "varlen_bwd",
30
+ "fwd_kvcache",
31
+ ]
32
+
33
+
34
+ def fwd(
35
+ q: torch.Tensor,
36
+ k: torch.Tensor,
37
+ v: torch.Tensor,
38
+ out: Optional[torch.Tensor] = None,
39
+ alibi_slopes: Optional[torch.Tensor] = None,
40
+ p_dropout: float = 0.0,
41
+ softmax_scale: Optional[float] = None,
42
+ is_causal: bool = False,
43
+ window_size_left: int = -1,
44
+ window_size_right: int = -1,
45
+ softcap: float = 0.0,
46
+ return_softmax: bool = False,
47
+ gen: Optional[torch.Generator] = None,
48
+ ) -> List[torch.Tensor]:
49
+ """
50
+ Forward pass for multi-head attention.
51
+
52
+ Args:
53
+ q: Query tensor of shape [batch_size, seqlen_q, num_heads, head_size]
54
+ k: Key tensor of shape [batch_size, seqlen_k, num_heads_k, head_size]
55
+ v: Value tensor of shape [batch_size, seqlen_k, num_heads_k, head_size]
56
+ out: Optional output tensor, same shape as q
57
+ alibi_slopes: Optional ALiBi slopes tensor of shape [num_heads] or [batch_size, num_heads]
58
+ p_dropout: Dropout probability
59
+ softmax_scale: Scale factor for softmax
60
+ is_causal: Whether to use causal attention
61
+ window_size_left: Window size for left context (-1 for unlimited)
62
+ window_size_right: Window size for right context (-1 for unlimited)
63
+ softcap: Soft cap for attention weights
64
+ return_softmax: Whether to return softmax weights
65
+ gen: Optional random number generator
66
+
67
+ Returns:
68
+ List of tensors: [output, softmax_lse, (softmax if return_softmax)]
69
+ """
70
+ if softmax_scale is None:
71
+ attention_head_dim = q.shape[-1]
72
+ softmax_scale = 1.0 / (attention_head_dim**0.5)
73
+
74
+ return flash_attn_ops.fwd(
75
+ q,
76
+ k,
77
+ v,
78
+ out,
79
+ alibi_slopes,
80
+ p_dropout,
81
+ softmax_scale,
82
+ is_causal,
83
+ window_size_left,
84
+ window_size_right,
85
+ softcap,
86
+ return_softmax,
87
+ gen,
88
+ )
89
+
90
+
91
+ def varlen_fwd(
92
+ q: torch.Tensor,
93
+ k: torch.Tensor,
94
+ v: torch.Tensor,
95
+ cu_seqlens_q: torch.Tensor,
96
+ cu_seqlens_k: torch.Tensor,
97
+ out: Optional[torch.Tensor] = None,
98
+ seqused_k: Optional[torch.Tensor] = None,
99
+ leftpad_k: Optional[torch.Tensor] = None,
100
+ block_table: Optional[torch.Tensor] = None,
101
+ alibi_slopes: Optional[torch.Tensor] = None,
102
+ max_seqlen_q: int = 0,
103
+ max_seqlen_k: int = 0,
104
+ p_dropout: float = 0.0,
105
+ softmax_scale: Optional[float] = None,
106
+ zero_tensors: bool = False,
107
+ is_causal: bool = False,
108
+ window_size_left: int = -1,
109
+ window_size_right: int = -1,
110
+ softcap: float = 0.0,
111
+ return_softmax: bool = False,
112
+ gen: Optional[torch.Generator] = None,
113
+ ) -> List[torch.Tensor]:
114
+ """
115
+ Forward pass for multi-head attention with variable sequence lengths.
116
+
117
+ Args:
118
+ q: Query tensor of shape [total_q, num_heads, head_size]
119
+ k: Key tensor of shape [total_k, num_heads_k, head_size] or [num_blocks, page_block_size, num_heads_k, head_size]
120
+ v: Value tensor of shape [total_k, num_heads_k, head_size] or [num_blocks, page_block_size, num_heads_k, head_size]
121
+ cu_seqlens_q: Cumulative sequence lengths for queries of shape [batch_size+1]
122
+ cu_seqlens_k: Cumulative sequence lengths for keys of shape [batch_size+1]
123
+ out: Optional output tensor of shape [total_q, num_heads, head_size]
124
+ seqused_k: Optional tensor specifying how many keys to use per batch element [batch_size]
125
+ leftpad_k: Optional left padding for keys of shape [batch_size]
126
+ block_table: Optional block table of shape [batch_size, max_num_blocks_per_seq]
127
+ alibi_slopes: Optional ALiBi slopes tensor of shape [num_heads] or [batch_size, num_heads]
128
+ max_seqlen_q: Maximum sequence length for queries
129
+ max_seqlen_k: Maximum sequence length for keys
130
+ p_dropout: Dropout probability
131
+ softmax_scale: Scale factor for softmax
132
+ zero_tensors: Whether to zero tensors before computation
133
+ is_causal: Whether to use causal attention
134
+ window_size_left: Window size for left context (-1 for unlimited)
135
+ window_size_right: Window size for right context (-1 for unlimited)
136
+ softcap: Soft cap for attention weights
137
+ return_softmax: Whether to return softmax weights
138
+ gen: Optional random number generator
139
+
140
+ Returns:
141
+ List of tensors: [output, softmax_lse, (softmax if return_softmax)]
142
+ """
143
+ if softmax_scale is None:
144
+ attention_head_dim = q.shape[-1]
145
+ softmax_scale = 1.0 / (attention_head_dim**0.5)
146
+
147
+ return flash_attn_ops.varlen_fwd(
148
+ q,
149
+ k,
150
+ v,
151
+ out,
152
+ cu_seqlens_q,
153
+ cu_seqlens_k,
154
+ seqused_k,
155
+ leftpad_k,
156
+ block_table,
157
+ alibi_slopes,
158
+ max_seqlen_q,
159
+ max_seqlen_k,
160
+ p_dropout,
161
+ softmax_scale,
162
+ zero_tensors,
163
+ is_causal,
164
+ window_size_left,
165
+ window_size_right,
166
+ softcap,
167
+ return_softmax,
168
+ gen,
169
+ )
170
+
171
+
172
+ def bwd(
173
+ dout: torch.Tensor,
174
+ q: torch.Tensor,
175
+ k: torch.Tensor,
176
+ v: torch.Tensor,
177
+ out: torch.Tensor,
178
+ softmax_lse: torch.Tensor,
179
+ dq: Optional[torch.Tensor] = None,
180
+ dk: Optional[torch.Tensor] = None,
181
+ dv: Optional[torch.Tensor] = None,
182
+ alibi_slopes: Optional[torch.Tensor] = None,
183
+ p_dropout: float = 0.0,
184
+ softmax_scale: Optional[float] = None,
185
+ is_causal: bool = False,
186
+ window_size_left: int = -1,
187
+ window_size_right: int = -1,
188
+ softcap: float = 0.0,
189
+ deterministic: bool = False,
190
+ gen: Optional[torch.Generator] = None,
191
+ rng_state: Optional[torch.Tensor] = None,
192
+ ) -> List[torch.Tensor]:
193
+ """
194
+ Backward pass for multi-head attention.
195
+
196
+ Args:
197
+ dout: Gradient tensor of shape [batch_size, seqlen_q, num_heads, head_size]
198
+ q: Query tensor of shape [batch_size, seqlen_q, num_heads, head_size]
199
+ k: Key tensor of shape [batch_size, seqlen_k, num_heads_k, head_size]
200
+ v: Value tensor of shape [batch_size, seqlen_k, num_heads_k, head_size]
201
+ out: Output tensor from forward pass of shape [batch_size, seqlen_q, num_heads, head_size]
202
+ softmax_lse: Log-sum-exp values from forward pass of shape [batch_size, num_heads, seqlen_q]
203
+ dq: Optional gradient tensor for queries, same shape as q
204
+ dk: Optional gradient tensor for keys, same shape as k
205
+ dv: Optional gradient tensor for values, same shape as v
206
+ alibi_slopes: Optional ALiBi slopes tensor of shape [num_heads] or [batch_size, num_heads]
207
+ p_dropout: Dropout probability
208
+ softmax_scale: Scale factor for softmax
209
+ is_causal: Whether to use causal attention
210
+ window_size_left: Window size for left context (-1 for unlimited)
211
+ window_size_right: Window size for right context (-1 for unlimited)
212
+ softcap: Soft cap for attention weights
213
+ deterministic: Whether to use deterministic algorithms
214
+ gen: Optional random number generator
215
+ rng_state: Optional RNG state from forward pass
216
+
217
+ Returns:
218
+ List of tensors: [dq, dk, dv]
219
+ """
220
+ if softmax_scale is None:
221
+ attention_head_dim = q.shape[-1]
222
+ softmax_scale = 1.0 / (attention_head_dim**0.5)
223
+
224
+ return flash_attn_ops.bwd(
225
+ dout,
226
+ q,
227
+ k,
228
+ v,
229
+ out,
230
+ softmax_lse,
231
+ dq,
232
+ dk,
233
+ dv,
234
+ alibi_slopes,
235
+ p_dropout,
236
+ softmax_scale,
237
+ is_causal,
238
+ window_size_left,
239
+ window_size_right,
240
+ softcap,
241
+ deterministic,
242
+ gen,
243
+ rng_state,
244
+ )
245
+
246
+
247
+ def varlen_bwd(
248
+ dout: torch.Tensor,
249
+ q: torch.Tensor,
250
+ k: torch.Tensor,
251
+ v: torch.Tensor,
252
+ out: torch.Tensor,
253
+ softmax_lse: torch.Tensor,
254
+ cu_seqlens_q: torch.Tensor,
255
+ cu_seqlens_k: torch.Tensor,
256
+ dq: Optional[torch.Tensor] = None,
257
+ dk: Optional[torch.Tensor] = None,
258
+ dv: Optional[torch.Tensor] = None,
259
+ alibi_slopes: Optional[torch.Tensor] = None,
260
+ max_seqlen_q: int = 0,
261
+ max_seqlen_k: int = 0,
262
+ p_dropout: float = 0.0,
263
+ softmax_scale: Optional[float] = None,
264
+ zero_tensors: bool = False,
265
+ is_causal: bool = False,
266
+ window_size_left: int = -1,
267
+ window_size_right: int = -1,
268
+ softcap: float = 0.0,
269
+ deterministic: bool = False,
270
+ gen: Optional[torch.Generator] = None,
271
+ rng_state: Optional[torch.Tensor] = None,
272
+ ) -> List[torch.Tensor]:
273
+ """
274
+ Backward pass for multi-head attention with variable sequence lengths.
275
+
276
+ Args:
277
+ dout: Gradient tensor of shape [batch_size, seqlen_q, num_heads, head_size]
278
+ q: Query tensor of shape [batch_size, seqlen_q, num_heads, head_size]
279
+ k: Key tensor of shape [batch_size, seqlen_k, num_heads_k, head_size]
280
+ v: Value tensor of shape [batch_size, seqlen_k, num_heads_k, head_size]
281
+ out: Output tensor from forward pass of shape [batch_size, seqlen_q, num_heads, head_size]
282
+ softmax_lse: Log-sum-exp values from forward pass of shape [batch_size, num_heads, seqlen_q]
283
+ cu_seqlens_q: Cumulative sequence lengths for queries of shape [batch_size+1]
284
+ cu_seqlens_k: Cumulative sequence lengths for keys of shape [batch_size+1]
285
+ dq: Optional gradient tensor for queries, same shape as q
286
+ dk: Optional gradient tensor for keys, same shape as k
287
+ dv: Optional gradient tensor for values, same shape as v
288
+ alibi_slopes: Optional ALiBi slopes tensor of shape [num_heads] or [batch_size, num_heads]
289
+ max_seqlen_q: Maximum sequence length for queries
290
+ max_seqlen_k: Maximum sequence length for keys
291
+ p_dropout: Dropout probability
292
+ softmax_scale: Scale factor for softmax
293
+ zero_tensors: Whether to zero tensors before computation
294
+ is_causal: Whether to use causal attention
295
+ window_size_left: Window size for left context (-1 for unlimited)
296
+ window_size_right: Window size for right context (-1 for unlimited)
297
+ softcap: Soft cap for attention weights
298
+ deterministic: Whether to use deterministic algorithms
299
+ gen: Optional random number generator
300
+ rng_state: Optional RNG state from forward pass
301
+
302
+ Returns:
303
+ List of tensors: [dq, dk, dv]
304
+ """
305
+ if softmax_scale is None:
306
+ attention_head_dim = q.shape[-1]
307
+ softmax_scale = 1.0 / (attention_head_dim**0.5)
308
+
309
+ return flash_attn_ops.varlen_bwd(
310
+ dout,
311
+ q,
312
+ k,
313
+ v,
314
+ out,
315
+ softmax_lse,
316
+ dq,
317
+ dk,
318
+ dv,
319
+ cu_seqlens_q,
320
+ cu_seqlens_k,
321
+ alibi_slopes,
322
+ max_seqlen_q,
323
+ max_seqlen_k,
324
+ p_dropout,
325
+ softmax_scale,
326
+ zero_tensors,
327
+ is_causal,
328
+ window_size_left,
329
+ window_size_right,
330
+ softcap,
331
+ deterministic,
332
+ gen,
333
+ rng_state,
334
+ )
335
+
336
+
337
+ def fwd_kvcache(
338
+ q: torch.Tensor,
339
+ kcache: torch.Tensor,
340
+ vcache: torch.Tensor,
341
+ k: Optional[torch.Tensor] = None,
342
+ v: Optional[torch.Tensor] = None,
343
+ seqlens_k: Optional[torch.Tensor] = None,
344
+ rotary_cos: Optional[torch.Tensor] = None,
345
+ rotary_sin: Optional[torch.Tensor] = None,
346
+ cache_batch_idx: Optional[torch.Tensor] = None,
347
+ leftpad_k: Optional[torch.Tensor] = None,
348
+ block_table: Optional[torch.Tensor] = None,
349
+ alibi_slopes: Optional[torch.Tensor] = None,
350
+ out: Optional[torch.Tensor] = None,
351
+ softmax_scale: Optional[float] = None,
352
+ is_causal: bool = False,
353
+ window_size_left: int = -1,
354
+ window_size_right: int = -1,
355
+ softcap: float = 0.0,
356
+ is_rotary_interleaved: bool = False,
357
+ num_splits: int = 1,
358
+ ) -> List[torch.Tensor]:
359
+ """
360
+ Forward pass for multi-head attention with KV cache.
361
+
362
+ Args:
363
+ q: Query tensor of shape [batch_size, seqlen_q, num_heads, head_size]
364
+ kcache: Key cache tensor of shape [batch_size_c, seqlen_k, num_heads_k, head_size] or [num_blocks, page_block_size, num_heads_k, head_size]
365
+ vcache: Value cache tensor of shape [batch_size_c, seqlen_k, num_heads_k, head_size] or [num_blocks, page_block_size, num_heads_k, head_size]
366
+ k: Optional new keys tensor of shape [batch_size, seqlen_knew, num_heads_k, head_size]
367
+ v: Optional new values tensor of shape [batch_size, seqlen_knew, num_heads_k, head_size]
368
+ seqlens_k: Optional sequence lengths for keys of shape [batch_size]
369
+ rotary_cos: Optional rotary cosine tensor of shape [seqlen_ro, rotary_dim/2]
370
+ rotary_sin: Optional rotary sine tensor of shape [seqlen_ro, rotary_dim/2]
371
+ cache_batch_idx: Optional indices to index into the KV cache
372
+ leftpad_k: Optional left padding for keys of shape [batch_size]
373
+ block_table: Optional block table of shape [batch_size, max_num_blocks_per_seq]
374
+ alibi_slopes: Optional ALiBi slopes tensor of shape [num_heads] or [batch_size, num_heads]
375
+ out: Optional output tensor, same shape as q
376
+ softmax_scale: Scale factor for softmax
377
+ is_causal: Whether to use causal attention
378
+ window_size_left: Window size for left context (-1 for unlimited)
379
+ window_size_right: Window size for right context (-1 for unlimited)
380
+ softcap: Soft cap for attention weights
381
+ is_rotary_interleaved: Whether rotary embeddings are interleaved
382
+ num_splits: Number of splits for computation
383
+
384
+ Returns:
385
+ List of tensors: [output, softmax_lse]
386
+ """
387
+ if softmax_scale is None:
388
+ attention_head_dim = q.shape[-1]
389
+ softmax_scale = 1.0 / (attention_head_dim**0.5)
390
+
391
+ return flash_attn_ops.fwd_kvcache(
392
+ q,
393
+ kcache,
394
+ vcache,
395
+ k,
396
+ v,
397
+ seqlens_k,
398
+ rotary_cos,
399
+ rotary_sin,
400
+ cache_batch_idx,
401
+ leftpad_k,
402
+ block_table,
403
+ alibi_slopes,
404
+ out,
405
+ softmax_scale,
406
+ is_causal,
407
+ window_size_left,
408
+ window_size_right,
409
+ softcap,
410
+ is_rotary_interleaved,
411
+ num_splits,
412
+ )
build/{torch213-cxx11-xpu20260-x86_64-linux/_flash_attn2_xpu_48628c8.abi3.so → torch214-cxx11-xpu20261-x86_64-linux/_flash_attn2_xpu_addf474.abi3.so} RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:8ce40cfb5cde51dadbd21e65c0fc95903ecba265c030f73a8e90678d9f01ec87
3
- size 81510520
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bbea9201ea60a6db717f4583f27cdefef948d10431d2e4d8c13e6f0fce661e93
3
+ size 81972264
build/torch214-cxx11-xpu20261-x86_64-linux/_ops.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from . import _flash_attn2_xpu_addf474
3
+ ops = torch.ops._flash_attn2_xpu_addf474
4
+
5
+ def add_op_namespace_prefix(op_name: str):
6
+ """
7
+ Prefix op by namespace.
8
+ """
9
+ return f"_flash_attn2_xpu_addf474::{op_name}"
build/torch214-cxx11-xpu20261-x86_64-linux/bert_padding.py ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Adapted from https://github.com/mlcommons/training_results_v1.1/blob/main/NVIDIA/benchmarks/bert/implementations/pytorch/padding.py
2
+
3
+ import torch
4
+ import torch.nn.functional as F
5
+ from einops import rearrange, repeat
6
+
7
+
8
+ class IndexFirstAxis(torch.autograd.Function):
9
+ @staticmethod
10
+ def forward(ctx, input, indices):
11
+ ctx.save_for_backward(indices)
12
+ assert input.ndim >= 2
13
+ ctx.first_axis_dim, other_shape = input.shape[0], input.shape[1:]
14
+ second_dim = other_shape.numel()
15
+ # TD [2022-03-04] For some reason torch.gather is a bit faster than indexing.
16
+ # return input[indices]
17
+ return torch.gather(
18
+ rearrange(input, "b ... -> b (...)"), 0, repeat(indices, "z -> z d", d=second_dim)
19
+ ).reshape(-1, *other_shape)
20
+
21
+ @staticmethod
22
+ def backward(ctx, grad_output):
23
+ (indices,) = ctx.saved_tensors
24
+ assert grad_output.ndim >= 2
25
+ other_shape = grad_output.shape[1:]
26
+ grad_output = rearrange(grad_output, "b ... -> b (...)")
27
+ grad_input = torch.zeros(
28
+ [ctx.first_axis_dim, grad_output.shape[1]],
29
+ device=grad_output.device,
30
+ dtype=grad_output.dtype,
31
+ )
32
+ # TD [2022-03-04] For some reason torch.scatter is a bit faster than indexing.
33
+ # grad_input[indices] = grad_output
34
+ grad_input.scatter_(0, repeat(indices, "z -> z d", d=grad_output.shape[1]), grad_output)
35
+ return grad_input.reshape(ctx.first_axis_dim, *other_shape), None
36
+
37
+
38
+ index_first_axis = IndexFirstAxis.apply
39
+
40
+
41
+ class IndexPutFirstAxis(torch.autograd.Function):
42
+ @staticmethod
43
+ def forward(ctx, values, indices, first_axis_dim):
44
+ ctx.save_for_backward(indices)
45
+ assert indices.ndim == 1
46
+ assert values.ndim >= 2
47
+ output = torch.zeros(
48
+ first_axis_dim, *values.shape[1:], device=values.device, dtype=values.dtype
49
+ )
50
+ # TD [2022-03-04] For some reason torch.scatter is a bit faster than indexing.
51
+ output[indices] = values
52
+ # output.scatter_(0, repeat(indices, 'z -> z d', d=values.shape[1]), values)
53
+ return output
54
+
55
+ @staticmethod
56
+ def backward(ctx, grad_output):
57
+ (indices,) = ctx.saved_tensors
58
+ # TD [2022-03-04] For some reason torch.gather is a bit faster than indexing.
59
+ grad_values = grad_output[indices]
60
+ # grad_values = torch.gather(grad_output, 0, repeat(indices, 'z -> z d', d=grad_output.shape[1]))
61
+ return grad_values, None, None
62
+
63
+
64
+ index_put_first_axis = IndexPutFirstAxis.apply
65
+
66
+
67
+ class IndexFirstAxisResidual(torch.autograd.Function):
68
+ @staticmethod
69
+ def forward(ctx, input, indices):
70
+ ctx.save_for_backward(indices)
71
+ assert input.ndim >= 2
72
+ ctx.first_axis_dim, other_shape = input.shape[0], input.shape[1:]
73
+ second_dim = other_shape.numel()
74
+ # TD [2022-03-04] For some reason torch.gather is a bit faster than indexing.
75
+ output = input[indices]
76
+ # We don't want to reshape input (b ... -> b (...)) since it could change the channel_last
77
+ # memory format to channel_first. In other words, input might not be contiguous.
78
+ # If we don't detach, Pytorch complains about output being a view and is being modified inplace
79
+ return output, input.detach()
80
+
81
+ @staticmethod
82
+ def backward(ctx, grad_output, grad_residual):
83
+ (indices,) = ctx.saved_tensors
84
+ assert grad_output.ndim >= 2
85
+ other_shape = grad_output.shape[1:]
86
+ assert grad_residual.shape[1:] == other_shape
87
+ grad_input = grad_residual
88
+ # grad_input[indices] += grad_output
89
+ indices = indices.reshape(indices.shape[0], *((1,) * (grad_output.ndim - 1)))
90
+ indices = indices.expand_as(grad_output)
91
+ grad_input.scatter_add_(0, indices, grad_output)
92
+ return grad_input.reshape(ctx.first_axis_dim, *other_shape), None
93
+
94
+
95
+ index_first_axis_residual = IndexFirstAxisResidual.apply
96
+
97
+
98
+ def unpad_input(hidden_states, attention_mask, unused_mask=None):
99
+ """
100
+ Arguments:
101
+ hidden_states: (batch, seqlen, ...)
102
+ attention_mask: (batch, seqlen), bool / int, 1 means valid and 0 means not valid.
103
+ unused_mask: (batch, seqlen), bool / int, 1 means the element is allocated but unused.
104
+ Return:
105
+ hidden_states: (total_nnz, ...), where total_nnz = number of tokens selected in attention_mask + unused_mask.
106
+ indices: (total_nnz), the indices of masked tokens from the flattened input sequence.
107
+ cu_seqlens: (batch + 1), the cumulative sequence lengths, used to index into hidden_states.
108
+ max_seqlen_in_batch: int
109
+ seqused: (batch), returns the number of tokens selected in attention_mask + unused_mask.
110
+ """
111
+ all_masks = (attention_mask + unused_mask) if unused_mask is not None else attention_mask
112
+ seqlens_in_batch = all_masks.sum(dim=-1, dtype=torch.int32)
113
+ used_seqlens_in_batch = attention_mask.sum(dim=-1, dtype=torch.int32)
114
+ indices = torch.nonzero(all_masks.flatten(), as_tuple=False).flatten()
115
+ max_seqlen_in_batch = seqlens_in_batch.max().item()
116
+ cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.int32), (1, 0))
117
+ # TD [2022-03-04] We don't want to index with a bool mask, because Pytorch will expand the
118
+ # bool mask, then call nonzero to get the indices, then index with those. The indices is @dim
119
+ # times larger than it needs to be, wasting memory. It's faster and more memory-efficient to
120
+ # index with integer indices. Moreover, torch's index is a bit slower than it needs to be,
121
+ # so we write custom forward and backward to make it a bit faster.
122
+ return (
123
+ index_first_axis(rearrange(hidden_states, "b s ... -> (b s) ..."), indices),
124
+ indices,
125
+ cu_seqlens,
126
+ max_seqlen_in_batch,
127
+ used_seqlens_in_batch,
128
+ )
129
+
130
+
131
+ def unpad_input_for_concatenated_sequences(hidden_states, attention_mask_in_length):
132
+ """
133
+ Supports concatenating short samples in one sequence. The attention_mask_in_length is utilized to mask other short samples. It helps efficient training of variant lengths-based samples (e.g., the supervised fine-tuning task in large language model).
134
+ The motivation for this function is explained [here](https://github.com/Dao-AILab/flash-attention/issues/432#issuecomment-1668822286).
135
+
136
+ For example, if batch = 3 and seqlen = 6, the attention_mask_in_length is:
137
+ ```
138
+ [
139
+ [2, 3, 0, 0, 0, 0],
140
+ [3, 2, 0, 0, 0, 0],
141
+ [6, 0, 0, 0, 0, 0]
142
+ ]
143
+ ```
144
+ , which refers to the 3D-attention mask:
145
+ ```
146
+ [
147
+ [
148
+ [1, 0, 0, 0, 0, 0],
149
+ [1, 1, 0, 0, 0, 0],
150
+ [0, 0, 1, 0, 0, 0],
151
+ [0, 0, 1, 1, 0, 0],
152
+ [0, 0, 1, 1, 1, 0],
153
+ [0, 0, 0, 0, 0, 1]
154
+ ],
155
+ [
156
+ [1, 0, 0, 0, 0, 0],
157
+ [1, 1, 0, 0, 0, 0],
158
+ [1, 1, 1, 0, 0, 0],
159
+ [0, 0, 0, 1, 0, 0],
160
+ [0, 0, 0, 1, 1, 0],
161
+ [0, 0, 0, 0, 0, 1]
162
+ ],
163
+ [
164
+ [1, 0, 0, 0, 0, 0],
165
+ [1, 1, 0, 0, 0, 0],
166
+ [1, 1, 1, 0, 0, 0],
167
+ [1, 1, 1, 1, 0, 0],
168
+ [1, 1, 1, 1, 1, 0],
169
+ [1, 1, 1, 1, 1, 1]
170
+ ]
171
+ ]
172
+ ```.
173
+
174
+ Arguments:
175
+ hidden_states: (batch, seqlen, ...)
176
+ attention_mask_in_length: (batch, seqlen), int, a nonzero number (e.g., 1, 2, 3, etc.) means length of concatenated sequence in b-th batch, and 0 means none.
177
+ Return:
178
+ hidden_states: (total_nnz, ...), where total_nnz = number of tokens in selected in attention_mask.
179
+ indices: (total_nnz), the indices of non-masked tokens from the flattened input sequence.
180
+ cu_seqlens: (batch + 1), the cumulative sequence lengths, used to index into hidden_states.
181
+ max_seqlen_in_batch: int
182
+ """
183
+ length = attention_mask_in_length.sum(dim=-1)
184
+ seqlen = attention_mask_in_length.size(-1)
185
+ attention_mask_2d = torch.arange(seqlen, device=length.device, dtype=length.dtype).expand(len(length), seqlen) < length.unsqueeze(1)
186
+ real_indices_idx = torch.nonzero(attention_mask_in_length.flatten(), as_tuple=False).flatten()
187
+ seqlens_in_batch = attention_mask_in_length.flatten()[real_indices_idx]
188
+ indices = torch.nonzero(attention_mask_2d.flatten(), as_tuple=False).flatten()
189
+ max_seqlen_in_batch = seqlens_in_batch.max().item()
190
+ cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.int32), (1, 0))
191
+ # TD [2022-03-04] We don't want to index with a bool mask, because Pytorch will expand the
192
+ # bool mask, then call nonzero to get the indices, then index with those. The indices is @dim
193
+ # times larger than it needs to be, wasting memory. It's faster and more memory-efficient to
194
+ # index with integer indices. Moreover, torch's index is a bit slower than it needs to be,
195
+ # so we write custom forward and backward to make it a bit faster.
196
+ return (
197
+ index_first_axis(rearrange(hidden_states, "b s ... -> (b s) ..."), indices),
198
+ indices,
199
+ cu_seqlens,
200
+ max_seqlen_in_batch,
201
+ )
202
+
203
+
204
+ def pad_input(hidden_states, indices, batch, seqlen):
205
+ """
206
+ Arguments:
207
+ hidden_states: (total_nnz, ...), where total_nnz = number of tokens in selected in attention_mask.
208
+ indices: (total_nnz), the indices that represent the non-masked tokens of the original padded input sequence.
209
+ batch: int, batch size for the padded sequence.
210
+ seqlen: int, maximum sequence length for the padded sequence.
211
+ Return:
212
+ hidden_states: (batch, seqlen, ...)
213
+ """
214
+ dim = hidden_states.shape[-1]
215
+ # output = torch.zeros((batch * seqlen), dim, device=hidden_states.device, dtype=hidden_states.dtype)
216
+ # output[indices] = hidden_states
217
+ output = index_put_first_axis(hidden_states, indices, batch * seqlen)
218
+ return rearrange(output, "(b s) ... -> b s ...", b=batch)
build/torch214-cxx11-xpu20261-x86_64-linux/flash_attn_interface.py ADDED
@@ -0,0 +1,1662 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2023, Tri Dao.
2
+
3
+ from typing import Optional, Sequence, Tuple, Union
4
+
5
+ import torch
6
+ import torch.nn as nn
7
+ import os
8
+
9
+ # # isort: off
10
+ # # We need to import the CUDA kernels after importing torch
11
+ # USE_TRITON_ROCM = os.getenv("FLASH_ATTENTION_TRITON_AMD_ENABLE", "FALSE") == "TRUE"
12
+ # if USE_TRITON_ROCM:
13
+ # from .flash_attn_triton_amd import interface_fa as flash_attn
14
+ # else:
15
+ # import flash_attn_2_cuda as flash_attn
16
+
17
+
18
+ from ._ops import ops as flash_attn
19
+ from ._ops import add_op_namespace_prefix
20
+
21
+ # # isort: on
22
+
23
+
24
+ def maybe_contiguous(x):
25
+ return x.contiguous() if x is not None and x.stride(-1) != 1 else x
26
+
27
+
28
+ def _get_device():
29
+ if torch.xpu.is_available():
30
+ return "xpu"
31
+ elif torch.cuda.is_available():
32
+ return "cuda"
33
+ else:
34
+ return "cpu"
35
+
36
+
37
+ def _get_block_size_n(device, head_dim, is_dropout, is_causal):
38
+ assert head_dim <= 256
39
+
40
+ if device.type == "xpu":
41
+ if head_dim <= 96:
42
+ return 64
43
+ elif head_dim <= 128:
44
+ return 32
45
+ elif head_dim <= 256:
46
+ return 64
47
+ else:
48
+ return 32
49
+
50
+ # This should match the block sizes in the CUDA kernel
51
+ major, minor = torch.cuda.get_device_capability(device)
52
+ is_sm8x = (
53
+ major == 8 and minor > 0
54
+ ) # Only include sm86 and sm89, exclude sm80 (A100)
55
+ is_sm80 = major == 8 and minor == 0
56
+ is_sm90 = major == 9 and minor == 0
57
+ if head_dim <= 32:
58
+ return 128
59
+ if head_dim <= 64:
60
+ return 128 if not is_dropout else 64
61
+ elif head_dim <= 96:
62
+ return 64
63
+ elif head_dim <= 128:
64
+ if is_sm8x:
65
+ return 64 if (not is_dropout and is_causal) else 32
66
+ else:
67
+ return 64 if not is_dropout else 32
68
+ elif head_dim <= 192:
69
+ return 64
70
+ elif head_dim <= 224:
71
+ return 64
72
+ elif head_dim <= 256:
73
+ return 64
74
+
75
+
76
+ def round_multiple(x, m):
77
+ return (x + m - 1) // m * m
78
+
79
+
80
+ @torch.library.custom_op(
81
+ add_op_namespace_prefix("_flash_attn_forward"),
82
+ mutates_args=(),
83
+ device_types=_get_device(),
84
+ )
85
+ def _flash_attn_forward(
86
+ q: torch.Tensor,
87
+ k: torch.Tensor,
88
+ v: torch.Tensor,
89
+ dropout_p: float,
90
+ softmax_scale: float,
91
+ causal: bool,
92
+ window_size_left: int,
93
+ window_size_right: int,
94
+ softcap: float,
95
+ alibi_slopes: Optional[torch.Tensor],
96
+ return_softmax: bool,
97
+ ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
98
+ q, k, v = [maybe_contiguous(x) for x in (q, k, v)]
99
+ out, softmax_lse, S_dmask, rng_state = flash_attn.fwd(
100
+ q,
101
+ k,
102
+ v,
103
+ None,
104
+ alibi_slopes,
105
+ dropout_p,
106
+ softmax_scale,
107
+ causal,
108
+ window_size_left,
109
+ window_size_right,
110
+ softcap,
111
+ return_softmax,
112
+ None,
113
+ )
114
+ return out, softmax_lse, S_dmask, rng_state
115
+
116
+
117
+ @torch.library.register_fake(add_op_namespace_prefix("_flash_attn_forward"))
118
+ def _flash_attn_forward_fake(
119
+ q: torch.Tensor,
120
+ k: torch.Tensor,
121
+ v: torch.Tensor,
122
+ dropout_p: float,
123
+ softmax_scale: float,
124
+ causal: bool,
125
+ window_size_left: int,
126
+ window_size_right: int,
127
+ softcap: float,
128
+ alibi_slopes: Optional[torch.Tensor],
129
+ return_softmax: bool,
130
+ ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
131
+ q, k, v = [maybe_contiguous(x) for x in (q, k, v)]
132
+ batch_size, seqlen_q, num_heads, head_size = q.shape
133
+ seqlen_k = k.shape[1]
134
+ out = torch.empty_like(q)
135
+ softmax_lse = torch.empty(
136
+ (batch_size, num_heads, seqlen_q),
137
+ dtype=torch.float32,
138
+ device=q.device,
139
+ layout=q.layout,
140
+ )
141
+ p = torch.empty((0,), dtype=q.dtype, device=q.device, layout=q.layout)
142
+ if return_softmax:
143
+ p = torch.empty(
144
+ (
145
+ batch_size,
146
+ num_heads,
147
+ round_multiple(seqlen_q, 128),
148
+ round_multiple(seqlen_k, 128),
149
+ ),
150
+ dtype=q.dtype,
151
+ device=q.device,
152
+ layout=q.layout,
153
+ )
154
+ rng_state = torch.empty((2,), dtype=torch.int64, device=q.device)
155
+
156
+ return out, softmax_lse, p, rng_state
157
+
158
+
159
+ @torch.library.custom_op(
160
+ add_op_namespace_prefix("_flash_attn_varlen_forward"),
161
+ mutates_args=(),
162
+ device_types=_get_device(),
163
+ )
164
+ def _flash_attn_varlen_forward(
165
+ q: torch.Tensor,
166
+ k: torch.Tensor,
167
+ v: torch.Tensor,
168
+ cu_seqlens_q: torch.Tensor,
169
+ cu_seqlens_k: torch.Tensor,
170
+ max_seqlen_q: int,
171
+ max_seqlen_k: int,
172
+ dropout_p: float,
173
+ softmax_scale: float,
174
+ causal: bool,
175
+ window_size_left: int = -1,
176
+ window_size_right: int = -1,
177
+ softcap: float = 0.0,
178
+ alibi_slopes: Optional[torch.Tensor] = None,
179
+ return_softmax: bool = False,
180
+ block_table: Optional[torch.Tensor] = None,
181
+ leftpad_k: Optional[torch.Tensor] = None,
182
+ seqused_k: Optional[torch.Tensor] = None,
183
+ zero_tensors: bool = False,
184
+ ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
185
+ q, k, v = [maybe_contiguous(x) for x in (q, k, v)]
186
+ out, softmax_lse, S_dmask, rng_state = flash_attn.varlen_fwd(
187
+ q,
188
+ k,
189
+ v,
190
+ None,
191
+ cu_seqlens_q,
192
+ cu_seqlens_k,
193
+ seqused_k,
194
+ leftpad_k,
195
+ block_table,
196
+ alibi_slopes,
197
+ max_seqlen_q,
198
+ max_seqlen_k,
199
+ dropout_p,
200
+ softmax_scale,
201
+ zero_tensors,
202
+ causal,
203
+ window_size_left,
204
+ window_size_right,
205
+ softcap,
206
+ return_softmax,
207
+ None,
208
+ )
209
+ # if out.isnan().any() or softmax_lse.isnan().any():
210
+ # breakpoint()
211
+ return out, softmax_lse, S_dmask, rng_state
212
+
213
+
214
+ @torch.library.register_fake(add_op_namespace_prefix("_flash_attn_varlen_forward"))
215
+ def _flash_attn_varlen_forward_fake(
216
+ q: torch.Tensor,
217
+ k: torch.Tensor,
218
+ v: torch.Tensor,
219
+ cu_seqlens_q: torch.Tensor,
220
+ cu_seqlens_k: torch.Tensor,
221
+ max_seqlen_q: int,
222
+ max_seqlen_k: int,
223
+ dropout_p: float,
224
+ softmax_scale: float,
225
+ causal: bool,
226
+ window_size_left: int = -1,
227
+ window_size_right: int = -1,
228
+ softcap: float = 0.0,
229
+ alibi_slopes: Optional[torch.Tensor] = None,
230
+ return_softmax: bool = False,
231
+ block_table: Optional[torch.Tensor] = None,
232
+ leftpad_k: Optional[torch.Tensor] = None,
233
+ seqused_k: Optional[torch.Tensor] = None,
234
+ zero_tensors: bool = False,
235
+ ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
236
+ q, k, v = [maybe_contiguous(x) for x in (q, k, v)]
237
+ paged_kv = block_table is not None
238
+ batch_size = cu_seqlens_q.numel() - 1
239
+ total_q, num_heads, _ = q.shape
240
+
241
+ out = torch.empty_like(q)
242
+ softmax_lse = torch.empty(
243
+ (num_heads, total_q), dtype=torch.float32, device=q.device, layout=q.layout
244
+ )
245
+ p = torch.empty((0,), dtype=q.dtype, device=q.device, layout=q.layout)
246
+ seqlen_q_rounded = round_multiple(max_seqlen_q, 128)
247
+ seqlen_k_rounded = round_multiple(max_seqlen_k, 128)
248
+ if return_softmax:
249
+ p = torch.empty(
250
+ (batch_size, num_heads, seqlen_q_rounded, seqlen_k_rounded),
251
+ dtype=q.dtype,
252
+ device=q.device,
253
+ layout=q.layout,
254
+ )
255
+ rng_state = torch.empty((2,), dtype=torch.int64, device=q.device)
256
+ return out, softmax_lse, p, rng_state
257
+
258
+
259
+ @torch.library.custom_op(
260
+ add_op_namespace_prefix("_flash_attn_backward"),
261
+ mutates_args=("dq", "dk", "dv"),
262
+ device_types=_get_device(),
263
+ )
264
+ def _flash_attn_backward(
265
+ dout: torch.Tensor,
266
+ q: torch.Tensor,
267
+ k: torch.Tensor,
268
+ v: torch.Tensor,
269
+ out: torch.Tensor,
270
+ softmax_lse: torch.Tensor,
271
+ dq: Optional[torch.Tensor],
272
+ dk: Optional[torch.Tensor],
273
+ dv: Optional[torch.Tensor],
274
+ dropout_p: float,
275
+ softmax_scale: float,
276
+ causal: bool,
277
+ window_size_left: int,
278
+ window_size_right: int,
279
+ softcap: float,
280
+ alibi_slopes: Optional[torch.Tensor],
281
+ deterministic: bool,
282
+ rng_state: Optional[torch.Tensor] = None,
283
+ ) -> torch.Tensor:
284
+ # dq, dk, dv are allocated by us so they should already be contiguous
285
+ dout, q, k, v, out = [maybe_contiguous(x) for x in (dout, q, k, v, out)]
286
+ (
287
+ dq,
288
+ dk,
289
+ dv,
290
+ softmax_d,
291
+ ) = flash_attn.bwd(
292
+ dout,
293
+ q,
294
+ k,
295
+ v,
296
+ out,
297
+ softmax_lse,
298
+ dq,
299
+ dk,
300
+ dv,
301
+ alibi_slopes,
302
+ dropout_p,
303
+ softmax_scale,
304
+ causal,
305
+ window_size_left,
306
+ window_size_right,
307
+ softcap,
308
+ deterministic,
309
+ None,
310
+ rng_state,
311
+ )
312
+ return softmax_d
313
+
314
+
315
+ @torch.library.register_fake(add_op_namespace_prefix("_flash_attn_backward"))
316
+ def _flash_attn_backward_fake(
317
+ dout: torch.Tensor,
318
+ q: torch.Tensor,
319
+ k: torch.Tensor,
320
+ v: torch.Tensor,
321
+ out: torch.Tensor,
322
+ softmax_lse: torch.Tensor,
323
+ dq: Optional[torch.Tensor],
324
+ dk: Optional[torch.Tensor],
325
+ dv: Optional[torch.Tensor],
326
+ dropout_p: float,
327
+ softmax_scale: float,
328
+ causal: bool,
329
+ window_size_left: int,
330
+ window_size_right: int,
331
+ softcap: float,
332
+ alibi_slopes: Optional[torch.Tensor],
333
+ deterministic: bool,
334
+ rng_state: Optional[torch.Tensor] = None,
335
+ ) -> torch.Tensor:
336
+ dout, q, k, v, out = [maybe_contiguous(x) for x in (dout, q, k, v, out)]
337
+ if dq is None:
338
+ dq = torch.empty_like(q)
339
+ if dk is None:
340
+ dk = torch.empty_like(k)
341
+ if dv is None:
342
+ dv = torch.empty_like(v)
343
+ batch_size, seqlen_q, num_heads, _ = q.shape
344
+ softmax_d = torch.empty(
345
+ (batch_size, num_heads, round_multiple(seqlen_q, 128)),
346
+ device=q.device,
347
+ dtype=torch.float32,
348
+ )
349
+
350
+ return softmax_d
351
+
352
+
353
+ @torch.library.custom_op(
354
+ add_op_namespace_prefix("_flash_attn_varlen_backward"),
355
+ mutates_args=("dq", "dk", "dv"),
356
+ device_types=_get_device(),
357
+ )
358
+ def _flash_attn_varlen_backward(
359
+ dout: torch.Tensor,
360
+ q: torch.Tensor,
361
+ k: torch.Tensor,
362
+ v: torch.Tensor,
363
+ out: torch.Tensor,
364
+ softmax_lse: torch.Tensor,
365
+ dq: Optional[torch.Tensor],
366
+ dk: Optional[torch.Tensor],
367
+ dv: Optional[torch.Tensor],
368
+ cu_seqlens_q: torch.Tensor,
369
+ cu_seqlens_k: torch.Tensor,
370
+ max_seqlen_q: int,
371
+ max_seqlen_k: int,
372
+ dropout_p: float,
373
+ softmax_scale: float,
374
+ causal: bool,
375
+ window_size_left: int,
376
+ window_size_right: int,
377
+ softcap: float,
378
+ alibi_slopes: Optional[torch.Tensor],
379
+ deterministic: bool,
380
+ rng_state: Optional[torch.Tensor] = None,
381
+ zero_tensors: bool = False,
382
+ ) -> torch.Tensor:
383
+ # dq, dk, dv are allocated by us so they should already be contiguous
384
+ dout, q, k, v, out = [maybe_contiguous(x) for x in (dout, q, k, v, out)]
385
+ (
386
+ dq,
387
+ dk,
388
+ dv,
389
+ softmax_d,
390
+ ) = flash_attn.varlen_bwd(
391
+ dout,
392
+ q,
393
+ k,
394
+ v,
395
+ out,
396
+ softmax_lse,
397
+ dq,
398
+ dk,
399
+ dv,
400
+ cu_seqlens_q,
401
+ cu_seqlens_k,
402
+ alibi_slopes,
403
+ max_seqlen_q,
404
+ max_seqlen_k,
405
+ dropout_p,
406
+ softmax_scale,
407
+ zero_tensors,
408
+ causal,
409
+ window_size_left,
410
+ window_size_right,
411
+ softcap,
412
+ deterministic,
413
+ None,
414
+ rng_state,
415
+ )
416
+ # if dk.isnan().any() or dk.isnan().any() or dv.isnan().any() or softmax_d.isnan().any():
417
+ # breakpoint()
418
+ return softmax_d
419
+
420
+
421
+ @torch.library.register_fake(add_op_namespace_prefix("_flash_attn_varlen_backward"))
422
+ def _flash_attn_varlen_backward_fake(
423
+ dout: torch.Tensor,
424
+ q: torch.Tensor,
425
+ k: torch.Tensor,
426
+ v: torch.Tensor,
427
+ out: torch.Tensor,
428
+ softmax_lse: torch.Tensor,
429
+ dq: Optional[torch.Tensor],
430
+ dk: Optional[torch.Tensor],
431
+ dv: Optional[torch.Tensor],
432
+ cu_seqlens_q: torch.Tensor,
433
+ cu_seqlens_k: torch.Tensor,
434
+ max_seqlen_q: int,
435
+ max_seqlen_k: int,
436
+ dropout_p: float,
437
+ softmax_scale: float,
438
+ causal: bool,
439
+ window_size_left: int,
440
+ window_size_right: int,
441
+ softcap: float,
442
+ alibi_slopes: Optional[torch.Tensor],
443
+ deterministic: bool,
444
+ rng_state: Optional[torch.Tensor] = None,
445
+ zero_tensors: bool = False,
446
+ ) -> torch.Tensor:
447
+ dout, q, k, v, out = [maybe_contiguous(x) for x in (dout, q, k, v, out)]
448
+ batch_size = cu_seqlens_q.numel() - 1
449
+ total_q, num_heads, _ = q.shape
450
+
451
+ if dq is None:
452
+ dq = torch.empty_like(q)
453
+ if dk is None:
454
+ dk = torch.empty_like(k)
455
+ if dv is None:
456
+ dv = torch.empty_like(v)
457
+ softmax_d = torch.empty(
458
+ (num_heads, total_q + 128 * batch_size), device=q.device, dtype=torch.float32
459
+ )
460
+
461
+ return softmax_d
462
+
463
+
464
+ class FlashAttnQKVPackedFunc(torch.autograd.Function):
465
+ @staticmethod
466
+ def forward(
467
+ ctx,
468
+ qkv,
469
+ dropout_p,
470
+ softmax_scale,
471
+ causal,
472
+ window_size,
473
+ softcap,
474
+ alibi_slopes,
475
+ deterministic,
476
+ return_softmax,
477
+ is_grad_enabled,
478
+ ):
479
+ is_grad = is_grad_enabled and qkv.requires_grad
480
+ if softmax_scale is None:
481
+ softmax_scale = qkv.shape[-1] ** (-0.5)
482
+ q, k, v = qkv[:, :, 0].detach(), qkv[:, :, 1].detach(), qkv[:, :, 2].detach()
483
+ head_size_og = q.size(3)
484
+ if head_size_og % 8 != 0:
485
+ q = torch.nn.functional.pad(q, [0, 8 - head_size_og % 8])
486
+ k = torch.nn.functional.pad(k, [0, 8 - head_size_og % 8])
487
+ v = torch.nn.functional.pad(v, [0, 8 - head_size_og % 8])
488
+ out_padded, softmax_lse, S_dmask, rng_state = _flash_attn_forward(
489
+ q,
490
+ k,
491
+ v,
492
+ dropout_p,
493
+ softmax_scale,
494
+ causal=causal,
495
+ window_size_left=window_size[0],
496
+ window_size_right=window_size[1],
497
+ softcap=softcap,
498
+ alibi_slopes=alibi_slopes,
499
+ return_softmax=return_softmax and dropout_p > 0,
500
+ )
501
+ if is_grad:
502
+ ctx.save_for_backward(q, k, v, out_padded, softmax_lse, rng_state)
503
+ ctx.dropout_p = dropout_p
504
+ ctx.softmax_scale = softmax_scale
505
+ ctx.causal = causal
506
+ ctx.window_size = window_size
507
+ ctx.softcap = softcap
508
+ ctx.alibi_slopes = alibi_slopes
509
+ ctx.deterministic = deterministic
510
+ out = out_padded[..., :head_size_og]
511
+ return out if not return_softmax else (out, softmax_lse, S_dmask)
512
+
513
+ @staticmethod
514
+ def backward(ctx, dout, *args):
515
+ q, k, v, out, softmax_lse, rng_state = ctx.saved_tensors
516
+ qkv_shape = q.shape[:-2] + (3, *q.shape[-2:])
517
+ dqkv = torch.empty(qkv_shape, dtype=q.dtype, device=q.device)
518
+ head_size_og = dout.size(3)
519
+ dout_padded = dout
520
+ if head_size_og % 8 != 0:
521
+ dout_padded = torch.nn.functional.pad(dout, [0, 8 - head_size_og % 8])
522
+ _flash_attn_backward(
523
+ dout_padded,
524
+ q,
525
+ k,
526
+ v,
527
+ out,
528
+ softmax_lse,
529
+ dqkv[:, :, 0],
530
+ dqkv[:, :, 1],
531
+ dqkv[:, :, 2],
532
+ ctx.dropout_p,
533
+ ctx.softmax_scale,
534
+ ctx.causal,
535
+ ctx.window_size[0],
536
+ ctx.window_size[1],
537
+ ctx.softcap,
538
+ ctx.alibi_slopes,
539
+ ctx.deterministic,
540
+ rng_state=rng_state,
541
+ )
542
+ dqkv = dqkv[..., : dout.shape[-1]] # We could have padded the head dimension
543
+ return dqkv, None, None, None, None, None, None, None, None, None
544
+
545
+
546
+ class FlashAttnVarlenQKVPackedFunc(torch.autograd.Function):
547
+ @staticmethod
548
+ def forward(
549
+ ctx,
550
+ qkv,
551
+ cu_seqlens,
552
+ max_seqlen,
553
+ dropout_p,
554
+ softmax_scale,
555
+ causal,
556
+ window_size,
557
+ softcap,
558
+ alibi_slopes,
559
+ deterministic,
560
+ return_softmax,
561
+ is_grad_enabled,
562
+ ):
563
+ is_grad = is_grad_enabled and qkv.requires_grad
564
+ if softmax_scale is None:
565
+ softmax_scale = qkv.shape[-1] ** (-0.5)
566
+ q, k, v = qkv[:, 0].detach(), qkv[:, 1].detach(), qkv[:, 2].detach()
567
+ head_size_og = q.size(2)
568
+ if head_size_og % 8 != 0:
569
+ q = torch.nn.functional.pad(q, [0, 8 - head_size_og % 8])
570
+ k = torch.nn.functional.pad(k, [0, 8 - head_size_og % 8])
571
+ v = torch.nn.functional.pad(v, [0, 8 - head_size_og % 8])
572
+ out_padded, softmax_lse, S_dmask, rng_state = _flash_attn_varlen_forward(
573
+ q,
574
+ k,
575
+ v,
576
+ cu_seqlens,
577
+ cu_seqlens,
578
+ max_seqlen,
579
+ max_seqlen,
580
+ dropout_p,
581
+ softmax_scale,
582
+ causal=causal,
583
+ window_size_left=window_size[0],
584
+ window_size_right=window_size[1],
585
+ softcap=softcap,
586
+ alibi_slopes=alibi_slopes,
587
+ return_softmax=return_softmax and dropout_p > 0,
588
+ block_table=None,
589
+ )
590
+ if is_grad:
591
+ ctx.save_for_backward(
592
+ q, k, v, out_padded, softmax_lse, cu_seqlens, rng_state
593
+ )
594
+ ctx.dropout_p = dropout_p
595
+ ctx.max_seqlen = max_seqlen
596
+ ctx.softmax_scale = softmax_scale
597
+ ctx.causal = causal
598
+ ctx.window_size = window_size
599
+ ctx.softcap = softcap
600
+ ctx.alibi_slopes = alibi_slopes
601
+ ctx.deterministic = deterministic
602
+ out = out_padded[..., :head_size_og]
603
+ return out if not return_softmax else (out, softmax_lse, S_dmask)
604
+
605
+ @staticmethod
606
+ def backward(ctx, dout, *args):
607
+ q, k, v, out, softmax_lse, cu_seqlens, rng_state = ctx.saved_tensors
608
+ qkv_shape = q.shape[:-2] + (3, *q.shape[-2:])
609
+ dqkv = torch.empty(qkv_shape, dtype=q.dtype, device=q.device)
610
+ head_size_og = dout.size(2)
611
+ dout_padded = dout
612
+ if head_size_og % 8 != 0:
613
+ dout_padded = torch.nn.functional.pad(dout, [0, 8 - head_size_og % 8])
614
+ _flash_attn_varlen_backward(
615
+ dout_padded,
616
+ q,
617
+ k,
618
+ v,
619
+ out,
620
+ softmax_lse,
621
+ dqkv[:, 0],
622
+ dqkv[:, 1],
623
+ dqkv[:, 2],
624
+ cu_seqlens,
625
+ cu_seqlens,
626
+ ctx.max_seqlen,
627
+ ctx.max_seqlen,
628
+ ctx.dropout_p,
629
+ ctx.softmax_scale,
630
+ ctx.causal,
631
+ ctx.window_size[0],
632
+ ctx.window_size[1],
633
+ ctx.softcap,
634
+ ctx.alibi_slopes,
635
+ ctx.deterministic,
636
+ rng_state=rng_state,
637
+ )
638
+ dqkv = dqkv[..., : dout.shape[-1]] # We could have padded the head dimension
639
+ return dqkv, None, None, None, None, None, None, None, None, None, None, None
640
+
641
+
642
+ class FlashAttnKVPackedFunc(torch.autograd.Function):
643
+ @staticmethod
644
+ def forward(
645
+ ctx,
646
+ q,
647
+ kv,
648
+ dropout_p,
649
+ softmax_scale,
650
+ causal,
651
+ window_size,
652
+ softcap,
653
+ alibi_slopes,
654
+ deterministic,
655
+ return_softmax,
656
+ is_grad_enabled,
657
+ ):
658
+ is_grad = is_grad_enabled and any(x.requires_grad for x in [q, kv])
659
+ if softmax_scale is None:
660
+ softmax_scale = q.shape[-1] ** (-0.5)
661
+ k, v = kv[:, :, 0].detach(), kv[:, :, 1].detach()
662
+ head_size_og = q.size(3)
663
+ if head_size_og % 8 != 0:
664
+ q = torch.nn.functional.pad(q, [0, 8 - head_size_og % 8])
665
+ k = torch.nn.functional.pad(k, [0, 8 - head_size_og % 8])
666
+ v = torch.nn.functional.pad(v, [0, 8 - head_size_og % 8])
667
+ out_padded, softmax_lse, S_dmask, rng_state = _flash_attn_forward(
668
+ q,
669
+ k,
670
+ v,
671
+ dropout_p,
672
+ softmax_scale,
673
+ causal=causal,
674
+ window_size_left=window_size[0],
675
+ window_size_right=window_size[1],
676
+ softcap=softcap,
677
+ alibi_slopes=alibi_slopes,
678
+ return_softmax=return_softmax and dropout_p > 0,
679
+ )
680
+ if is_grad:
681
+ ctx.save_for_backward(q, k, v, out_padded, softmax_lse, rng_state)
682
+ ctx.dropout_p = dropout_p
683
+ ctx.softmax_scale = softmax_scale
684
+ ctx.causal = causal
685
+ ctx.window_size = window_size
686
+ ctx.softcap = softcap
687
+ ctx.alibi_slopes = alibi_slopes
688
+ ctx.deterministic = deterministic
689
+ out = out_padded[..., :head_size_og]
690
+ return out if not return_softmax else (out, softmax_lse, S_dmask)
691
+
692
+ @staticmethod
693
+ def backward(ctx, dout, *args):
694
+ q, k, v, out, softmax_lse, rng_state = ctx.saved_tensors
695
+ dq = torch.empty_like(q)
696
+ kv_shape = k.shape[:-2] + (2, *k.shape[-2:])
697
+ dkv = torch.empty(kv_shape, dtype=k.dtype, device=k.device)
698
+ head_size_og = dout.size(3)
699
+ dout_padded = dout
700
+ if head_size_og % 8 != 0:
701
+ dout_padded = torch.nn.functional.pad(dout, [0, 8 - head_size_og % 8])
702
+ _flash_attn_backward(
703
+ dout_padded,
704
+ q,
705
+ k,
706
+ v,
707
+ out,
708
+ softmax_lse,
709
+ dq,
710
+ dkv[:, :, 0],
711
+ dkv[:, :, 1],
712
+ ctx.dropout_p,
713
+ ctx.softmax_scale,
714
+ ctx.causal,
715
+ ctx.window_size[0],
716
+ ctx.window_size[1],
717
+ ctx.softcap,
718
+ ctx.alibi_slopes,
719
+ ctx.deterministic,
720
+ rng_state=rng_state,
721
+ )
722
+ dq = dq[..., : dout.shape[-1]] # We could have padded the head dimension
723
+ dkv = dkv[..., : dout.shape[-1]]
724
+ return dq, dkv, None, None, None, None, None, None, None, None, None
725
+
726
+
727
+ class FlashAttnVarlenKVPackedFunc(torch.autograd.Function):
728
+ @staticmethod
729
+ def forward(
730
+ ctx,
731
+ q,
732
+ kv,
733
+ cu_seqlens_q,
734
+ cu_seqlens_k,
735
+ max_seqlen_q,
736
+ max_seqlen_k,
737
+ dropout_p,
738
+ softmax_scale,
739
+ causal,
740
+ window_size,
741
+ softcap,
742
+ alibi_slopes,
743
+ deterministic,
744
+ return_softmax,
745
+ is_grad_enabled,
746
+ ):
747
+ is_grad = is_grad_enabled and any(x.requires_grad for x in [q, kv])
748
+ if softmax_scale is None:
749
+ softmax_scale = q.shape[-1] ** (-0.5)
750
+ k, v = kv[:, 0].detach(), kv[:, 1].detach()
751
+ head_size_og = q.size(2)
752
+ if head_size_og % 8 != 0:
753
+ q = torch.nn.functional.pad(q, [0, 8 - head_size_og % 8])
754
+ k = torch.nn.functional.pad(k, [0, 8 - head_size_og % 8])
755
+ v = torch.nn.functional.pad(v, [0, 8 - head_size_og % 8])
756
+ out_padded, softmax_lse, S_dmask, rng_state = _flash_attn_varlen_forward(
757
+ q,
758
+ k,
759
+ v,
760
+ cu_seqlens_q,
761
+ cu_seqlens_k,
762
+ max_seqlen_q,
763
+ max_seqlen_k,
764
+ dropout_p,
765
+ softmax_scale,
766
+ causal=causal,
767
+ window_size_left=window_size[0],
768
+ window_size_right=window_size[1],
769
+ softcap=softcap,
770
+ alibi_slopes=alibi_slopes,
771
+ return_softmax=return_softmax and dropout_p > 0,
772
+ block_table=None,
773
+ )
774
+ if is_grad:
775
+ ctx.save_for_backward(
776
+ q, k, v, out_padded, softmax_lse, cu_seqlens_q, cu_seqlens_k, rng_state
777
+ )
778
+ ctx.dropout_p = dropout_p
779
+ ctx.max_seqlen_q = max_seqlen_q
780
+ ctx.max_seqlen_k = max_seqlen_k
781
+ ctx.softmax_scale = softmax_scale
782
+ ctx.causal = causal
783
+ ctx.window_size = window_size
784
+ ctx.softcap = softcap
785
+ ctx.alibi_slopes = alibi_slopes
786
+ ctx.deterministic = deterministic
787
+ out = out_padded[..., :head_size_og]
788
+ return out if not return_softmax else (out, softmax_lse, S_dmask)
789
+
790
+ @staticmethod
791
+ def backward(ctx, dout, *args):
792
+ q, k, v, out, softmax_lse, cu_seqlens_q, cu_seqlens_k, rng_state = (
793
+ ctx.saved_tensors
794
+ )
795
+ dq = torch.empty_like(q)
796
+ kv_shape = k.shape[:-2] + (2, *k.shape[-2:])
797
+ dkv = torch.empty(kv_shape, dtype=k.dtype, device=k.device)
798
+ head_size_og = dout.size(2)
799
+ dout_padded = dout
800
+ if head_size_og % 8 != 0:
801
+ dout_padded = torch.nn.functional.pad(dout, [0, 8 - head_size_og % 8])
802
+ _flash_attn_varlen_backward(
803
+ dout_padded,
804
+ q,
805
+ k,
806
+ v,
807
+ out,
808
+ softmax_lse,
809
+ dq,
810
+ dkv[:, 0],
811
+ dkv[:, 1],
812
+ cu_seqlens_q,
813
+ cu_seqlens_k,
814
+ ctx.max_seqlen_q,
815
+ ctx.max_seqlen_k,
816
+ ctx.dropout_p,
817
+ ctx.softmax_scale,
818
+ ctx.causal,
819
+ ctx.window_size[0],
820
+ ctx.window_size[1],
821
+ ctx.softcap,
822
+ ctx.alibi_slopes,
823
+ ctx.deterministic,
824
+ rng_state=rng_state,
825
+ )
826
+ dq = dq[..., : dout.shape[-1]] # We could have padded the head dimension
827
+ dkv = dkv[..., : dout.shape[-1]]
828
+ return (
829
+ dq,
830
+ dkv,
831
+ None,
832
+ None,
833
+ None,
834
+ None,
835
+ None,
836
+ None,
837
+ None,
838
+ None,
839
+ None,
840
+ None,
841
+ None,
842
+ None,
843
+ None,
844
+ )
845
+
846
+
847
+ class FlashAttnFunc(torch.autograd.Function):
848
+ @staticmethod
849
+ def forward(
850
+ ctx,
851
+ q,
852
+ k,
853
+ v,
854
+ dropout_p,
855
+ softmax_scale,
856
+ causal,
857
+ window_size,
858
+ softcap,
859
+ alibi_slopes,
860
+ deterministic,
861
+ return_softmax,
862
+ is_grad_enabled,
863
+ ):
864
+ is_grad = is_grad_enabled and any(x.requires_grad for x in [q, k, v])
865
+ if softmax_scale is None:
866
+ softmax_scale = q.shape[-1] ** (-0.5)
867
+ head_size_og = q.size(3)
868
+ if head_size_og % 8 != 0:
869
+ q = torch.nn.functional.pad(q, [0, 8 - head_size_og % 8])
870
+ k = torch.nn.functional.pad(k, [0, 8 - head_size_og % 8])
871
+ v = torch.nn.functional.pad(v, [0, 8 - head_size_og % 8])
872
+ out_padded, softmax_lse, S_dmask, rng_state = _flash_attn_forward(
873
+ q,
874
+ k,
875
+ v,
876
+ dropout_p,
877
+ softmax_scale,
878
+ causal=causal,
879
+ window_size_left=window_size[0],
880
+ window_size_right=window_size[1],
881
+ softcap=softcap,
882
+ alibi_slopes=alibi_slopes,
883
+ return_softmax=return_softmax and dropout_p > 0,
884
+ )
885
+ if is_grad:
886
+ ctx.save_for_backward(q, k, v, out_padded, softmax_lse, rng_state)
887
+ ctx.dropout_p = dropout_p
888
+ ctx.softmax_scale = softmax_scale
889
+ ctx.causal = causal
890
+ ctx.window_size = window_size
891
+ ctx.softcap = softcap
892
+ ctx.alibi_slopes = alibi_slopes
893
+ ctx.deterministic = deterministic
894
+ out = out_padded[..., :head_size_og]
895
+ return out if not return_softmax else (out, softmax_lse, S_dmask)
896
+
897
+ @staticmethod
898
+ def backward(ctx, dout, *args):
899
+ q, k, v, out, softmax_lse, rng_state = ctx.saved_tensors
900
+ dq, dk, dv = torch.empty_like(q), torch.empty_like(k), torch.empty_like(v)
901
+ head_size_og = dout.size(3)
902
+ dout_padded = dout
903
+ if head_size_og % 8 != 0:
904
+ dout_padded = torch.nn.functional.pad(dout, [0, 8 - head_size_og % 8])
905
+ _flash_attn_backward(
906
+ dout_padded,
907
+ q,
908
+ k,
909
+ v,
910
+ out,
911
+ softmax_lse,
912
+ dq,
913
+ dk,
914
+ dv,
915
+ ctx.dropout_p,
916
+ ctx.softmax_scale,
917
+ ctx.causal,
918
+ ctx.window_size[0],
919
+ ctx.window_size[1],
920
+ ctx.softcap,
921
+ ctx.alibi_slopes,
922
+ ctx.deterministic,
923
+ rng_state=rng_state,
924
+ )
925
+ dq = dq[..., : dout.shape[-1]] # We could have padded the head dimension
926
+ dk = dk[..., : dout.shape[-1]]
927
+ dv = dv[..., : dout.shape[-1]]
928
+ return dq, dk, dv, None, None, None, None, None, None, None, None, None
929
+
930
+
931
+ class FlashAttnVarlenFunc(torch.autograd.Function):
932
+ @staticmethod
933
+ def forward(
934
+ ctx,
935
+ q,
936
+ k,
937
+ v,
938
+ cu_seqlens_q,
939
+ cu_seqlens_k,
940
+ max_seqlen_q,
941
+ max_seqlen_k,
942
+ dropout_p,
943
+ softmax_scale,
944
+ causal,
945
+ window_size,
946
+ softcap,
947
+ alibi_slopes,
948
+ deterministic,
949
+ return_softmax,
950
+ block_table,
951
+ is_grad_enabled,
952
+ ):
953
+ is_grad = is_grad_enabled and any(x.requires_grad for x in [q, k, v])
954
+ if softmax_scale is None:
955
+ softmax_scale = q.shape[-1] ** (-0.5)
956
+ head_size_og = q.size(2)
957
+ if head_size_og % 8 != 0:
958
+ q = torch.nn.functional.pad(q, [0, 8 - head_size_og % 8])
959
+ k = torch.nn.functional.pad(k, [0, 8 - head_size_og % 8])
960
+ v = torch.nn.functional.pad(v, [0, 8 - head_size_og % 8])
961
+ out_padded, softmax_lse, S_dmask, rng_state = _flash_attn_varlen_forward(
962
+ q,
963
+ k,
964
+ v,
965
+ cu_seqlens_q,
966
+ cu_seqlens_k,
967
+ max_seqlen_q,
968
+ max_seqlen_k,
969
+ dropout_p,
970
+ softmax_scale,
971
+ causal=causal,
972
+ window_size_left=window_size[0],
973
+ window_size_right=window_size[1],
974
+ softcap=softcap,
975
+ alibi_slopes=alibi_slopes,
976
+ return_softmax=return_softmax and dropout_p > 0,
977
+ block_table=block_table,
978
+ )
979
+ if is_grad:
980
+ ctx.save_for_backward(
981
+ q, k, v, out_padded, softmax_lse, cu_seqlens_q, cu_seqlens_k, rng_state
982
+ )
983
+ ctx.dropout_p = dropout_p
984
+ ctx.max_seqlen_q = max_seqlen_q
985
+ ctx.max_seqlen_k = max_seqlen_k
986
+ ctx.softmax_scale = softmax_scale
987
+ ctx.causal = causal
988
+ ctx.window_size = window_size
989
+ ctx.softcap = softcap
990
+ ctx.alibi_slopes = alibi_slopes
991
+ ctx.deterministic = deterministic
992
+
993
+ out = out_padded[..., :head_size_og]
994
+ return out if not return_softmax else (out, softmax_lse, S_dmask)
995
+
996
+ @staticmethod
997
+ def backward(ctx, dout, *args):
998
+ q, k, v, out, softmax_lse, cu_seqlens_q, cu_seqlens_k, rng_state = (
999
+ ctx.saved_tensors
1000
+ )
1001
+ dq, dk, dv = torch.empty_like(q), torch.empty_like(k), torch.empty_like(v)
1002
+ head_size_og = dout.size(2)
1003
+ dout_padded = dout
1004
+ if head_size_og % 8 != 0:
1005
+ dout_padded = torch.nn.functional.pad(dout, [0, 8 - head_size_og % 8])
1006
+ _flash_attn_varlen_backward(
1007
+ dout_padded,
1008
+ q,
1009
+ k,
1010
+ v,
1011
+ out,
1012
+ softmax_lse,
1013
+ dq,
1014
+ dk,
1015
+ dv,
1016
+ cu_seqlens_q,
1017
+ cu_seqlens_k,
1018
+ ctx.max_seqlen_q,
1019
+ ctx.max_seqlen_k,
1020
+ ctx.dropout_p,
1021
+ ctx.softmax_scale,
1022
+ ctx.causal,
1023
+ ctx.window_size[0],
1024
+ ctx.window_size[1],
1025
+ ctx.softcap,
1026
+ ctx.alibi_slopes,
1027
+ ctx.deterministic,
1028
+ rng_state=rng_state,
1029
+ )
1030
+ dq = dq[..., : dout.shape[-1]] # We could have padded the head dimension
1031
+ dk = dk[..., : dout.shape[-1]]
1032
+ dv = dv[..., : dout.shape[-1]]
1033
+ return (
1034
+ dq,
1035
+ dk,
1036
+ dv,
1037
+ None,
1038
+ None,
1039
+ None,
1040
+ None,
1041
+ None,
1042
+ None,
1043
+ None,
1044
+ None,
1045
+ None,
1046
+ None,
1047
+ None,
1048
+ None,
1049
+ None,
1050
+ None,
1051
+ )
1052
+
1053
+
1054
+ def flash_attn_qkvpacked_func(
1055
+ qkv,
1056
+ dropout_p=0.0,
1057
+ softmax_scale=None,
1058
+ causal=False,
1059
+ window_size=(-1, -1), # -1 means infinite context window
1060
+ softcap=0.0, # <=0.0 means deactivate
1061
+ alibi_slopes=None,
1062
+ deterministic=False,
1063
+ return_attn_probs=False,
1064
+ ):
1065
+ """dropout_p should be set to 0.0 during evaluation
1066
+ If Q, K, V are already stacked into 1 tensor, this function will be faster than
1067
+ calling flash_attn_func on Q, K, V since the backward pass avoids explicit concatenation
1068
+ of the gradients of Q, K, V.
1069
+ For multi-query and grouped-query attention (MQA/GQA), please see
1070
+ flash_attn_kvpacked_func and flash_attn_func.
1071
+
1072
+ If window_size != (-1, -1), implements sliding window local attention. Query at position i
1073
+ will only attend to keys between [i - window_size[0], i + window_size[1]] inclusive.
1074
+
1075
+ Arguments:
1076
+ qkv: (batch_size, seqlen, 3, nheads, headdim)
1077
+ dropout_p: float. Dropout probability.
1078
+ softmax_scale: float. The scaling of QK^T before applying softmax.
1079
+ Default to 1 / sqrt(headdim).
1080
+ causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
1081
+ window_size: (left, right). If not (-1, -1), implements sliding window local attention.
1082
+ softcap: float. Anything > 0 activates softcapping attention.
1083
+ alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of (-alibi_slope * |i - j|) is added to
1084
+ the attention score of query i and key j.
1085
+ deterministic: bool. Whether to use the deterministic implementation of the backward pass,
1086
+ which is slightly slower and uses more memory. The forward pass is always deterministic.
1087
+ return_attn_probs: bool. Whether to return the attention probabilities. This option is for
1088
+ testing only. The returned probabilities are not guaranteed to be correct
1089
+ (they might not have the right scaling).
1090
+ Return:
1091
+ out: (batch_size, seqlen, nheads, headdim).
1092
+ softmax_lse [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen). The
1093
+ logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
1094
+ normalization factor).
1095
+ S_dmask [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen, seqlen).
1096
+ The output of softmax (possibly with different scaling). It also encodes the dropout
1097
+ pattern (negative means that location was dropped, nonnegative means it was kept).
1098
+ """
1099
+ return FlashAttnQKVPackedFunc.apply(
1100
+ qkv,
1101
+ dropout_p,
1102
+ softmax_scale,
1103
+ causal,
1104
+ window_size,
1105
+ softcap,
1106
+ alibi_slopes,
1107
+ deterministic,
1108
+ return_attn_probs,
1109
+ torch.is_grad_enabled(),
1110
+ )
1111
+
1112
+
1113
+ def flash_attn_kvpacked_func(
1114
+ q,
1115
+ kv,
1116
+ dropout_p=0.0,
1117
+ softmax_scale=None,
1118
+ causal=False,
1119
+ window_size=(-1, -1), # -1 means infinite context window
1120
+ softcap=0.0, # 0.0 means deactivated
1121
+ alibi_slopes=None,
1122
+ deterministic=False,
1123
+ return_attn_probs=False,
1124
+ ):
1125
+ """dropout_p should be set to 0.0 during evaluation
1126
+ If K, V are already stacked into 1 tensor, this function will be faster than
1127
+ calling flash_attn_func on Q, K, V since the backward pass avoids explicit concatenation
1128
+ of the gradients of K, V.
1129
+ Supports multi-query and grouped-query attention (MQA/GQA) by passing in KV with fewer heads
1130
+ than Q. Note that the number of heads in Q must be divisible by the number of heads in KV.
1131
+ For example, if Q has 6 heads and K, V have 2 heads, head 0, 1, 2 of Q will attention to head
1132
+ 0 of K, V, and head 3, 4, 5 of Q will attention to head 1 of K, V.
1133
+
1134
+ If causal=True, the causal mask is aligned to the bottom right corner of the attention matrix.
1135
+ For example, if seqlen_q = 2 and seqlen_k = 5, the causal mask (1 = keep, 0 = masked out) is:
1136
+ 1 1 1 1 0
1137
+ 1 1 1 1 1
1138
+ If seqlen_q = 5 and seqlen_k = 2, the causal mask is:
1139
+ 0 0
1140
+ 0 0
1141
+ 0 0
1142
+ 1 0
1143
+ 1 1
1144
+ If the row of the mask is all zero, the output will be zero.
1145
+
1146
+ If window_size != (-1, -1), implements sliding window local attention. Query at position i
1147
+ will only attend to keys between
1148
+ [i + seqlen_k - seqlen_q - window_size[0], i + seqlen_k - seqlen_q + window_size[1]] inclusive.
1149
+
1150
+ Arguments:
1151
+ q: (batch_size, seqlen, nheads, headdim)
1152
+ kv: (batch_size, seqlen, 2, nheads_k, headdim)
1153
+ dropout_p: float. Dropout probability.
1154
+ softmax_scale: float. The scaling of QK^T before applying softmax.
1155
+ Default to 1 / sqrt(headdim).
1156
+ causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
1157
+ window_size: (left, right). If not (-1, -1), implements sliding window local attention.
1158
+ softcap: float. Anything > 0 activates softcapping attention.
1159
+ alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of
1160
+ (-alibi_slope * |i + seqlen_k - seqlen_q - j|)
1161
+ is added to the attention score of query i and key j.
1162
+ deterministic: bool. Whether to use the deterministic implementation of the backward pass,
1163
+ which is slightly slower and uses more memory. The forward pass is always deterministic.
1164
+ return_attn_probs: bool. Whether to return the attention probabilities. This option is for
1165
+ testing only. The returned probabilities are not guaranteed to be correct
1166
+ (they might not have the right scaling).
1167
+ Return:
1168
+ out: (batch_size, seqlen, nheads, headdim).
1169
+ softmax_lse [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen). The
1170
+ logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
1171
+ normalization factor).
1172
+ S_dmask [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen, seqlen).
1173
+ The output of softmax (possibly with different scaling). It also encodes the dropout
1174
+ pattern (negative means that location was dropped, nonnegative means it was kept).
1175
+ """
1176
+ return FlashAttnKVPackedFunc.apply(
1177
+ q,
1178
+ kv,
1179
+ dropout_p,
1180
+ softmax_scale,
1181
+ causal,
1182
+ window_size,
1183
+ softcap,
1184
+ alibi_slopes,
1185
+ deterministic,
1186
+ return_attn_probs,
1187
+ torch.is_grad_enabled(),
1188
+ )
1189
+
1190
+
1191
+ def flash_attn_func(
1192
+ q,
1193
+ k,
1194
+ v,
1195
+ dropout_p=0.0,
1196
+ softmax_scale=None,
1197
+ causal=False,
1198
+ window_size=(-1, -1), # -1 means infinite context window
1199
+ softcap=0.0, # 0.0 means deactivated
1200
+ alibi_slopes=None,
1201
+ deterministic=False,
1202
+ return_attn_probs=False,
1203
+ ):
1204
+ """dropout_p should be set to 0.0 during evaluation
1205
+ Supports multi-query and grouped-query attention (MQA/GQA) by passing in KV with fewer heads
1206
+ than Q. Note that the number of heads in Q must be divisible by the number of heads in KV.
1207
+ For example, if Q has 6 heads and K, V have 2 heads, head 0, 1, 2 of Q will attention to head
1208
+ 0 of K, V, and head 3, 4, 5 of Q will attention to head 1 of K, V.
1209
+
1210
+ If causal=True, the causal mask is aligned to the bottom right corner of the attention matrix.
1211
+ For example, if seqlen_q = 2 and seqlen_k = 5, the causal mask (1 = keep, 0 = masked out) is:
1212
+ 1 1 1 1 0
1213
+ 1 1 1 1 1
1214
+ If seqlen_q = 5 and seqlen_k = 2, the causal mask is:
1215
+ 0 0
1216
+ 0 0
1217
+ 0 0
1218
+ 1 0
1219
+ 1 1
1220
+ If the row of the mask is all zero, the output will be zero.
1221
+
1222
+ If window_size != (-1, -1), implements sliding window local attention. Query at position i
1223
+ will only attend to keys between
1224
+ [i + seqlen_k - seqlen_q - window_size[0], i + seqlen_k - seqlen_q + window_size[1]] inclusive.
1225
+
1226
+ Arguments:
1227
+ q: (batch_size, seqlen, nheads, headdim)
1228
+ k: (batch_size, seqlen, nheads_k, headdim)
1229
+ v: (batch_size, seqlen, nheads_k, headdim)
1230
+ dropout_p: float. Dropout probability.
1231
+ softmax_scale: float. The scaling of QK^T before applying softmax.
1232
+ Default to 1 / sqrt(headdim).
1233
+ causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
1234
+ window_size: (left, right). If not (-1, -1), implements sliding window local attention.
1235
+ alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of
1236
+ (-alibi_slope * |i + seqlen_k - seqlen_q - j|)
1237
+ is added to the attention score of query i and key j.
1238
+ deterministic: bool. Whether to use the deterministic implementation of the backward pass,
1239
+ which is slightly slower and uses more memory. The forward pass is always deterministic.
1240
+ return_attn_probs: bool. Whether to return the attention probabilities. This option is for
1241
+ testing only. The returned probabilities are not guaranteed to be correct
1242
+ (they might not have the right scaling).
1243
+ Return:
1244
+ out: (batch_size, seqlen, nheads, headdim).
1245
+ softmax_lse [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen). The
1246
+ logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
1247
+ normalization factor).
1248
+ S_dmask [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen, seqlen).
1249
+ The output of softmax (possibly with different scaling). It also encodes the dropout
1250
+ pattern (negative means that location was dropped, nonnegative means it was kept).
1251
+ """
1252
+ return FlashAttnFunc.apply(
1253
+ q,
1254
+ k,
1255
+ v,
1256
+ dropout_p,
1257
+ softmax_scale,
1258
+ causal,
1259
+ window_size,
1260
+ softcap,
1261
+ alibi_slopes,
1262
+ deterministic,
1263
+ return_attn_probs,
1264
+ torch.is_grad_enabled(),
1265
+ )
1266
+
1267
+
1268
+ def flash_attn_varlen_qkvpacked_func(
1269
+ qkv,
1270
+ cu_seqlens,
1271
+ max_seqlen,
1272
+ dropout_p=0.0,
1273
+ softmax_scale=None,
1274
+ causal=False,
1275
+ window_size=(-1, -1), # -1 means infinite context window
1276
+ softcap=0.0, # 0.0 means deactivated
1277
+ alibi_slopes=None,
1278
+ deterministic=False,
1279
+ return_attn_probs=False,
1280
+ ):
1281
+ """dropout_p should be set to 0.0 during evaluation
1282
+ If Q, K, V are already stacked into 1 tensor, this function will be faster than
1283
+ calling flash_attn_varlen_func on Q, K, V since the backward pass avoids explicit concatenation
1284
+ of the gradients of Q, K, V.
1285
+ For multi-query and grouped-query attention (MQA/GQA), please see
1286
+ flash_attn_varlen_kvpacked_func and flash_attn_varlen_func.
1287
+
1288
+ If window_size != (-1, -1), implements sliding window local attention. Query at position i
1289
+ will only attend to keys between [i - window_size[0], i + window_size[1]] inclusive.
1290
+
1291
+ Arguments:
1292
+ qkv: (total, 3, nheads, headdim), where total = total number of tokens in the batch.
1293
+ cu_seqlens: (batch_size + 1,), dtype torch.int32. The cumulative sequence lengths
1294
+ of the sequences in the batch, used to index into qkv.
1295
+ max_seqlen: int. Maximum sequence length in the batch.
1296
+ dropout_p: float. Dropout probability.
1297
+ softmax_scale: float. The scaling of QK^T before applying softmax.
1298
+ Default to 1 / sqrt(headdim).
1299
+ causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
1300
+ window_size: (left, right). If not (-1, -1), implements sliding window local attention.
1301
+ softcap: float. Anything > 0 activates softcapping attention.
1302
+ alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of (-alibi_slope * |i - j|)
1303
+ is added to the attention score of query i and key j.
1304
+ deterministic: bool. Whether to use the deterministic implementation of the backward pass,
1305
+ which is slightly slower and uses more memory. The forward pass is always deterministic.
1306
+ return_attn_probs: bool. Whether to return the attention probabilities. This option is for
1307
+ testing only. The returned probabilities are not guaranteed to be correct
1308
+ (they might not have the right scaling).
1309
+ Return:
1310
+ out: (total, nheads, headdim).
1311
+ softmax_lse [optional, if return_attn_probs=True]: (nheads, total_q_seqlen). The
1312
+ logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
1313
+ normalization factor).
1314
+ S_dmask [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen, seqlen).
1315
+ The output of softmax (possibly with different scaling). It also encodes the dropout
1316
+ pattern (negative means that location was dropped, nonnegative means it was kept).
1317
+ """
1318
+ return FlashAttnVarlenQKVPackedFunc.apply(
1319
+ qkv,
1320
+ cu_seqlens,
1321
+ max_seqlen,
1322
+ dropout_p,
1323
+ softmax_scale,
1324
+ causal,
1325
+ window_size,
1326
+ softcap,
1327
+ alibi_slopes,
1328
+ deterministic,
1329
+ return_attn_probs,
1330
+ torch.is_grad_enabled(),
1331
+ )
1332
+
1333
+
1334
+ def flash_attn_varlen_kvpacked_func(
1335
+ q,
1336
+ kv,
1337
+ cu_seqlens_q,
1338
+ cu_seqlens_k,
1339
+ max_seqlen_q,
1340
+ max_seqlen_k,
1341
+ dropout_p=0.0,
1342
+ softmax_scale=None,
1343
+ causal=False,
1344
+ window_size=(-1, -1), # -1 means infinite context window
1345
+ softcap=0.0, # 0.0 means deactivated
1346
+ alibi_slopes=None,
1347
+ deterministic=False,
1348
+ return_attn_probs=False,
1349
+ ):
1350
+ """dropout_p should be set to 0.0 during evaluation
1351
+ If K, V are already stacked into 1 tensor, this function will be faster than
1352
+ calling flash_attn_func on Q, K, V since the backward pass avoids explicit concatenation
1353
+ of the gradients of K, V.
1354
+ Supports multi-query and grouped-query attention (MQA/GQA) by passing in KV with fewer heads
1355
+ than Q. Note that the number of heads in Q must be divisible by the number of heads in KV.
1356
+ For example, if Q has 6 heads and K, V have 2 heads, head 0, 1, 2 of Q will attention to head
1357
+ 0 of K, V, and head 3, 4, 5 of Q will attention to head 1 of K, V.
1358
+
1359
+ If causal=True, the causal mask is aligned to the bottom right corner of the attention matrix.
1360
+ For example, if seqlen_q = 2 and seqlen_k = 5, the causal mask (1 = keep, 0 = masked out) is:
1361
+ 1 1 1 1 0
1362
+ 1 1 1 1 1
1363
+ If seqlen_q = 5 and seqlen_k = 2, the causal mask is:
1364
+ 0 0
1365
+ 0 0
1366
+ 0 0
1367
+ 1 0
1368
+ 1 1
1369
+ If the row of the mask is all zero, the output will be zero.
1370
+
1371
+ If window_size != (-1, -1), implements sliding window local attention. Query at position i
1372
+ will only attend to keys between
1373
+ [i + seqlen_k - seqlen_q - window_size[0], i + seqlen_k - seqlen_q + window_size[1]] inclusive.
1374
+
1375
+ Arguments:
1376
+ q: (total_q, nheads, headdim), where total_q = total number of query tokens in the batch.
1377
+ kv: (total_k, 2, nheads_k, headdim), where total_k = total number of key tokens in the batch.
1378
+ cu_seqlens_q: (batch_size + 1,), dtype torch.int32. The cumulative sequence lengths
1379
+ of the sequences in the batch, used to index into q.
1380
+ cu_seqlens_k: (batch_size + 1,), dtype torch.int32. The cumulative sequence lengths
1381
+ of the sequences in the batch, used to index into kv.
1382
+ max_seqlen_q: int. Maximum query sequence length in the batch.
1383
+ max_seqlen_k: int. Maximum key sequence length in the batch.
1384
+ dropout_p: float. Dropout probability.
1385
+ softmax_scale: float. The scaling of QK^T before applying softmax.
1386
+ Default to 1 / sqrt(headdim).
1387
+ causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
1388
+ window_size: (left, right). If not (-1, -1), implements sliding window local attention.
1389
+ softcap: float. Anything > 0 activates softcapping attention.
1390
+ alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of
1391
+ (-alibi_slope * |i + seqlen_k - seqlen_q - j|)
1392
+ is added to the attention score of query i and key j.
1393
+ deterministic: bool. Whether to use the deterministic implementation of the backward pass,
1394
+ which is slightly slower and uses more memory. The forward pass is always deterministic.
1395
+ return_attn_probs: bool. Whether to return the attention probabilities. This option is for
1396
+ testing only. The returned probabilities are not guaranteed to be correct
1397
+ (they might not have the right scaling).
1398
+ Return:
1399
+ out: (total, nheads, headdim).
1400
+ softmax_lse [optional, if return_attn_probs=True]: (nheads, total_q_seqlen). The
1401
+ logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
1402
+ normalization factor).
1403
+ S_dmask [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen, seqlen).
1404
+ The output of softmax (possibly with different scaling). It also encodes the dropout
1405
+ pattern (negative means that location was dropped, nonnegative means it was kept).
1406
+ """
1407
+ return FlashAttnVarlenKVPackedFunc.apply(
1408
+ q,
1409
+ kv,
1410
+ cu_seqlens_q,
1411
+ cu_seqlens_k,
1412
+ max_seqlen_q,
1413
+ max_seqlen_k,
1414
+ dropout_p,
1415
+ softmax_scale,
1416
+ causal,
1417
+ window_size,
1418
+ softcap,
1419
+ alibi_slopes,
1420
+ deterministic,
1421
+ return_attn_probs,
1422
+ torch.is_grad_enabled(),
1423
+ )
1424
+
1425
+
1426
+ def flash_attn_varlen_func(
1427
+ q,
1428
+ k,
1429
+ v,
1430
+ cu_seqlens_q,
1431
+ cu_seqlens_k,
1432
+ max_seqlen_q,
1433
+ max_seqlen_k,
1434
+ dropout_p=0.0,
1435
+ softmax_scale=None,
1436
+ causal=False,
1437
+ window_size=(-1, -1), # -1 means infinite context window
1438
+ softcap=0.0, # 0.0 means deactivated
1439
+ alibi_slopes=None,
1440
+ deterministic=False,
1441
+ return_attn_probs=False,
1442
+ block_table=None,
1443
+ ):
1444
+ """dropout_p should be set to 0.0 during evaluation
1445
+ Supports multi-query and grouped-query attention (MQA/GQA) by passing in K, V with fewer heads
1446
+ than Q. Note that the number of heads in Q must be divisible by the number of heads in KV.
1447
+ For example, if Q has 6 heads and K, V have 2 heads, head 0, 1, 2 of Q will attention to head
1448
+ 0 of K, V, and head 3, 4, 5 of Q will attention to head 1 of K, V.
1449
+
1450
+ If causal=True, the causal mask is aligned to the bottom right corner of the attention matrix.
1451
+ For example, if seqlen_q = 2 and seqlen_k = 5, the causal mask (1 = keep, 0 = masked out) is:
1452
+ 1 1 1 1 0
1453
+ 1 1 1 1 1
1454
+ If seqlen_q = 5 and seqlen_k = 2, the causal mask is:
1455
+ 0 0
1456
+ 0 0
1457
+ 0 0
1458
+ 1 0
1459
+ 1 1
1460
+ If the row of the mask is all zero, the output will be zero.
1461
+
1462
+ If window_size != (-1, -1), implements sliding window local attention. Query at position i
1463
+ will only attend to keys between
1464
+ [i + seqlen_k - seqlen_q - window_size[0], i + seqlen_k - seqlen_q + window_size[1]] inclusive.
1465
+
1466
+ Arguments:
1467
+ q: (total_q, nheads, headdim), where total_q = total number of query tokens in the batch.
1468
+ k: (total_k, nheads_k, headdim), where total_k = total number of key tokens in the batch.
1469
+ v: (total_k, nheads_k, headdim), where total_k = total number of key tokens in the batch.
1470
+ cu_seqlens_q: (batch_size + 1,), dtype torch.int32. The cumulative sequence lengths
1471
+ of the sequences in the batch, used to index into q.
1472
+ cu_seqlens_k: (batch_size + 1,), dtype torch.int32. The cumulative sequence lengths
1473
+ of the sequences in the batch, used to index into kv.
1474
+ max_seqlen_q: int. Maximum query sequence length in the batch.
1475
+ max_seqlen_k: int. Maximum key sequence length in the batch.
1476
+ dropout_p: float. Dropout probability.
1477
+ softmax_scale: float. The scaling of QK^T before applying softmax.
1478
+ Default to 1 / sqrt(headdim).
1479
+ causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
1480
+ window_size: (left, right). If not (-1, -1), implements sliding window local attention.
1481
+ softcap: float. Anything > 0 activates softcapping attention.
1482
+ alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of
1483
+ (-alibi_slope * |i + seqlen_k - seqlen_q - j|)
1484
+ is added to the attention score of query i and key j.
1485
+ deterministic: bool. Whether to use the deterministic implementation of the backward pass,
1486
+ which is slightly slower and uses more memory. The forward pass is always deterministic.
1487
+ return_attn_probs: bool. Whether to return the attention probabilities. This option is for
1488
+ testing only. The returned probabilities are not guaranteed to be correct
1489
+ (they might not have the right scaling).
1490
+ Return:
1491
+ out: (total, nheads, headdim).
1492
+ softmax_lse [optional, if return_attn_probs=True]: (nheads, total_q_seqlen). The
1493
+ logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
1494
+ normalization factor).
1495
+ S_dmask [optional, if return_attn_probs=True]: (batch_size, nheads, seqlen, seqlen).
1496
+ The output of softmax (possibly with different scaling). It also encodes the dropout
1497
+ pattern (negative means that location was dropped, nonnegative means it was kept).
1498
+ """
1499
+ return FlashAttnVarlenFunc.apply(
1500
+ q,
1501
+ k,
1502
+ v,
1503
+ cu_seqlens_q,
1504
+ cu_seqlens_k,
1505
+ max_seqlen_q,
1506
+ max_seqlen_k,
1507
+ dropout_p,
1508
+ softmax_scale,
1509
+ causal,
1510
+ window_size,
1511
+ softcap,
1512
+ alibi_slopes,
1513
+ deterministic,
1514
+ return_attn_probs,
1515
+ block_table,
1516
+ False if q.device.type == "cpu" else torch.is_grad_enabled(),
1517
+ )
1518
+
1519
+
1520
+ def flash_attn_with_kvcache(
1521
+ q,
1522
+ k_cache,
1523
+ v_cache,
1524
+ k=None,
1525
+ v=None,
1526
+ rotary_cos=None,
1527
+ rotary_sin=None,
1528
+ cache_seqlens: Optional[Union[(int, torch.Tensor)]] = None,
1529
+ cache_batch_idx: Optional[torch.Tensor] = None,
1530
+ cache_leftpad: Optional[torch.Tensor] = None,
1531
+ block_table: Optional[torch.Tensor] = None,
1532
+ softmax_scale=None,
1533
+ causal=False,
1534
+ window_size=(-1, -1), # -1 means infinite context window
1535
+ softcap=0.0, # 0.0 means deactivated
1536
+ rotary_interleaved=True,
1537
+ alibi_slopes=None,
1538
+ num_splits=0,
1539
+ return_softmax_lse=False,
1540
+ ):
1541
+ """
1542
+ If k and v are not None, k_cache and v_cache will be updated *inplace* with the new values from
1543
+ k and v. This is useful for incremental decoding: you can pass in the cached keys/values from
1544
+ the previous step, and update them with the new keys/values from the current step, and do
1545
+ attention with the updated cache, all in 1 kernel.
1546
+
1547
+ If you pass in k / v, you must make sure that the cache is large enough to hold the new values.
1548
+ For example, the KV cache could be pre-allocated with the max sequence length, and you can use
1549
+ cache_seqlens to keep track of the current sequence lengths of each sequence in the batch.
1550
+
1551
+ Also apply rotary embedding if rotary_cos and rotary_sin are passed in. The key @k will be
1552
+ rotated by rotary_cos and rotary_sin at indices cache_seqlens, cache_seqlens + 1, etc.
1553
+ If causal or local (i.e., window_size != (-1, -1)), the query @q will be rotated by rotary_cos
1554
+ and rotary_sin at indices cache_seqlens, cache_seqlens + 1, etc.
1555
+ If not causal and not local, the query @q will be rotated by rotary_cos and rotary_sin at
1556
+ indices cache_seqlens only (i.e. we consider all tokens in @q to be at position cache_seqlens).
1557
+
1558
+ See tests/test_flash_attn.py::test_flash_attn_kvcache for examples of how to use this function.
1559
+
1560
+ Supports multi-query and grouped-query attention (MQA/GQA) by passing in KV with fewer heads
1561
+ than Q. Note that the number of heads in Q must be divisible by the number of heads in KV.
1562
+ For example, if Q has 6 heads and K, V have 2 heads, head 0, 1, 2 of Q will attention to head
1563
+ 0 of K, V, and head 3, 4, 5 of Q will attention to head 1 of K, V.
1564
+
1565
+ If causal=True, the causal mask is aligned to the bottom right corner of the attention matrix.
1566
+ For example, if seqlen_q = 2 and seqlen_k = 5, the causal mask (1 = keep, 0 = masked out) is:
1567
+ 1 1 1 1 0
1568
+ 1 1 1 1 1
1569
+ If seqlen_q = 5 and seqlen_k = 2, the causal mask is:
1570
+ 0 0
1571
+ 0 0
1572
+ 0 0
1573
+ 1 0
1574
+ 1 1
1575
+ If the row of the mask is all zero, the output will be zero.
1576
+
1577
+ If window_size != (-1, -1), implements sliding window local attention. Query at position i
1578
+ will only attend to keys between
1579
+ [i + seqlen_k - seqlen_q - window_size[0], i + seqlen_k - seqlen_q + window_size[1]] inclusive.
1580
+
1581
+ Note: Does not support backward pass.
1582
+
1583
+ Arguments:
1584
+ q: (batch_size, seqlen, nheads, headdim)
1585
+ k_cache: (batch_size_cache, seqlen_cache, nheads_k, headdim) if there's no block_table,
1586
+ or (num_blocks, page_block_size, nheads_k, headdim) if there's a block_table (i.e. paged KV cache)
1587
+ page_block_size must be a multiple of 256.
1588
+ v_cache: (batch_size_cache, seqlen_cache, nheads_k, headdim) if there's no block_table,
1589
+ or (num_blocks, page_block_size, nheads_k, headdim) if there's a block_table (i.e. paged KV cache)
1590
+ k [optional]: (batch_size, seqlen_new, nheads_k, headdim). If not None, we concatenate
1591
+ k with k_cache, starting at the indices specified by cache_seqlens.
1592
+ v [optional]: (batch_size, seqlen_new, nheads_k, headdim). Similar to k.
1593
+ rotary_cos [optional]: (seqlen_ro, rotary_dim / 2). If not None, we apply rotary embedding
1594
+ to k and q. Only applicable if k and v are passed in. rotary_dim must be divisible by 16.
1595
+ rotary_sin [optional]: (seqlen_ro, rotary_dim / 2). Similar to rotary_cos.
1596
+ cache_seqlens: int, or (batch_size,), dtype torch.int32. The sequence lengths of the
1597
+ KV cache.
1598
+ cache_batch_idx: (batch_size,), dtype torch.int32. The indices used to index into the KV cache.
1599
+ If None, we assume that the batch indices are [0, 1, 2, ..., batch_size - 1].
1600
+ If the indices are not distinct, and k and v are provided, the values updated in the cache
1601
+ might come from any of the duplicate indices.
1602
+ cache_leftpad: (batch_size,), dtype torch.int32. The index that the KV cache starts. If None, assume 0.
1603
+ block_table [optional]: (batch_size, max_num_blocks_per_seq), dtype torch.int32.
1604
+ softmax_scale: float. The scaling of QK^T before applying softmax.
1605
+ Default to 1 / sqrt(headdim).
1606
+ causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
1607
+ window_size: (left, right). If not (-1, -1), implements sliding window local attention.
1608
+ softcap: float. Anything > 0 activates softcapping attention.
1609
+ rotary_interleaved: bool. Only applicable if rotary_cos and rotary_sin are passed in.
1610
+ If True, rotary embedding will combine dimensions 0 & 1, 2 & 3, etc. If False,
1611
+ rotary embedding will combine dimensions 0 & rotary_dim / 2, 1 & rotary_dim / 2 + 1
1612
+ (i.e. GPT-NeoX style).
1613
+ alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of
1614
+ (-alibi_slope * |i + seqlen_k - seqlen_q - j|)
1615
+ is added to the attention score of query i and key j.
1616
+ num_splits: int. If > 1, split the key/value into this many chunks along the sequence.
1617
+ If num_splits == 1, we don't split the key/value. If num_splits == 0, we use a heuristic
1618
+ to automatically determine the number of splits.
1619
+ Don't change this unless you know what you are doing.
1620
+ return_softmax_lse: bool. Whether to return the logsumexp of the attention scores.
1621
+
1622
+ Return:
1623
+ out: (batch_size, seqlen, nheads, headdim).
1624
+ softmax_lse [optional, if return_softmax_lse=True]: (batch_size, nheads, seqlen). The
1625
+ logsumexp of each row of the matrix QK^T * scaling (e.g., log of the softmax
1626
+ normalization factor).
1627
+ """
1628
+ assert k_cache.stride(-1) == 1, "k_cache must have contiguous last dimension"
1629
+ assert v_cache.stride(-1) == 1, "v_cache must have contiguous last dimension"
1630
+ q, k, v = [maybe_contiguous(x) for x in (q, k, v)]
1631
+ if softmax_scale is None:
1632
+ softmax_scale = q.shape[-1] ** (-0.5)
1633
+ if cache_seqlens is not None and isinstance(cache_seqlens, int):
1634
+ cache_seqlens = torch.full(
1635
+ (k_cache.shape[0],), cache_seqlens, dtype=torch.int32, device=k_cache.device
1636
+ )
1637
+ cache_seqlens = maybe_contiguous(cache_seqlens)
1638
+ cache_batch_idx = maybe_contiguous(cache_batch_idx)
1639
+ block_table = maybe_contiguous(block_table)
1640
+ out, softmax_lse = flash_attn.fwd_kvcache(
1641
+ q,
1642
+ k_cache,
1643
+ v_cache,
1644
+ k,
1645
+ v,
1646
+ cache_seqlens,
1647
+ rotary_cos,
1648
+ rotary_sin,
1649
+ cache_batch_idx,
1650
+ cache_leftpad,
1651
+ block_table,
1652
+ alibi_slopes,
1653
+ None,
1654
+ softmax_scale,
1655
+ causal,
1656
+ window_size[0],
1657
+ window_size[1],
1658
+ softcap,
1659
+ rotary_interleaved,
1660
+ num_splits,
1661
+ )
1662
+ return (out, softmax_lse) if return_softmax_lse else out
build/torch214-cxx11-xpu20261-x86_64-linux/metadata.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "flash-attn2",
3
+ "id": "_flash_attn2_xpu_addf474",
4
+ "version": 3,
5
+ "license": "BSD-3-Clause",
6
+ "python-depends": [],
7
+ "kernel-depends": [],
8
+ "backend": {
9
+ "type": "xpu"
10
+ },
11
+ "digest": {
12
+ "algorithm": "sha256",
13
+ "files": {
14
+ "__init__.py": "pbZ3riEB3GTIymdTvC7023ydYDWalnxEy+Lq0DGeZoQ=",
15
+ "_flash_attn2_xpu_addf474.abi3.so": "u+qSAepgpttxf0WD8nze/vlI0QQx0uTYwT5vD85mHpM=",
16
+ "_ops.py": "SVHrptG44fRcqKQon5TkM+QCjGVH3iHyvzLL07Qz0nY=",
17
+ "bert_padding.py": "gF1EmsdJ+HpQ86MRQ4VxDw+Sb/RVISdQALdNnoByHlw=",
18
+ "flash_attn_interface.py": "pJrnUxC+7qEqFh1C1YbjYggC9FfoG3dblU+XlwaJkEs="
19
+ }
20
+ },
21
+ "provenance": {
22
+ "kernel-builder": {
23
+ "version": "0.17.0-dev0",
24
+ "commit": "7d2828e6592de641b44fb8eb896719101a2ab2fb",
25
+ "dirty": false
26
+ },
27
+ "kernel": {
28
+ "commit": "addf4741fafb55b4c101b15985dfaeea7c7c2f3a",
29
+ "dirty": false
30
+ }
31
+ }
32
+ }
build/torch214-cxx11-xpu20261-x86_64-linux/metadata.json.sigstore ADDED
@@ -0,0 +1 @@
 
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHTTCCBtKgAwIBAgIUJiBmAc5hkBcEoEvKdO9erpK/DsIwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODI3MTMyOTEwWhcNMjYwODI3MTMzOTEwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpQmGEIfnWep8IBRwSSbe4jNATd7XyU54JeKXSn6NMyKnbZuTL5oNVtRhe2MOC2wa1FD/69Nt1819Juj3qMBUQaOCBfEwggXtMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUW5GSi/YCwfE1QhJT3TgiNy4tqRUwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wawYDVR0RAQH/BGEwX4ZdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTATBgorBgEEAYO/MAEEBAVCdWlsZDArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMG0GCisGAQQBg78wAQkEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTAbBgorBgEEAYO/MAELBA0MC3NlbGYtaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoYWRkZjQ3NDFmYWZiNTViNGMxMDFiMTU5ODVkZmFlZWE3YzdjMmYzYTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBtBgorBgEEAYO/MAESBF8MXWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAETBCoMKGFkZGY0NzQxZmFmYjU1YjRjMTAxYjE1OTg1ZGZhZWVhN2M3YzJmM2EwIQYKKwYBBAGDvzABFAQTDBF3b3JrZmxvd19kaXNwYXRjaDBkBgorBgEEAYO/MAEVBFYMVGh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS9hY3Rpb25zL3J1bnMvMzMwNDUzNzY3MDkvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBGBgorBgEEAYO/MAEYBDgMNnJlcG86aHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHk6cmVmOnJlZnMvaGVhZHMvbWFpbjCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABoENpAXYAAAQDAEgwRgIhAIIZXqJDdhLJKIceGmedKGU2ooeDgvrAlJ6dGiCQsEIzAiEAsxYx+KhK8F3WYBaTReq5YlBYuPzW0s6Z7plRdUB0Lj4wCgYIKoZIzj0EAwMDaQAwZgIxAIR224zny9tcVIse/il8dLELwSYnr92d36vu8d58tVzTBC6sevfbIDo9hqVTdG9igQIxAJK7cYC18axOaG3FcFS3Y8vgX/mFewso8Rowl93Map5dWMQV3CqdnpnZ5iWfURAgdA=="}, "tlogEntries":[{"logIndex":"2617572074", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"hashedrekord", "version":"0.0.1"}, "integratedTime":"1787837350", "inclusionPromise":{"signedEntryTimestamp":"MEQCIGH9nSpqoitvFG2Ib2RDGwEyY6S8sH8Jnxa0dT5XdDqJAiA8PTXHPsAnD8OLz8Fqm/yjowvQJA/F/4nE/suFIC2ucw=="}, "inclusionProof":{"logIndex":"2495667812", "rootHash":"82ZLEHyzkMgjUUFeP3XW0zcoOHHpW5nVAGZMWSJBqPA=", "treeSize":"2495667814", "hashes":["n2XFkMN350RvyiemI4xJlDkKUSSRG8O2INUzH6UqZMo=", "/cJgxP5kOp7hwwlNXQbmdOIHROhvGCJD5mVddcQOfy8=", "xu/NRzZfoRxICpa4SZNY+6paWOuHDiX7d7x9II7+5nM=", "/6o7MZIufK03bD8F4EOaA+yxokO5bSxXQ41rqgYa1kA=", "yQO+lU+BYjw/StER3vXQ6duMOiQ2Mz17sRtmuvpn/Bo=", "sdN13MFQdkXvb2RAPpo3BH3EkaXyw1DShsTDIhmR7B0=", "j7l7RGwr5raxJ54dpK82R1803gTyHGwThtKMyJFCjQ4=", "y7L1qSm2rUs3AbT5z7Z+6M/cB6RvBvdAY4eFQpirFHU=", "cJ2q4pCEl+jR0nHuBAA73o7IPjVizVSrluQzXi4wDMM=", "FpSw22a4rFmHTsWm0qhNgotKKqE0bytfDjyfXj4VEds=", "QutiLOAfQukwHVQ717gM+94FF/5Giel82kbXkTx/F8w=", "7TfDCaMWgEwSJEZd/e33b24919rF4IDJLmbqNNRNhZs=", "0HfdxDt/zGugZLIuHasrdLEW9s8OaTykSSqBEDFQXdw=", "SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=", "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2495667814\n82ZLEHyzkMgjUUFeP3XW0zcoOHHpW5nVAGZMWSJBqPA=\n\n— rekor.sigstore.dev wNI9ajBEAiBzSeSVLLHbJ3WlYAWrwbPYZ0Bqk3+PYEIiaAmJ5Ce9mgIgEPJEmkjzStPfbVQcbYABC/jlPEP5vi7vbBkvqD9BJaM=\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI4ZDRkNDgxNzM3OTVhZjJlMjdlNWE0ZThjMDNlZmEyMzM3ZWU4MDZlZTJmMzkzZjU3ZTJhMjc0NTQyYzMyZjA2In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUNuUTl1cFptb3QzRFBja09oYXBaZWNmMDhNaW1LWElTWk13UWFUQ3FnNXB3SWdKcnNNc2haYnRoZWNnL093a0lLVERuK1I0K3RaK0lNcnQ3R1hRVWNJaUJJPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFVWRU5EUW5STFowRjNTVUpCWjBsVlNtbENiVUZqTldoclFtTkZiMFYyUzJSUE9XVnljRXN2UkhOSmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFU1ROTlZFMTVUMVJGZDFkb1kwNU5hbGwzVDBSSk0wMVVUWHBQVkVWM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZ3VVcxSFJVbG1ibGRsY0RoSlFsSjNVMU5pWlRScVRrRlVaRGRZZVZVMU5FcGxTMWdLVTI0MlRrMTVTMjVpV25WVVREVnZUbFowVW1obE1rMVBRekozWVRGR1JDODJPVTUwTVRneE9VcDFhak54VFVKVlVXRlBRMEptUlhkbloxaDBUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZYTlVkVENta3ZXVU4zWmtVeFVXaEtWRE5VWjJsT2VUUjBjVkpWZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJGM1dVUldVakJTUVZGSUwwSkhSWGRZTkZwa1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4dWJHaGlWM2hCQ21OdFZtMWplVGx2V2xkR2EyTjVPWFJaVjJ4MVRVUnJSME5wYzBkQlVWRkNaemM0ZDBGUlJVVkxNbWd3WkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpBS1lWYzVkV041Tlc1aFdGSnZaRmRLTVdNeVZubFpNamwxWkVkV2RXUkROV3BpTWpCM1NIZFpTMHQzV1VKQ1FVZEVkbnBCUWtGblVWSmtNamw1WVRKYWN3cGlNMlJtV2tkc2VtTkhSakJaTW1kM1RtZFpTMHQzV1VKQ1FVZEVkbnBCUWtGM1VXOVpWMUpyV21wUk0wNUVSbTFaVjFwcFRsUldhVTVIVFhoTlJFWnBDazFVVlRWUFJGWnJXbTFHYkZwWFJUTlplbVJxVFcxWmVsbFVRVlJDWjI5eVFtZEZSVUZaVHk5TlFVVkZRa0ZXUTJSWGJITmFSRUZ5UW1kdmNrSm5SVVVLUVZsUEwwMUJSVVpDUWpGdlpGZGtibUZYTlc1YWJVWnFXbE01Y2xwWVNuVmFWM2g2VEZkT2RtSlhNVEZpYld3d1pWUkJaRUpuYjNKQ1owVkZRVmxQTHdwTlFVVkhRa0U1ZVZwWFducE1NbWhzV1ZkU2Vrd3lNV2hoVnpSM1QzZFpTMHQzV1VKQ1FVZEVkbnBCUWtOQlVYUkVRM1J2WkVoU2QyTjZiM1pNTTFKMkNtRXlWblZNYlVacVpFZHNkbUp1VFhWYU1td3dZVWhXYVdSWVRteGpiVTUyWW01U2JHSnVVWFZaTWpsMFRVY3dSME5wYzBkQlVWRkNaemM0ZDBGUmEwVUtXSGQ0WkdGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5YURGYU1tUndZbTFrYlZsWFRteE1NblJzWTIwMWJHSklUWFJaTWpsMFlsaFdkUXBoV0ZJMVRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKS01XRlhlR3RNYm14b1lsZDRRV050Vm0xamVUbHZXbGRHYTJONU9YUlpWMngxQ2sxRVowZERhWE5IUVZGUlFtYzNPSGRCVVc5RlMyZDNiMWxYVW10YWFsRXpUa1JHYlZsWFdtbE9WRlpwVGtkTmVFMUVSbWxOVkZVMVQwUldhMXB0Um13S1dsZEZNMWw2WkdwTmJWbDZXVlJCWWtKbmIzSkNaMFZGUVZsUEwwMUJSVXhDUVRCTlF6Tk9iR0pIV1hSaFJ6bDZaRWRXYTAxRlFVZERhWE5IUVZGUlFncG5OemgzUVZGM1JVMW5kM2RoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlUxRVowZERhWE5IUVZGUlFtYzNPSGRCVVRCRlMyZDNiMWxYVW10YWFsRXpUa1JHYlZsWFdtbE9WRlpwVGtkTmVFMUVSbWtLVFZSVk5VOUVWbXRhYlVac1dsZEZNMWw2WkdwTmJWbDZXVlJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVTlDUWtWTlJETktiRnB1VFhaaFIxWm9Xa2hOZGdwaVYwWndZbXBCWVVKbmIzSkNaMFZGUVZsUEwwMUJSVkJDUVhkTlEycEZkMDU2UlRCT2VsVXhUV3ByZDB4bldVdExkMWxDUWtGSFJIWjZRVUpGUVZGbkNrUkNOVzlrU0ZKM1kzcHZka3d5WkhCa1IyZ3hXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWM1IwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWUlVVc0tSRUZuZVU1VVkzbE5SR013VFhwQ2RFSm5iM0pDWjBWRlFWbFBMMDFCUlZOQ1JqaE5XRmRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVid3BrVjJSdVlWYzFibHB0Um1wYVV6bHlXbGhLZFZwWGVIcE1WMDUyWWxjeE1XSnRiREJsVXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxwQ21SWGJITmFRelUxV1ZjeGMxRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCTkVKbmIzSkNaMFZGUVZsUEwwMUJSVlJDUTI5TlMwZEdhMXBIV1RBS1RucFJlRnB0Um0xWmFsVXhXV3BTYWsxVVFYaFpha1V4VDFSbk1WcEhXbWhhVjFab1RqSk5NMWw2U20xTk1rVjNTVkZaUzB0M1dVSkNRVWRFZG5wQlFncEdRVkZVUkVKR00ySXpTbkphYlhoMlpERTVhMkZZVG5kWldGSnFZVVJDYTBKbmIzSkNaMFZGUVZsUEwwMUJSVlpDUmxsTlZrZG9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemxvV1ROU2NHSXlOWG9LVEROS01XSnVUWFpOZWsxM1RrUlZlazU2V1ROTlJHdDJXVmhTTUZwWE1YZGtTRTEyVFZSQlYwSm5iM0pDWjBWRlFWbFBMMDFCUlZkQ1FXZE5RbTVDTVFwWmJYaHdXWHBDUjBKbmIzSkNaMFZGUVZsUEwwMUJSVmxDUkdkTlRtNUtiR05IT0RaaFNGWnVXakpzZFZveVdtaFpNbFYyWVRKV2VXSnRWbk5qZVRGcUNtSXlNWFJrVnpWd1pFaHJObU50Vm0xUGJrcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRMEpwZDFsTFMzZFpRa0pCU0ZkbFVVbEZRV2RTT1VKSWMwRUtaVkZDTTBGT01EbE5SM0pIZUhoRmVWbDRhMlZJU214dVRuZExhVk5zTmpRemFubDBMelJsUzJOdlFYWkxaVFpQUVVGQlFtOUZUbkJCV0ZsQlFVRlJSQXBCUldkM1VtZEphRUZKU1ZwWWNVcEVaR2hNU2t0SlkyVkhiV1ZrUzBkVk1tOXZaVVJuZG5KQmJFbzJaRWRwUTFGelJVbDZRV2xGUVhONFdYZ3JTMmhMQ2poR00xZFpRbUZVVW1WeE5WbHNRbGwxVUhwWE1ITTJXamR3YkZKa1ZVSXdUR28wZDBObldVbExiMXBKZW1vd1JVRjNUVVJoVVVGM1dtZEplRUZKVWpJS01qUjZibms1ZEdOV1NYTmxMMmxzT0dSTVJVeDNVMWx1Y2preVpETTJkblU0WkRVNGRGWjZWRUpETm5ObGRtWmlTVVJ2T1doeFZsUmtSemxwWjFGSmVBcEJTa3MzWTFsRE1UaGhlRTloUnpOR1kwWlRNMWs0ZG1kWUwyMUdaWGR6YnpoU2IzZHNPVE5OWVhBMVpGZE5VVll6UTNGa2JuQnVXalZwVjJaVlVrRm5DbVJCUFQwS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}], "timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgh61pJsKYlme3QaIF9F/JG0PQNXDaqclfGQ9vRqmWJIsCFQCXrACFMFgLLl7hcFoBnF9fBTzPTxgPMjAyNjA4MjcxMzI5MTBaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHbMIIB1wIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDgyNzEzMjkxMFowLwYJKoZIhvcNAQkEMSIEIImg5TRoA4mopwrFIq8H6aTTpsECDMya5Wy0L9+as5s9MIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRnMGUCMQCeVGIKzmO2AqdyWcM7Jn5NkCY1BEu1/57707/o9zHcarOg8PzgxYjPTfJtqXwlOMwCMHVHI7rdQFl4q7F1mKN6SjU62aeSZ2j0Sd2X+HFibfCN5+56TJHe16s+tvWPO+JT2Q=="}]}}, "messageSignature":{"messageDigest":{"algorithm":"SHA2_256", "digest":"jU1IFzeVry4n5aTowD76IzfugG7i85P1fionRULDLwY="}, "signature":"MEUCIQCnQ9upZmot3DPckOhapZecf08MimKXISZMwQaTCqg5pwIgJrsMshZbthecg/OwkIKTDn+R4+tZ+IMrt7GXQUcIiBI="}}