Files
2026-05-20 19:53:46 -07:00

239 lines
6.6 KiB
Python

import torch
import comfy
from comfy import latent_formats, supported_models_base
from . import model_base
class OklabPixels(latent_formats.LatentFormat):
is_pixel_latent = True
latent_channels = 3
spacial_downscale_ratio = 1
class GMQwenImage(supported_models_base.BASE):
unet_config = {
"image_model": "gm_qwen_image",
}
policy_config = {
"type": "GMFlow",
}
sampling_settings = {'multiplier': 1.0}
memory_usage_factor = 1.8
unet_extra_config = {}
latent_format = latent_formats.Wan21
supported_inference_dtypes = [torch.bfloat16, torch.float32]
vae_key_prefix = ["vae."]
text_encoder_key_prefix = ["text_encoders."]
def get_model(self, state_dict, prefix="", device=None):
out = model_base.GMQwenImage(self, device=device)
return out
def clip_target(self, state_dict={}):
pref = self.text_encoder_key_prefix[0]
hunyuan_detect = comfy.text_encoders.hunyuan_video.llama_detect(state_dict, "{}qwen25_7b.transformer.".format(pref))
return supported_models_base.ClipTarget(comfy.text_encoders.qwen_image.QwenImageTokenizer, comfy.text_encoders.qwen_image.te(**hunyuan_detect))
class QwenImage(supported_models_base.BASE):
unet_config = {
"image_model": "qwen_image",
}
policy_config = {}
sampling_settings = {'multiplier': 1.0}
memory_usage_factor = 1.8
unet_extra_config = {}
latent_format = latent_formats.Wan21
supported_inference_dtypes = [torch.bfloat16, torch.float32]
vae_key_prefix = ["vae."]
text_encoder_key_prefix = ["text_encoders."]
def get_model(self, state_dict, prefix="", device=None):
out = model_base.QwenImage(self, device=device)
return out
def clip_target(self, state_dict={}):
pref = self.text_encoder_key_prefix[0]
hunyuan_detect = comfy.text_encoders.hunyuan_video.llama_detect(state_dict, "{}qwen25_7b.transformer.".format(pref))
return supported_models_base.ClipTarget(comfy.text_encoders.qwen_image.QwenImageTokenizer, comfy.text_encoders.qwen_image.te(**hunyuan_detect))
class GMFlux(supported_models_base.BASE):
unet_config = {
"image_model": "gm_flux",
"guidance_embed": True,
}
policy_config = {
"type": "GMFlow",
}
sampling_settings = {'multiplier': 1.0}
unet_extra_config = {}
latent_format = latent_formats.Flux
memory_usage_factor = 3.1
supported_inference_dtypes = [torch.bfloat16, torch.float16, torch.float32]
vae_key_prefix = ["vae."]
text_encoder_key_prefix = ["text_encoders."]
def get_model(self, state_dict, prefix="", device=None):
out = model_base.GMFlux(self, device=device)
return out
def clip_target(self, state_dict={}):
pref = self.text_encoder_key_prefix[0]
t5_detect = comfy.text_encoders.sd3_clip.t5_xxl_detect(state_dict, "{}t5xxl.transformer.".format(pref))
return supported_models_base.ClipTarget(comfy.text_encoders.flux.FluxTokenizer, comfy.text_encoders.flux.flux_clip(**t5_detect))
class Flux(supported_models_base.BASE):
unet_config = {
"image_model": "flux",
"guidance_embed": True,
}
policy_config = {}
sampling_settings = {'multiplier': 1.0}
unet_extra_config = {}
latent_format = latent_formats.Flux
memory_usage_factor = 3.1
supported_inference_dtypes = [torch.bfloat16, torch.float16, torch.float32]
vae_key_prefix = ["vae."]
text_encoder_key_prefix = ["text_encoders."]
def get_model(self, state_dict, prefix="", device=None):
out = model_base.Flux(self, device=device)
return out
def clip_target(self, state_dict={}):
pref = self.text_encoder_key_prefix[0]
t5_detect = comfy.text_encoders.sd3_clip.t5_xxl_detect(state_dict, "{}t5xxl.transformer.".format(pref))
return supported_models_base.ClipTarget(comfy.text_encoders.flux.FluxTokenizer, comfy.text_encoders.flux.flux_clip(**t5_detect))
class GMFlux2(supported_models_base.BASE):
unet_config = {
"image_model": "gm_flux2",
}
policy_config = {
"type": "GMFlow",
}
sampling_settings = {
'multiplier': 1.0,
'patch_size': (2, 2)
}
unet_extra_config = {}
latent_format = latent_formats.Flux2
memory_usage_factor = 3.1
supported_inference_dtypes = [torch.bfloat16, torch.float16, torch.float32]
vae_key_prefix = ["vae."]
text_encoder_key_prefix = ["text_encoders."]
def __init__(self, unet_config):
super().__init__(unet_config)
self.memory_usage_factor = self.memory_usage_factor * (2.0 * 2.0) * (unet_config["hidden_size"] / 2604)
def get_model(self, state_dict, prefix="", device=None):
out = model_base.GMFlux2(self, device=device)
return out
def clip_target(self, state_dict={}):
return None
class Flux2(supported_models_base.BASE):
unet_config = {
"image_model": "flux2",
}
policy_config = {}
sampling_settings = {
'multiplier': 1.0,
'patch_size': (2, 2)
}
unet_extra_config = {}
latent_format = latent_formats.Flux2
memory_usage_factor = 3.1
supported_inference_dtypes = [torch.bfloat16, torch.float16, torch.float32]
vae_key_prefix = ["vae."]
text_encoder_key_prefix = ["text_encoders."]
def __init__(self, unet_config):
super().__init__(unet_config)
self.memory_usage_factor = self.memory_usage_factor * (2.0 * 2.0) * (unet_config['hidden_size'] / 2604)
def get_model(self, state_dict, prefix="", device=None):
out = model_base.Flux2(self, device=device)
return out
def clip_target(self, state_dict={}):
return None
class AsymFlux2(supported_models_base.BASE):
unet_config = {
"image_model": "asym_flux2",
}
sampling_settings = {
"shift": 17.0,
}
unet_extra_config = {}
latent_format = OklabPixels
memory_usage_factor = 3.1
supported_inference_dtypes = [torch.bfloat16, torch.float16, torch.float32]
vae_key_prefix = ["vae."]
text_encoder_key_prefix = ["text_encoders."]
def __init__(self, unet_config):
super().__init__(unet_config)
hidden_size = unet_config["hidden_size"]
patch_size = unet_config["patch_size"]
self.memory_usage_factor = self.memory_usage_factor * (2.0 * 2.0) * (hidden_size / 2604) / (patch_size * patch_size)
def get_model(self, state_dict, prefix="", device=None):
out = model_base.AsymFlux2(self, device=device)
return out
def clip_target(self, state_dict={}):
return None
models = [GMQwenImage, QwenImage, GMFlux, Flux, GMFlux2, Flux2, AsymFlux2]