File size: 4,420 Bytes
29161c2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | # XLSR-Nes2Net-LA — implementation notes
Plan: `speech-spoof-bench/docs/plans/2026-11-07-eleven-model-batch-arena-submission.md` (model #3).
## Source
- Code: github XuepingZhang/MultiAPI-Spoof @ `1f712e3fff26e237268385b92365a9debd4cb69f`,
`models/XLSR2_Nes2Net_X_ATT.py`, config `job/xlsr2_nes2net_ATT/few_dkucc.conf` (Nes_ratio [8,8], SE_ratio [1],
dilation 2, pool_func mean, n_output_logits 2). Code license CC BY-NC 4.0 (README; no LICENSE file → `LICENSE.source`).
- Weights: HF XuepingZhang/XLSR-Nes2Net-LA @ `ef20423b7a2555f699f217184f3629078bf0e664`, `epoch_5_1.422.pth`
(1,289,109,435 B, sha256 `c855f654f640b39fa19295445d1c67dc3658060f2282e015208eaedb5a34ddf8`). No weight license →
**not re-hosted**; meta.yaml links the pinned HF file. `epoch_5_1.422.pth` here is a symlink to
`benchmarks/_ckpt_dl/XuepingZhang__XLSR-Nes2Net-LA/` (the HF repo has no README).
- Paper arXiv 2512.07352 (BibTeX `zhang2025multiapispoofmultiapidataset` from the GitHub README).
## Port (`_net.py`, from `benchmarks/Nes2Net/_net.py`)
- SSLModel / Bottle2neck / SEModule / ASTP reused from Nes2Net (fairseq cross-version fix, `xlsr2_300m.pt` symlink to
W2V2-AASIST). Added `Dropout(0.2)` in Bottle2neck (source; eval no-op) and `LocalWindowAttention` verbatim
(W=3, dilation 1, 1 head, D=128, pos_emb 8×128, attn dropout 0.1 = eval no-op, clamped edge indices) between the
block stack and the concat.
- `global_attn = nn.MultiheadAttention(1024, 8)` is built only because it is in the checkpoint; forward never calls
it (tested with a hook).
- Checkpoint: plain OrderedDict, 998 tensors, all `module.`-prefixed (DataParallel) → stripped; loaded with
`torch.load(weights_only=True)`; 429 `ssl_model.model.*` tensors. `strict=True`: 0 missing / 0 unexpected.
- forward returns `(ssl_feat, logits)` as the source; score = `logits[:, 1]` (source `label_map` bonafide=1,
`batch_out[:, 1]`).
- `.to(device)` before `.eval()` (SSLModel.extract_feat would otherwise flip the SSL to train()).
- Params: forward path **317,969,191** (meta `params_millions`); 322,167,591 incl. the unused global_attn (4,198,400);
back-end (excl. global_attn) 578,599.
## Input
Authors: `pad_random` — random 64600 crop for long clips (train and eval loaders), repeat-pad short ones, no
normalisation. Here: deterministic first 64600 samples, tile-repeat if shorter, empty → zeros. FP32, cuDNN TF32 off.
## Source parity (`source_parity.py`, log `source_parity.log`)
Authors' `Nested_Res2Net_TDNN` (from the downloaded source file, strict-loaded from the same checkpoint) vs ours on
XLS-R features of 12 In-the-Wild clips: max |Δlogits| = 0 (bit-identical). The front-end is the same fairseq model
(only its construction differs).
## Batch sweep (`sweep.py`, 64600 random input, 2026-11-07, logs `logs_sweep_g{2,1}.txt`)
| card | best | notes |
|---|---|---|
| RTX 4070 Ti SUPER (idx 2) | 122.8 utt/s @24 | plateau 16–64 → `batch_size = 24` |
| RTX 5060 Ti (idx 1) | 45.9 utt/s @4 | ~32 at bs ≥ 8 → 4 on 5060 (set in `load`) |
## Sanity (PyTorch)
Full J-SPAW_LA (`results_pt/`, run on RTX 5060 Ti idx 1): EER **0.376 %** (2397 trials, 0 skipped). Copied to
`results/J-SPAW_LA` for submission. Unit tests: `test_xlsr_nes2net_la.py` 8 passed.
## TensorRT (`trt_xlsr_nes2net_la.py`, sidecar `trt_xlsr-nes2net-la.json`, TRT 10.16.1.11)
Adapted from Forensics-XLSR-Wild's script (net output tuple → introspected L=2, i=1, n_classes=2). FP16 fails the
ranking tolerance (64-clip ITW build parity Spearman 0.9989 / 0.9987) → FP32 on both cards; FP16 engines deleted.
| card | precision | best batch | utt/s (sweep) | build parity Spearman | J-SPAW EER | J-SPAW Spearman vs PT / max Δ |
|---|---|---|---|---|---|---|
| RTX 4070 Ti SUPER (idx 2) | FP32 | 32 | 177.0 | 0.99995 | 0.3757 (=PT) | 0.999996 / 0.043 |
| RTX 5060 Ti (idx 1) | FP32 | 4 | 119.8 | 1.00000 | 0.3757 (=PT) | 0.999992 / 0.109 |
Scripts: `run_sweep.sh`, `run_pt.sh [gpu]`, `run_trt_export.sh ["2 1"]`, `run_trt_jspaw.sh <gpu>`, `cmp_scores.py`.
## meta.yaml
- `trained_on: [ODSS]` (training mix TIMIT, ODSS, FoR, AI4T, ASVspoof5 train, MLAAD, MultiAPI-Spoof; only ODSS is
an Arena corpus besides ASVspoof5 *train*, which is not our eval split).
- In-the-Wild was the dev set for checkpoint selection (file name = ITW EER 1.422 %); maintainer decision: ITW stays
ranked, stated in notes, not in trained_on. Self-reported ITW 1.42 %.
|