loras: peftgptqmodel AWQ compat shim (fixes add_adapter ImportError)

LoRA add_adapter() crashed: peft's dispatch_awq does `from
gptqmodel.nn_modules.qlinear.gemm_awq import AwqGEMMQuantLinear`, but gptqmodel
7.1.0 renamed that class to AwqGEMMLinear. peft calls dispatch_awq for ANY non-bnb
target when gptqmodel is installed, so the failed import broke every add_adapter
(SDXL/Wan/Z-Image), not just AWQ models.

Add _ensure_peft_awq_compat(): alias AwqGEMMQuantLinear -> AwqGEMMLinear so peft's
import succeeds and falls through to the correct dispatcher. Called before every
add_adapter() (sd15/sdxl/dit/wan).
Co-Authored-By: 's avatarClaude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RdMufYvtTbtGDWsiZVoXce
parent ff6002d6
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
# Canonical product version for CoderAI — single source of truth. Both the API # Canonical product version for CoderAI — single source of truth. Both the API
# metadata and the admin web UI read from here. # metadata and the admin web UI read from here.
__version__ = "0.1.21" __version__ = "0.1.22"
# Configure the CUDA caching allocator BEFORE torch is imported anywhere. # Configure the CUDA caching allocator BEFORE torch is imported anywhere.
# expandable_segments lets the allocator return freed pages to the driver even # expandable_segments lets the allocator return freed pages to the driver even
......
...@@ -1154,6 +1154,7 @@ def _train_sd15(req, base_path, images, instance_prompt, ...@@ -1154,6 +1154,7 @@ def _train_sd15(req, base_path, images, instance_prompt,
r=rank, lora_alpha=rank, init_lora_weights="gaussian", r=rank, lora_alpha=rank, init_lora_weights="gaussian",
target_modules=["to_k", "to_q", "to_v", "to_out.0"], target_modules=["to_k", "to_q", "to_v", "to_out.0"],
) )
_ensure_peft_awq_compat()
unet.add_adapter(lora_cfg, adapter_name="default") unet.add_adapter(lora_cfg, adapter_name="default")
lora_params = [p for p in unet.parameters() if p.requires_grad] lora_params = [p for p in unet.parameters() if p.requires_grad]
optimizer = torch.optim.AdamW(lora_params, lr=lr) optimizer = torch.optim.AdamW(lora_params, lr=lr)
...@@ -1298,6 +1299,7 @@ def _train_sdxl(req, base_path, images, instance_prompt, ...@@ -1298,6 +1299,7 @@ def _train_sdxl(req, base_path, images, instance_prompt,
r=rank, lora_alpha=rank, init_lora_weights="gaussian", r=rank, lora_alpha=rank, init_lora_weights="gaussian",
target_modules=["to_k", "to_q", "to_v", "to_out.0"], target_modules=["to_k", "to_q", "to_v", "to_out.0"],
) )
_ensure_peft_awq_compat()
unet.add_adapter(lora_cfg, adapter_name="default") unet.add_adapter(lora_cfg, adapter_name="default")
lora_params = [p for p in unet.parameters() if p.requires_grad] lora_params = [p for p in unet.parameters() if p.requires_grad]
optimizer = torch.optim.AdamW(lora_params, lr=lr) optimizer = torch.optim.AdamW(lora_params, lr=lr)
...@@ -1431,6 +1433,22 @@ def _train_sdxl(req, base_path, images, instance_prompt, ...@@ -1431,6 +1433,22 @@ def _train_sdxl(req, base_path, images, instance_prompt,
return {"name": name, "path": path} return {"name": name, "path": path}
def _ensure_peft_awq_compat():
"""peft's LoRA AWQ dispatcher does `from gptqmodel.nn_modules.qlinear.gemm_awq
import AwqGEMMQuantLinear`, but gptqmodel 7.1.0 renamed that class to
AwqGEMMLinear. Since peft calls dispatch_awq for ANY non-bnb target whenever
gptqmodel is installed, the failed import crashes EVERY add_adapter() (SDXL, Wan
and Z-Image LoRA training alike). Alias the renamed class so the import succeeds;
no-op when the name already exists or gptqmodel isn't present."""
try:
import importlib
m = importlib.import_module("gptqmodel.nn_modules.qlinear.gemm_awq")
if not hasattr(m, "AwqGEMMQuantLinear") and hasattr(m, "AwqGEMMLinear"):
m.AwqGEMMQuantLinear = m.AwqGEMMLinear
except Exception:
pass
def _train_dit(req, base_path, images, instance_prompt, def _train_dit(req, base_path, images, instance_prompt,
steps, rank, resolution, lr, seed, device): steps, rank, resolution, lr, seed, device):
"""Train a LoRA for an image diffusion-TRANSFORMER (DiT) — currently Z-Image """Train a LoRA for an image diffusion-TRANSFORMER (DiT) — currently Z-Image
...@@ -1561,6 +1579,7 @@ def _train_dit(req, base_path, images, instance_prompt, ...@@ -1561,6 +1579,7 @@ def _train_dit(req, base_path, images, instance_prompt,
lora_cfg = PeftLoraConfig(r=rank, lora_alpha=rank, init_lora_weights="gaussian", lora_cfg = PeftLoraConfig(r=rank, lora_alpha=rank, init_lora_weights="gaussian",
target_modules=["to_k", "to_q", "to_v", "to_out.0"]) target_modules=["to_k", "to_q", "to_v", "to_out.0"])
transformer.requires_grad_(False) transformer.requires_grad_(False)
_ensure_peft_awq_compat()
transformer.add_adapter(lora_cfg, adapter_name="default") transformer.add_adapter(lora_cfg, adapter_name="default")
_hooks = [] _hooks = []
# Gradient checkpointing is intentionally OFF: with a bnb-4-bit frozen base the # Gradient checkpointing is intentionally OFF: with a bnb-4-bit frozen base the
...@@ -1813,6 +1832,7 @@ def _train_wan(req, base_path, images, instance_prompt, ...@@ -1813,6 +1832,7 @@ def _train_wan(req, base_path, images, instance_prompt,
hook_handles = [] hook_handles = []
for _, tr in experts: for _, tr in experts:
tr.requires_grad_(False) tr.requires_grad_(False)
_ensure_peft_awq_compat()
tr.add_adapter(lora_cfg, adapter_name="default") tr.add_adapter(lora_cfg, adapter_name="default")
try: try:
tr.enable_gradient_checkpointing() tr.enable_gradient_checkpointing()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment