jstarks's picture
Upload Q4_K_M GGUF, full BF16 HF checkpoint, safetensors patches (r16 + dense delta), and apply_patch.py
8018ecd verified
Raw History Blame Contribute Delete
3.49 kB
"""Apply Qwen/Qwen3.5-4B WSP v2.5 safetensors patches (factored r16 subspaces or dense delta)
to a loaded Hugging Face Qwen3.5-4B model in-memory.
Supports Variant 3 regime presets cleanly:
- general_fast_think : scales=[1.95, 0.0, 0.0, 0.0, 0.0, 0.0]
- mid_code_synthesis : scales=[0.65, 0.0, 0.0, 0.65, 0.0, 0.0]
- tool_routing : scales=[0.70, 0.0, 0.95, 0.0, 0.0, 0.0]
- turn2_json : scales=[0.70, 0.40, 0.0, 0.0, 1.0, 0.0]
- restraint_pushback : scales=[0.70, 1.0, 0.0, 0.0, 0.0, 0.0]
- escalate_handoff : scales=[0.70, 0.0, 0.0, 0.0, 0.0, 1.0]
"""
from __future__ import annotations
import json
from pathlib import Path
from typing import Dict, List, Sequence
import torch
from safetensors.torch import load_file
SUBSPACE_PATCH_FILES = [
"wsp_s1_think_r16.safetensors",
"wsp_s2_restraint_r16.safetensors",
"wsp_s3_router_r16.safetensors",
"wsp_s4_mid_code_r16.safetensors",
"wsp_s5_json_schema_r16.safetensors",
"wsp_s6_handoff_r16.safetensors",
]
REGIME_PRESETS: Dict[str, List[float]] = {
"general_fast_think": [1.95, 0.0, 0.0, 0.0, 0.0, 0.0],
"mid_code_synthesis": [0.65, 0.0, 0.0, 0.65, 0.0, 0.0],
"tool_routing": [0.70, 0.0, 0.95, 0.0, 0.0, 0.0],
"turn2_json_synthesis": [0.70, 0.40, 0.0, 0.0, 1.0, 0.0],
"restraint_pushback": [0.70, 1.0, 0.0, 0.0, 0.0, 0.0],
"handoff_gate": [0.70, 0.0, 0.0, 0.0, 0.0, 1.0],
"static_all_on_v2": [0.65, 0.65, 0.65, 0.65, 0.65, 0.65],
}
def apply_subspace_scales_to_hf_model(
model: torch.nn.Module,
patches_dir: Path | str,
scales: Sequence[float],
use_s4_oproj: bool = False,
) -> int:
"""Add sum_i scale[i] * (lora_b @ lora_a) directly into HF model weights in-place."""
if len(scales) != 6:
raise ValueError(f"Expected 6 subspace scales, got {len(scales)}")
pdir = Path(patches_dir)
params = dict(model.named_parameters())
updated_tensors = 0
with torch.no_grad():
for i, fname in enumerate(SUBSPACE_PATCH_FILES):
sc = float(scales[i])
if abs(sc) < 1e-9:
continue
target_file = pdir / ("wsp_s4_mid_code_oproj_r16.safetensors" if (i == 3 and use_s4_oproj) else fname)
tensors = load_file(str(target_file), device="cpu")
prefixes = sorted({k[:-7] for k in tensors if k.endswith(".lora_a")})
for hf_key in prefixes:
param = params[hf_key]
la = tensors[f"{hf_key}.lora_a"].to(device=param.device, dtype=torch.float32)
lb = tensors[f"{hf_key}.lora_b"].to(device=param.device, dtype=torch.float32)
delta = sc * (lb @ la)
param.add_(delta.to(dtype=param.dtype))
updated_tensors += 1
return updated_tensors
def apply_dense_patch_to_hf_model(
model: torch.nn.Module,
dense_patch_path: Path | str,
scale: float = 1.0,
) -> int:
"""Add scale * delta tensors from wsp_qwen35_4b_patch.safetensors directly in-place."""
tensors = load_file(str(dense_patch_path), device="cpu")
params = dict(model.named_parameters())
updated = 0
with torch.no_grad():
for key, delta in tensors.items():
if not key.endswith(".delta"):
continue
hf_key = key[: -len(".delta")]
param = params[hf_key]
param.add_((scale * delta.to(device=param.device, dtype=torch.float32)).to(dtype=param.dtype))
updated += 1
return updated