Skip to content

Run wheel builds on pull requests - #1

Merged
andimarafioti merged 9 commits into
mainfrom
enable-pr-wheel-builds
Jun 9, 2026
Merged

andimarafioti merged 9 commits into
mainfrom
enable-pr-wheel-builds

Conversation

@andimarafioti

Copy link
Copy Markdown
Owner

Adds a pull_request trigger for the CUDA wheel workflow while keeping workflow_dispatch inputs for manual builds. The PR path also defines default qwentts.cpp ref, CUDA architectures, and wheel build tag because dispatch inputs are not available on pull_request events.

@andimarafioti

Copy link
Copy Markdown
Owner Author

Added generated wheel audio samples in samples/pr-wheel-audio/ for the runnable wheels on the local GB10 machine.

Settings: Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice, BF16, speaker aiden, English, seed 42, stream chunk 8 / 12.5s, left context 2.0s.

Greedy parity prompt: This is a short deterministic backend comparison.

Backend Greedy sample Duration
CPU cpu_greedy_20f_customvoice_bf16.wav 1.60s
CUDA 12.8 cu128_greedy_20f_customvoice_bf16.wav 1.60s
CUDA 13.0 cu130_greedy_20f_customvoice_bf16.wav 1.60s

Sampled prompt: Hello from the qwentts cpp Python wheel. This sample compares the same Qwen three custom voice settings across backends.

Backend Sampled sample Duration
CPU cpu_sampled_seed42_customvoice_bf16.wav 3.68s
CUDA 12.8 cu128_sampled_seed42_customvoice_bf16.wav 6.40s
CUDA 13.0 cu130_sampled_seed42_customvoice_bf16.wav 6.40s

manifest.json in the same folder has the measured generation metadata.

@andimarafioti

Copy link
Copy Markdown
Owner Author

CPU audio issue corroborated with STT and fixed in this branch.

What failed before, using the CPU wheel built from eda8b59092b8d7b7142177c599b08909b87f63b4:

File nano-parakeet transcript
cpu_greedy_20f_customvoice_bf16.wav D
cpu_sampled_seed42_customvoice_bf16.wav What uh

The CPU failure tracks to the newer native backend text-projection revision. A local CPU wheel built from a62fde62e64bf81a49af6e6c07ac5817df93f19e produces intelligible speech on the same aarch64 machine, so CPU wheel builds are now pinned to that native ref while CUDA wheels stay on eda8b59092b8d7b7142177c599b08909b87f63b4.

Final STT validation with nano-parakeet / nvidia/parakeet-tdt-0.6b-v3:

File nano-parakeet transcript
cpu_greedy_20f_customvoice_bf16.wav This is a short deterministic.
cpu_sampled_seed42_customvoice_bf16.wav Hello from the Quentz CPP Python wheel. This sample compares the same Quen 3 custom
cu128_greedy_20f_customvoice_bf16.wav This is a short deterministic.
cu128_sampled_seed42_customvoice_bf16.wav Hello from the Quent's TP by Python wheel. This sample compares the same Quen 3 custom voice setting.
cu130_greedy_20f_customvoice_bf16.wav This is a short determination.
cu130_sampled_seed42_customvoice_bf16.wav Hello from the Quint GPP Python wheel. This sample compares the same Quen 3 custom voice settings.

Updated files are in samples/pr-wheel-audio/, and manifest.json now includes the STT transcripts.

@andimarafioti

andimarafioti commented Jun 9, 2026

Copy link
Copy Markdown
Owner Author

Replaced the CPU-only old-ref workaround with a native patch applied to the current qwentts.cpp ref for all wheel builds.

What changed:

  • CPU and CUDA now both default to eda8b59092b8d7b7142177c599b08909b87f63b4.
  • CI applies patches/qwentts-cpu-host-prompt-projection.patch after checkout.
  • CUDA keeps the backend prompt projection path.
  • CPU uses host F32 prompt text projection and host ref-code embedding sum when no GPU backend is present.

Local validation on the aarch64 GB10 machine:

  • Before the fix, the current-ref CPU wheel transcribed as D and What uh with nano-parakeet.
  • After the fix, the current-ref CPU wheel transcribed as:
    • This is a short determination.
    • Hello from the Quince TPP Python wheel. This sample compares the same Quen 3 custom voice set.
  • Final STT pass succeeded for all six checked-in WAVs: CPU, CUDA 12.8, and CUDA 13.0, greedy and sampled.

