Adds .github/workflows/consolidated-tests-ci.yml: one ubuntu-latest job that
covers test_* coverage the existing CI does not already pick up.
What this consolidates:
1. unsloth Bucket-A (16 test_* across 5 files): tests/saving/test_save_shell_injection.py,
tests/saving/test_patch_saving_none_tokenizer.py, tests/saving/test_fix_sentencepiece_gguf_robustness.py,
tests/utils/test_attention_masks.py, tests/utils/test_trunc_normal_patch.py.
Currently excluded by the Repo tests (CPU) job's --ignore=tests/saving and --ignore=tests/utils
because those directories also house GPU-bound and real-HF-weight tests; the five files above are
pure-Python / AST / protobuf / regex and run cleanly on CPU.
2. unsloth_zoo @ main full pytest tests/ (172 collected, 2 deselected as CUDA-only).
unsloth_zoo has no CI on main today (.github/workflows/ is empty upstream); 106 of 111 test_*
are CPU-runnable. Locally validated: 172 passed, 2 deselected, 11.17 s.
3. unsloth_zoo.compiler.test_apply_fused_lm_head. Lives at unsloth_zoo/compiler.py:1983, not under
tests/, so it is not picked up by pytest's default collection. Plain function with no fixtures:
pure regex over transformers source strings, no GPU, no model download. Wall ~5-15 s, dominated
by the transformers import. Invoked via python -c.
Implementation notes:
- Install ladder mirrors studio-backend-ci.yml's Repo tests (CPU) job + mlx-ci.yml: studio.txt,
the explicit pin list, torch CPU + torchvision, transformers, bitsandbytes, then unsloth -e .
--no-deps and unsloth_zoo -e <clone> --no-deps. The --no-deps install lets pip honor the explicit
torch CPU-index install rather than fighting it.
- unsloth_zoo source comes from a shallow git clone at $RUNNER_TEMP/unsloth-zoo so the full tests/
directory is available (the wheel does not ship tests/). UNSLOTH_ZOO_REF is workflow_dispatch input
with default 'main'.
- PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python on the Bucket-A step. transformers' bundled
sentencepiece_model_pb2.py was generated against an older protoc and raises against the C++
protobuf 4+/5+/6 implementation; the pure-Python parser bypasses that check. Cost is negligible
for these tests, which avoids pinning protobuf and fighting transitive deps.
- Two unsloth_zoo CUDA-only cases in test_unsloth_zoo_lora_merge.py are explicitly --deselect'd to
document intent (they auto-skip on no-CUDA anyway).
- One Bucket-A test (test_run_attention_flash_varlen_receives_window_and_softcap) is --deselect'd
because it monkeypatches flash_attn_varlen_func, only bound on the module when flash_attn is
importable. flash_attn requires CUDA + dev toolchain; not installable on ubuntu-latest.
- continue-on-error: true on the job for the first pass: surfaces results in the PR check UI without
blocking merge. Once one full green run is observed, flip to false.
Locally validated on the workspace_6 host (Linux + Python 3.13.12, CUDA visible):
- Bucket-A: 15 passed, 1 deselected, 10.1 s
- unsloth_zoo @ main: 172 passed, 2 deselected, 11.2 s
- test_apply_fused_lm_head: OK
Coverage previously absent from CI: 16 unsloth tests (15 effective), 106 unsloth_zoo tests, plus
one in-tree compiler.py test. All CPU-only.