kernels-bot commited on
Commit
a8755e1
·
verified ·
1 Parent(s): 3ba7a06

Uploaded using `kernel-builder`.

Browse files
build/torch-cuda/_ops.py CHANGED
@@ -25,7 +25,7 @@ def get_backend() -> str:
25
 
26
  def _find_ops_name() -> str:
27
  kernel_name = "fla"
28
- unique_id = "faa8674"
29
  backend = get_backend()
30
  return f"_{kernel_name}_{backend}_{unique_id}"
31
 
 
25
 
26
  def _find_ops_name() -> str:
27
  kernel_name = "fla"
28
+ unique_id = "5fe9dbb"
29
  backend = get_backend()
30
  return f"_{kernel_name}_{backend}_{unique_id}"
31
 
build/torch-cuda/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "fla",
3
- "id": "_fla_cuda_faa8674",
4
  "version": 2,
5
  "kernels-minver": "0.14.0",
6
  "license": "MIT",
@@ -15,7 +15,7 @@
15
  "algorithm": "sha256",
16
  "files": {
17
  "__init__.py": "eSkze5EKF+DhheKdXmGOOQPa6oJCFDY0fw3vg7WX3mU=",
18
- "_ops.py": "q78tXrH/5M5hfjOclPcmC6NXw+I2de7vH6gfnXW225o=",
19
  "backends.py": "h+9RflmubYjIEs0Fqhadj8SzFXHr+ghgXBmqn5Tm9v4=",
20
  "layers.py": "MogF8nJKBsgqJjVXLjVFJHBMakhJCkK2of1ykPWF0yA=",
21
  "modules/__init__.py": "rq5MxYJ+DgZLmrKdBb/PB1Q6PcuZ+rP0btubKE7uMdc=",
@@ -339,7 +339,7 @@
339
  "ops/wall_attn/decode.py": "o5q0fsJTiz+0XW0RPFFI1hBXz6PXSBMSTvog8Bc+sGA=",
340
  "ops/wall_attn/naive.py": "9YKwBSvQ9imy229T5KMYKpuVNb+xEzhXsXdMemRWqjQ=",
341
  "ops/wall_attn/parallel.py": "k1DMCeZ/dLyUrpaLt1eWphG3WA0STXIwofUU2/lZx1g=",
342
- "symbols.json": "XeDbgUU3taJ6OhnIi2xuHQpY5Guf0MQ5YL5XFWYzxl0=",
343
  "utils/__init__.py": "+7iYDYAJEDL9y/TTl/bNr5/O0LpSylNyE6J7c1OCAxs=",
344
  "utils/decorators.py": "Xy1DCGkQ7HRyffUHEXsVLhn6LE7xgdIY9Yob1GFm/f8=",
345
  "utils/env.py": "LJZbQTALlKpcS2dwt7JBv/AdlZ8Yh7LC7tCDDJs0D2M=",
@@ -351,11 +351,11 @@
351
  "provenance": {
352
  "kernel-builder": {
353
  "version": "0.18.0-dev0",
354
- "commit": "d054906a13710b811b96697b4635f03020842733",
355
  "dirty": false
356
  },
357
  "kernel": {
358
- "commit": "faa8674647aa5ebaab5e997cd11e6e3808d090a9",
359
  "dirty": false
360
  }
361
  }
 
1
  {
2
  "name": "fla",
3
+ "id": "_fla_cuda_5fe9dbb",
4
  "version": 2,
5
  "kernels-minver": "0.14.0",
6
  "license": "MIT",
 
15
  "algorithm": "sha256",
16
  "files": {
17
  "__init__.py": "eSkze5EKF+DhheKdXmGOOQPa6oJCFDY0fw3vg7WX3mU=",
18
+ "_ops.py": "l7rebIyWJuK1zq0aOwFJqz57y/YTEFr6HS+2Ctt4QbI=",
19
  "backends.py": "h+9RflmubYjIEs0Fqhadj8SzFXHr+ghgXBmqn5Tm9v4=",
20
  "layers.py": "MogF8nJKBsgqJjVXLjVFJHBMakhJCkK2of1ykPWF0yA=",
21
  "modules/__init__.py": "rq5MxYJ+DgZLmrKdBb/PB1Q6PcuZ+rP0btubKE7uMdc=",
 
339
  "ops/wall_attn/decode.py": "o5q0fsJTiz+0XW0RPFFI1hBXz6PXSBMSTvog8Bc+sGA=",
340
  "ops/wall_attn/naive.py": "9YKwBSvQ9imy229T5KMYKpuVNb+xEzhXsXdMemRWqjQ=",
341
  "ops/wall_attn/parallel.py": "k1DMCeZ/dLyUrpaLt1eWphG3WA0STXIwofUU2/lZx1g=",
342
+ "symbols.json": "GpguIP509J+sE/htwYPhcz7d20Qem9wLpG+gmQFP6Ds=",
343
  "utils/__init__.py": "+7iYDYAJEDL9y/TTl/bNr5/O0LpSylNyE6J7c1OCAxs=",
344
  "utils/decorators.py": "Xy1DCGkQ7HRyffUHEXsVLhn6LE7xgdIY9Yob1GFm/f8=",
345
  "utils/env.py": "LJZbQTALlKpcS2dwt7JBv/AdlZ8Yh7LC7tCDDJs0D2M=",
 
351
  "provenance": {
352
  "kernel-builder": {
353
  "version": "0.18.0-dev0",
354
+ "commit": "21bdf69d97a289b9c581a0c60f63deed131647d5",
355
  "dirty": false
356
  },
357
  "kernel": {
358
+ "commit": "5fe9dbb3d45f6f2652958c1f70e5381891fa7aa0",
359
  "dirty": false
360
  }
361
  }
build/torch-cuda/metadata.json.sigstore CHANGED
@@ -1 +1 @@
1
- {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHLDCCBrKgAwIBAgIUJ0lshTFWwst8IzAT9YYsFzLfS7UwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYxMDIzMTEzNjMwWhcNMjYxMDIzMTE0NjMwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVH1tLrQmeUKnQkq6i218PIuzMBN2MaWZxQRoCfiUSaVu/nAFlPRTZzmrlfQEF3aXDzrNpYFoluul4oNZ4Y6WCaOCBdEwggXNMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAfBgNVHSMEGDAWgBTf0+nPViQRlvmo2OkoVaLGLhhkPzBrBgNVHREBAf8EYTBfhl1odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3MvYnVpbGQueWFtbEByZWZzL2hlYWRzL21haW4wOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAfBgorBgEEAYO/MAECBBF3b3JrZmxvd19kaXNwYXRjaDA2BgorBgEEAYO/MAEDBChmYWE4Njc0NjQ3YWE1ZWJhYWI1ZTk5N2NkMTFlNmUzODA4ZDA5MGE5MBMGCisGAQQBg78wAQQEBUJ1aWxkMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wbQYKKwYBBAGDvzABCQRfDF1odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3MvYnVpbGQueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABCgQqDChmYWE4Njc0NjQ3YWE1ZWJhYWI1ZTk5N2NkMTFlNmUzODA4ZDA5MGE5MBsGCisGAQQBg78wAQsEDQwLc2VsZi1ob3N0ZWQwQAYKKwYBBAGDvzABDAQyDDBodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkwOAYKKwYBBAGDvzABDQQqDChmYWE4Njc0NjQ3YWE1ZWJhYWI1ZTk5N2NkMTFlNmUzODA4ZDA5MGE5MB8GCisGAQQBg78wAQ4EEQwPcmVmcy9oZWFkcy9tYWluMBoGCisGAQQBg78wAQ8EDAwKMTA3MTQ3NTUyOTAuBgorBgEEAYO/MAEQBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZTAYBgorBgEEAYO/MAERBAoMCDI1NzIwNzQzMG0GCisGAQQBg78wARIEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wARMEKgwoZmFhODY3NDY0N2FhNWViYWFiNWU5OTdjZDExZTZlMzgwOGQwOTBhOTAhBgorBgEEAYO/MAEUBBMMEXdvcmtmbG93X2Rpc3BhdGNoMGQGCisGAQQBg78wARUEVgxUaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5L2FjdGlvbnMvcnVucy8zOTk0NjY4MTMwNi9hdHRlbXB0cy8xMBYGCisGAQQBg78wARYECAwGcHVibGljMEYGCisGAQQBg78wARgEOAw2cmVwbzpodWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTpyZWY6cmVmcy9oZWFkcy9tYWluMIGKBgorBgEEAdZ5AgQCBHwEegB4AHYA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGhaIxWtgAABAMARzBFAiA3Mxsa2S68TxSeHT7HXRh62YaPF97CC3OwsEnL4ja1AwIhALVgWgeGDAI/5j9YDP74V+guDjbdvQkMg2vHu5KyNhhFMAoGCCqGSM49BAMDA2gAMGUCMBnfXMxYFwK/DRvbcsHlq0PvGkM1NqeixJ5H5As6Jg45Z615nhcamax1wsj4AKK7rgIxANWWrq/rJESdCT9ggQ/kpJxxP+imt+mq6fIHaCffe/Yylgj9g0to02iMQ9k/69Dkmw=="},"tlogEntries":[{"logIndex":"3419008331","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1792755390","inclusionPromise":{"signedEntryTimestamp":"MEUCIHvJr/8by9tWaT3jeJJiivxQKWs2VM0boinRaO3ylXkuAiEAyJIR/Q3Qbwar9hM4XgN1zJbW/fFYrtrukZaB7tUNk3s="},"inclusionProof":{"logIndex":"3297104069","rootHash":"AqEZL47IwYqgsicGfAageWXsWmgX6YcDTik4qtxz2sc=","treeSize":"3297104128","hashes":["+yS/RWgXFySNiJ0ZgrZGgVAj6zWXwOCm4WrbgeF8dC0=","KsQjMi5juLHmsKYyDSki1ICMSzuRvPGAuACX1H3/8jI=","P0oBgWSFiXueLc0tVfsnbyLUKXOzTdOTejAWGF6l5xM=","+Bs2pMVYRrSa/d35vCtvxJ68lW8BwWxd2/HKDt9bNZo=","w0HXTzOCeQloq8VyOrly0kaLWIB5wilzU8Bco8fSK2o=","+/C/wG5vb5fZGIuj5BBhNyzFtDMokIlyng6/zFO2b2g=","ztq64hrGDMsagAzcS7TBpjEoa5IBt4ZfjbJeXxr45YU=","uXrMs//7PODlDhbfW5/N1WF/DasPzJ/ibTSju6FLX3M=","VkmqZERFTnJ1R5W0yWtcLd+8use8iaIHPzUfOBMqcig=","6zZ8RsJy6iP4dtNMyvsMaXpS/M1KSI7mWA3Rh/qb+UY=","sH3iRJ+YSpMgcl9MQvq5mOnxKnX0UOS6Qxva+JrjED8=","mIjtw1KA13/4jqXfKlJiFrODS7dNF+hqEUNlXprnzTE=","pNenO6BoAxc3BwcFEO9IJI4uZmwdkynjP9MI8OiYc50=","1GPTGQWDthSzUsPF7t/XQmpI2SH4KZm3gaVrhMs6T2k=","YYCr61A8azar3dfO8Ct+pri7LqDxkUlUkfs7fiqYErU=","1DaDKzrCNNBhmSdY5vFjz+NpAmxmYfYEgBCdPLrMP1A=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n3297104128\nAqEZL47IwYqgsicGfAageWXsWmgX6YcDTik4qtxz2sc=\n\n— rekor.sigstore.dev wNI9ajBEAiB+jRMOO5bzTbuSA/sVaPQpmFtDRyBg5BSA6pLG6InlZQIgApukpBYACLX9oUTSsmUHGiqZ1xhK3CxQyzD4KioiYgE=\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIwZGIyMmFhMzI4ZWUzZjcwOTAwYTFmMTM4MzRmYjFiMmFiNDE5NTMwODY0N2MzNWM5NjFmMTAzMGQyNzljMGJhIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUURLVm94b0NnMkx5V3JJMDhtMGl6M3FqeDM3UjVxTFhHbWs4aWZ3clczc0t3SWhBTmJBbFpvUFF2d2tSS1VKL2J1bWt6dnhCNzJUREZPZmRnWjFUa2pCRC96ZiIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaE1SRU5EUW5KTFowRjNTVUpCWjBsVlNqQnNjMmhVUmxkM2MzUTRTWHBCVkRsWldYTkdla3htVXpkVmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFU1hwTlZFVjZUbXBOZDFkb1kwNU5hbGw0VFVSSmVrMVVSVEJPYWsxM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZXU0RGMFRISlJiV1ZWUzI1UmEzRTJhVEl4T0ZCSmRYcE5RazR5VFdGWFduaFJVbThLUTJacFZWTmhWblV2YmtGR2JGQlNWRnA2YlhKc1psRkZSak5oV0VSNmNrNXdXVVp2YkhWMWJEUnZUbG8wV1RaWFEyRlBRMEprUlhkbloxaE9UVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFuSkNaMDVXU0ZKRlFrRm1PRVZaVkVKbWFHd3hiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWMllUSldlV0p0Vm5OamVURnFZakl4ZEdSWE5YQmtTR3QyVEcxa2NHUkhhREZaYVRrellqTktjZ3BhYlhoMlpETk5kbGx1Vm5CaVIxRjFaVmRHZEdKRlFubGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMDlSV1V0TGQxbENRa0ZIUkhaNlFVSkJVVkZ5Q21GSVVqQmpTRTAyVEhrNU1HSXlkR3hpYVRWb1dUTlNjR0l5TlhwTWJXUndaRWRvTVZsdVZucGFXRXBxWWpJMU1GcFhOVEJNYlU1MllsUkJaa0puYjNJS1FtZEZSVUZaVHk5TlFVVkRRa0pHTTJJelNuSmFiWGgyWkRFNWEyRllUbmRaV0ZKcVlVUkJNa0puYjNKQ1owVkZRVmxQTDAxQlJVUkNRMmh0V1ZkRk5BcE9hbU13VG1wUk0xbFhSVEZhVjBwb1dWZEpNVnBVYXpWT01rNXJUVlJHYkU1dFZYcFBSRUUwV2tSQk5VMUhSVFZOUWsxSFEybHpSMEZSVVVKbk56aDNDa0ZSVVVWQ1ZVb3hZVmQ0YTAxRGMwZERhWE5IUVZGUlFtYzNPSGRCVVZWRlNGZG9NVm95WkhCaWJXUnRXVmRPYkV3eWRHeGpiVFZzWWtoTmRGa3lPWFFLWWxoV2RXRllValZOUWpCSFEybHpSMEZSVVVKbk56aDNRVkZaUlVRelNteGFiazEyWVVkV2FGcElUWFppVjBad1ltcEJOMEpuYjNKQ1owVkZRVmxQTHdwTlFVVkpRa013VFVzeWFEQmtTRUo2VDJrNGRtUkhPWEphVnpSMVdWZE9NR0ZYT1hWamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcUNtSXlNSGRpVVZsTFMzZFpRa0pCUjBSMmVrRkNRMUZTWmtSR01XOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaFNGWnVXakpzZFZveVdtZ0tXVEpWZG1FeVZubGliVlp6WTNreGFtSXlNWFJrVnpWd1pFaHJka3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsbHVWbkJpUjFGMVpWZEdkQXBpUlVKNVdsZGFla3d5YUd4WlYxSjZUREl4YUdGWE5IZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1EyZFJjVVJEYUcxWlYwVTBUbXBqTUU1cVVUTlpWMFV4Q2xwWFNtaFpWMGt4V2xSck5VNHlUbXROVkVac1RtMVZlazlFUVRSYVJFRTFUVWRGTlUxQ2MwZERhWE5IUVZGUlFtYzNPSGRCVVhORlJGRjNUR015Vm5NS1dta3hiMkl6VGpCYVYxRjNVVUZaUzB0M1dVSkNRVWRFZG5wQlFrUkJVWGxFUkVKdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5XcGlNakIyWVVoV2JncGFNbXgxV2pKYWFGa3lWWFpoTWxaNVltMVdjMk41TVdwaU1qRjBaRmMxY0dSSWEzZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JGRlJjVVJEYUcxWlYwVTBDazVxWXpCT2FsRXpXVmRGTVZwWFNtaFpWMGt4V2xSck5VNHlUbXROVkVac1RtMVZlazlFUVRSYVJFRTFUVWRGTlUxQ09FZERhWE5IUVZGUlFtYzNPSGNLUVZFMFJVVlJkMUJqYlZadFkzazViMXBYUm10amVUbDBXVmRzZFUxQ2IwZERhWE5IUVZGUlFtYzNPSGRCVVRoRlJFRjNTMDFVUVROTlZGRXpUbFJWZVFwUFZFRjFRbWR2Y2tKblJVVkJXVTh2VFVGRlVVSkRRVTFJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx2WkZka2JtRlhOVzVhYlVacUNscFVRVmxDWjI5eVFtZEZSVUZaVHk5TlFVVlNRa0Z2VFVORVNURk9la2wzVG5wUmVrMUhNRWREYVhOSFFWRlJRbWMzT0hkQlVrbEZXSGQ0WkdGSVVqQUtZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTW1neFdqSmtjR0p0WkcxWlYwNXNUREowYkdOdE5XeGlTRTEwV1RJNWRHSllWblZoV0ZJMVRIazFiZ3BoV0ZKdlpGZEpkbVF5T1hsaE1scHpZak5rZWt3eVNqRmhWM2hyVEc1c2FHSlhlRUZqYlZadFkzazViMXBYUm10amVUbDBXVmRzZFUxRVowZERhWE5IQ2tGUlVVSm5OemgzUVZKTlJVdG5kMjlhYlVab1QwUlpNMDVFV1RCT01rWm9UbGRXYVZsWFJtbE9WMVUxVDFSa2FscEVSWGhhVkZwc1RYcG5kMDlIVVhjS1QxUkNhRTlVUVdoQ1oyOXlRbWRGUlVGWlR5OU5RVVZWUWtKTlRVVllaSFpqYlhSdFlrYzVNMWd5VW5Cak0wSm9aRWRPYjAxSFVVZERhWE5IUVZGUlFncG5OemgzUVZKVlJWWm5lRlZoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlV3eVJtcGtSMngyWW01TmRtTnVWblZqZVRoNlQxUnJNRTVxV1RSTlZFMTNUbWs1YUdSSVVteGlXRUl3WTNrNGVFMUNXVWNLUTJselIwRlJVVUpuTnpoM1FWSlpSVU5CZDBkalNGWnBZa2RzYWsxRldVZERhWE5IUVZGUlFtYzNPSGRCVW1kRlQwRjNNbU50Vm5kaWVuQnZaRmRrYmdwaFZ6VnVXbTFHYWxwVE9YSmFXRXAxV2xkNGVreFhUblppVnpFeFltMXNNR1ZVY0hsYVYxazJZMjFXYldONU9XOWFWMFpyWTNrNWRGbFhiSFZOU1VkTENrSm5iM0pDWjBWRlFXUmFOVUZuVVVOQ1NIZEZaV2RDTkVGSVdVRXpWREIzWVhOaVNFVlVTbXBIVWpSamJWZGpNMEZ4U2t0WWNtcGxVRXN6TDJnMGNIa0taME00Y0Rkdk5FRkJRVWRvWVVsNFYzUm5RVUZDUVUxQlVucENSa0ZwUVROTmVITmhNbE0yT0ZSNFUyVklWRGRJV0ZKb05qSlpZVkJHT1RkRFF6TlBkd3B6Ulc1TU5HcGhNVUYzU1doQlRGWm5WMmRsUjBSQlNTODFhamxaUkZBM05GWXJaM1ZFYW1Ka2RsRnJUV2N5ZGtoMU5VdDVUbWhvUmsxQmIwZERRM0ZIQ2xOTk5EbENRVTFFUVRKblFVMUhWVU5OUW01bVdFMTRXVVozU3k5RVVuWmlZM05JYkhFd1VIWkhhMDB4VG5GbGFYaEtOVWcxUVhNMlNtYzBOVm8yTVRVS2JtaGpZVzFoZURGM2MybzBRVXRMTjNKblNYaEJUbGRYY25FdmNrcEZVMlJEVkRsbloxRXZhM0JLZUhoUUsybHRkQ3R0Y1RabVNVaGhRMlptWlM5WmVRcHNaMm81WnpCMGJ6QXlhVTFST1dzdk5qbEVhMjEzUFQwS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgKB8OcrUJ27GcVZz2qNq4zR5hJfaHWWGUk9J7/t4R7RkCFG5bvtRoup2e72M5BnkX4Xra8qqVGA8yMDI2MTAyMzExMzYzMFowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdwwggHYAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYxMDIzMTEzNjMwWjAvBgkqhkiG9w0BCQQxIgQgf8bINr/Esb7yzUJw+qHInIAuScmfRLYmpnNhmHaRpbcwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGgwZgIxAJYixMb7TBf8oOPGWWCwG09NgfajMLuQDFGlKfNGRTY9B6SRjQiaf7D8B+d4Oi66EgIxANHq5VMDOfmmEVFR7jvSVVBkLUa/srwHUI49iW7MRd2kLjp5DNmb6z34fA3SHlHp9g=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"DbIqoyjuP3CQCh8Tg0+xsqtBlTCGR8Nclh8QMNJ5wLo="},"signature":"MEYCIQDKVoxoCg2LyWrI08m0iz3qjx37R5qLXGmk8ifwrW3sKwIhANbAlZoPQvwkRKUJ/bumkzvxB72TDFOfdgZ1TkjBD/zf"}}
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHKzCCBrKgAwIBAgIUEJt1CqdtlD0W+jhcLBaoDzhisY0wCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYxMDMwMTYwOTMxWhcNMjYxMDMwMTYxOTMxWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6ahIMBSZ6iTNpp08bJERB1GsRkxV2oXJ6EtV7JgirHfSRvo8sT8nUJXZJjo0/2BiL1UQzfj6q/d9Sd7CevA3qaOCBdEwggXNMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAfBgNVHSMEGDAWgBTf0+nPViQRlvmo2OkoVaLGLhhkPzBrBgNVHREBAf8EYTBfhl1odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3MvYnVpbGQueWFtbEByZWZzL2hlYWRzL21haW4wOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAfBgorBgEEAYO/MAECBBF3b3JrZmxvd19kaXNwYXRjaDA2BgorBgEEAYO/MAEDBCg1ZmU5ZGJiM2Q0NWY2ZjI2NTI5NThjMWY3MGU1MzgxODkxZmE3YWEwMBMGCisGAQQBg78wAQQEBUJ1aWxkMCsGCisGAQQBg78wAQUEHWh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wbQYKKwYBBAGDvzABCQRfDF1odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvLmdpdGh1Yi93b3JrZmxvd3MvYnVpbGQueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABCgQqDCg1ZmU5ZGJiM2Q0NWY2ZjI2NTI5NThjMWY3MGU1MzgxODkxZmE3YWEwMBsGCisGAQQBg78wAQsEDQwLc2VsZi1ob3N0ZWQwQAYKKwYBBAGDvzABDAQyDDBodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkwOAYKKwYBBAGDvzABDQQqDCg1ZmU5ZGJiM2Q0NWY2ZjI2NTI5NThjMWY3MGU1MzgxODkxZmE3YWEwMB8GCisGAQQBg78wAQ4EEQwPcmVmcy9oZWFkcy9tYWluMBoGCisGAQQBg78wAQ8EDAwKMTA3MTQ3NTUyOTAuBgorBgEEAYO/MAEQBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZTAYBgorBgEEAYO/MAERBAoMCDI1NzIwNzQzMG0GCisGAQQBg78wARIEXwxdaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLnlhbWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wARMEKgwoNWZlOWRiYjNkNDVmNmYyNjUyOTU4YzFmNzBlNTM4MTg5MWZhN2FhMDAhBgorBgEEAYO/MAEUBBMMEXdvcmtmbG93X2Rpc3BhdGNoMGQGCisGAQQBg78wARUEVgxUaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5L2FjdGlvbnMvcnVucy80MTA4MzQ5MDM5MC9hdHRlbXB0cy8xMBYGCisGAQQBg78wARYECAwGcHVibGljMEYGCisGAQQBg78wARgEOAw2cmVwbzpodWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTpyZWY6cmVmcy9oZWFkcy9tYWluMIGKBgorBgEEAdZ5AgQCBHwEegB4AHYA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGhjZLPWgAABAMARzBFAiEA+RAFuPuDn0U3NDoHHgjtIvovpphxp29wIzmjwKB7WDgCIH/f03EnyNCMQe0TTb65uQO/yjF/E4/rfmLDS6xGsg8HMAoGCCqGSM49BAMDA2cAMGQCMAxbcZXnEsYn4hV7wMizt4QKUGUVoj8lFIdO/ErMhB785zTUefTh65dQJONQ8WRZpwIwZ+0F2r4jQ1bD0ZxWaSUoDN/FaTo95nvnmI/a6fHCnFpFri8JBvFAm/hezXy5qT9+"}, "tlogEntries":[{"logIndex":"3597183353", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"hashedrekord", "version":"0.0.1"}, "integratedTime":"1793376578", "inclusionPromise":{"signedEntryTimestamp":"MEQCICr4GP6P1bNQ5ckk6si56/AYNCeOSK9vnsXxr2oEruQtAiAcky29mKwn3KTyFlU16vHjGCSi2ZQpGQRbkZhGGm08KQ=="}, "inclusionProof":{"logIndex":"3475279091", "rootHash":"d7mMB4mZqWNN/hfUbhJAVxzA3A4XtWsIZG/LiHA3nlU=", "treeSize":"3475279811", "hashes":["54grlPt//BtljD05ncVfKvT27zYnbth7OqyLZVFGMtI=", "Xqr0HD1ahrTg9CGZssFx1mT9pDjDPUv2QBNXWVK+mkg=", "qAaQAaGDH+NjMJqu642QGLzBCb6Y7NI75lU0DrKazlY=", "U7UPrZiWkU4PvIhBLM6HA4J0Hf5duJGC3cpVm/1hlYc=", "VWV3Eh8jNi/Hq4o9rlzLH+qgZOrmPgaSJiNZCOXV4qc=", "/EvR2mBJGvQBzYZzVBeR0g1XBXy+yLIaX2DJGxoGOS0=", "FxSEboGVgsaudLgFB/usA7V5JZo0i6Qk52OlTKLq4vs=", "8jBLvixUsBj50BRkg7CyXtRFWcTGsKk18yLjg8aoZuo=", "1MCDbxTCJuA/tusmmxZoaVH0SVJ7Vk43ele1fdgsbig=", "CN2Us2NboJF1YQ5/SZ/8VspkExudePXlKYo8uR2/7zc=", "OwJHDAACBfMkCTyHxTsuWXdQt9EyMPLc503TmGzF+Ak=", "vuvNAh+Y3AiltMWZU4lGPMoU5o7a1Q4qRvTh5m9MO7c=", "h5VrGDgepEIgtJuhPvWmuJKEVx8q8xCLApgI8ngr2Rg=", "NlD7kf7zliz6XZMopFEPBDQTFkC1k0B/M414sWSVjjg=", "na7MCafKydTMg7pLg31hVCvG2iNeSrYEtRLJwhh7wng=", "e3OaWwzL1tEWYXiUzGpH+1v9CiFPwweyfRzIh3Z+uO4=", "b+938HIdfjdD/+LgIs3AVRE3Wc65/1NSSAL4OJ5FUXE=", "kQz/4ND7LdhfAQn+idNsO+ZFC32sfkYRlhjWF5W+sPc=", "zGfeoWKmrZlXMOvyi3R2GDbGpmI1skJW/wLTXCCgF0o=", "1DaDKzrCNNBhmSdY5vFjz+NpAmxmYfYEgBCdPLrMP1A=", "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n3475279811\nd7mMB4mZqWNN/hfUbhJAVxzA3A4XtWsIZG/LiHA3nlU=\n\n— rekor.sigstore.dev wNI9ajBEAiAWCtxV9MDUdal4soEwpS3msLPNx0FwrXzwOFFO0GaNqAIgJez6xdO1isQxLDNL72CWvusHYe9OkW1axAGc9w+ReaQ=\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIzNDEwOTZkMTVmN2ZkM2I5NGY4ZWE1ODY5MTAwYmYwYWE0YzkxNjlhMjk4Mzg5OWQyMTE5MjY2MWVjYzUxYjRmIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUMrdXhkQnNMUEh3MklWc3l0aEJyNVNITW12L1I1Y001RFZ1QncyVDlCd093SWhBS044VEF6ZjlzQzhPRTZlQ3pwdWRlUzQxVEV2Z29xYjYybFJqZ1o0eDdnaSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaExla05EUW5KTFowRjNTVUpCWjBsVlJVcDBNVU54WkhSc1JEQlhLMnBvWTB4Q1lXOUVlbWhwYzFrd2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFVFhkTlZGbDNUMVJOZUZkb1kwNU5hbGw0VFVSTmQwMVVXWGhQVkUxNFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVUyWVdoSlRVSlRXalpwVkU1d2NEQTRZa3BGVWtJeFIzTlNhM2hXTW05WVNqWkZkRllLTjBwbmFYSklabE5TZG04NGMxUTRibFZLV0ZwS2FtOHdMekpDYVV3eFZWRjZabW8yY1M5a09WTmtOME5sZGtFemNXRlBRMEprUlhkbloxaE9UVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFuSkNaMDVXU0ZKRlFrRm1PRVZaVkVKbWFHd3hiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmhTRlp1V2pKc2RWb3lXbWhaTWxWMllUSldlV0p0Vm5OamVURnFZakl4ZEdSWE5YQmtTR3QyVEcxa2NHUkhhREZaYVRrellqTktjZ3BhYlhoMlpETk5kbGx1Vm5CaVIxRjFaVmRHZEdKRlFubGFWMXA2VERKb2JGbFhVbnBNTWpGb1lWYzBkMDlSV1V0TGQxbENRa0ZIUkhaNlFVSkJVVkZ5Q21GSVVqQmpTRTAyVEhrNU1HSXlkR3hpYVRWb1dUTlNjR0l5TlhwTWJXUndaRWRvTVZsdVZucGFXRXBxWWpJMU1GcFhOVEJNYlU1MllsUkJaa0puYjNJS1FtZEZSVUZaVHk5TlFVVkRRa0pHTTJJelNuSmFiWGgyWkRFNWEyRllUbmRaV0ZKcVlVUkJNa0puYjNKQ1owVkZRVmxQTDAxQlJVUkNRMmN4V20xVk5RcGFSMHBwVFRKUk1FNVhXVEphYWtreVRsUkpOVTVVYUdwTlYxa3pUVWRWTVUxNlozaFBSR3Q0V20xRk0xbFhSWGROUWsxSFEybHpSMEZSVVVKbk56aDNDa0ZSVVVWQ1ZVb3hZVmQ0YTAxRGMwZERhWE5IUVZGUlFtYzNPSGRCVVZWRlNGZG9NVm95WkhCaWJXUnRXVmRPYkV3eWRHeGpiVFZzWWtoTmRGa3lPWFFLWWxoV2RXRllValZOUWpCSFEybHpSMEZSVVVKbk56aDNRVkZaUlVRelNteGFiazEyWVVkV2FGcElUWFppVjBad1ltcEJOMEpuYjNKQ1owVkZRVmxQTHdwTlFVVkpRa013VFVzeWFEQmtTRUo2VDJrNGRtUkhPWEphVnpSMVdWZE9NR0ZYT1hWamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcUNtSXlNSGRpVVZsTFMzZFpRa0pCUjBSMmVrRkNRMUZTWmtSR01XOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaFNGWnVXakpzZFZveVdtZ0tXVEpWZG1FeVZubGliVlp6WTNreGFtSXlNWFJrVnpWd1pFaHJka3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsbHVWbkJpUjFGMVpWZEdkQXBpUlVKNVdsZGFla3d5YUd4WlYxSjZUREl4YUdGWE5IZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1EyZFJjVVJEWnpGYWJWVTFXa2RLYVUweVVUQk9WMWt5Q2xwcVNUSk9WRWsxVGxSb2FrMVhXVE5OUjFVeFRYcG5lRTlFYTNoYWJVVXpXVmRGZDAxQ2MwZERhWE5IUVZGUlFtYzNPSGRCVVhORlJGRjNUR015Vm5NS1dta3hiMkl6VGpCYVYxRjNVVUZaUzB0M1dVSkNRVWRFZG5wQlFrUkJVWGxFUkVKdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5XcGlNakIyWVVoV2JncGFNbXgxV2pKYWFGa3lWWFpoTWxaNVltMVdjMk41TVdwaU1qRjBaRmMxY0dSSWEzZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JGRlJjVVJEWnpGYWJWVTFDbHBIU21sTk1sRXdUbGRaTWxwcVNUSk9WRWsxVGxSb2FrMVhXVE5OUjFVeFRYcG5lRTlFYTNoYWJVVXpXVmRGZDAxQ09FZERhWE5IUVZGUlFtYzNPSGNLUVZFMFJVVlJkMUJqYlZadFkzazViMXBYUm10amVUbDBXVmRzZFUxQ2IwZERhWE5IUVZGUlFtYzNPSGRCVVRoRlJFRjNTMDFVUVROTlZGRXpUbFJWZVFwUFZFRjFRbWR2Y2tKblJVVkJXVTh2VFVGRlVVSkRRVTFJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx2WkZka2JtRlhOVzVhYlVacUNscFVRVmxDWjI5eVFtZEZSVUZaVHk5TlFVVlNRa0Z2VFVORVNURk9la2wzVG5wUmVrMUhNRWREYVhOSFFWRlJRbWMzT0hkQlVrbEZXSGQ0WkdGSVVqQUtZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTW1neFdqSmtjR0p0WkcxWlYwNXNUREowYkdOdE5XeGlTRTEwV1RJNWRHSllWblZoV0ZJMVRIazFiZ3BoV0ZKdlpGZEpkbVF5T1hsaE1scHpZak5rZWt3eVNqRmhWM2hyVEc1c2FHSlhlRUZqYlZadFkzazViMXBYUm10amVUbDBXVmRzZFUxRVowZERhWE5IQ2tGUlVVSm5OemgzUVZKTlJVdG5kMjlPVjFwc1QxZFNhVmxxVG10T1JGWnRUbTFaZVU1cVZYbFBWRlUwV1hwR2JVNTZRbXhPVkUwMFRWUm5OVTFYV21nS1RqSkdhRTFFUVdoQ1oyOXlRbWRGUlVGWlR5OU5RVVZWUWtKTlRVVllaSFpqYlhSdFlrYzVNMWd5VW5Cak0wSm9aRWRPYjAxSFVVZERhWE5IUVZGUlFncG5OemgzUVZKVlJWWm5lRlZoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiR050Tld4aVNFMTBDbGt5T1hSaVdGWjFZVmhTTlV3eVJtcGtSMngyWW01TmRtTnVWblZqZVRnd1RWUkJORTE2VVRWTlJFMDFUVU01YUdSSVVteGlXRUl3WTNrNGVFMUNXVWNLUTJselIwRlJVVUpuTnpoM1FWSlpSVU5CZDBkalNGWnBZa2RzYWsxRldVZERhWE5IUVZGUlFtYzNPSGRCVW1kRlQwRjNNbU50Vm5kaWVuQnZaRmRrYmdwaFZ6VnVXbTFHYWxwVE9YSmFXRXAxV2xkNGVreFhUblppVnpFeFltMXNNR1ZVY0hsYVYxazJZMjFXYldONU9XOWFWMFpyWTNrNWRGbFhiSFZOU1VkTENrSm5iM0pDWjBWRlFXUmFOVUZuVVVOQ1NIZEZaV2RDTkVGSVdVRXpWREIzWVhOaVNFVlVTbXBIVWpSamJWZGpNMEZ4U2t0WWNtcGxVRXN6TDJnMGNIa0taME00Y0Rkdk5FRkJRVWRvYWxwTVVGZG5RVUZDUVUxQlVucENSa0ZwUlVFclVrRkdkVkIxUkc0d1ZUTk9SRzlJU0dkcWRFbDJiM1p3Y0doNGNESTVkd3BKZW0xcWQwdENOMWRFWjBOSlNDOW1NRE5GYm5sT1EwMVJaVEJVVkdJMk5YVlJUeTk1YWtZdlJUUXZjbVp0VEVSVE5uaEhjMmM0U0UxQmIwZERRM0ZIQ2xOTk5EbENRVTFFUVRKalFVMUhVVU5OUVhoaVkxcFlia1Z6V1c0MGFGWTNkMDFwZW5RMFVVdFZSMVZXYjJvNGJFWkpaRTh2UlhKTmFFSTNPRFY2VkZVS1pXWlVhRFkxWkZGS1QwNVJPRmRTV25CM1NYZGFLekJHTW5JMGFsRXhZa1F3V25oWFlWTlZiMFJPTDBaaFZHODVOVzUyYm0xSkwyRTJaa2hEYmtad1JncHlhVGhLUW5aR1FXMHZhR1Y2V0hrMWNWUTVLd290TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In19fX0="}], "timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbcGCyqGSIb3DQEJEAEEoIGnBIGkMIGhAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgF8ijXrOM/3mAc6fw7E+5lwT4/3RWXLI0u1t+qHAL19MCFEUEsjeFVC/FQSkWpn49DL8O+GZNGA8yMDI2MTAzMDE2MDkzMVowAwIBAaAypDAwLjEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MRUwEwYDVQQDEwxzaWdzdG9yZS10c2GgADGCAdswggHXAgEBMFEwOTEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MSAwHgYDVQQDExdzaWdzdG9yZS10c2Etc2VsZnNpZ25lZAIUOhNULwyQYe68wUMvy4qOiyojiwwwCwYJYIZIAWUDBAIBoIH8MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYxMDMwMTYwOTMxWjAvBgkqhkiG9w0BCQQxIgQgz/bEPjNq7w6tKBMWNPot4ETin0A7Fasid9/3yTDLtDkwgY4GCyqGSIb3DQEJEAIvMX8wfTB7MHkEIIX5J7wHq2LKw7RDVsEO/IGyxog/2nq55thw2dE6zQW3MFUwPaQ7MDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAoGCCqGSM49BAMCBGcwZQIxAK+3XgObUiP99wp19h8R3zCcD68LU7L5ggjHwABsx5ZEQHAKmv64BF8pUuvjKPgaygIwOsHohVpKWk2f0gv9S72moChClCFYwxX7DkNKFvN/pgfcy/eGSyL1m5mjwXPS4snc"}]}}, "messageSignature":{"messageDigest":{"algorithm":"SHA2_256", "digest":"NBCW0V9/07lPjqWGkQC/CqTJFpopg4mdIRkmYezFG08="}, "signature":"MEYCIQC+uxdBsLPHw2IVsythBr5SHMmv/R5cM5DVuBw2T9BwOwIhAKN8TAzf9sC8OE6eCzpudeS41TEvgoqb62lRjgZ4x7gi"}}
build/torch-cuda/symbols.json CHANGED
@@ -1,11 +1,11 @@
1
  {
2
  "schema_version": 1,
3
- "module": "_fla_cuda_faa8674",
4
  "functions": [
5
  {
6
  "name": "chunk_kda",
7
  "qualname": "chunk_kda",
8
- "module": "_fla_cuda_faa8674.ops.kda.chunk",
9
  "kind": "function",
10
  "doc": "Args:\n q (torch.Tensor):\n queries of shape ``[B, T, H, K]``.\n k (torch.Tensor):\n keys of shape ``[B, T, H, K]``.\n v (torch.Tensor):\n values of shape ``[B, T, HV, V]``.\n GVA (Grouped Value Attention) is applied if ``HV > H``, where ``HV`` must be divisible by ``H``.\n g (torch.Tensor):\n (forget) gating tensor (in log space!) of shape ``[B, T, HV, K]``.\n When ``use_gate_in_kernel=False`` (default), ``g`` should be the pre-computed decay value.\n When ``use_gate_in_kernel=True``, ``g`` is the raw input before gate activation;\n the kernel fuses ``-exp(A_log) * softplus(g + dt_bias)`` + chunk cumsum internally.\n beta (torch.Tensor):\n betas of shape ``[B, T, HV]``.\n scale (float, Optional):\n Scale factor for the KDA attention scores.\n If not provided, it will default to ``1 / sqrt(K)``. Default: ``None``.\n initial_state (torch.Tensor, Optional):\n Initial state of shape ``[N, HV, K, V]`` for ``N`` input sequences.\n For equal-length input sequences, ``N`` equals the batch size ``B``.\n Default: ``None``.\n output_final_state (bool, Optional):\n Whether to output the final state of shape ``[N, HV, K, V]``. Default: ``False``.\n use_qk_l2norm_in_kernel (bool, Optional):\n Whether to apply L2norm to the q,k tensor internally. Default: ``False``.\n use_gate_in_kernel (bool, Optional):\n Whether to compute the log-space KDA decay internally.\n - If ``True``:\n The passed ``g`` acts as the raw input for ``-exp(A_log) * softplus(g + dt_bias.view(HV, K))``.\n Note that as part of the input arguments,\n ``A_log`` (shape ``[HV]``) and the optional ``dt_bias`` (shape ``[HV * K]``) should be provided.\n When ``lower_bound`` is set, ``A_log`` may be ``None``,\n in which case the gate is ``lower_bound * sigmoid(g + dt_bias)``.\n - If ``False``, ``g`` is expected to be the pre-computed decay value.\n Default: ``False``.\n use_beta_sigmoid_in_kernel (bool, Optional):\n Whether to apply ``torch.sigmoid(beta)`` before launching the chunk kernel.\n - If ``True``, the passed ``beta`` acts as the raw beta logits.\n - If ``False``, ``beta`` is expected to already be in post-sigmoid space.\n Default: ``False``.\n allow_neg_eigval (bool, Optional):\n Whether to allow negative eigenvalues by scaling ``beta`` to ``[0, 2)``.\n Only takes effect together with ``use_beta_sigmoid_in_kernel=True``,\n in which case the kernel computes ``2 * sigmoid(beta)`` instead of ``sigmoid(beta)``.\n Default: ``False``.\n safe_gate (bool, Optional):\n Whether to enable M=16 TensorCore acceleration for bounded gates.\n With ``use_gate_in_kernel=True``, requires ``lower_bound`` and bounds gates to ``[lower_bound, 0)``.\n Otherwise, the caller must provide pre-computed bounded gates.\n Default: ``False``.\n lower_bound (float, Optional):\n Lower bound for the forget gate (in log space). When set together with ``safe_gate=True``,\n the gate uses ``lower_bound * sigmoid(exp(A_log) * (g + dt_bias))``,\n replacing ``-exp(A_log) * softplus(g + dt_bias)`` and clamping the output to ``[lower_bound, 0)``.\n Recommended value: ``-5`` (i.e., per-step decay ``exp(-5) ≈ 0.0067``).\n Default: ``None``.\n disable_recompute (bool, Optional):\n Whether to disable gradient recomputation in the kernel. When ``True``,\n the kernel will save all intermediate activations for backward pass,\n which is beneficial for training small models at the cost of increased memory usage. Default: ``False``.\n return_intermediate_states (bool, Optional):\n If ``True``, returns intermediate state ``h`` for inference scenarios (e.g., vLLM).\n Must be used within ``torch.inference_mode()`` and will return a 3-tuple instead of 2-tuple.\n This is not intended for training as it bypasses autograd. Default: ``False``.\n state_v_first (bool, Optional):\n Store the recurrent state in V-first ``[V, K]`` layout instead of the default ``[K, V]``. Default: ``False``.\n cu_seqlens (torch.LongTensor, Optional):\n Cumulative sequence lengths of shape ``[N+1]`` used for variable-length training,\n consistent with the FlashAttention API. Default: `None`.\n cu_seqlens_cpu (torch.LongTensor, Optional):\n Cumulative sequence lengths of shape ``[N+1]`` used for variable-length training,\n consistent with the FlashAttention API. Default: `None`.\n cp_context (FLACPContext, Optional):\n Context parallel context for distributed training across multiple devices.\n When provided, ``initial_state`` and ``output_final_state`` are not supported,\n and ``cu_seqlens`` will be overridden by the context. Default: ``None``.\n use_graph (bool, Optional):\n Whether to build a fixed-shape varlen chunk list on-device for CUDA or NPU graph capture.\n Forward and backward can then be replayed after only the contents of ``cu_seqlens`` change. Requires:\n\n - Pad ``cu_seqlens`` with zero-length tail sequences to exactly ``max_num_seqs + 1`` entries;\n kernels return immediately on sentinel rows (segment id < 0),\n so output/gradient rows not covered by real tokens are left undefined.\n - Shape ``initial_state`` and the incoming ``dht`` gradient (when used) as ``[max_num_seqs, ...]``.\n - Warm up the captured step eagerly so kernel autotuning runs outside the graph;\n with ``cp_context``, this also includes NCCL communicator setup.\n\n With ``cp_context``, the cross-rank state all-gathers are recorded into the graph. This additionally requires:\n\n - A graph-capturable (non-blocking) NCCL communicator;\n all ranks must capture and replay the same collectives in the same order.\n - A persistent padded ``cp_context.cu_seqlens`` buffer, refreshed in place before each replay.\n - Persistent int32 device scalars ``cp_context.pre_num_ranks_dev`` and ``post_num_ranks_dev``,\n refreshed in place before each replay.\n\n Ascend currently requires flattened variable-length inputs and does not support context parallelism in graph mode.\n ``disable_recompute=True`` is not supported. Default: ``False``.\n max_num_seqs (int, Optional):\n Static upper bound of the sequence count used together with ``use_graph``.\n Uses ``cu_seqlens.shape[0] - 1`` when omitted. Default: ``None``.\n\nReturns:\n - Normal mode (return_intermediate_states=False): A tuple (o, final_state)\n o (torch.Tensor):\n Outputs of shape ``[B, T, HV, V]``.\n final_state (torch.Tensor):\n Final state of shape ``[N, HV, K, V]`` if ``output_final_state=True`` else ``None``.\n - Inference mode (return_intermediate_states=True): A tuple (o, final_state, h)\n o (torch.Tensor):\n Outputs of shape ``[B, T, HV, V]``.\n final_state (torch.Tensor):\n Final state of shape ``[N, HV, K, V]`` if ``output_final_state=True`` else ``None``.\n h (torch.Tensor):\n Intermediate states of shape ``[B, NT, HV, K, V]`` and dtype ``bfloat16``.\n - For equal-length sequences: ``NT = ceil(T / chunk_size)``\n - For variable-length sequences (cu_seqlens): B is always 1 (flattened),\n NT is the total number of chunks across all sequences.\n\nExamples::\n >>> import torch\n >>> import torch.nn.functional as F\n >>> from einops import rearrange\n >>> from fla.ops.kda import chunk_kda\n # inputs with equal lengths (no GVA, HV == H)\n >>> B, T, H, K, V = 4, 2048, 4, 512, 512\n >>> q = torch.randn(B, T, H, K, dtype=torch.bfloat16, device='cuda')\n >>> k = torch.randn(B, T, H, K, dtype=torch.bfloat16, device='cuda')\n >>> v = torch.randn(B, T, H, V, dtype=torch.bfloat16, device='cuda')\n >>> beta = torch.rand(B, T, H, dtype=torch.bfloat16, device='cuda')\n >>> g = torch.rand(B, T, H, K, dtype=torch.bfloat16, device='cuda')\n >>> h0 = torch.randn(B, H, K, V, dtype=torch.bfloat16, device='cuda')\n >>> A_log = torch.randn(H, dtype=torch.float32, device='cuda')\n >>> dt_bias = torch.randn(H * K, dtype=torch.float32, device='cuda')\n >>> o, ht = chunk_kda(\n ... q=q,\n ... k=k,\n ... v=v,\n ... g=g,\n ... beta=beta,\n ... initial_state=h0,\n ... output_final_state=True,\n ... use_qk_l2norm_in_kernel=True,\n ... use_gate_in_kernel=True,\n ... A_log=A_log,\n ... dt_bias=dt_bias,\n ... )\n # GVA mode (HV > H)\n # 2x more value heads than qk heads\n >>> HV = 8\n >>> v = torch.randn(B, T, HV, V, dtype=torch.bfloat16, device='cuda')\n >>> g = torch.rand(B, T, HV, K, dtype=torch.bfloat16, device='cuda')\n >>> beta = torch.rand(B, T, HV, dtype=torch.bfloat16, device='cuda')\n >>> h0 = torch.randn(B, HV, K, V, dtype=torch.bfloat16, device='cuda')\n >>> A_log = torch.randn(HV, dtype=torch.float32, device='cuda')\n >>> dt_bias = torch.randn(HV * K, dtype=torch.float32, device='cuda')\n >>> o, ht = chunk_kda(\n ... q=q,\n ... k=k,\n ... v=v,\n ... g=g,\n ... beta=beta,\n ... initial_state=h0,\n ... output_final_state=True,\n ... use_qk_l2norm_in_kernel=True,\n ... use_gate_in_kernel=True,\n ... A_log=A_log,\n ... dt_bias=dt_bias,\n ... )\n # for variable-length inputs, the batch size `B` is expected to be 1 and `cu_seqlens` is required\n >>> q, k, v, beta, g = map(lambda x: rearrange(x, 'b t ... -> 1 (b t) ...'), (q, k, v, beta, g))\n # for a batch with 4 sequences, `cu_seqlens` with 5 start/end positions are expected\n >>> cu_seqlens = q.new_tensor([0, 2048, 4096, 6144, 8192], dtype=torch.long)\n >>> o, ht = chunk_kda(\n ... q=q,\n ... k=k,\n ... v=v,\n ... g=g,\n ... beta=beta,\n ... initial_state=h0,\n ... output_final_state=True,\n ... use_qk_l2norm_in_kernel=True,\n ... use_gate_in_kernel=True,\n ... cu_seqlens=cu_seqlens,\n ... A_log=A_log,\n ... dt_bias=dt_bias,\n ... )",
11
  "signature": {
@@ -128,7 +128,7 @@
128
  "name": "cp_context",
129
  "kind": "POSITIONAL_OR_KEYWORD",
130
  "default": "None",
131
- "annotation": "_fla_cuda_faa8674.ops.cp.context.FLACPContext | None"
132
  },
133
  {
134
  "name": "use_graph",
@@ -155,7 +155,7 @@
155
  {
156
  "name": "fused_recurrent_kda",
157
  "qualname": "fused_recurrent_kda",
158
- "module": "_fla_cuda_faa8674.ops.kda.fused_recurrent",
159
  "kind": "function",
160
  "doc": "Args:\n q (torch.Tensor):\n queries of shape `[B, T, H, K]`.\n k (torch.Tensor):\n keys of shape `[B, T, H, K]`.\n v (torch.Tensor):\n values of shape `[B, T, HV, V]`.\n GVA is applied if `HV > H`.\n g (torch.Tensor):\n g (decays) of shape `[B, T, HV, K]`.\n beta (torch.Tensor):\n betas of shape `[B, T, HV]`.\n A_log (Optional[torch.Tensor]):\n Decay parameter of shape `[HV]`.\n When `use_gate_in_kernel=True` together with `lower_bound`,\n may be `None` to use `lower_bound * sigmoid(g + dt_bias)`.\n dt_bias (Optional[torch.Tensor]):\n Bias added to `g` before activation, of shape `[HV]`. Only used when `use_gate_in_kernel=True`.\n scale (Optional[float]):\n Scale factor for the RetNet attention scores.\n If not provided, it will default to `1 / sqrt(K)`. Default: `None`.\n initial_state (Optional[torch.Tensor]):\n Initial state of shape `[N, HV, K, V]` for `N` input sequences.\n For equal-length input sequences, `N` equals the batch size `B`.\n Default: `None`.\n output_final_state (Optional[bool]):\n Whether to output the final state of shape `[N, HV, K, V]`. Default: `False`.\n use_qk_l2norm_in_kernel (Optional[bool]):\n Whether to use L2 normalization in the kernel. Default: `False`.\n use_gate_in_kernel (Optional[bool]):\n Whether to compute the log-space KDA decay internally.\n When `True`, `g` is the raw input and the kernel fuses gate activation into the recurrence.\n Default: `False`.\n use_beta_sigmoid_in_kernel (Optional[bool]):\n Whether to apply `torch.sigmoid(beta)` inside the kernel.\n - If `True`, the passed `beta` acts as the raw beta logits.\n - If `False`, `beta` is expected to already be in post-sigmoid space.\n Default: `False`.\n allow_neg_eigval (Optional[bool]):\n Whether to allow negative eigenvalues by scaling `beta` to `[0, 2)`.\n Only takes effect together with `use_beta_sigmoid_in_kernel=True`, in which case\n the kernel computes `2 * sigmoid(beta)` instead of `sigmoid(beta)`. Default: `False`.\n lower_bound (Optional[float]):\n Lower bound for the forget gate (in log space). Only used when `use_gate_in_kernel=True`. Default: `None`.\n state_v_first (Optional[bool]):\n Store the recurrent state in V-first ``[V, K]`` layout instead of the default ``[K, V]``. Default: ``False``.\n cu_seqlens (torch.LongTensor):\n Cumulative sequence lengths of shape `[N+1]` used for variable-length training,\n consistent with the FlashAttention API.\n\nReturns:\n o (torch.Tensor):\n Outputs of shape `[B, T, HV, V]`.\n final_state (torch.Tensor):\n Final state of shape `[N, HV, K, V]` if `output_final_state=True` else `None`.\n\nExamples::\n >>> import torch\n >>> import torch.nn.functional as F\n >>> from einops import rearrange\n >>> from fla.ops.kda import fused_recurrent_kda\n # inputs with equal lengths\n >>> B, T, H, HV, K, V = 4, 2048, 4, 8, 512, 512\n >>> q = torch.randn(B, T, H, K, device='cuda')\n >>> k = F.normalize(torch.randn(B, T, H, K, device='cuda'), p=2, dim=-1)\n >>> v = torch.randn(B, T, HV, V, device='cuda')\n >>> g = F.logsigmoid(torch.rand(B, T, HV, K, device='cuda'))\n >>> beta = torch.rand(B, T, HV, device='cuda').sigmoid()\n >>> h0 = torch.randn(B, HV, K, V, device='cuda')\n >>> o, ht = fused_recurrent_kda(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True\n )\n # for variable-length inputs, the batch size `B` is expected to be 1 and `cu_seqlens` is required\n >>> q, k, v, g, beta = map(lambda x: rearrange(x, 'b t ... -> 1 (b t) ...'), (q, k, v, g, beta))\n # for a batch with 4 sequences, `cu_seqlens` with 5 start/end positions are expected\n >>> cu_seqlens = q.new_tensor([0, 2048, 4096, 6144, 8192], dtype=torch.long)\n >>> o_var, ht_var = fused_recurrent_kda(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True,\n cu_seqlens=cu_seqlens\n )",
161
  "signature": {
@@ -275,7 +275,7 @@
275
  {
276
  "name": "chunk_gated_delta_rule",
277
  "qualname": "chunk_gated_delta_rule",
278
- "module": "_fla_cuda_faa8674.ops.gated_delta_rule.chunk",
279
  "kind": "function",
280
  "doc": "Args:\n q (torch.Tensor):\n queries of shape `[B, T, H, K]`.\n k (torch.Tensor):\n keys of shape `[B, T, H, K]`.\n v (torch.Tensor):\n values of shape `[B, T, HV, V]`.\n GVA (Grouped Value Attention) is applied if `HV > H`, where `HV` must be divisible by `H`.\n g (torch.Tensor):\n (forget) gating tensor of shape `[B, T, HV]`.\n When `use_gate_in_kernel=False` (default), `g` should be in log space (pre-computed decay).\n When `use_gate_in_kernel=True`, `g` is the raw input before gate activation;\n the kernel fuses `-exp(A_log) * softplus(g + dt_bias)` + chunk cumsum internally.\n beta (torch.Tensor):\n betas of shape `[B, T, HV]`.\n scale (Optional[float]):\n Scale factor for the RetNet attention scores.\n If not provided, it will default to `1 / sqrt(K)`. Default: `None`.\n initial_state (Optional[torch.Tensor]):\n Initial state of shape `[N, HV, K, V]` for `N` input sequences.\n For equal-length input sequences, `N` equals the batch size `B`.\n Default: `None`.\n output_final_state (Optional[bool]):\n Whether to output the final state of shape `[N, HV, K, V]`. Default: `False`.\n use_qk_l2norm_in_kernel (bool):\n Whether to apply L2norm to the q/k tensor internally. Default: `False`.\n use_gate_in_kernel (bool):\n Whether to compute the log-space GDN decay internally.\n When `True`, the passed `g` is the raw input, and `A_log` must be provided.\n The kernel fuses gate activation + chunk cumsum in a single pass.\n Default: `False`.\n A_log (Optional[torch.Tensor]):\n Decay parameter of shape `[HV]`. Required when `use_gate_in_kernel=True`.\n dt_bias (Optional[torch.Tensor]):\n Bias added to `g` before activation, of shape `[HV]`.\n Only used when `use_gate_in_kernel=True`.\n use_beta_sigmoid_in_kernel (bool):\n Whether to apply `torch.sigmoid(beta)` before launching the chunk kernel.\n - If `True`, the passed `beta` acts as the raw beta logits.\n - If `False`, `beta` is expected to already be in post-sigmoid space.\n Default: `False`.\n allow_neg_eigval (bool):\n Whether to allow negative eigenvalues by scaling `beta` to `[0, 2)`.\n Only takes effect together with `use_beta_sigmoid_in_kernel=True`, in which case\n the kernel computes `2 * sigmoid(beta)` instead of `sigmoid(beta)`. Default: `False`.\n state_v_first (Optional[bool]):\n Store the recurrent state in V-first ``[V, K]`` layout instead of the default ``[K, V]``. Default: ``False``.\n cu_seqlens (torch.LongTensor):\n Cumulative sequence lengths of shape `[N+1]` used for variable-length training,\n consistent with the FlashAttention API.\n chunk_indices (Optional[torch.LongTensor]):\n Pre-computed chunk indices for variable-length inputs.\n If provided, they are used directly instead of being computed from `cu_seqlens`. Default: `None`.\n cp_context (Optional[FLACPContext]):\n Context parallel context for distributed training across multiple devices.\n When provided, `initial_state` and `output_final_state` are not supported,\n and `cu_seqlens` will be overridden by the context. Default: `None`.\n\nReturns:\n o (torch.Tensor):\n Outputs of shape `[B, T, HV, V]`.\n final_state (torch.Tensor):\n Final state of shape `[N, HV, K, V]` if `output_final_state=True` else `None`.\n\nExamples::\n >>> import torch\n >>> import torch.nn.functional as F\n >>> from einops import rearrange\n >>> from fla.ops.gated_delta_rule import chunk_gated_delta_rule\n # inputs with equal lengths\n >>> B, T, H, HV, K, V = 4, 2048, 4, 8, 512, 512\n >>> q = torch.randn(B, T, H, K, dtype=torch.bfloat16, device='cuda')\n >>> k = F.normalize(torch.randn(B, T, H, K, dtype=torch.bfloat16, device='cuda'), p=2, dim=-1)\n >>> v = torch.randn(B, T, HV, V, dtype=torch.bfloat16, device='cuda')\n >>> beta = torch.rand(B, T, HV, dtype=torch.bfloat16, device='cuda').sigmoid()\n >>> g = F.logsigmoid(torch.rand(B, T, HV, dtype=torch.bfloat16, device='cuda'))\n >>> h0 = torch.randn(B, HV, K, V, dtype=torch.bfloat16, device='cuda')\n >>> o, ht = chunk_gated_delta_rule(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True\n )\n # for variable-length inputs, the batch size `B` is expected to be 1 and `cu_seqlens` is required\n >>> q, k, v, beta, g = map(lambda x: rearrange(x, 'b t ... -> 1 (b t) ...'), (q, k, v, beta, g))\n # for a batch with 4 sequences, `cu_seqlens` with 5 start/end positions are expected\n >>> cu_seqlens = q.new_tensor([0, 2048, 4096, 6144, 8192], dtype=torch.long)\n >>> o, ht = chunk_gated_delta_rule(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True,\n cu_seqlens=cu_seqlens\n )",
281
  "signature": {
@@ -374,7 +374,7 @@
374
  "name": "cp_context",
375
  "kind": "POSITIONAL_OR_KEYWORD",
376
  "default": "None",
377
- "annotation": "_fla_cuda_faa8674.ops.cp.context.FLACPContext | None"
378
  },
379
  {
380
  "name": "kwargs",
@@ -389,7 +389,7 @@
389
  {
390
  "name": "fused_recurrent_gated_delta_rule",
391
  "qualname": "fused_recurrent_gated_delta_rule",
392
- "module": "_fla_cuda_faa8674.ops.gated_delta_rule.fused_recurrent",
393
  "kind": "function",
394
  "doc": "Args:\n q (torch.Tensor):\n queries of shape `[B, T, H, K]`.\n k (torch.Tensor):\n keys of shape `[B, T, H, K]`.\n v (torch.Tensor):\n values of shape `[B, T, HV, V]`.\n GVA (Grouped Value Attention) is applied if `HV > H`, where `HV` must be divisible by `H`.\n g (torch.Tensor):\n g (decays) of shape `[B, T, HV]`. Default: `None`.\n When `use_gate_in_kernel=False` (default), `g` must be in log space (pre-computed decay).\n When `use_gate_in_kernel=True`, `g` is the raw pre-activation input; the kernel fuses\n `-exp(A_log) * softplus(g + dt_bias)` internally per step.\n gk (torch.Tensor):\n gk (decays) of shape `[B, T, HV, K]`. Default: `None`.\n gv (torch.Tensor):\n gv (decays) of shape `[B, T, HV, V]`. Default: `None`.\n beta (torch.Tensor):\n betas of shape `[B, T, HV]`.\n scale (Optional[float]):\n Scale factor for the RetNet attention scores.\n If not provided, it will default to `1 / sqrt(K)`. Default: `None`.\n initial_state (Optional[torch.Tensor]):\n Initial state of shape `[N, HV, K, V]` for `N` input sequences.\n For equal-length input sequences, `N` equals the batch size `B`.\n Default: `None`.\n output_final_state (Optional[bool]):\n Whether to output the final state of shape `[N, HV, K, V]`. Default: `False`.\n use_qk_l2norm_in_kernel (Optional[bool]):\n Whether to use L2 normalization in the kernel. Default: `False`.\n use_gate_in_kernel (bool):\n Whether to compute the log-space GDN decay internally.\n When `True`, `g` is the raw input and `A_log` must be provided; the kernel fuses\n gate activation into the recurrence. Default: `False`.\n A_log (Optional[torch.Tensor]):\n Decay parameter of shape `[HV]`. Required when `use_gate_in_kernel=True`.\n dt_bias (Optional[torch.Tensor]):\n Bias added to `g` before activation, of shape `[HV]`.\n Only used when `use_gate_in_kernel=True`.\n use_beta_sigmoid_in_kernel (Optional[bool]):\n Whether to apply `torch.sigmoid(beta)` inside the kernel.\n - If `True`, the passed `beta` acts as the raw beta logits.\n - If `False`, `beta` is expected to already be in post-sigmoid space.\n Default: `False`.\n allow_neg_eigval (Optional[bool]):\n Whether to allow negative eigenvalues by scaling `beta` to `[0, 2)`.\n Only takes effect together with `use_beta_sigmoid_in_kernel=True`, in which case\n the kernel computes `2 * sigmoid(beta)` instead of `sigmoid(beta)`. Default: `False`.\n state_v_first (Optional[bool]):\n Store the recurrent state in V-first ``[V, K]`` layout instead of the default ``[K, V]``. Default: ``False``.\n cu_seqlens (torch.LongTensor):\n Cumulative sequence lengths of shape `[N+1]` used for variable-length training,\n consistent with the FlashAttention API.\n\nReturns:\n o (torch.Tensor):\n Outputs of shape `[B, T, HV, V]`.\n final_state (torch.Tensor):\n Final state of shape `[N, HV, K, V]` if `output_final_state=True` else `None`.\n\nExamples::\n >>> import torch\n >>> import torch.nn.functional as F\n >>> from einops import rearrange\n >>> from fla.ops.gated_delta_rule import fused_recurrent_gated_delta_rule\n # inputs with equal lengths\n >>> B, T, H, HV, K, V = 4, 2048, 4, 8, 512, 512\n >>> q = torch.randn(B, T, H, K, device='cuda')\n >>> k = F.normalize(torch.randn(B, T, H, K, device='cuda'), p=2, dim=-1)\n >>> v = torch.randn(B, T, HV, V, device='cuda')\n >>> g = F.logsigmoid(torch.rand(B, T, HV, device='cuda'))\n >>> beta = torch.rand(B, T, HV, device='cuda').sigmoid()\n >>> h0 = torch.randn(B, HV, K, V, device='cuda')\n >>> o, ht = fused_gated_recurrent_delta_rule(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True\n )\n # for variable-length inputs, the batch size `B` is expected to be 1 and `cu_seqlens` is required\n >>> q, k, v, g, beta = map(lambda x: rearrange(x, 'b t ... -> 1 (b t) ...'), (q, k, v, g, beta))\n # for a batch with 4 sequences, `cu_seqlens` with 5 start/end positions are expected\n >>> cu_seqlens = q.new_tensor([0, 2048, 4096, 6144, 8192], dtype=torch.long)\n >>> o, ht = fused_gated_recurrent_delta_rule(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True,\n cu_seqlens=cu_seqlens\n )",
395
  "signature": {
@@ -517,7 +517,7 @@
517
  {
518
  "name": "FusedRMSNormGated",
519
  "qualname": "FusedRMSNormGated",
520
- "module": "_fla_cuda_faa8674.layers",
521
  "kind": "class",
522
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
523
  "signature": {
@@ -545,7 +545,7 @@
545
  {
546
  "name": "chunk_kimi_delta_attention",
547
  "qualname": "chunk_kimi_delta_attention",
548
- "module": "_fla_cuda_faa8674.layers",
549
  "kind": "class",
550
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
551
  "signature": {
@@ -573,7 +573,7 @@
573
  {
574
  "name": "recurrent_kimi_delta_attention",
575
  "qualname": "recurrent_kimi_delta_attention",
576
- "module": "_fla_cuda_faa8674.layers",
577
  "kind": "class",
578
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
579
  "signature": {
@@ -601,7 +601,7 @@
601
  {
602
  "name": "chunk_gated_delta_rule",
603
  "qualname": "chunk_gated_delta_rule",
604
- "module": "_fla_cuda_faa8674.layers",
605
  "kind": "class",
606
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
607
  "signature": {
@@ -629,7 +629,7 @@
629
  {
630
  "name": "recurrent_gated_delta_rule",
631
  "qualname": "recurrent_gated_delta_rule",
632
- "module": "_fla_cuda_faa8674.layers",
633
  "kind": "class",
634
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
635
  "signature": {
 
1
  {
2
  "schema_version": 1,
3
+ "module": "_fla_cuda_5fe9dbb",
4
  "functions": [
5
  {
6
  "name": "chunk_kda",
7
  "qualname": "chunk_kda",
8
+ "module": "_fla_cuda_5fe9dbb.ops.kda.chunk",
9
  "kind": "function",
10
  "doc": "Args:\n q (torch.Tensor):\n queries of shape ``[B, T, H, K]``.\n k (torch.Tensor):\n keys of shape ``[B, T, H, K]``.\n v (torch.Tensor):\n values of shape ``[B, T, HV, V]``.\n GVA (Grouped Value Attention) is applied if ``HV > H``, where ``HV`` must be divisible by ``H``.\n g (torch.Tensor):\n (forget) gating tensor (in log space!) of shape ``[B, T, HV, K]``.\n When ``use_gate_in_kernel=False`` (default), ``g`` should be the pre-computed decay value.\n When ``use_gate_in_kernel=True``, ``g`` is the raw input before gate activation;\n the kernel fuses ``-exp(A_log) * softplus(g + dt_bias)`` + chunk cumsum internally.\n beta (torch.Tensor):\n betas of shape ``[B, T, HV]``.\n scale (float, Optional):\n Scale factor for the KDA attention scores.\n If not provided, it will default to ``1 / sqrt(K)``. Default: ``None``.\n initial_state (torch.Tensor, Optional):\n Initial state of shape ``[N, HV, K, V]`` for ``N`` input sequences.\n For equal-length input sequences, ``N`` equals the batch size ``B``.\n Default: ``None``.\n output_final_state (bool, Optional):\n Whether to output the final state of shape ``[N, HV, K, V]``. Default: ``False``.\n use_qk_l2norm_in_kernel (bool, Optional):\n Whether to apply L2norm to the q,k tensor internally. Default: ``False``.\n use_gate_in_kernel (bool, Optional):\n Whether to compute the log-space KDA decay internally.\n - If ``True``:\n The passed ``g`` acts as the raw input for ``-exp(A_log) * softplus(g + dt_bias.view(HV, K))``.\n Note that as part of the input arguments,\n ``A_log`` (shape ``[HV]``) and the optional ``dt_bias`` (shape ``[HV * K]``) should be provided.\n When ``lower_bound`` is set, ``A_log`` may be ``None``,\n in which case the gate is ``lower_bound * sigmoid(g + dt_bias)``.\n - If ``False``, ``g`` is expected to be the pre-computed decay value.\n Default: ``False``.\n use_beta_sigmoid_in_kernel (bool, Optional):\n Whether to apply ``torch.sigmoid(beta)`` before launching the chunk kernel.\n - If ``True``, the passed ``beta`` acts as the raw beta logits.\n - If ``False``, ``beta`` is expected to already be in post-sigmoid space.\n Default: ``False``.\n allow_neg_eigval (bool, Optional):\n Whether to allow negative eigenvalues by scaling ``beta`` to ``[0, 2)``.\n Only takes effect together with ``use_beta_sigmoid_in_kernel=True``,\n in which case the kernel computes ``2 * sigmoid(beta)`` instead of ``sigmoid(beta)``.\n Default: ``False``.\n safe_gate (bool, Optional):\n Whether to enable M=16 TensorCore acceleration for bounded gates.\n With ``use_gate_in_kernel=True``, requires ``lower_bound`` and bounds gates to ``[lower_bound, 0)``.\n Otherwise, the caller must provide pre-computed bounded gates.\n Default: ``False``.\n lower_bound (float, Optional):\n Lower bound for the forget gate (in log space). When set together with ``safe_gate=True``,\n the gate uses ``lower_bound * sigmoid(exp(A_log) * (g + dt_bias))``,\n replacing ``-exp(A_log) * softplus(g + dt_bias)`` and clamping the output to ``[lower_bound, 0)``.\n Recommended value: ``-5`` (i.e., per-step decay ``exp(-5) ≈ 0.0067``).\n Default: ``None``.\n disable_recompute (bool, Optional):\n Whether to disable gradient recomputation in the kernel. When ``True``,\n the kernel will save all intermediate activations for backward pass,\n which is beneficial for training small models at the cost of increased memory usage. Default: ``False``.\n return_intermediate_states (bool, Optional):\n If ``True``, returns intermediate state ``h`` for inference scenarios (e.g., vLLM).\n Must be used within ``torch.inference_mode()`` and will return a 3-tuple instead of 2-tuple.\n This is not intended for training as it bypasses autograd. Default: ``False``.\n state_v_first (bool, Optional):\n Store the recurrent state in V-first ``[V, K]`` layout instead of the default ``[K, V]``. Default: ``False``.\n cu_seqlens (torch.LongTensor, Optional):\n Cumulative sequence lengths of shape ``[N+1]`` used for variable-length training,\n consistent with the FlashAttention API. Default: `None`.\n cu_seqlens_cpu (torch.LongTensor, Optional):\n Cumulative sequence lengths of shape ``[N+1]`` used for variable-length training,\n consistent with the FlashAttention API. Default: `None`.\n cp_context (FLACPContext, Optional):\n Context parallel context for distributed training across multiple devices.\n When provided, ``initial_state`` and ``output_final_state`` are not supported,\n and ``cu_seqlens`` will be overridden by the context. Default: ``None``.\n use_graph (bool, Optional):\n Whether to build a fixed-shape varlen chunk list on-device for CUDA or NPU graph capture.\n Forward and backward can then be replayed after only the contents of ``cu_seqlens`` change. Requires:\n\n - Pad ``cu_seqlens`` with zero-length tail sequences to exactly ``max_num_seqs + 1`` entries;\n kernels return immediately on sentinel rows (segment id < 0),\n so output/gradient rows not covered by real tokens are left undefined.\n - Shape ``initial_state`` and the incoming ``dht`` gradient (when used) as ``[max_num_seqs, ...]``.\n - Warm up the captured step eagerly so kernel autotuning runs outside the graph;\n with ``cp_context``, this also includes NCCL communicator setup.\n\n With ``cp_context``, the cross-rank state all-gathers are recorded into the graph. This additionally requires:\n\n - A graph-capturable (non-blocking) NCCL communicator;\n all ranks must capture and replay the same collectives in the same order.\n - A persistent padded ``cp_context.cu_seqlens`` buffer, refreshed in place before each replay.\n - Persistent int32 device scalars ``cp_context.pre_num_ranks_dev`` and ``post_num_ranks_dev``,\n refreshed in place before each replay.\n\n Ascend currently requires flattened variable-length inputs and does not support context parallelism in graph mode.\n ``disable_recompute=True`` is not supported. Default: ``False``.\n max_num_seqs (int, Optional):\n Static upper bound of the sequence count used together with ``use_graph``.\n Uses ``cu_seqlens.shape[0] - 1`` when omitted. Default: ``None``.\n\nReturns:\n - Normal mode (return_intermediate_states=False): A tuple (o, final_state)\n o (torch.Tensor):\n Outputs of shape ``[B, T, HV, V]``.\n final_state (torch.Tensor):\n Final state of shape ``[N, HV, K, V]`` if ``output_final_state=True`` else ``None``.\n - Inference mode (return_intermediate_states=True): A tuple (o, final_state, h)\n o (torch.Tensor):\n Outputs of shape ``[B, T, HV, V]``.\n final_state (torch.Tensor):\n Final state of shape ``[N, HV, K, V]`` if ``output_final_state=True`` else ``None``.\n h (torch.Tensor):\n Intermediate states of shape ``[B, NT, HV, K, V]`` and dtype ``bfloat16``.\n - For equal-length sequences: ``NT = ceil(T / chunk_size)``\n - For variable-length sequences (cu_seqlens): B is always 1 (flattened),\n NT is the total number of chunks across all sequences.\n\nExamples::\n >>> import torch\n >>> import torch.nn.functional as F\n >>> from einops import rearrange\n >>> from fla.ops.kda import chunk_kda\n # inputs with equal lengths (no GVA, HV == H)\n >>> B, T, H, K, V = 4, 2048, 4, 512, 512\n >>> q = torch.randn(B, T, H, K, dtype=torch.bfloat16, device='cuda')\n >>> k = torch.randn(B, T, H, K, dtype=torch.bfloat16, device='cuda')\n >>> v = torch.randn(B, T, H, V, dtype=torch.bfloat16, device='cuda')\n >>> beta = torch.rand(B, T, H, dtype=torch.bfloat16, device='cuda')\n >>> g = torch.rand(B, T, H, K, dtype=torch.bfloat16, device='cuda')\n >>> h0 = torch.randn(B, H, K, V, dtype=torch.bfloat16, device='cuda')\n >>> A_log = torch.randn(H, dtype=torch.float32, device='cuda')\n >>> dt_bias = torch.randn(H * K, dtype=torch.float32, device='cuda')\n >>> o, ht = chunk_kda(\n ... q=q,\n ... k=k,\n ... v=v,\n ... g=g,\n ... beta=beta,\n ... initial_state=h0,\n ... output_final_state=True,\n ... use_qk_l2norm_in_kernel=True,\n ... use_gate_in_kernel=True,\n ... A_log=A_log,\n ... dt_bias=dt_bias,\n ... )\n # GVA mode (HV > H)\n # 2x more value heads than qk heads\n >>> HV = 8\n >>> v = torch.randn(B, T, HV, V, dtype=torch.bfloat16, device='cuda')\n >>> g = torch.rand(B, T, HV, K, dtype=torch.bfloat16, device='cuda')\n >>> beta = torch.rand(B, T, HV, dtype=torch.bfloat16, device='cuda')\n >>> h0 = torch.randn(B, HV, K, V, dtype=torch.bfloat16, device='cuda')\n >>> A_log = torch.randn(HV, dtype=torch.float32, device='cuda')\n >>> dt_bias = torch.randn(HV * K, dtype=torch.float32, device='cuda')\n >>> o, ht = chunk_kda(\n ... q=q,\n ... k=k,\n ... v=v,\n ... g=g,\n ... beta=beta,\n ... initial_state=h0,\n ... output_final_state=True,\n ... use_qk_l2norm_in_kernel=True,\n ... use_gate_in_kernel=True,\n ... A_log=A_log,\n ... dt_bias=dt_bias,\n ... )\n # for variable-length inputs, the batch size `B` is expected to be 1 and `cu_seqlens` is required\n >>> q, k, v, beta, g = map(lambda x: rearrange(x, 'b t ... -> 1 (b t) ...'), (q, k, v, beta, g))\n # for a batch with 4 sequences, `cu_seqlens` with 5 start/end positions are expected\n >>> cu_seqlens = q.new_tensor([0, 2048, 4096, 6144, 8192], dtype=torch.long)\n >>> o, ht = chunk_kda(\n ... q=q,\n ... k=k,\n ... v=v,\n ... g=g,\n ... beta=beta,\n ... initial_state=h0,\n ... output_final_state=True,\n ... use_qk_l2norm_in_kernel=True,\n ... use_gate_in_kernel=True,\n ... cu_seqlens=cu_seqlens,\n ... A_log=A_log,\n ... dt_bias=dt_bias,\n ... )",
11
  "signature": {
 
128
  "name": "cp_context",
129
  "kind": "POSITIONAL_OR_KEYWORD",
130
  "default": "None",
131
+ "annotation": "_fla_cuda_5fe9dbb.ops.cp.context.FLACPContext | None"
132
  },
133
  {
134
  "name": "use_graph",
 
155
  {
156
  "name": "fused_recurrent_kda",
157
  "qualname": "fused_recurrent_kda",
158
+ "module": "_fla_cuda_5fe9dbb.ops.kda.fused_recurrent",
159
  "kind": "function",
160
  "doc": "Args:\n q (torch.Tensor):\n queries of shape `[B, T, H, K]`.\n k (torch.Tensor):\n keys of shape `[B, T, H, K]`.\n v (torch.Tensor):\n values of shape `[B, T, HV, V]`.\n GVA is applied if `HV > H`.\n g (torch.Tensor):\n g (decays) of shape `[B, T, HV, K]`.\n beta (torch.Tensor):\n betas of shape `[B, T, HV]`.\n A_log (Optional[torch.Tensor]):\n Decay parameter of shape `[HV]`.\n When `use_gate_in_kernel=True` together with `lower_bound`,\n may be `None` to use `lower_bound * sigmoid(g + dt_bias)`.\n dt_bias (Optional[torch.Tensor]):\n Bias added to `g` before activation, of shape `[HV]`. Only used when `use_gate_in_kernel=True`.\n scale (Optional[float]):\n Scale factor for the RetNet attention scores.\n If not provided, it will default to `1 / sqrt(K)`. Default: `None`.\n initial_state (Optional[torch.Tensor]):\n Initial state of shape `[N, HV, K, V]` for `N` input sequences.\n For equal-length input sequences, `N` equals the batch size `B`.\n Default: `None`.\n output_final_state (Optional[bool]):\n Whether to output the final state of shape `[N, HV, K, V]`. Default: `False`.\n use_qk_l2norm_in_kernel (Optional[bool]):\n Whether to use L2 normalization in the kernel. Default: `False`.\n use_gate_in_kernel (Optional[bool]):\n Whether to compute the log-space KDA decay internally.\n When `True`, `g` is the raw input and the kernel fuses gate activation into the recurrence.\n Default: `False`.\n use_beta_sigmoid_in_kernel (Optional[bool]):\n Whether to apply `torch.sigmoid(beta)` inside the kernel.\n - If `True`, the passed `beta` acts as the raw beta logits.\n - If `False`, `beta` is expected to already be in post-sigmoid space.\n Default: `False`.\n allow_neg_eigval (Optional[bool]):\n Whether to allow negative eigenvalues by scaling `beta` to `[0, 2)`.\n Only takes effect together with `use_beta_sigmoid_in_kernel=True`, in which case\n the kernel computes `2 * sigmoid(beta)` instead of `sigmoid(beta)`. Default: `False`.\n lower_bound (Optional[float]):\n Lower bound for the forget gate (in log space). Only used when `use_gate_in_kernel=True`. Default: `None`.\n state_v_first (Optional[bool]):\n Store the recurrent state in V-first ``[V, K]`` layout instead of the default ``[K, V]``. Default: ``False``.\n cu_seqlens (torch.LongTensor):\n Cumulative sequence lengths of shape `[N+1]` used for variable-length training,\n consistent with the FlashAttention API.\n\nReturns:\n o (torch.Tensor):\n Outputs of shape `[B, T, HV, V]`.\n final_state (torch.Tensor):\n Final state of shape `[N, HV, K, V]` if `output_final_state=True` else `None`.\n\nExamples::\n >>> import torch\n >>> import torch.nn.functional as F\n >>> from einops import rearrange\n >>> from fla.ops.kda import fused_recurrent_kda\n # inputs with equal lengths\n >>> B, T, H, HV, K, V = 4, 2048, 4, 8, 512, 512\n >>> q = torch.randn(B, T, H, K, device='cuda')\n >>> k = F.normalize(torch.randn(B, T, H, K, device='cuda'), p=2, dim=-1)\n >>> v = torch.randn(B, T, HV, V, device='cuda')\n >>> g = F.logsigmoid(torch.rand(B, T, HV, K, device='cuda'))\n >>> beta = torch.rand(B, T, HV, device='cuda').sigmoid()\n >>> h0 = torch.randn(B, HV, K, V, device='cuda')\n >>> o, ht = fused_recurrent_kda(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True\n )\n # for variable-length inputs, the batch size `B` is expected to be 1 and `cu_seqlens` is required\n >>> q, k, v, g, beta = map(lambda x: rearrange(x, 'b t ... -> 1 (b t) ...'), (q, k, v, g, beta))\n # for a batch with 4 sequences, `cu_seqlens` with 5 start/end positions are expected\n >>> cu_seqlens = q.new_tensor([0, 2048, 4096, 6144, 8192], dtype=torch.long)\n >>> o_var, ht_var = fused_recurrent_kda(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True,\n cu_seqlens=cu_seqlens\n )",
161
  "signature": {
 
275
  {
276
  "name": "chunk_gated_delta_rule",
277
  "qualname": "chunk_gated_delta_rule",
278
+ "module": "_fla_cuda_5fe9dbb.ops.gated_delta_rule.chunk",
279
  "kind": "function",
280
  "doc": "Args:\n q (torch.Tensor):\n queries of shape `[B, T, H, K]`.\n k (torch.Tensor):\n keys of shape `[B, T, H, K]`.\n v (torch.Tensor):\n values of shape `[B, T, HV, V]`.\n GVA (Grouped Value Attention) is applied if `HV > H`, where `HV` must be divisible by `H`.\n g (torch.Tensor):\n (forget) gating tensor of shape `[B, T, HV]`.\n When `use_gate_in_kernel=False` (default), `g` should be in log space (pre-computed decay).\n When `use_gate_in_kernel=True`, `g` is the raw input before gate activation;\n the kernel fuses `-exp(A_log) * softplus(g + dt_bias)` + chunk cumsum internally.\n beta (torch.Tensor):\n betas of shape `[B, T, HV]`.\n scale (Optional[float]):\n Scale factor for the RetNet attention scores.\n If not provided, it will default to `1 / sqrt(K)`. Default: `None`.\n initial_state (Optional[torch.Tensor]):\n Initial state of shape `[N, HV, K, V]` for `N` input sequences.\n For equal-length input sequences, `N` equals the batch size `B`.\n Default: `None`.\n output_final_state (Optional[bool]):\n Whether to output the final state of shape `[N, HV, K, V]`. Default: `False`.\n use_qk_l2norm_in_kernel (bool):\n Whether to apply L2norm to the q/k tensor internally. Default: `False`.\n use_gate_in_kernel (bool):\n Whether to compute the log-space GDN decay internally.\n When `True`, the passed `g` is the raw input, and `A_log` must be provided.\n The kernel fuses gate activation + chunk cumsum in a single pass.\n Default: `False`.\n A_log (Optional[torch.Tensor]):\n Decay parameter of shape `[HV]`. Required when `use_gate_in_kernel=True`.\n dt_bias (Optional[torch.Tensor]):\n Bias added to `g` before activation, of shape `[HV]`.\n Only used when `use_gate_in_kernel=True`.\n use_beta_sigmoid_in_kernel (bool):\n Whether to apply `torch.sigmoid(beta)` before launching the chunk kernel.\n - If `True`, the passed `beta` acts as the raw beta logits.\n - If `False`, `beta` is expected to already be in post-sigmoid space.\n Default: `False`.\n allow_neg_eigval (bool):\n Whether to allow negative eigenvalues by scaling `beta` to `[0, 2)`.\n Only takes effect together with `use_beta_sigmoid_in_kernel=True`, in which case\n the kernel computes `2 * sigmoid(beta)` instead of `sigmoid(beta)`. Default: `False`.\n state_v_first (Optional[bool]):\n Store the recurrent state in V-first ``[V, K]`` layout instead of the default ``[K, V]``. Default: ``False``.\n cu_seqlens (torch.LongTensor):\n Cumulative sequence lengths of shape `[N+1]` used for variable-length training,\n consistent with the FlashAttention API.\n chunk_indices (Optional[torch.LongTensor]):\n Pre-computed chunk indices for variable-length inputs.\n If provided, they are used directly instead of being computed from `cu_seqlens`. Default: `None`.\n cp_context (Optional[FLACPContext]):\n Context parallel context for distributed training across multiple devices.\n When provided, `initial_state` and `output_final_state` are not supported,\n and `cu_seqlens` will be overridden by the context. Default: `None`.\n\nReturns:\n o (torch.Tensor):\n Outputs of shape `[B, T, HV, V]`.\n final_state (torch.Tensor):\n Final state of shape `[N, HV, K, V]` if `output_final_state=True` else `None`.\n\nExamples::\n >>> import torch\n >>> import torch.nn.functional as F\n >>> from einops import rearrange\n >>> from fla.ops.gated_delta_rule import chunk_gated_delta_rule\n # inputs with equal lengths\n >>> B, T, H, HV, K, V = 4, 2048, 4, 8, 512, 512\n >>> q = torch.randn(B, T, H, K, dtype=torch.bfloat16, device='cuda')\n >>> k = F.normalize(torch.randn(B, T, H, K, dtype=torch.bfloat16, device='cuda'), p=2, dim=-1)\n >>> v = torch.randn(B, T, HV, V, dtype=torch.bfloat16, device='cuda')\n >>> beta = torch.rand(B, T, HV, dtype=torch.bfloat16, device='cuda').sigmoid()\n >>> g = F.logsigmoid(torch.rand(B, T, HV, dtype=torch.bfloat16, device='cuda'))\n >>> h0 = torch.randn(B, HV, K, V, dtype=torch.bfloat16, device='cuda')\n >>> o, ht = chunk_gated_delta_rule(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True\n )\n # for variable-length inputs, the batch size `B` is expected to be 1 and `cu_seqlens` is required\n >>> q, k, v, beta, g = map(lambda x: rearrange(x, 'b t ... -> 1 (b t) ...'), (q, k, v, beta, g))\n # for a batch with 4 sequences, `cu_seqlens` with 5 start/end positions are expected\n >>> cu_seqlens = q.new_tensor([0, 2048, 4096, 6144, 8192], dtype=torch.long)\n >>> o, ht = chunk_gated_delta_rule(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True,\n cu_seqlens=cu_seqlens\n )",
281
  "signature": {
 
374
  "name": "cp_context",
375
  "kind": "POSITIONAL_OR_KEYWORD",
376
  "default": "None",
377
+ "annotation": "_fla_cuda_5fe9dbb.ops.cp.context.FLACPContext | None"
378
  },
379
  {
380
  "name": "kwargs",
 
389
  {
390
  "name": "fused_recurrent_gated_delta_rule",
391
  "qualname": "fused_recurrent_gated_delta_rule",
392
+ "module": "_fla_cuda_5fe9dbb.ops.gated_delta_rule.fused_recurrent",
393
  "kind": "function",
394
  "doc": "Args:\n q (torch.Tensor):\n queries of shape `[B, T, H, K]`.\n k (torch.Tensor):\n keys of shape `[B, T, H, K]`.\n v (torch.Tensor):\n values of shape `[B, T, HV, V]`.\n GVA (Grouped Value Attention) is applied if `HV > H`, where `HV` must be divisible by `H`.\n g (torch.Tensor):\n g (decays) of shape `[B, T, HV]`. Default: `None`.\n When `use_gate_in_kernel=False` (default), `g` must be in log space (pre-computed decay).\n When `use_gate_in_kernel=True`, `g` is the raw pre-activation input; the kernel fuses\n `-exp(A_log) * softplus(g + dt_bias)` internally per step.\n gk (torch.Tensor):\n gk (decays) of shape `[B, T, HV, K]`. Default: `None`.\n gv (torch.Tensor):\n gv (decays) of shape `[B, T, HV, V]`. Default: `None`.\n beta (torch.Tensor):\n betas of shape `[B, T, HV]`.\n scale (Optional[float]):\n Scale factor for the RetNet attention scores.\n If not provided, it will default to `1 / sqrt(K)`. Default: `None`.\n initial_state (Optional[torch.Tensor]):\n Initial state of shape `[N, HV, K, V]` for `N` input sequences.\n For equal-length input sequences, `N` equals the batch size `B`.\n Default: `None`.\n output_final_state (Optional[bool]):\n Whether to output the final state of shape `[N, HV, K, V]`. Default: `False`.\n use_qk_l2norm_in_kernel (Optional[bool]):\n Whether to use L2 normalization in the kernel. Default: `False`.\n use_gate_in_kernel (bool):\n Whether to compute the log-space GDN decay internally.\n When `True`, `g` is the raw input and `A_log` must be provided; the kernel fuses\n gate activation into the recurrence. Default: `False`.\n A_log (Optional[torch.Tensor]):\n Decay parameter of shape `[HV]`. Required when `use_gate_in_kernel=True`.\n dt_bias (Optional[torch.Tensor]):\n Bias added to `g` before activation, of shape `[HV]`.\n Only used when `use_gate_in_kernel=True`.\n use_beta_sigmoid_in_kernel (Optional[bool]):\n Whether to apply `torch.sigmoid(beta)` inside the kernel.\n - If `True`, the passed `beta` acts as the raw beta logits.\n - If `False`, `beta` is expected to already be in post-sigmoid space.\n Default: `False`.\n allow_neg_eigval (Optional[bool]):\n Whether to allow negative eigenvalues by scaling `beta` to `[0, 2)`.\n Only takes effect together with `use_beta_sigmoid_in_kernel=True`, in which case\n the kernel computes `2 * sigmoid(beta)` instead of `sigmoid(beta)`. Default: `False`.\n state_v_first (Optional[bool]):\n Store the recurrent state in V-first ``[V, K]`` layout instead of the default ``[K, V]``. Default: ``False``.\n cu_seqlens (torch.LongTensor):\n Cumulative sequence lengths of shape `[N+1]` used for variable-length training,\n consistent with the FlashAttention API.\n\nReturns:\n o (torch.Tensor):\n Outputs of shape `[B, T, HV, V]`.\n final_state (torch.Tensor):\n Final state of shape `[N, HV, K, V]` if `output_final_state=True` else `None`.\n\nExamples::\n >>> import torch\n >>> import torch.nn.functional as F\n >>> from einops import rearrange\n >>> from fla.ops.gated_delta_rule import fused_recurrent_gated_delta_rule\n # inputs with equal lengths\n >>> B, T, H, HV, K, V = 4, 2048, 4, 8, 512, 512\n >>> q = torch.randn(B, T, H, K, device='cuda')\n >>> k = F.normalize(torch.randn(B, T, H, K, device='cuda'), p=2, dim=-1)\n >>> v = torch.randn(B, T, HV, V, device='cuda')\n >>> g = F.logsigmoid(torch.rand(B, T, HV, device='cuda'))\n >>> beta = torch.rand(B, T, HV, device='cuda').sigmoid()\n >>> h0 = torch.randn(B, HV, K, V, device='cuda')\n >>> o, ht = fused_gated_recurrent_delta_rule(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True\n )\n # for variable-length inputs, the batch size `B` is expected to be 1 and `cu_seqlens` is required\n >>> q, k, v, g, beta = map(lambda x: rearrange(x, 'b t ... -> 1 (b t) ...'), (q, k, v, g, beta))\n # for a batch with 4 sequences, `cu_seqlens` with 5 start/end positions are expected\n >>> cu_seqlens = q.new_tensor([0, 2048, 4096, 6144, 8192], dtype=torch.long)\n >>> o, ht = fused_gated_recurrent_delta_rule(\n q, k, v, g, beta,\n initial_state=h0,\n output_final_state=True,\n cu_seqlens=cu_seqlens\n )",
395
  "signature": {
 
517
  {
518
  "name": "FusedRMSNormGated",
519
  "qualname": "FusedRMSNormGated",
520
+ "module": "_fla_cuda_5fe9dbb.layers",
521
  "kind": "class",
522
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
523
  "signature": {
 
545
  {
546
  "name": "chunk_kimi_delta_attention",
547
  "qualname": "chunk_kimi_delta_attention",
548
+ "module": "_fla_cuda_5fe9dbb.layers",
549
  "kind": "class",
550
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
551
  "signature": {
 
573
  {
574
  "name": "recurrent_kimi_delta_attention",
575
  "qualname": "recurrent_kimi_delta_attention",
576
+ "module": "_fla_cuda_5fe9dbb.layers",
577
  "kind": "class",
578
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
579
  "signature": {
 
601
  {
602
  "name": "chunk_gated_delta_rule",
603
  "qualname": "chunk_gated_delta_rule",
604
+ "module": "_fla_cuda_5fe9dbb.layers",
605
  "kind": "class",
606
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
607
  "signature": {
 
629
  {
630
  "name": "recurrent_gated_delta_rule",
631
  "qualname": "recurrent_gated_delta_rule",
632
+ "module": "_fla_cuda_5fe9dbb.layers",
633
  "kind": "class",
634
  "doc": "Base class for all neural network modules.\n\nYour models should also subclass this class.\n\nModules can also contain other Modules, allowing them to be nested in\na tree structure. You can assign the submodules as regular attributes::\n\n import torch.nn as nn\n import torch.nn.functional as F\n\n\n class Model(nn.Module):\n def __init__(self) -> None:\n super().__init__()\n self.conv1 = nn.Conv2d(1, 20, 5)\n self.conv2 = nn.Conv2d(20, 20, 5)\n\n def forward(self, x):\n x = F.relu(self.conv1(x))\n return F.relu(self.conv2(x))\n\nSubmodules assigned in this way will be registered, and will also have their\nparameters converted when you call :meth:`to`, etc.\n\n.. note::\n As per the example above, an ``__init__()`` call to the parent class\n must be made before assignment on the child.\n\n:ivar training: Boolean represents whether this module is in training or\n evaluation mode.\n:vartype training: bool",
635
  "signature": {