import os import copy import torch from PIL import Image from tqdm import tqdm from models.pipe import CoTylePipeline, PiCoTylePipeline from io import BytesIO import requests from models.vlm_unitok import UniTok from transformers import Qwen2_5_VLForConditionalGeneration, Qwen2Tokenizer, Qwen2VLProcessor import argparse from models.utils import set_seed, load_and_process_config, patched_from_model_config, concatenate_images_with_sref from transformers import AutoModelForCausalLM, AutoTokenizer, AutoConfig from models.model import StyleGenerator import json from models.model import Qwen2_5_VLForConditionalGeneration_Quant, Qwen2_5_VL_Quant from transformers.models.qwen2_5_vl.modeling_qwen2_5_vl import Qwen2_5_VLForConditionalGeneration from diffusers.image_processor import PipelineImageInput, VaeImageProcessor from diffusers.schedulers import FlowMatchEulerDiscreteScheduler from diffusers.models import AutoencoderKLQwenImage, QwenImageTransformer2DModel from transformers import Qwen2_5_VLForConditionalGeneration, Qwen2Tokenizer, Qwen2VLProcessor from transformers.generation.configuration_utils import GenerationConfig _original_from_model_config = GenerationConfig.from_model_config GenerationConfig.from_model_config = classmethod(patched_from_model_config) def main(args): output_dir = args.output_path unitok_config = { 'unitok_embed_dim' : 3584, 'unitok_vocab_width' : 64, 'unitok_vocab_size' : 1024, 'unitok_e_temp' : 0.01, 'unitok_num_codebooks' : 1, 'unitok_le' : 0.0 } weight_type = torch.bfloat16 style_generator_path = os.path.join(args.model_path, 'prior') config = AutoConfig.from_pretrained(f"{style_generator_path}/config.json") style_generator = StyleGenerator._from_config(config) state_dict = torch.load(f"{style_generator_path}/prior.pth", map_location='cpu') style_generator.load_state_dict(state_dict) style_generator.to('cuda', dtype=weight_type) # loading codebook unitok = UniTok(unitok_config) unitok_state_dict = torch.load(f"{args.model_path}/codebook/model.pth", map_location='cpu') unitok.load_state_dict(unitok_state_dict) unitok.to('cuda', dtype=weight_type) # loading text_encoder if args.accelerate: pipeline = PiCoTylePipeline.from_pretrained(args.model_path, torch_dtype=torch.bfloat16, text_encoder=None,processor=None) else: pipeline = CoTylePipeline.from_pretrained(args.model_path, torch_dtype=torch.bfloat16, text_encoder=None,processor=None) qwen_text_visual_encoder = Qwen2_5_VLForConditionalGeneration_Quant.from_pretrained( os.path.join(args.model_path, 'text_encoder'), ).to('cuda', dtype=weight_type) qwen_text_visual_encoder = Qwen2_5_VL_Quant(unitok, qwen_text_visual_encoder) qwen_text_visual_encoder.to('cuda', dtype=weight_type) pipeline.text_encoder = qwen_text_visual_encoder processor = Qwen2VLProcessor.from_pretrained(os.path.join(args.model_path, 'processor'), min_pixels=64 * 28 * 28, max_pixels=256 * 28 * 28) pipeline.processor = processor if args.accelerate: adapter_name = pipeline.load_piflow_adapter( # you may later call `pipe.set_adapters([adapter_name, ...])` to combine other adapters (e.g., style LoRAs) 'Lakonik/pi-Qwen-Image', subfolder='gmqwen_k8_piid_4step', target_module_name='transformer') pipeline.scheduler = FlowMatchEulerDiscreteScheduler.from_config( # use fixed shift=3.2 pipeline.scheduler.config, shift=3.2, shift_terminal=None, use_dynamic_shifting=False) pipeline.to('cuda', dtype=torch.bfloat16) pipeline.set_progress_bar_config(disable=True) os.makedirs(output_dir, exist_ok=True) placeholder_image = Image.new("RGB", (392, 392), (0, 0, 0)) with open(f'{args.model_path}/freq.json', 'r') as f: code_freq = json.load(f) prompts = [] with open(args.prompt_file_path, 'r') as f: for line in f: prompts.append(line.strip()) res_imgs = [] seeds = [] for style_code in tqdm(args.style_code): set_seed(style_code) style_generator_inputs = dict() style_generator_inputs['input_ids'] = torch.randint(low=0, high=1024, size=(1, 1)).to('cuda') style_generator_inputs['attention_mask'] = torch.ones(style_generator_inputs['input_ids'].shape).to('cuda') generated_ids = style_generator.generate( **style_generator_inputs, max_new_tokens=195, temperature=1.0, top_k=200, top_p=0.95, do_sample=True , repetition_penalty=50.0, code_freq=code_freq, code_freq_threshold=args.freq_threshold, k=args.freq_k, ) set_seed(args.seed) if args.accelerate: sample_steps = 4 else: sample_steps = 40 res_imgs_line = [] for prompt_i, prompt in enumerate(prompts): inputs = { "image": [placeholder_image], "prompt": prompt, "generator": torch.manual_seed(args.seed), "true_cfg_scale": 6.0, "negative_prompt": "丑陋,怪物,怪兽,畸形,变异,结构不合理,肢体不合理,人脸扭曲, 肢体错乱,突兀", "num_inference_steps": sample_steps, "guidance_scale": 1.0, "num_images_per_prompt": 1, "codebook_id": generated_ids, } with torch.inference_mode(): output = pipeline(**inputs) res_imgs_line.append(output.images[0]) os.makedirs(f"{output_dir}/batch/", exist_ok=True) output.images[0].save(f"{output_dir}/batch/{style_code}-{prompt_i}.png") res_imgs.append(copy.deepcopy(res_imgs_line)) seeds.append(style_code) concatenate_images_with_sref(res_imgs, seeds).save(f"{output_dir}/batch.png") print(f"The results are saved to {output_dir}/batch.png") if __name__ == "__main__": parser = argparse.ArgumentParser(description="Simple example of a training script.") parser.add_argument( "--style_code", type=int, nargs='+', default=[1234567, 5201314,13415926, 886, 20010627, 996007, 2333], ) parser.add_argument( "--seed", type=int, default=1024, ) parser.add_argument( "--model_path", type=str, default='./pretrained_models', ) parser.add_argument( "--output_path", type=str, default="outputs", ) parser.add_argument( "--prompt_file_path", type=str, default="./test_prompts.txt", ) parser.add_argument( "--freq_threshold", type=int, default=90000, ) parser.add_argument( "--freq_k", type=float, default=0.0001, ) parser.add_argument( "--accelerate", action='store_true' ) args = parser.parse_args() main(args)