Skip to content

v2.16.5 Technical Notes ​

Extended technical notes for the v2.16.5 release — the deeper "how and why" behind each change. For the user-facing summary, see the CHANGELOG.

Home

Table of Contents ​

Wan2GP on Python 3.11, PyTorch 2.10 and CUDA 13 ​

Wan2GP's own installer (the GPU profiles in its setup_config.json) moved RTX 20XX and newer to Python 3.11 with a CUDA 13 build of PyTorch, keeping Python 3.10 only for GTX 10XX. Stability Matrix still installed Python 3.10 attention wheels, so a Python 3.11 venv failed with sageattention ... has no wheels with a matching Python version tag.

The NVIDIA install now chooses its stack from the venv's Python version:

  • Python 3.11 and newer (any NVIDIA card except GTX 10XX): torch 2.10.0, torchvision 0.25.0 and torchaudio 2.10.0 from the cu130 index, with their dependencies, so the CUDA 13 runtime (and Triton, on Linux) comes along. Ampere (RTX 30XX) and newer cards also get:
    • Windows: triton-windows 3.6, SageAttention through the same wheel resolver ComfyUI uses (woct0rdho's post6 build for CUDA 13 and torch 2.10 or newer), and Wan2GP's Flash Attention wheel, which is published for Python 3.11 only.
    • Linux: Wan2GP's own SageAttention build (the cg1 wheel for CUDA 13 and torch 2.10). Flash Attention is skipped, since Wan2GP's Linux installer builds it from source.
  • Python 3.10: the torch 2.7 stack as before, with triton-windows 3.3.1 and the Python 3.10 attention wheels on Ampere and newer.

RTX 20XX gets the CUDA 13 PyTorch build and, as before, no Triton or attention wheels. New installs default to Python 3.11, or 3.10 on GTX 10XX.

Existing installs keep their stack ​

Updates reuse the install's recorded Python version, and Wan2GP declares no minimum version that would trigger the venv-recreating upgrade prompt, so an install created on Python 3.10 keeps torch 2.7.1 and triton-windows 3.3.1 (on Windows) on every update. Triton can't be bumped alone: triton-windows 3.4 and later pair with torch 2.8 and later. Newer Wan2GP models that compile Triton kernels, such as LTX 2.5, can fail on that stack (#1756).

Change Version offers no Python choice either, so moving to the new stack means a fresh install:

  1. In the Package Manager, add Wan2GP again under a different name. The installer won't accept a name that's already in use.
  2. Open Advanced Options and check that Python Version is 3.11 (the default on RTX 20XX and newer).
  3. Once it's installed and working, copy your outputs and anything else you want to keep from the old install folder, then uninstall the old copy.

Driver check at launch ​

CUDA 13 needs NVIDIA driver 580 or newer. Wan2GP's launch now runs the same check as ComfyUI and AI Toolkit: on an NVIDIA card other than GTX 10XX, if the driver's major version is below 580 and the venv's torch is a +cu130 build, it prints a console warning recommending a driver update (or an older torch index such as cu128) and stops the launch. Python 3.10 installs, and systems where the driver version can't be read, launch unchecked.

Node.js Extraction on Linux and macOS ​

On Linux and macOS, AI Toolkit's Node.js prerequisite comes from the official v20.19.3 .tar.gz, which contains relative symlinks for npm, npx and corepack. The bundled 7-Zip rejects those as dangerous link paths, so AI Toolkit installs on Linux failed before Python setup started (#1767).

Rather than turning 7-Zip's protection off, the Unix Node install now goes through a small dedicated extractor built on .NET's System.Formats.Tar. It extracts directories and regular files first, keeping their Unix permissions so node stays executable, and creates the symlinks only after every file is out, so no archive entry can write through a link the same archive created. Each link is written as a relative link to its checked, normalized target. Extraction fails on:

  • absolute paths, backslash or drive/UNC spellings, and any path that resolves outside the destination;
  • a link whose target is not a regular file extracted from the same archive, which also rules out directory links, link chains and missing targets;
  • hard links and special entries such as devices and FIFOs;
  • an existing symlink or junction anywhere along a destination path.

Windows Node installs and every other archive extraction keep their existing behavior.

Every SwarmUI install gets Models/diffusion_models, a link to Models/DiffusionModels. Since 2.16.4 the model index follows links but scans each physical folder at most once (see Workflow Library Link Loops), so the alias and the real folder competed for one folder, and the scan order let the last-listed entry win. On NTFS _ sorts after uppercase letters, so diffusion_models won every time. Diffusion models were then indexed only under the alias, whose name maps to no model type, so the Checkpoint Manager showed bare filenames without previews or metadata, and Image Lab and Inference missed them (#1749, #1753, #1755).

The rule now: the real directory tree is scanned first, then links are followed in order of how many links each path passes through, and the first path to reach a physical folder owns it. A real folder is the zero-link case, so it always beats an alias. If DiffusionModels is itself a link to another drive and the alias points at that link, the direct link is one hop and the alias two, so name sort order (or Linux's unordered listing) never decides. Links are resolved one at a time through each stored target, which is what counts the hops and also stops resolution passing through subst drive letters, where every file had been listed twice.

Not covered: a hand-made link whose stored target uses a different drive alias (T:\... while the library is reached through C:\...) can still list files twice. Stability Matrix's own links are spelled from the models folder, so they can't hit this.

Diagnosed and first fixed by @NeuralFault (#1743), with the link-count ordering by @ionite34 (#1763).

For a package using symlink sharing, the package size shown in the uninstall confirmation (added in 2.16.4) could be the size of the whole shared model library. The count skipped links only among the package folder's direct children, then recursed with options that follow nested links, and symlink sharing puts its links one level down (models/checkpoints). It's now one enumeration that skips links at every depth and still counts hidden files, shared with the size shown when installing over an existing folder. Only the number was wrong: the delete checks for links at every level and only unlinks them, so shared models were never removed.