Local checks:

  • python3 -m py_compile ...
  • manifest/WAV metadata validator
  • patch apply check against a clean eda8b59 checkout
  • uv run --with pytest --with numpy --with huggingface-hub pytest -q -> 1 passed, 1 skipped

@andimarafioti

Copy link
Copy Markdown
Owner Author

Uploaded reset-before-alloc CPU validation artifacts here:

Summary, CPU BF16 CustomVoice aiden, qwentts.cpp eda8b59 plus scheduler reset before talker graph allocation:

file mode audio first yield native total STT
reset_before_greedy_20f_customvoice_bf16.wav greedy, 20 frames 1.60s 3059ms 7833ms This is a short deterministic.
reset_before_sampled_seed42_customvoice_bf16.wav sampled seed 42, 80 frames 6.40s 5160ms 24610ms Hello from the QNTTS CPP Python wheel. This sample compares the same QN three.

The reset-only candidate keeps the batched prompt projection path. The prompt embeddings are identical to the failing CPU run, but the first talker hidden/logits and first-frame codes match the good split-special path after resetting the scheduler before ggml_backend_sched_alloc_graph.

@andimarafioti

Copy link
Copy Markdown
Owner Author

Added all-options audio/timing artifacts:

Covered rows:

option source greedy first yield / total sampled first yield / total STT
cpu_reset_before_local local native CPU, reset-before-alloc candidate 2880ms / 5893ms 4172ms / 28631ms pass
cuda13_reset_before_local local native CUDA 13.0, reset-before-alloc candidate 692ms / 1102ms 259ms / 2713ms pass
cu128_wheel installed CUDA 12.8 wheel 887ms / 1318ms 281ms / 2770ms pass
cu130_wheel installed CUDA 13.0 wheel 779ms / 1199ms 266ms / 2704ms pass

Notes:

  • Downloads are not included; all runs use local GGUF files.
  • Each option loaded the model once, generated the greedy clip, then generated the sampled clip.
  • The CUDA 12.8 wheel needed the venv-provided CUDA 12 runtime path in LD_LIBRARY_PATH on this machine.
  • I did not include the stale cpu_wheel venv as a passing row because it still contains the old failing CPU backend path. The CPU validation row is the reset-before-alloc native candidate.

@andimarafioti

Copy link
Copy Markdown
Owner Author

Pushed an update replacing the broad host-projection patch with the minimal scheduler-reset patch.

Latest package commit: 2263ea5 (Use scheduler reset patch for wheel builds)

What changed:

  • removed patches/qwentts-cpu-host-prompt-projection.patch
  • added patches/qwentts-reset-scheduler-before-talker-alloc.patch
  • CI applies the scheduler-reset patch for CPU and CUDA builds
  • checked-in CPU sample metadata now points at the reset-before validation path

I also opened the native upstream PR here:
ServeurpersoCom/qwentts.cpp#4

Once that lands upstream, this package can drop the local patch and just build from the fixed qwentts.cpp ref.

@andimarafioti

Copy link
Copy Markdown
Owner Author

Upstream qwentts.cpp PR #4 was merged, so I pushed another package update.

Latest package commit: 98dbb7d (Build from merged qwentts.cpp scheduler fix)

What changed:

  • wheel CI now defaults to qwentts.cpp f79b23a56702584d51e3a66509b881cd99a95bba
  • removed the package-side scheduler patch entirely
  • removed patch application from both CPU and CUDA jobs
  • updated README and sample metadata to note that the fix is upstream

I also verified locally that qwentts.cpp f79b23a builds as CPU with no patch and produces valid speech on the short greedy STT check.

A fresh six-job wheel build is running from 98dbb7d:
https://github.com/andimarafioti/qwentts-cpp-python/actions/runs/27198934466

@andimarafioti
andimarafioti merged commit 32a953a into main Jun 9, 2026
6 checks passed
@andimarafioti
andimarafioti deleted the enable-pr-wheel-builds branch June 9, 2026 15:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant