1ripon1's picture
Upload folder using huggingface_hub
7344bef verified
Raw
History Blame Contribute Delete
15.3 kB
import os
from typing import Optional, Union
import numpy as np
import torch
from huggingface_hub import hf_hub_download, snapshot_download
from omegaconf import OmegaConf
from omegaconf.dictconfig import DictConfig
from .models.dit import get_dit
from .models.text_embedders import get_text_embedder
from .models.vae import build_vae
from .i2v_pipeline import Kandinsky5I2VPipeline
from .t2v_pipeline import Kandinsky5T2VPipeline
from .t2i_pipeline import Kandinsky5T2IPipeline
from .i2i_pipeline import Kandinsky5I2IPipeline
from .magcache_utils import set_magcache_params
from PIL import Image
from safetensors.torch import load_file
torch._dynamo.config.suppress_errors = True
HF_TOKEN = None
def get_hf_token():
return HF_TOKEN
def set_hf_token(hf_token):
global HF_TOKEN
HF_TOKEN = hf_token
def get_T2V_pipeline(
device_map: Union[str, torch.device, dict],
cache_dir: str = "./weights/",
dit_path: str = None,
text_encoder_path: str = None,
text_encoder2_path: str = None,
vae_path: str = None,
conf_path: str = None,
magcache: bool = False,
quantized_qwen: bool = False,
text_token_padding: bool = False,
attention_engine: str = "auto",
) -> Kandinsky5T2VPipeline:
if not isinstance(device_map, dict):
device_map = {"dit": device_map, "vae": device_map, "text_embedder": device_map}
os.makedirs(cache_dir, exist_ok=True)
if dit_path is None and conf_path is None:
dit_path = snapshot_download(
repo_id="kandinskylab/Kandinsky-5.0-T2V-Lite-sft-5s",
allow_patterns="model/*",
local_dir=cache_dir,
token=get_hf_token()
)
dit_path = os.path.join(cache_dir, "model/kandinsky5lite_t2v_sft_5s.safetensors")
if vae_path is None and conf_path is None:
vae_path = snapshot_download(
repo_id="hunyuanvideo-community/HunyuanVideo",
allow_patterns="vae/*",
local_dir=cache_dir,
token=get_hf_token()
)
vae_path = os.path.join(cache_dir, "vae/")
if text_encoder_path is None and conf_path is None:
text_encoder_path = snapshot_download(
repo_id="Qwen/Qwen2.5-VL-7B-Instruct",
local_dir=os.path.join(cache_dir, "text_encoder/"),
token=get_hf_token()
)
text_encoder_path = os.path.join(cache_dir, "text_encoder/")
if text_encoder2_path is None and conf_path is None:
text_encoder2_path = snapshot_download(
repo_id="openai/clip-vit-large-patch14",
local_dir=os.path.join(cache_dir, "text_encoder2/"),
token=get_hf_token()
)
text_encoder2_path = os.path.join(cache_dir, "text_encoder2/")
if conf_path is None:
conf = get_default_conf(
dit_path, vae_path, text_encoder_path, text_encoder2_path
)
else:
conf = OmegaConf.load(conf_path)
conf.model.dit_params.attention_engine = attention_engine
conf.model.text_embedder.qwen.mode = "t2v"
text_embedder = get_text_embedder(conf.model.text_embedder, device=torch.device("cpu"),
quantized_qwen=quantized_qwen, text_token_padding=text_token_padding)
vae = build_vae(conf.model.vae)
vae = vae.eval()
dit = get_dit(conf.model.dit_params, text_token_padding=text_token_padding)
if magcache:
mag_ratios = conf.magcache.mag_ratios
num_steps = conf.model.num_steps
no_cfg = False
if conf.model.guidance_weight == 1.0:
no_cfg = True
set_magcache_params(dit, mag_ratios, num_steps, no_cfg, start_step=0)
state_dict = load_file(conf.model.checkpoint_path, device='cpu')
dit.load_state_dict(state_dict, assign=True)
return Kandinsky5T2VPipeline(
device_map=device_map,
dit=dit,
text_embedder=text_embedder,
vae=vae,
conf=conf,
)
def get_I2V_pipeline(
device_map: Union[str, torch.device, dict],
cache_dir: str = "./weights/",
dit_path: str = None,
text_encoder_path: str = None,
text_encoder2_path: str = None,
vae_path: str = None,
conf_path: str = None,
magcache: bool = False,
quantized_qwen: bool = False,
text_token_padding: bool = False,
attention_engine: str = "auto",
) -> Kandinsky5T2VPipeline:
if not isinstance(device_map, dict):
device_map = {"dit": device_map, "vae": device_map, "text_embedder": device_map}
os.makedirs(cache_dir, exist_ok=True)
if dit_path is None and conf_path is None:
dit_path = snapshot_download(
repo_id="kandinskylab/Kandinsky-5.0-I2V-Lite-5s",
allow_patterns="model/*",
local_dir=cache_dir,
token=get_hf_token()
)
dit_path = os.path.join(cache_dir, "model/kandinsky5lite_i2v_5s.safetensors")
if vae_path is None and conf_path is None:
vae_path = snapshot_download(
repo_id="hunyuanvideo-community/HunyuanVideo",
allow_patterns="vae/*",
local_dir=cache_dir,
token=get_hf_token()
)
vae_path = os.path.join(cache_dir, "vae/")
if text_encoder_path is None and conf_path is None:
text_encoder_path = snapshot_download(
repo_id="Qwen/Qwen2.5-VL-7B-Instruct",
local_dir=os.path.join(cache_dir, "text_encoder/"),
token=get_hf_token()
)
text_encoder_path = os.path.join(cache_dir, "text_encoder/")
if text_encoder2_path is None and conf_path is None:
text_encoder2_path = snapshot_download(
repo_id="openai/clip-vit-large-patch14",
local_dir=os.path.join(cache_dir, "text_encoder2/"),
token=get_hf_token()
)
text_encoder2_path = os.path.join(cache_dir, "text_encoder2/")
if conf_path is None:
conf = get_default_conf(
dit_path, vae_path, text_encoder_path, text_encoder2_path
)
else:
conf = OmegaConf.load(conf_path)
conf.model.dit_params.attention_engine = attention_engine
conf.model.text_embedder.qwen.mode = "i2v"
text_embedder = get_text_embedder(conf.model.text_embedder, device=torch.device("cpu"),
quantized_qwen=quantized_qwen, text_token_padding=text_token_padding)
vae = build_vae(conf.model.vae)
vae = vae.eval()
dit = get_dit(conf.model.dit_params, text_token_padding=text_token_padding)
if magcache:
mag_ratios = conf.magcache.mag_ratios
num_steps = conf.model.num_steps
no_cfg = False
if conf.model.guidance_weight == 1.0:
no_cfg = True
set_magcache_params(dit, mag_ratios, num_steps, no_cfg, start_step=0)
state_dict = load_file(conf.model.checkpoint_path, device='cpu')
dit.load_state_dict(state_dict, assign=True)
return Kandinsky5I2VPipeline(
device_map=device_map,
dit=dit,
text_embedder=text_embedder,
vae=vae,
conf=conf,
)
def _get_TI2I_params(
instruct_type: bool,
model_name: str,
weights_name: str,
device_map: Union[str, torch.device, dict],
resolution: int = 1024,
cache_dir: str = "./weights/",
dit_path: str = None,
text_encoder_path: str = None,
text_encoder2_path: str = None,
vae_path: str = None,
conf_path: str = None,
magcache: bool = False,
quantized_qwen: bool = False,
text_token_padding: bool = False,
attention_engine: str = "auto",
) -> Kandinsky5T2IPipeline:
assert resolution in [1024]
if not isinstance(device_map, dict):
device_map = {"dit": device_map, "vae": device_map, "text_embedder": device_map}
os.makedirs(cache_dir, exist_ok=True)
if dit_path is None and conf_path is None:
dit_path = snapshot_download(
repo_id=f"kandinskylab/{model_name}",
allow_patterns="model/*",
local_dir=cache_dir,
token=get_hf_token()
)
dit_path = os.path.join(cache_dir, f"model/{weights_name}")
if vae_path is None and conf_path is None:
vae_path = snapshot_download(
repo_id="hunyuanvideo-community/HunyuanVideo",
allow_patterns="vae/*",
local_dir=cache_dir,
token=get_hf_token()
)
vae_path = os.path.join(cache_dir, "vae/")
if text_encoder_path is None and conf_path is None:
text_encoder_path = snapshot_download(
repo_id="Qwen/Qwen2.5-VL-7B-Instruct",
local_dir=os.path.join(cache_dir, "text_encoder/"),
token=get_hf_token()
)
text_encoder_path = os.path.join(cache_dir, "text_encoder/")
if text_encoder2_path is None and conf_path is None:
text_encoder2_path = snapshot_download(
repo_id="openai/clip-vit-large-patch14",
local_dir=os.path.join(cache_dir, "text_encoder2/"),
token=get_hf_token()
)
text_encoder2_path = os.path.join(cache_dir, "text_encoder2/")
if conf_path is None:
conf = get_default_ti2i_conf(
dit_path, vae_path, text_encoder_path, text_encoder2_path, instruct_type=instruct_type,
)
else:
conf = OmegaConf.load(conf_path)
conf.model.dit_params.attention_engine = attention_engine
conf.model.text_embedder.qwen.mode = "t2i"
text_embedder = get_text_embedder(conf.model.text_embedder, device=torch.device("cpu"),
quantized_qwen=quantized_qwen, text_token_padding=text_token_padding)
vae = build_vae(conf.model.vae)
vae = vae.eval()
dit = get_dit(conf.model.dit_params, text_token_padding=text_token_padding)
if magcache:
mag_ratios = conf.magcache.mag_ratios
num_steps = conf.model.num_steps
no_cfg = False
if conf.model.guidance_weight == 1.0:
no_cfg = True
set_magcache_params(dit, mag_ratios, num_steps, no_cfg, start_step=0)
state_dict = load_file(conf.model.checkpoint_path)
dit.load_state_dict(state_dict, assign=True)
return dict(
device_map=device_map,
dit=dit,
text_embedder=text_embedder,
vae=vae,
resolution=resolution,
conf=conf,
)
def get_T2I_pipeline(
device_map: Union[str, torch.device, dict],
resolution: int = 1024,
cache_dir: str = "./weights/",
dit_path: str = None,
text_encoder_path: str = None,
text_encoder2_path: str = None,
vae_path: str = None,
conf_path: str = None,
magcache: bool = False,
quantized_qwen: bool = False,
text_token_padding: bool = False,
attention_engine: str = "auto",
) -> Kandinsky5T2IPipeline:
kwargs = _get_TI2I_params(
instruct_type=None,
model_name='Kandinsky-5.0-T2I-Lite',
weights_name='kandinsky5lite_t2i.safetensors',
device_map=device_map,
resolution=resolution,
cache_dir=cache_dir,
dit_path=dit_path,
text_encoder_path=text_encoder_path,
text_encoder2_path=text_encoder2_path,
vae_path=vae_path,
conf_path=conf_path,
magcache=magcache,
quantized_qwen=quantized_qwen,
text_token_padding=text_token_padding,
attention_engine=attention_engine,
)
return Kandinsky5T2IPipeline(**kwargs)
def get_I2I_pipeline(
device_map: Union[str, torch.device, dict],
resolution: int = 1024,
cache_dir: str = "./weights/",
dit_path: str = None,
text_encoder_path: str = None,
text_encoder2_path: str = None,
vae_path: str = None,
conf_path: str = None,
magcache: bool = False,
quantized_qwen: bool = False,
text_token_padding: bool = False,
attention_engine: str = "auto",
) -> Kandinsky5T2IPipeline:
kwargs = _get_TI2I_params(
instruct_type='channel',
model_name='Kandinsky-5.0-I2I-Lite',
weights_name='kandinsky5lite_i2i.safetensors',
device_map=device_map,
resolution=resolution,
cache_dir=cache_dir,
dit_path=dit_path,
text_encoder_path=text_encoder_path,
text_encoder2_path=text_encoder2_path,
vae_path=vae_path,
conf_path=conf_path,
magcache=magcache,
quantized_qwen=quantized_qwen,
text_token_padding=text_token_padding,
attention_engine=attention_engine,
)
return Kandinsky5I2IPipeline(**kwargs)
def get_default_conf(
dit_path,
vae_path,
text_encoder_path,
text_encoder2_path,
) -> DictConfig:
dit_params = {
"in_visual_dim": 16,
"out_visual_dim": 16,
"time_dim": 512,
"patch_size": [1, 2, 2],
"model_dim": 1792,
"ff_dim": 7168,
"num_text_blocks": 2,
"num_visual_blocks": 32,
"axes_dims": [16, 24, 24],
"visual_cond": True,
"in_text_dim": 3584,
"in_text_dim2": 768,
}
attention = {
"type": "flash",
"causal": False,
"local": False,
"glob": False,
"window": 3,
}
vae = {
"checkpoint_path": vae_path,
"name": "hunyuan",
}
text_embedder = {
"qwen": {
"emb_size": 3584,
"checkpoint_path": text_encoder_path,
"max_length": 256,
},
"clip": {
"checkpoint_path": text_encoder2_path,
"emb_size": 768,
"max_length": 77,
},
}
conf = {
"model": {
"checkpoint_path": dit_path,
"vae": vae,
"text_embedder": text_embedder,
"dit_params": dit_params,
"attention": attention,
"num_steps": 50,
"guidance_weight": 5.0,
},
"metrics": {"scale_factor": (1, 2, 2), "resolution": 512,},
}
return DictConfig(conf)
def get_default_ti2i_conf(
dit_path,
vae_path,
text_encoder_path,
text_encoder2_path,
instruct_type=None,
) -> DictConfig:
dit_params = {
"instruct_type": instruct_type,
"in_visual_dim": 16,
"out_visual_dim": 16,
"time_dim": 512,
"patch_size": [1, 2, 2],
"model_dim": 2560,
"ff_dim": 10240,
"num_text_blocks": 2,
"num_visual_blocks": 50,
"axes_dims": [32,48, 48],
}
attention = {
"type": "flash",
"causal": False,
"local": False,
"glob": False,
"window": 3,
}
vae = {
"checkpoint_path": vae_path,
"name": "hunyuan",
}
text_embedder = {
"qwen": {
"emb_size": 3584,
"checkpoint_path": text_encoder_path,
"max_length": 512,
},
"clip": {
"checkpoint_path": text_encoder2_path,
"emb_size": 768,
"max_length": 77,
},
}
conf = {
"model": {
"checkpoint_path": dit_path,
"vae": vae,
"text_embedder": text_embedder,
"dit_params": dit_params,
"attention": attention,
"num_steps": 50,
"guidance_weight": 3.5,
},
"metrics": {"scale_factor": (1, 2, 2), "resolution": 1024},
}
return DictConfig(conf)