unsloth/.github
Daniel Han 2843e2a9bb ci(windows): pre-upgrade npm to 11 + Defender exclusions for ~/.unsloth + frontend
Side-by-side substep timing (Update CI, same SHA, post cache-revert):

                           Mac   Linux   Windows
  install uv                1s      1s      12s
  uv pip install unsloth    8s     10s      29s
  Node setup                4s      4s      35s   <- winget reinstall
  frontend build           20s     22s     204s   <- 10x slower
  9-step uv pip deps       15s     20s      92s   <- 5x slower
  llama.cpp validate       38s     21s      13s
  -------------------------------------------------
  total                    96s     93s     400s

Two Windows-specific time sinks have nothing to do with the install
logic itself; they are runner-environment friction:

(1) `setup.ps1` line 1109-1145 requires Node 22.12+ AND npm >=11
    (Vite 8 hard requirement). actions/setup-node@v4 with
    `node-version: '22'` lands Node 22.22.2 + the npm 10.9.7 it
    bundles, so the npm check fails and setup.ps1 falls into the
    "winget install Node.js LTS" branch (~35 s) for a Node reinstall
    we do not actually need. `npm install -g npm@^11` upgrades the
    bundled npm in-place in ~5 s, which lets setup.ps1 short-circuit
    on the existing Node 22.

(2) windows-latest's Windows Defender real-time scanning opens and
    hashes every file the install writes. Vite/Tailwind/TSC produce
    thousands of small chunks during the frontend build, and uv pip
    extracts thousands of small files per wheel. The scan latency
    dominates both. Adding Add-MpPreference -ExclusionPath entries
    for the four directories Studio writes to drops per-file open
    latency from ~ms to ~us. The runneradmin user has the privilege
    needed; wrap each call in try/catch so a permission flake leaves
    the install otherwise unaffected.

Excluded paths:

  $env:USERPROFILE\.unsloth                       (Studio venv + llama.cpp)
  $env:USERPROFILE\AppData\Local\uv               (uv wheel cache + extracts)
  $env:GITHUB_WORKSPACE\studio\frontend\node_modules
  $env:GITHUB_WORKSPACE\studio\frontend\dist

Six Windows jobs touched (4 workflows, with the inference workflow
fanning out to 3 jobs):

  studio-windows-update-smoke.yml      (1 job)
  studio-windows-api-smoke.yml         (1 job)
  studio-windows-ui-smoke.yml          (1 job)
  studio-windows-inference-smoke.yml   (3 jobs: openai-anthropic,
                                        tool-calling, json-images)

The new "Pre-install Windows tweaks" step is identical across every
Windows job; the rationale is described once in
studio-windows-update-smoke.yml and cross-referenced from the others.

Expected savings per Windows job:
  - npm fix: ~35 s saved (winget Node reinstall skipped)
  - Defender exclusions: ~30-90 s saved (frontend / uv-pip-extract)
  - Combined: ~60-120 s per job, or ~6-12 min CPU per PR push across
    all 6 Windows jobs.

Not addressed (out of scope for this commit):
  - The fundamental Vite/TSC/Tailwind frontend build cost on NTFS.
    Optimising that would mean changing the build pipeline (e.g.
    skipping `tsc -b` and relying on type-check elsewhere), which is
    much more invasive.
  - The uv pip extraction cost. The actions/setup-python@v5 cache
    already caches pip wheels; uv has its own cache that we could
    cache separately, but the cache restore overhead on Windows
    (76 s for the venv we tried and reverted) tends to eat the
    savings -- the Defender exclusion above goes after the same
    cost via a different lever.
2026-05-08 08:54:50 +00:00
..
ISSUE_TEMPLATE Update issue template 2026-03-23 10:10:15 +05:30
workflows ci(windows): pre-upgrade npm to 11 + Defender exclusions for ~/.unsloth + frontend 2026-05-08 08:54:50 +00:00
CODEOWNERS Update CODEOWNERS 2026-03-13 13:38:19 -07:00
dependabot.yml CI(security): defense-in-depth additions across 7 axes 2026-05-07 00:09:40 +00:00
FUNDING.yml Update FUNDING.yml (#3792) 2025-12-28 19:57:43 -08:00