fusedtok
Fused CUDA kernels for LLM inference — RMSNorm / RoPE / SwiGLU / attention decode and friends, with zero-copy torch tensor support: up to 9.3x faster than PyTorch SDPA (attention decode, RTX 3060, see Benchmarks).
中文文档请看 README_zh.md | English below.
Why
LLM inference frameworks launch many small, memory-bound operators per token. Each launch
round-trips through global memory. fusedtok fuses them into single kernels to cut memory
traffic and launch overhead.
Operators
| Status | Kernel | Notes |
|---|---|---|
| ✅ | RMSNorm (+residual) | LLaMA/Qwen style, fused residual add |
| ✅ | LayerNorm | with affine |
| ✅ | RoPE | interleaved and NeoX layouts, kv-cache pos_offset |
| ✅ | SwiGLU | fused MLP activation |
| ✅ | Softmax (row-wise) | numerically stable |
| ✅ | SiLU / GeLU / GeLU-tanh / ReLU / Tanh / Sigmoid | elementwise |
| ✅ | add / mul | elementwise binary (fused add+residual pattern) |
| ✅ | top-k / top-p (nucleus) | arrival-ticket radix + early-exit compaction, replayed from a cached CUDA graph; deterministic ties (1.5x vs torch/CUB @131k k=50, parity-to-winning across the whole k range on both test GPUs) |
| ✅ | argmax / temperature | greedy decoding helpers |
| ✅ | sample_topp | fused nucleus sampling: softmax -> top-p -> seeded draw, global-mass threshold |
| ✅ | sample_topk | fused top-k sampling: softmax -> top-k -> renormalize within the window -> seeded draw (2.1x / 1.9x vs the topk+multinomial composite @131k) |
| ✅ | repetition penalty | CTRL-style, applied to sampled token ids |
| ✅ | decode_step | the whole decode step fused: penalty -> temperature -> nucleus sample, one call, one readback |
| ✅ | quantize_int8 / dequantize_int8 / qadd_int8 | symmetric per-tensor INT8, fused dequant-add-requant |
| ✅ | qgemm | INT8 matmul, int32-exact: cp.async double-buffered pipelined IMMA GEMM with runtime tile tuning (64x64 / 128x128) + warp-per-row GEMV (M=1 decode; 2x vs fp16 projection) |
| ✅ | qgemm_perchannel | the W8A8 layout real INT8 inference uses: per-output-channel weight scales fused into the same kernel's epilogue at zero cost |
| ✅ | attention_decode | single-token causal attention with GQA over a contiguous kv-cache: online softmax, flash-decoding split over long caches, per-sequence lengths; float32 / bfloat16 / float16 storage (half-precision cache = half the decode bytes, softmax stays float32) |
| ✅ | attention_prefill | fresh-sequence attention over S query rows (causal / bidirectional), float32 / bf16 / fp16 storage; convenience path - heavyweight prefill stays SDPA/flash territory (honest ~0.45x f32) |
Install
pip install fusedtok
Prebuilt wheels on PyPI (built with CUDA 12.4): Linux x86_64 (manylinux, cp310-cp313) and Windows x86_64 (cp311-cp313). On other platforms or Python versions pip builds from source automatically:
git clone https://github.com/Hai-Wenxiang/fusedtok.git
cd fusedtok
pip install .
Requirements:
- NVIDIA GPU of RTX 30 series (Ampere) or newer — e.g. RTX 3060/3090, RTX 4080, RTX 5090, A100, H100
- CUDA Toolkit >= 12.0
- A C++17 compiler (MSVC on Windows, GCC/Clang on Linux); Python 3.10+
What is "compute capability"? (click to expand)
Compute capability is NVIDIA's version number for a GPU architecture generation — not a performance score. CUDA code must be compiled for a specific architecture to run on it. The wheel builds native cubins for compute capability 8.0 (A100) and 8.6 (RTX 30) plus a compute_86 PTX fallback, so Ampere runs natively and newer architectures (RTX 40/50, ...) JIT the PTX with their driver.
| Compute capability | Architecture | Example GPUs |
|---|---|---|
| 7.5 | Turing | GTX 16xx, RTX 20xx (not supported) |
| 8.0 / 8.6 | Ampere | A100, RTX 30xx |
| 8.9 | Ada | RTX 40xx (via PTX) |
| 9.0 | Hopper | H100 (via PTX) |
| 12.0 | Blackwell | RTX 50xx (via PTX) |
Check yours: run nvidia-smi to see your GPU model, then look it up at
https://developer.nvidia.com/cuda-gpus
Usage
numpy in / numpy out, or torch in / torch out — including zero-copy CUDA:
kernels read and write torch device buffers directly via data_ptr(), with
no staging copies and no host synchronization.
import numpy as np
import torch
import fusedtok
x = np.random.randn(4, 1024).astype(np.float32)
w = np.random.rand(1024).astype(np.float32)
# CPU reference implementation (ground truth, runs anywhere)
y = fusedtok.rmsnorm(x, w, eps=1e-6)
# staged CUDA: copies to GPU, runs kernel, copies back
y = fusedtok.rmsnorm(x, w, cuda=True)
# zero-copy CUDA with torch tensors: kernels run in torch's own buffers,
# stream-ordered with other torch operations
xt, wt = torch.from_numpy(x).cuda(), torch.from_numpy(w).cuda()
yt = fusedtok.rmsnorm(xt, wt) # -> CUDA torch tensor
# RoPE with kv-cache position offset, NeoX (LLaMA-HF) layout
q = torch.randn(1, 4096, device="cuda") # new token only
q_rot, k_rot = fusedtok.rope(q, k=None, pos_offset=1023, neox=True)
# attention over a GQA kv-cache: one call per decode step, no score
# materialization, variable-length batches share one cache tensor
out = fusedtok.attention_decode(
q_heads, # [B, Hq, D] new token
k_cache, v_cache, # [B, Hkv, T, D]
lens=torch.tensor([1023, 512], dtype=torch.int32, device="cuda"))
# fresh-sequence prefill (causal by default; convenience path)
ctx = fusedtok.attention_prefill(q_all, k_all, v_all, causal=True)
# sampling side: the whole decode step in one fused call
token = fusedtok.decode_step(logits, sampled_ids, penalty=1.1,
p=0.9, temperature=0.8, seed=step)
# or step by step:
logits = fusedtok.repetition_penalty(logits, sampled_ids, penalty=1.1)
token = fusedtok.sample_topp(logits, p=0.9, temperature=0.8, seed=step)
# top-k sampling variant (renormalizes within the k survivors)
token = fusedtok.sample_topk(logits, k=50, temperature=0.8, seed=step)
A minimal per-token sampling loop:
import torch, fusedtok as ft
h = torch.zeros(1, 4096, device="cuda") # decoder state
w = torch.load("rms_weight.pt").cuda() # float32 weights
wq, wscale = ft.quantize_int8(weight_f32.ravel()) # int8 weights
generated = []
for step in range(256):
h = ft.rmsnorm(h, w, residual=h) # fused add + norm
q = ft.rope(q, k=None, pos_offset=step, neox=True)
logits = model_output(h) # your model
tok = ft.decode_step(logits, generated, penalty=1.1,
p=0.9, temperature=0.8, seed=step)
generated.append(int(tok))
Every function accepts float32 numpy arrays or torch tensors (other dtypes are converted with a copy) and returns float32 outputs of the same family. CUDA torch tensors may also be bfloat16 - the kernels compute in float32 and convert at the load/store boundary (norm weights are upcast to float32 automatically; sampling/selection ops stay float32). CUDA torch tensors select the zero-copy path automatically.
See examples/demo.py for a runnable tour of every operator.
Correctness
Every kernel ships with a CPU reference implementation and element-wise parity tests (pytest). Tests run on machines without a GPU (CUDA cases skip automatically).
API stability
1.0 freezes the public surface: the names in fusedtok.__all__ (30
operators + helpers) keep their signatures across the 1.x series.
Type stubs (__init__.pyi, PEP 561 py.typed) ship with the package.
New operators arrive in minor releases; breaking changes require a new
major version and a deprecation window. Determinism promises: selection
ties resolve to the earliest index; sampling is deterministic per seed.
Benchmarks
RTX 3060 (sm_86), float32, zero-copy torch tensors, CUDA-event timing over
3 independent rounds (means below; per-round values in the JSON), vs
the equivalent PyTorch reference (composite eager expressions; attention
references use pre-expanded heads - repeat_interleave outside the
timed region). Largest shape per op; full data:
docs/benchmark_rtx3060.json, reproduce with python benchmarks/bench.py:
| Op | Shape | fusedtok | PyTorch reference | Speedup |
|---|---|---|---|---|
| attention_decode (GQA) | T=16384, D=128 | 866 µs | 7626 µs (SDPA) | 8.81x |
| attention_decode bf16 | T=16384, D=128 | 851 µs | 1795 µs (SDPA bf16) | 2.11x |
| RoPE NeoX (q+k) | [8192×4096] | 1641 µs | 10061 µs | 6.13x |
| RMSNorm (+residual) | [4096×4096] | 614 µs | 2061 µs | 3.36x |
| SwiGLU | [4096×4096] | 614 µs | 1025 µs | 1.67x |
| top-k (k=50) | [131072] | 79 µs | 137 µs | 1.75x |
| top-k (k=4096, mid-k) | [131072] | 113 µs | 127 µs | 1.12x |
| LayerNorm | [4096×4096] | 446 µs | 616 µs | 1.38x |
| Softmax | [4096×4096] | 414 µs | 432 µs | 1.04x |
| SiLU / GeLU / add | [4096×4096] | ~412 µs | ~411 µs | ~1.0x |
| sample_topk k=50 | [131072] | 135 µs | 292 µs (topk+multinomial) | 2.16x |
| sample_topp p=0.9 (peaked) | [131072] | 160 µs | 496 µs (sort+mask+multinomial) | 3.11x |
| sample_topp p=0.9 (flat worst case) | [131072] | 25388 µs | 391 µs | 0.02x (honest, see below) |
| argmax | [131072] | 65 µs | 45 µs | 0.69x (incl. host readback) |
| int8 qgemm pc (W8A8) | [4096×4096×4096] | 3553 µs (38.7 TOPS) | 2046 µs (cuBLASLt + broadcast) | 0.58x (honest) |
| attention_prefill (causal) | S=1024, D=128 | 5732 µs | 2560 µs (SDPA flash) | 0.45x (honest) |
Row-wise kernels (norms, softmax) autotune their thread-block size per shape at first call (v0.4.1); the table reflects the tuned choices.
RTX 5060 Ti (Blackwell, sm_120) — same suite, largest shape per op
(full data: docs/benchmark_rtx5060ti.json):
| Op | Shape | fusedtok | PyTorch reference | Speedup |
|---|---|---|---|---|
| RoPE NeoX (q+k) | [8192×4096] | 1384 µs | 8368 µs | 6.04x |
| attention_decode (GQA) | T=16384, D=128 | 573 µs | 2682 µs (SDPA) | 4.68x |
| attention_decode bf16 | T=16384, D=128 | 548 µs | 640 µs (SDPA bf16) | 1.17x |
| RMSNorm (+residual) | [4096×4096] | 504 µs | 1657 µs | 3.29x |
| SwiGLU | [4096×4096] | 504 µs | 858 µs | 1.70x |
| top-k (k=50) | [131072] | 27 µs | 41 µs (CUB) | 1.50x |
| top-k (k=4096, mid-k) | [131072] | 50 µs | 54 µs (CUB) | 1.09x |
| LayerNorm / Softmax | [4096×4096] | ~345 µs | ~348 µs | 1.0x |
| sample_topk k=50 | [131072] | 47 µs | 93 µs (topk+multinomial) | 1.98x |
| sample_topp p=0.9 (peaked) | [131072] | 62 µs | 155 µs (sort+mask+multinomial) | 2.49x |
| sample_topp p=0.9 (flat worst case) | [131072] | 17635 µs | 159 µs | 0.01x (honest, see below) |
| argmax | [131072] | 17 µs | 14 µs | 0.83x (incl. host readback) |
| int8 qgemm (IMMA) | [4096×4096×4096] | 2063 µs (66.6 TOPS) | 800 µs (cuBLASLt) | 0.39x (honest) |
| int8 qgemm pc (W8A8) | [4096×4096×4096] | 2079 µs (66.1 TOPS) | 1142 µs (cuBLASLt + broadcast) | 0.55x (honest) |
| attention_prefill (causal) | S=1024, D=128 | 3291 µs | 1421 µs (SDPA flash) | 0.43x (honest) |
On smaller shapes the Blackwell card shows bigger wins (softmax 2.5x, RMSNorm 3.2x at 256 rows, attention decode 3.8x at T=4096 running 235 GB/s) - the launch-overhead share shrinks as shapes grow; full sweep in the JSON.
The PyPI wheel ships sm_80/sm_86 cubins plus a compute_86 PTX fallback — verified to JIT and run correctly on Blackwell (sm_120) drivers.
Fusions win big (RoPE / RMSNorm / SwiGLU) because eager mode round-trips
intermediate tensors through global memory. The v0.4 selection pipeline
(arrival-ticket radix rounds + early-exit compaction, replayed from a
cached CUDA graph) beats torch's CUB radix select at small k on both
GPUs; the v1.0 retune (in-block-sort threshold and sort chunk both
dropped 2048 -> 1024 - a single block bitonic-sorting 2048 keys was the
whole mid-k regression) brings the mid-k window to parity-or-winning as
well (k=4096 @131k: 1.12x / 1.09x). The fused samplers win against the
eager composites when the logits look like real decode output
(sample_topp peaked: 3.11x / 2.49x; sample_topk: 2.16x / 1.98x); on a
FLAT distribution sample_topp is honestly 0.01-0.02x - the nucleus then
spans most of the vocab, the widening loop reruns the pipeline on
ever-larger windows (x8 jumps since 1.0.1), and the final serial scan
is single-threaded by design (documented since v0.4; torch's fully
parallel sort handles that regime natively).
attention_decode wins
big at decode (one launch streams the GQA cache once at up to ~157 GB/s
effective while SDPA pays head expansion or small-query inefficiency);
attention_prefill is the honest convenience path at ~0.45x of SDPA's
flash backend — no tensor cores by design, so heavyweight prefill stays
with SDPA/FlashAttention. The INT8 decode GEMV moves half the bytes of
an fp16 projection and runs at full memory bandwidth (2x); the pipelined
IMMA GEMM (v1.0 rework: cp.async double-buffered slabs, runtime-tuned
64x64 / 128x128 tiles) reaches ~39 TOPS on a 3060 and ~67 TOPS on a
5060 Ti — 2x-4x the v0.4 kernel — but cuBLASLt (torch._int_mm) still
holds a ~2.2-2.6x lead: its tiles pipeline deeper and its epilogue is
tuned per-arch. For now qgemm is the exact / graph-capturable /
zero-copy INT8 path, not the fastest one; honest numbers, a
CUTLASS-class schedule stays future work. The per-channel variant
(qgemm_perchannel, the W8A8 layout INT8 inference actually uses)
fuses the per-output-channel scale multiply into the same epilogue at
zero kernel cost — the composite torch reference pays for that
broadcast separately, which is where its 0.55-0.58x comes from.
Development
See CONTRIBUTING.md for the full guide (test rules, error contract, determinism invariants). Quick start:
# Windows: run inside a VS developer prompt (vcvars64)
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
# from repo root: PYTHONPATH picks up the built module, conftest.py adds python/
$env:PYTHONPATH = "$PWD/build" # Windows
PYTHONPATH=$PWD/build # Linux
python -m pytest tests -q
python benchmarks/bench.py # GPU benchmark + chart
Windows / Linux. Windows uses MSVC via nvcc; CI builds and runs the CPU test suite on every push.
Roadmap
- v0.2 (done): bf16 zero-copy, radix-select top-k/top-p, fused nucleus sampling, single-read softmax, CUDA-graph verified
- v0.3 (done): chunk-merge selection sort + parallel nucleus count, bf16x4/x8 vectorized elementwise, INT8 quantize/dequantize utilities
- v0.4 (done): arrival-ticket selection pipeline (no cooperative launch, early-exit compaction, cached CUDA graphs), stream-aware launchers everywhere (real CUDA-graph capture), INT8 compute path (IMMA qgemm + decode GEMV), fused decode_step sampling
- v0.4.1 (done): runtime block-size autotuning for the row-wise kernels (norms/softmax pick 128..1024 threads per shape at first call)
- v0.5 (done): attention - GQA decode attention over a contiguous kv-cache (flash-decoding split over long caches, per-sequence lengths) and a tiled prefill path (honest ~0.45x of SDPA flash - the convenience path); single-chart-per-GPU benchmarks; Windows wheels in the PyPI publish pipeline
- 1.0 (released): pipelined tensor-core INT8 GEMM (cp.async double-buffering, runtime tile tuning; 17 -> 39 TOPS on a 3060) with per-channel weight scales (W8A8), fused top-k sampling (2.1x vs the topk+multinomial composite), top-k mid-range-k parity, text hygiene gate, wheel matrix expansion (Linux cp310-313, Windows cp311-313), API freeze
Community
- Contributing guide — setup, rules of the road, PR process
- Code of conduct
- Security policy
- Changelog
License
MIT — see LICENSE. Third-party notices: NOTICES.md.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fusedtok-1.1.0.tar.gz.
File metadata
- Download URL: fusedtok-1.1.0.tar.gz
- Upload date:
- Size: 477.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
68a0998e94f9f5f4b0af69f8083eed8b5f61db702d2992712e058b64089deb42
|
|
| MD5 |
cf78d5cef88d9de941264e61de4f4636
|
|
| BLAKE2b-256 |
26f84ada81e44336323774f2ca0e830fff72bbea0087faadcba2f75819f2db77
|
Provenance
The following attestation bundles were made for fusedtok-1.1.0.tar.gz:
Publisher:
publish.yml on Hai-Wenxiang/fusedtok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fusedtok-1.1.0.tar.gz -
Subject digest:
68a0998e94f9f5f4b0af69f8083eed8b5f61db702d2992712e058b64089deb42 - Sigstore transparency entry: 2655093406
- Sigstore integration time:
-
Permalink:
Hai-Wenxiang/fusedtok@f6385f2813748d90f16bec079e0447db9ee32d00 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Hai-Wenxiang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f6385f2813748d90f16bec079e0447db9ee32d00 -
Trigger Event:
release
-
Statement type:
File details
Details for the file fusedtok-1.1.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: fusedtok-1.1.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b31032674e7102360acc059d39af633e291a3b68f39567ef83eaf2e58e848b0f
|
|
| MD5 |
528e691f6f31ed60147cad56d29c196f
|
|
| BLAKE2b-256 |
47045d9c6c168e9b01b6a67f5ec9b538a29ed20ec875fb003794d86c91fd26db
|
Provenance
The following attestation bundles were made for fusedtok-1.1.0-cp313-cp313-win_amd64.whl:
Publisher:
publish.yml on Hai-Wenxiang/fusedtok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fusedtok-1.1.0-cp313-cp313-win_amd64.whl -
Subject digest:
b31032674e7102360acc059d39af633e291a3b68f39567ef83eaf2e58e848b0f - Sigstore transparency entry: 2655093510
- Sigstore integration time:
-
Permalink:
Hai-Wenxiang/fusedtok@f6385f2813748d90f16bec079e0447db9ee32d00 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Hai-Wenxiang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f6385f2813748d90f16bec079e0447db9ee32d00 -
Trigger Event:
release
-
Statement type:
File details
Details for the file fusedtok-1.1.0-cp313-cp313-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: fusedtok-1.1.0-cp313-cp313-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.13, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e79fb5090232c1c913614c7481e966a91224fc6a9018e75f41526d09a53a9c0
|
|
| MD5 |
d9557029018506b1e4c3d89259648449
|
|
| BLAKE2b-256 |
c6c7acb419c0645fa14fe806a0dcfb1804bee2e53de1107878ea286b0b02b682
|
Provenance
The following attestation bundles were made for fusedtok-1.1.0-cp313-cp313-manylinux_2_34_x86_64.whl:
Publisher:
publish.yml on Hai-Wenxiang/fusedtok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fusedtok-1.1.0-cp313-cp313-manylinux_2_34_x86_64.whl -
Subject digest:
6e79fb5090232c1c913614c7481e966a91224fc6a9018e75f41526d09a53a9c0 - Sigstore transparency entry: 2655093464
- Sigstore integration time:
-
Permalink:
Hai-Wenxiang/fusedtok@f6385f2813748d90f16bec079e0447db9ee32d00 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Hai-Wenxiang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f6385f2813748d90f16bec079e0447db9ee32d00 -
Trigger Event:
release
-
Statement type:
File details
Details for the file fusedtok-1.1.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: fusedtok-1.1.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f9afdac35594e9659f60f7b10eac85e5feba2cc719ebb5f34ae61014ac589d7
|
|
| MD5 |
f85a41b1d86a16dcd28e04084f1fceee
|
|
| BLAKE2b-256 |
fc9796e88a91fa7cc46608b53ea8f8166acd50920034e04ab1d411a2f8316e1e
|
Provenance
The following attestation bundles were made for fusedtok-1.1.0-cp312-cp312-win_amd64.whl:
Publisher:
publish.yml on Hai-Wenxiang/fusedtok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fusedtok-1.1.0-cp312-cp312-win_amd64.whl -
Subject digest:
3f9afdac35594e9659f60f7b10eac85e5feba2cc719ebb5f34ae61014ac589d7 - Sigstore transparency entry: 2655093477
- Sigstore integration time:
-
Permalink:
Hai-Wenxiang/fusedtok@f6385f2813748d90f16bec079e0447db9ee32d00 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Hai-Wenxiang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f6385f2813748d90f16bec079e0447db9ee32d00 -
Trigger Event:
release
-
Statement type:
File details
Details for the file fusedtok-1.1.0-cp312-cp312-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: fusedtok-1.1.0-cp312-cp312-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.12, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a66f56a8d60353e30a79686fc4017d29511d63ff529c66cc949d7ff797da73c
|
|
| MD5 |
c656d2e8c5ae4a211cea3b4dd6b47322
|
|
| BLAKE2b-256 |
7460018df706e8762d5f168bf6c6b0675a6446a7ec328fa97560d2df1d2f767a
|
Provenance
The following attestation bundles were made for fusedtok-1.1.0-cp312-cp312-manylinux_2_34_x86_64.whl:
Publisher:
publish.yml on Hai-Wenxiang/fusedtok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fusedtok-1.1.0-cp312-cp312-manylinux_2_34_x86_64.whl -
Subject digest:
3a66f56a8d60353e30a79686fc4017d29511d63ff529c66cc949d7ff797da73c - Sigstore transparency entry: 2655093437
- Sigstore integration time:
-
Permalink:
Hai-Wenxiang/fusedtok@f6385f2813748d90f16bec079e0447db9ee32d00 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Hai-Wenxiang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f6385f2813748d90f16bec079e0447db9ee32d00 -
Trigger Event:
release
-
Statement type:
File details
Details for the file fusedtok-1.1.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: fusedtok-1.1.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38a23908b192140fe84ae96f960894106e6996df5204b9bca5fc52fbebbdd5e1
|
|
| MD5 |
892a3f2c34898351f95a399d7a716294
|
|
| BLAKE2b-256 |
fac9ea7e20ba58e890d1b3206e45f06fc3c49df4ae7ac13250200e438a86f238
|
Provenance
The following attestation bundles were made for fusedtok-1.1.0-cp311-cp311-win_amd64.whl:
Publisher:
publish.yml on Hai-Wenxiang/fusedtok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fusedtok-1.1.0-cp311-cp311-win_amd64.whl -
Subject digest:
38a23908b192140fe84ae96f960894106e6996df5204b9bca5fc52fbebbdd5e1 - Sigstore transparency entry: 2655093484
- Sigstore integration time:
-
Permalink:
Hai-Wenxiang/fusedtok@f6385f2813748d90f16bec079e0447db9ee32d00 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Hai-Wenxiang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f6385f2813748d90f16bec079e0447db9ee32d00 -
Trigger Event:
release
-
Statement type:
File details
Details for the file fusedtok-1.1.0-cp311-cp311-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: fusedtok-1.1.0-cp311-cp311-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.11, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
862d00ed2096572b6a201c018be26137d01d4b4bc3f049167f797cc7c8724cd2
|
|
| MD5 |
2fd6dbad6c975179879f121b0111bb53
|
|
| BLAKE2b-256 |
eb01a21a715f23ad00655ccfa0332a9d3183e894a562ed1e873467f2d88eb7bf
|
Provenance
The following attestation bundles were made for fusedtok-1.1.0-cp311-cp311-manylinux_2_34_x86_64.whl:
Publisher:
publish.yml on Hai-Wenxiang/fusedtok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fusedtok-1.1.0-cp311-cp311-manylinux_2_34_x86_64.whl -
Subject digest:
862d00ed2096572b6a201c018be26137d01d4b4bc3f049167f797cc7c8724cd2 - Sigstore transparency entry: 2655093503
- Sigstore integration time:
-
Permalink:
Hai-Wenxiang/fusedtok@f6385f2813748d90f16bec079e0447db9ee32d00 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Hai-Wenxiang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f6385f2813748d90f16bec079e0447db9ee32d00 -
Trigger Event:
release
-
Statement type:
File details
Details for the file fusedtok-1.1.0-cp310-cp310-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: fusedtok-1.1.0-cp310-cp310-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.10, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2226febb98c9534a442206080ccad0286d898aaed225129d63f0063b5967024
|
|
| MD5 |
aa89c5dc37e1537bcf2517e5c88ae89c
|
|
| BLAKE2b-256 |
5114c04138552b1d0449a38b82f190f3b96a39ecb3b25bf33c388f6ea0c79a68
|
Provenance
The following attestation bundles were made for fusedtok-1.1.0-cp310-cp310-manylinux_2_34_x86_64.whl:
Publisher:
publish.yml on Hai-Wenxiang/fusedtok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fusedtok-1.1.0-cp310-cp310-manylinux_2_34_x86_64.whl -
Subject digest:
c2226febb98c9534a442206080ccad0286d898aaed225129d63f0063b5967024 - Sigstore transparency entry: 2655093496
- Sigstore integration time:
-
Permalink:
Hai-Wenxiang/fusedtok@f6385f2813748d90f16bec079e0447db9ee32d00 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Hai-Wenxiang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f6385f2813748d90f16bec079e0447db9ee32d00 -
Trigger Event:
release
-
Statement type: