|
Download implementation-notes.md from SpeechAntiSpoofingBenchmarks/XLSR-Conformer-TCM-DF: direct link, hf CLI and curl.
- Browser
- Download file 4.81 kB
-
https://huggingface.co/SpeechAntiSpoofingBenchmarks/XLSR-Conformer-TCM-DF/resolve/main/implementation-notes.md
- Command line
-
hf download hf://SpeechAntiSpoofingBenchmarks/XLSR-Conformer-TCM-DF/implementation-notes.md
-
curl -L -o implementation-notes.md https://huggingface.co/SpeechAntiSpoofingBenchmarks/XLSR-Conformer-TCM-DF/resolve/main/implementation-notes.md
4.81 kB
XLSR-Conformer-TCM-DF — implementation notes
Plan: speech-spoof-bench/docs/plans/2026-11-01-nine-model-batch-arena-submission.md (model #4; sibling #9
XLSR-Conformer-TCM-LA in ../XLSR-Conformer-TCM-LA/).
Source
- Code: github.com/ductuantruong/tcm_add @
726387eb731223a21d551476349f8f8f680a3375(MIT,LICENSE.source):conformer.py+model.py→_net.py(edits in its header). Diff vs dpda_ganets/conformer*.py: only (out, attn) returns, the commented-outattn_drop(p = 0 anyway) and the xlsr path → the network is the DPDA-GA-TCM one;_net.py, wrapper, tests, sweep and TRT script are copied from../DPDA-GA-TCM/. - Hyper-parameters = main.py defaults (emb 144, heads 4, kernel 31, 4 encoders); strict load confirms.
- XLS-R 300M architecture from
xlsr2_300m.ptcfg (symlink to../W2V2-AASIST/,merge_with_parent); base weights not loaded (the checkpoint overwrites all 588 tensors). - Weights: the authors' NTU SharePoint folder
model_checkpoints/interspeech24_tcm/(guest link in the tcm_add README; two-step curl with a guest cookie,../_ckpt_dl/ntu__tcm_add/dl.sh, proxy unset).DF/fixed_length/avg_5_best.pth(1,285,107,735 B, uploaded 2024-07-15) = the authors' own main.py average, re-saved unchanged asmodel.safetensors(convert.py,weights_only=True, 588 tensors fp32 + int64).
!! DF and LA releases are the same model
avg_5_best.pthequals main.py's average ofLA/fixed_length/best_{0..4}.pth— i.e. the(2*b1+b2+b3+b4)/5aliasing formula, see../XLSR-Conformer-TCM-LA/make_avg.py— to max |Δ| 4.8e-7 (float rounding; num_batches_tracked 14212 = trunc((2*15228+12690+19035+8883)/5) exactly). Plain mean of b0..b4: max |Δ| 0.017. This also confirms the authors really ran the buggy averaging.- SharePoint
DF/fixed_length/also holds best_0..4.pth (uploaded 2024-07-21; LA's were uploaded 2024-09-16). Downloaded only to check: they are byte-identical toLA/fixed_length/best_*(_ckpt_dl/ntu__tcm_add/dl_df_best.log). - So the LA folder contains the DF-track n-best checkpoints (or the reverse); the authors' distinct LA-track model (RawBoost algo 5) is not in the release. J-SPAW_LA PyTorch scores of the two wrappers: Spearman 1.000000, max |Δ| 6.5e-5. Maintainer decision needed (drop #9, or keep a single entry).
Wrapper decisions
- Input: first 66,800 samples (source
data_utils.Dataset_eval.cut; the paper text says 64,600), shorter clips repeat-tiled (utils.pad). No resampling/normalisation. - Score =
logits[:, 1](bona fide = 1,produce_evaluation_file)..to(device)then.eval(). - cuDNN TF32 disabled in
load()(DPDA-GA-TCM finding: TF32 made scores batch-dependent by ~2e-4). - Params: 321,213,220 (incl. the frozen 10000×144 positional table; paper's 319.77 M excludes it).
- 5060 batch-size override uses
torch.cuda.get_device_name()(current device). - Tests (
test_xlsr_conformer_tcm_df.py): pad/crop, strict load, eval mode + param count, cls-token rewrite == source stack, batched == single (1e-4), determinism/finite, sign on 16+16 J-SPAW clips. 7 passed.
Batch sweep (sweep.py, 66,800-sample random input, TF32 off) — see the logs_sweep_g*.txt
| card | best | other |
|---|---|---|
| RTX 4070 Ti SUPER (idx 2) | 121.0 utt/s @24 | 118.8 @16, 115.8 @32 |
| RTX 5060 Ti (idx 3) | 46.7 utt/s @4 | ~31 @ >= 8 |
Sanity (PyTorch, RTX 4070 Ti SUPER)
- J-SPAW_LA (full): EER 11.5216% (2397 trials, 0 skipped), ~110 utt/s. (DPDA-GA-TCM 12.90.) Not flipped.
- InTheWild (full): EER 7.8453% (31779 trials, 0 skipped), ~100 utt/s. No paper ITW number; no authors' score files released, so no per-utterance parity check possible. Paper target 21DF 2.06% not re-run here.
TensorRT (trt_xlsr_conformer_tcm_df.py, sidecar trt_xlsr-conformer-tcm-df.json, TRT 10.16)
Copied from DPDA-GA-TCM's script (config block + per-card ONNX filename so both cards can export concurrently).
| card | precision | best batch | utt/s (sweep) | build parity Spearman (64 ITW) | J-SPAW EER | J-SPAW Spearman vs PT / max Δ |
|---|---|---|---|---|---|---|
| RTX 4070 Ti SUPER (idx 2) | FP32 (FP16 Spearman 0.99872 < 0.9999) | 8 | 173.3 | 1.0000 | 11.5216 (=PT) | 0.999998 / 0.026 |
| RTX 5060 Ti (idx 3) | FP32 (FP16 Spearman 0.99940 < 0.9999; DPDA-GA-TCM's 5060 FP16 passed at 0.99991, this one does not) | 4 | 121.7 | 0.99995 | 11.5216 (=PT) | 0.999998 / 0.026 |
| Both cards pass ( | ΔEER | = 0, Spearman ≥ 0.999). J-SPAW_LA submitted from PyTorch (results_pt/); TRT runs in |
||||
results_trt2/, results_trt3/ (cmp_scores.py). Unused FP16 engines deleted. Logs: trt_export_g*.log, |
||||||
jspaw_trt_g*.log. Helper scripts: run_jspaw.sh <gpu> <mod:Class> <outdir> [dataset], run_sweep.sh <gpu>, |
||||||
_queue_trt.sh <gpu> <outdir> (all take the shared GPU lock). |