From 5997b33f02dcd5b632747bae95b8f59341754180 Mon Sep 17 00:00:00 2001 From: Mr-Neutr0n Date: Sun, 8 Feb 2026 17:39:26 +0530 Subject: [PATCH] fix(controlnet): Use deep copy in ZImageControlNet.from_transformer The from_transformer classmethod was creating shallow copies of modules from the transformer, causing modifications to the controlnet weights to also affect the original transformer weights. This fix uses copy.deepcopy() to ensure the controlnet has its own independent copy of the weights. Fixes #13077 --- .../models/controlnets/controlnet_z_image.py | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/diffusers/models/controlnets/controlnet_z_image.py b/src/diffusers/models/controlnets/controlnet_z_image.py index 3f79ec925419..6004016c8561 100644 --- a/src/diffusers/models/controlnets/controlnet_z_image.py +++ b/src/diffusers/models/controlnets/controlnet_z_image.py @@ -517,15 +517,19 @@ def __init__( @classmethod def from_transformer(cls, controlnet, transformer): + import copy + controlnet.t_scale = transformer.t_scale - controlnet.t_embedder = transformer.t_embedder - controlnet.all_x_embedder = transformer.all_x_embedder - controlnet.cap_embedder = transformer.cap_embedder - controlnet.rope_embedder = transformer.rope_embedder - controlnet.noise_refiner = transformer.noise_refiner - controlnet.context_refiner = transformer.context_refiner - controlnet.x_pad_token = transformer.x_pad_token - controlnet.cap_pad_token = transformer.cap_pad_token + # Use deep copies to avoid sharing references with the transformer. + # This ensures modifying controlnet weights won't affect the transformer. + controlnet.t_embedder = copy.deepcopy(transformer.t_embedder) + controlnet.all_x_embedder = copy.deepcopy(transformer.all_x_embedder) + controlnet.cap_embedder = copy.deepcopy(transformer.cap_embedder) + controlnet.rope_embedder = copy.deepcopy(transformer.rope_embedder) + controlnet.noise_refiner = copy.deepcopy(transformer.noise_refiner) + controlnet.context_refiner = copy.deepcopy(transformer.context_refiner) + controlnet.x_pad_token = copy.deepcopy(transformer.x_pad_token) + controlnet.cap_pad_token = copy.deepcopy(transformer.cap_pad_token) return controlnet @staticmethod