Update lora load in comfyui && Fix bug in qwen image training. (#318)

This commit is contained in:
Bubbliiiing
2025-09-15 13:45:54 +08:00
committed by GitHub
parent abeac38889
commit a40638f853
5 changed files with 1960 additions and 12 deletions
@@ -0,0 +1,892 @@
{
"id": "71b53971-2ab9-41eb-a405-78c174d97672",
"revision": 0,
"last_node_id": 111,
"last_link_id": 93,
"nodes": [
{
"id": 78,
"type": "Note",
"pos": [
18,
-46
],
"size": [
210,
88
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"text": ""
},
"widgets_values": [
"You can write prompt here\n(你可以在此填写提示词)"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 88,
"type": "Note",
"pos": [
-99,
197
],
"size": [
326.1556091308594,
145.20904541015625
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"text": ""
},
"widgets_values": [
"Using longer neg prompt such as \"Blurring, mutation, deformation, distortion, dark and solid, comics.\" can increase stability. Adding words such as \"quiet, solid\" to the neg prompt can increase dynamism.\n(使用更长的neg prompt如\"模糊,突变,变形,失真,画面暗,画面固定,连环画,漫画,线稿,没有主体。\",可以增加稳定性。在neg prompt中添加\"安静,固定\"等词语可以增加动态性。)"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 94,
"type": "FunTextBox",
"pos": [
258,
178
],
"size": [
368.5529479980469,
159.4075927734375
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "prompt",
"type": "STRING_PROMPT",
"slot_index": 0,
"links": [
77
]
}
],
"properties": {
"Node name for S&R": "FunTextBox"
},
"widgets_values": [
"色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
]
},
{
"id": 17,
"type": "VHS_VideoCombine",
"pos": [
1179.8734130859375,
-215.58523559570312
],
"size": [
390.9534912109375,
966.9860229492188
],
"flags": {},
"order": 16,
"mode": 0,
"inputs": [
{
"label": "图像",
"name": "images",
"shape": 7,
"type": "IMAGE",
"link": 80
},
{
"label": "音频",
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": null
},
{
"label": "批次管理",
"name": "meta_batch",
"shape": 7,
"type": "VHS_BatchManager",
"link": null
},
{
"name": "vae",
"shape": 7,
"type": "VAE",
"link": null
}
],
"outputs": [
{
"label": "文件名",
"name": "Filenames",
"type": "VHS_FILENAMES",
"slot_index": 0,
"links": null
}
],
"properties": {
"Node name for S&R": "VHS_VideoCombine"
},
"widgets_values": {
"frame_rate": 16,
"loop_count": 0,
"filename_prefix": "Fun",
"format": "video/h264-mp4",
"pix_fmt": "yuv420p",
"crf": 22,
"save_metadata": true,
"pingpong": false,
"save_output": true,
"videopreview": {
"hidden": false,
"paused": false,
"params": {
"filename": "Fun_00154.mp4",
"subfolder": "",
"type": "output",
"format": "video/h264-mp4",
"frame_rate": 16
}
}
}
},
{
"id": 79,
"type": "Note",
"pos": [
-215.824951171875,
490.2828369140625
],
"size": [
210,
88
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"text": ""
},
"widgets_values": [
"You can upload ref images here\n(在此上传参考图片)"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 104,
"type": "ImageCollectNode",
"pos": [
835.30908203125,
491.93438720703125
],
"size": [
162.85116577148438,
46
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "image_1",
"type": "IMAGE",
"link": 83
},
{
"name": "image_2",
"shape": 7,
"type": "IMAGE",
"link": 82
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
84
]
}
],
"properties": {
"Node name for S&R": "ImageCollectNode"
},
"widgets_values": []
},
{
"id": 103,
"type": "LoadImage",
"pos": [
409.56060791015625,
457.4063415527344
],
"size": [
315,
314.0000305175781
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
82
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"ref_1.png",
"image"
]
},
{
"id": 92,
"type": "FunTextBox",
"pos": [
254,
-46
],
"size": [
380.845703125,
157.68350219726562
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "prompt",
"type": "STRING_PROMPT",
"slot_index": 0,
"links": [
76
]
}
],
"title": "Positive Prompt(正向提示词)",
"properties": {
"Node name for S&R": "FunTextBox"
},
"widgets_values": [
"海风作曲,浪花打拍。她握着一台亮黄色相机,双臂如翼般舒展流转。双手托举相机,在胸前划出轻柔的圆弧,时而高举过肩,迎向天际的光晕,时而缓缓贴近心口,倾听快门低语般的节奏。紫色长发在风中扬起,拂过肩头,仿佛与镜头共舞。她的目光随取景框游走,每一次微倾与回旋,都让镜头掠过海天相接的边际、摇曳的花丛。最后,呼吸一凝,稳稳对准水中倒影,轻轻按下快门——将风、光与心动,悄然收藏。"
]
},
{
"id": 97,
"type": "LoadImage",
"pos": [
51.6423454284668,
459.73138427734375
],
"size": [
315,
314.0000305175781
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
83
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"8.png",
"image"
]
},
{
"id": 105,
"type": "LoadVaceWanTransformer3DModel",
"pos": [
238.0269317626953,
-745.763671875
],
"size": [
408.1667785644531,
102
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "transformer",
"type": "TransformerModel",
"links": [
85
]
},
{
"name": "model_name",
"type": "STRING",
"links": [
90
]
}
],
"properties": {
"Node name for S&R": "LoadVaceWanTransformer3DModel"
},
"widgets_values": [
"Wan2.2-VACE-Fun-A14B-LOW_bf16.safetensors",
"bf16"
]
},
{
"id": 106,
"type": "LoadWanVAEModel",
"pos": [
240.40968322753906,
-583.1104736328125
],
"size": [
406.1996154785156,
82
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "vae",
"type": "VAEModel",
"links": [
86
]
}
],
"properties": {
"Node name for S&R": "LoadWanVAEModel"
},
"widgets_values": [
"Wan2.1_VAE.pth",
"bf16"
]
},
{
"id": 107,
"type": "LoadWanTextEncoderModel",
"pos": [
241.08558654785156,
-434.9287109375
],
"size": [
404.7171936035156,
102
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "text_encoder",
"type": "TextEncoderModel",
"links": [
87
]
},
{
"name": "tokenizer",
"type": "Tokenizer",
"links": [
88
]
}
],
"properties": {
"Node name for S&R": "LoadWanTextEncoderModel"
},
"widgets_values": [
"models_t5_umt5-xxl-enc-bf16.pth",
"bf16"
]
},
{
"id": 109,
"type": "LoadVaceWanTransformer3DModel",
"pos": [
692.4532470703125,
-742.7451782226562
],
"size": [
354.0464782714844,
102
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "transformer",
"type": "TransformerModel",
"links": [
89
]
},
{
"name": "model_name",
"type": "STRING",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadVaceWanTransformer3DModel"
},
"widgets_values": [
"Wan2.2-VACE-Fun-A14B-HIGH_bf16.safetensors",
"bf16"
]
},
{
"id": 110,
"type": "Note",
"pos": [
-220.1790008544922,
-468.36676025390625
],
"size": [
427.074951171875,
143.9142608642578
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"text": ""
},
"widgets_values": [
"When using the 14B model, you can use sequential_cpu_offload to save GPU memory during generation.\n(在使用14B模型时,可以使用sequential_cpu_offload节省显存,进行生成。)"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 108,
"type": "CombineWan2_2VaceFunPipeline",
"pos": [
693.27978515625,
-566.5641479492188
],
"size": [
361.8251953125,
182
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"name": "transformer",
"type": "TransformerModel",
"link": 85
},
{
"name": "vae",
"type": "VAEModel",
"link": 86
},
{
"name": "text_encoder",
"type": "TextEncoderModel",
"link": 87
},
{
"name": "tokenizer",
"type": "Tokenizer",
"link": 88
},
{
"name": "clip_encoder",
"shape": 7,
"type": "ClipEncoderModel",
"link": null
},
{
"name": "transformer_2",
"shape": 7,
"type": "TransformerModel",
"link": 89
},
{
"name": "model_name",
"type": "STRING",
"widget": {
"name": "model_name"
},
"link": 90
}
],
"outputs": [
{
"name": "funmodels",
"type": "FunModels",
"links": [
92
]
}
],
"properties": {
"Node name for S&R": "CombineWan2_2VaceFunPipeline"
},
"widgets_values": [
"",
"sequential_cpu_offload"
]
},
{
"id": 111,
"type": "LoadWan2_2FunLora",
"pos": [
1122.6082763671875,
-506.19036865234375
],
"size": [
601.3900756835938,
130
],
"flags": {},
"order": 14,
"mode": 0,
"inputs": [
{
"name": "funmodels",
"type": "FunModels",
"link": 92
}
],
"outputs": [
{
"name": "funmodels",
"type": "FunModels",
"links": [
93
]
}
],
"properties": {
"Node name for S&R": "LoadWan2_2FunLora"
},
"widgets_values": [
"Wan2.2-T2V-A14B-4steps-lora-rank64-Seko-V1.1_low_noise_model.safetensors",
"Wan2.2-T2V-A14B-4steps-lora-rank64-Seko-V1.1_high_noise_model.safetensors",
1,
false
]
},
{
"id": 101,
"type": "Wan2_2VaceFunSampler",
"pos": [
842.1512451171875,
-215.00350952148438
],
"size": [
280.724609375,
534
],
"flags": {},
"order": 15,
"mode": 0,
"inputs": [
{
"name": "funmodels",
"type": "FunModels",
"link": 93
},
{
"name": "prompt",
"type": "STRING_PROMPT",
"link": 76
},
{
"name": "negative_prompt",
"type": "STRING_PROMPT",
"link": 77
},
{
"name": "control_video",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "start_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "end_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "subject_ref_images",
"shape": 7,
"type": "IMAGE",
"link": 84
},
{
"name": "riflex_k",
"shape": 7,
"type": "RIFLEXT_ARGS",
"link": null
}
],
"outputs": [
{
"name": "images",
"type": "IMAGE",
"links": [
80
]
}
],
"properties": {
"Node name for S&R": "Wan2_2VaceFunSampler"
},
"widgets_values": [
81,
640,
580941324226511,
"randomize",
4,
1.0000000000000002,
"Flow_Unipc",
12,
0.875,
0.1,
false,
3,
true,
0,
true
]
}
],
"links": [
[
76,
92,
0,
101,
1,
"STRING_PROMPT"
],
[
77,
94,
0,
101,
2,
"STRING_PROMPT"
],
[
80,
101,
0,
17,
0,
"IMAGE"
],
[
82,
103,
0,
104,
1,
"IMAGE"
],
[
83,
97,
0,
104,
0,
"IMAGE"
],
[
84,
104,
0,
101,
6,
"IMAGE"
],
[
85,
105,
0,
108,
0,
"TransformerModel"
],
[
86,
106,
0,
108,
1,
"VAEModel"
],
[
87,
107,
0,
108,
2,
"TextEncoderModel"
],
[
88,
107,
1,
108,
3,
"Tokenizer"
],
[
89,
109,
0,
108,
5,
"TransformerModel"
],
[
90,
105,
1,
108,
6,
"STRING"
],
[
92,
108,
0,
111,
0,
"FunModels"
],
[
93,
111,
0,
101,
0,
"FunModels"
]
],
"groups": [
{
"id": 1,
"title": "Upload Your Ref Images",
"bounding": [
-0.4573218524456024,
378.5783386230469,
1071.616943359375,
451.41473388671875
],
"color": "#a1309b",
"font_size": 24,
"flags": {}
},
{
"id": 3,
"title": "Prompts",
"bounding": [
218,
-127,
450,
483
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 4,
"title": "Load Model",
"bounding": [
220.02639770507812,
-821.3883056640625,
863.243896484375,
511.2655029296875
],
"color": "#b06634",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"ds": {
"scale": 1.1,
"offset": [
-67.03623665930887,
397.7621525676092
]
},
"frontendVersion": "1.21.3",
"workspace_info": {
"id": "776b62b4-bd17-4ed3-9923-b7aad000b1ea"
},
"node_versions": {
"CogVideoX-Fun": "abeac38889da94b1f215b456a8180198a24d5032",
"ComfyUI-VideoHelperSuite": "70faa9bcef65932ab72e7404d6373fb300013a2e",
"comfy-core": "0.3.57"
}
},
"version": 0.4
}
@@ -0,0 +1,892 @@
{
"id": "71b53971-2ab9-41eb-a405-78c174d97672",
"revision": 0,
"last_node_id": 111,
"last_link_id": 93,
"nodes": [
{
"id": 78,
"type": "Note",
"pos": [
18,
-46
],
"size": [
210,
88
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"text": ""
},
"widgets_values": [
"You can write prompt here\n(你可以在此填写提示词)"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 88,
"type": "Note",
"pos": [
-99,
197
],
"size": [
326.1556091308594,
145.20904541015625
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"text": ""
},
"widgets_values": [
"Using longer neg prompt such as \"Blurring, mutation, deformation, distortion, dark and solid, comics.\" can increase stability. Adding words such as \"quiet, solid\" to the neg prompt can increase dynamism.\n(使用更长的neg prompt如\"模糊,突变,变形,失真,画面暗,画面固定,连环画,漫画,线稿,没有主体。\",可以增加稳定性。在neg prompt中添加\"安静,固定\"等词语可以增加动态性。)"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 94,
"type": "FunTextBox",
"pos": [
258,
178
],
"size": [
368.5529479980469,
159.4075927734375
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "prompt",
"type": "STRING_PROMPT",
"slot_index": 0,
"links": [
77
]
}
],
"properties": {
"Node name for S&R": "FunTextBox"
},
"widgets_values": [
"色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走"
]
},
{
"id": 17,
"type": "VHS_VideoCombine",
"pos": [
1179.8734130859375,
-215.58523559570312
],
"size": [
390.9534912109375,
966.9860229492188
],
"flags": {},
"order": 16,
"mode": 0,
"inputs": [
{
"label": "图像",
"name": "images",
"shape": 7,
"type": "IMAGE",
"link": 80
},
{
"label": "音频",
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": null
},
{
"label": "批次管理",
"name": "meta_batch",
"shape": 7,
"type": "VHS_BatchManager",
"link": null
},
{
"name": "vae",
"shape": 7,
"type": "VAE",
"link": null
}
],
"outputs": [
{
"label": "文件名",
"name": "Filenames",
"type": "VHS_FILENAMES",
"slot_index": 0,
"links": null
}
],
"properties": {
"Node name for S&R": "VHS_VideoCombine"
},
"widgets_values": {
"frame_rate": 16,
"loop_count": 0,
"filename_prefix": "Fun",
"format": "video/h264-mp4",
"pix_fmt": "yuv420p",
"crf": 22,
"save_metadata": true,
"pingpong": false,
"save_output": true,
"videopreview": {
"hidden": false,
"paused": false,
"params": {
"filename": "Fun_00154.mp4",
"subfolder": "",
"type": "output",
"format": "video/h264-mp4",
"frame_rate": 16
}
}
}
},
{
"id": 79,
"type": "Note",
"pos": [
-215.824951171875,
490.2828369140625
],
"size": [
210,
88
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"text": ""
},
"widgets_values": [
"You can upload ref images here\n(在此上传参考图片)"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 104,
"type": "ImageCollectNode",
"pos": [
835.30908203125,
491.93438720703125
],
"size": [
162.85116577148438,
46
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "image_1",
"type": "IMAGE",
"link": 83
},
{
"name": "image_2",
"shape": 7,
"type": "IMAGE",
"link": 82
}
],
"outputs": [
{
"name": "image",
"type": "IMAGE",
"links": [
84
]
}
],
"properties": {
"Node name for S&R": "ImageCollectNode"
},
"widgets_values": []
},
{
"id": 103,
"type": "LoadImage",
"pos": [
409.56060791015625,
457.4063415527344
],
"size": [
315,
314.0000305175781
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
82
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"ref_1.png",
"image"
]
},
{
"id": 92,
"type": "FunTextBox",
"pos": [
254,
-46
],
"size": [
380.845703125,
157.68350219726562
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "prompt",
"type": "STRING_PROMPT",
"slot_index": 0,
"links": [
76
]
}
],
"title": "Positive Prompt(正向提示词)",
"properties": {
"Node name for S&R": "FunTextBox"
},
"widgets_values": [
"海风作曲,浪花打拍。她握着一台亮黄色相机,双臂如翼般舒展流转。双手托举相机,在胸前划出轻柔的圆弧,时而高举过肩,迎向天际的光晕,时而缓缓贴近心口,倾听快门低语般的节奏。紫色长发在风中扬起,拂过肩头,仿佛与镜头共舞。她的目光随取景框游走,每一次微倾与回旋,都让镜头掠过海天相接的边际、摇曳的花丛。最后,呼吸一凝,稳稳对准水中倒影,轻轻按下快门——将风、光与心动,悄然收藏。"
]
},
{
"id": 97,
"type": "LoadImage",
"pos": [
51.6423454284668,
459.73138427734375
],
"size": [
315,
314.0000305175781
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
83
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"8.png",
"image"
]
},
{
"id": 105,
"type": "LoadVaceWanTransformer3DModel",
"pos": [
238.0269317626953,
-745.763671875
],
"size": [
408.1667785644531,
102
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "transformer",
"type": "TransformerModel",
"links": [
85
]
},
{
"name": "model_name",
"type": "STRING",
"links": [
90
]
}
],
"properties": {
"Node name for S&R": "LoadVaceWanTransformer3DModel"
},
"widgets_values": [
"Wan2.2-VACE-Fun-A14B-LOW_bf16.safetensors",
"bf16"
]
},
{
"id": 106,
"type": "LoadWanVAEModel",
"pos": [
240.40968322753906,
-583.1104736328125
],
"size": [
406.1996154785156,
82
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "vae",
"type": "VAEModel",
"links": [
86
]
}
],
"properties": {
"Node name for S&R": "LoadWanVAEModel"
},
"widgets_values": [
"Wan2.1_VAE.pth",
"bf16"
]
},
{
"id": 107,
"type": "LoadWanTextEncoderModel",
"pos": [
241.08558654785156,
-434.9287109375
],
"size": [
404.7171936035156,
102
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "text_encoder",
"type": "TextEncoderModel",
"links": [
87
]
},
{
"name": "tokenizer",
"type": "Tokenizer",
"links": [
88
]
}
],
"properties": {
"Node name for S&R": "LoadWanTextEncoderModel"
},
"widgets_values": [
"models_t5_umt5-xxl-enc-bf16.pth",
"bf16"
]
},
{
"id": 109,
"type": "LoadVaceWanTransformer3DModel",
"pos": [
692.4532470703125,
-742.7451782226562
],
"size": [
354.0464782714844,
102
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "transformer",
"type": "TransformerModel",
"links": [
89
]
},
{
"name": "model_name",
"type": "STRING",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadVaceWanTransformer3DModel"
},
"widgets_values": [
"Wan2.2-VACE-Fun-A14B-HIGH_bf16.safetensors",
"bf16"
]
},
{
"id": 110,
"type": "Note",
"pos": [
-220.1790008544922,
-468.36676025390625
],
"size": [
427.074951171875,
143.9142608642578
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"text": ""
},
"widgets_values": [
"When using the 14B model, you can use sequential_cpu_offload to save GPU memory during generation.\n(在使用14B模型时,可以使用sequential_cpu_offload节省显存,进行生成。)"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 108,
"type": "CombineWan2_2VaceFunPipeline",
"pos": [
693.27978515625,
-566.5641479492188
],
"size": [
361.8251953125,
182
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"name": "transformer",
"type": "TransformerModel",
"link": 85
},
{
"name": "vae",
"type": "VAEModel",
"link": 86
},
{
"name": "text_encoder",
"type": "TextEncoderModel",
"link": 87
},
{
"name": "tokenizer",
"type": "Tokenizer",
"link": 88
},
{
"name": "clip_encoder",
"shape": 7,
"type": "ClipEncoderModel",
"link": null
},
{
"name": "transformer_2",
"shape": 7,
"type": "TransformerModel",
"link": 89
},
{
"name": "model_name",
"type": "STRING",
"widget": {
"name": "model_name"
},
"link": 90
}
],
"outputs": [
{
"name": "funmodels",
"type": "FunModels",
"links": [
92
]
}
],
"properties": {
"Node name for S&R": "CombineWan2_2VaceFunPipeline"
},
"widgets_values": [
"",
"sequential_cpu_offload"
]
},
{
"id": 111,
"type": "LoadWan2_2FunLora",
"pos": [
1122.6082763671875,
-506.19036865234375
],
"size": [
601.3900756835938,
130
],
"flags": {},
"order": 14,
"mode": 0,
"inputs": [
{
"name": "funmodels",
"type": "FunModels",
"link": 92
}
],
"outputs": [
{
"name": "funmodels",
"type": "FunModels",
"links": [
93
]
}
],
"properties": {
"Node name for S&R": "LoadWan2_2FunLora"
},
"widgets_values": [
"Wan2.2-T2V-A14B-4steps-lora-rank64-Seko-V1.1_low_noise_model.safetensors",
"Wan2.2-T2V-A14B-4steps-lora-rank64-Seko-V1.1_high_noise_model.safetensors",
1,
false
]
},
{
"id": 101,
"type": "Wan2_2VaceFunSampler",
"pos": [
842.1512451171875,
-215.00350952148438
],
"size": [
280.724609375,
534
],
"flags": {},
"order": 15,
"mode": 0,
"inputs": [
{
"name": "funmodels",
"type": "FunModels",
"link": 93
},
{
"name": "prompt",
"type": "STRING_PROMPT",
"link": 76
},
{
"name": "negative_prompt",
"type": "STRING_PROMPT",
"link": 77
},
{
"name": "control_video",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "start_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "end_image",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "subject_ref_images",
"shape": 7,
"type": "IMAGE",
"link": 84
},
{
"name": "riflex_k",
"shape": 7,
"type": "RIFLEXT_ARGS",
"link": null
}
],
"outputs": [
{
"name": "images",
"type": "IMAGE",
"links": [
80
]
}
],
"properties": {
"Node name for S&R": "Wan2_2VaceFunSampler"
},
"widgets_values": [
81,
640,
580941324226511,
"randomize",
40,
1.0000000000000002,
"Flow",
12,
0.875,
0.1,
true,
3,
true,
0.25000000000000006,
true
]
}
],
"links": [
[
76,
92,
0,
101,
1,
"STRING_PROMPT"
],
[
77,
94,
0,
101,
2,
"STRING_PROMPT"
],
[
80,
101,
0,
17,
0,
"IMAGE"
],
[
82,
103,
0,
104,
1,
"IMAGE"
],
[
83,
97,
0,
104,
0,
"IMAGE"
],
[
84,
104,
0,
101,
6,
"IMAGE"
],
[
85,
105,
0,
108,
0,
"TransformerModel"
],
[
86,
106,
0,
108,
1,
"VAEModel"
],
[
87,
107,
0,
108,
2,
"TextEncoderModel"
],
[
88,
107,
1,
108,
3,
"Tokenizer"
],
[
89,
109,
0,
108,
5,
"TransformerModel"
],
[
90,
105,
1,
108,
6,
"STRING"
],
[
92,
108,
0,
111,
0,
"FunModels"
],
[
93,
111,
0,
101,
0,
"FunModels"
]
],
"groups": [
{
"id": 1,
"title": "Upload Your Ref Images",
"bounding": [
-0.4573218524456024,
378.5783386230469,
1071.616943359375,
451.41473388671875
],
"color": "#a1309b",
"font_size": 24,
"flags": {}
},
{
"id": 3,
"title": "Prompts",
"bounding": [
218,
-127,
450,
483
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 4,
"title": "Load Model",
"bounding": [
220.02639770507812,
-821.3883056640625,
863.243896484375,
511.2655029296875
],
"color": "#b06634",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"ds": {
"scale": 0.9090909090909095,
"offset": [
-50.780612464991464,
485.5421122795407
]
},
"frontendVersion": "1.21.3",
"workspace_info": {
"id": "776b62b4-bd17-4ed3-9923-b7aad000b1ea"
},
"node_versions": {
"CogVideoX-Fun": "abeac38889da94b1f215b456a8180198a24d5032",
"ComfyUI-VideoHelperSuite": "70faa9bcef65932ab72e7404d6373fb300013a2e",
"comfy-core": "0.3.57"
}
},
"version": 0.4
}
+1 -3
View File
@@ -135,7 +135,7 @@ check_min_version("0.18.0.dev0")
logger = get_logger(__name__, log_level="INFO")
def log_validation(vae, text_encoder, tokenizer, transformer3d, args, config, accelerator, weight_dtype, global_step):
def log_validation(vae, text_encoder, tokenizer, transformer3d, args, accelerator, weight_dtype, global_step):
try:
logger.info("Running validation... ")
@@ -1566,7 +1566,6 @@ def main():
tokenizer,
transformer3d,
args,
config,
accelerator,
weight_dtype,
global_step,
@@ -1593,7 +1592,6 @@ def main():
tokenizer,
transformer3d,
args,
config,
accelerator,
weight_dtype,
global_step,
+163 -9
View File
@@ -558,6 +558,14 @@ class QwenImageTransformer2DModel(ModelMixin, ConfigMixin, PeftAdapterMixin, Fro
self.sp_world_size = 1
self.sp_world_rank = 0
def _set_gradient_checkpointing(self, *args, **kwargs):
if "value" in kwargs:
self.gradient_checkpointing = kwargs["value"]
elif "enable" in kwargs:
self.gradient_checkpointing = kwargs["enable"]
else:
raise ValueError("Invalid set gradient checkpointing")
def enable_multi_gpus_inference(self,):
self.sp_world_size = get_sequence_parallel_world_size()
self.sp_world_rank = get_sequence_parallel_rank()
@@ -703,14 +711,21 @@ class QwenImageTransformer2DModel(ModelMixin, ConfigMixin, PeftAdapterMixin, Fro
for index_block, block in enumerate(self.transformer_blocks):
if torch.is_grad_enabled() and self.gradient_checkpointing:
encoder_hidden_states, hidden_states = self._gradient_checkpointing_func(
block,
hidden_states,
encoder_hidden_states,
encoder_hidden_states_mask,
temb,
image_rotary_emb,
)
def create_custom_forward(module):
def custom_forward(*inputs):
return module(*inputs)
return custom_forward
ckpt_kwargs: Dict[str, Any] = {"use_reentrant": False} if is_torch_version(">=", "1.11.0") else {}
encoder_hidden_states, hidden_states = torch.utils.checkpoint.checkpoint(
create_custom_forward(block),
hidden_states,
encoder_hidden_states,
encoder_hidden_states_mask,
temb,
image_rotary_emb,
**ckpt_kwargs,
)
else:
encoder_hidden_states, hidden_states = block(
@@ -736,4 +751,143 @@ class QwenImageTransformer2DModel(ModelMixin, ConfigMixin, PeftAdapterMixin, Fro
if not return_dict:
return (output,)
return Transformer2DModelOutput(sample=output)
return Transformer2DModelOutput(sample=output)
@classmethod
def from_pretrained(
cls, pretrained_model_path, subfolder=None, transformer_additional_kwargs={},
low_cpu_mem_usage=False, torch_dtype=torch.bfloat16
):
if subfolder is not None:
pretrained_model_path = os.path.join(pretrained_model_path, subfolder)
print(f"loaded 3D transformer's pretrained weights from {pretrained_model_path} ...")
config_file = os.path.join(pretrained_model_path, 'config.json')
if not os.path.isfile(config_file):
raise RuntimeError(f"{config_file} does not exist")
with open(config_file, "r") as f:
config = json.load(f)
from diffusers.utils import WEIGHTS_NAME
model_file = os.path.join(pretrained_model_path, WEIGHTS_NAME)
model_file_safetensors = model_file.replace(".bin", ".safetensors")
if "dict_mapping" in transformer_additional_kwargs.keys():
for key in transformer_additional_kwargs["dict_mapping"]:
transformer_additional_kwargs[transformer_additional_kwargs["dict_mapping"][key]] = config[key]
if low_cpu_mem_usage:
try:
import re
from diffusers import __version__ as diffusers_version
if diffusers_version >= "0.33.0":
from diffusers.models.model_loading_utils import \
load_model_dict_into_meta
else:
from diffusers.models.modeling_utils import \
load_model_dict_into_meta
from diffusers.utils import is_accelerate_available
if is_accelerate_available():
import accelerate
# Instantiate model with empty weights
with accelerate.init_empty_weights():
model = cls.from_config(config, **transformer_additional_kwargs)
param_device = "cpu"
if os.path.exists(model_file):
state_dict = torch.load(model_file, map_location="cpu")
elif os.path.exists(model_file_safetensors):
from safetensors.torch import load_file, safe_open
state_dict = load_file(model_file_safetensors)
else:
from safetensors.torch import load_file, safe_open
model_files_safetensors = glob.glob(os.path.join(pretrained_model_path, "*.safetensors"))
state_dict = {}
print(model_files_safetensors)
for _model_file_safetensors in model_files_safetensors:
_state_dict = load_file(_model_file_safetensors)
for key in _state_dict:
state_dict[key] = _state_dict[key]
if diffusers_version >= "0.33.0":
# Diffusers has refactored `load_model_dict_into_meta` since version 0.33.0 in this commit:
# https://github.com/huggingface/diffusers/commit/f5929e03060d56063ff34b25a8308833bec7c785.
load_model_dict_into_meta(
model,
state_dict,
dtype=torch_dtype,
model_name_or_path=pretrained_model_path,
)
else:
model._convert_deprecated_attention_blocks(state_dict)
# move the params from meta device to cpu
missing_keys = set(model.state_dict().keys()) - set(state_dict.keys())
if len(missing_keys) > 0:
raise ValueError(
f"Cannot load {cls} from {pretrained_model_path} because the following keys are"
f" missing: \n {', '.join(missing_keys)}. \n Please make sure to pass"
" `low_cpu_mem_usage=False` and `device_map=None` if you want to randomly initialize"
" those weights or else make sure your checkpoint file is correct."
)
unexpected_keys = load_model_dict_into_meta(
model,
state_dict,
device=param_device,
dtype=torch_dtype,
model_name_or_path=pretrained_model_path,
)
if cls._keys_to_ignore_on_load_unexpected is not None:
for pat in cls._keys_to_ignore_on_load_unexpected:
unexpected_keys = [k for k in unexpected_keys if re.search(pat, k) is None]
if len(unexpected_keys) > 0:
print(
f"Some weights of the model checkpoint were not used when initializing {cls.__name__}: \n {[', '.join(unexpected_keys)]}"
)
return model
except Exception as e:
print(
f"The low_cpu_mem_usage mode is not work because {e}. Use low_cpu_mem_usage=False instead."
)
model = cls.from_config(config, **transformer_additional_kwargs)
if os.path.exists(model_file):
state_dict = torch.load(model_file, map_location="cpu")
elif os.path.exists(model_file_safetensors):
from safetensors.torch import load_file, safe_open
state_dict = load_file(model_file_safetensors)
else:
from safetensors.torch import load_file, safe_open
model_files_safetensors = glob.glob(os.path.join(pretrained_model_path, "*.safetensors"))
state_dict = {}
for _model_file_safetensors in model_files_safetensors:
_state_dict = load_file(_model_file_safetensors)
for key in _state_dict:
state_dict[key] = _state_dict[key]
tmp_state_dict = {}
for key in state_dict:
if key in model.state_dict().keys() and model.state_dict()[key].size() == state_dict[key].size():
tmp_state_dict[key] = state_dict[key]
else:
print(key, "Size don't match, skip")
state_dict = tmp_state_dict
m, u = model.load_state_dict(state_dict, strict=False)
print(f"### missing keys: {len(m)}; \n### unexpected keys: {len(u)};")
print(m)
params = [p.numel() if "." in n else 0 for n, p in model.named_parameters()]
print(f"### All Parameters: {sum(params) / 1e6} M")
params = [p.numel() if "attn1." in n else 0 for n, p in model.named_parameters()]
print(f"### attn1 Parameters: {sum(params) / 1e6} M")
model = model.to(torch_dtype)
return model
+12
View File
@@ -377,6 +377,12 @@ def merge_lora(pipeline, lora_path, multiplier, device='cpu', dtype=torch.float3
state_dict = state_dict
updates = defaultdict(dict)
for key, value in state_dict.items():
if "diffusion_model" in key:
key = key.replace("diffusion_model.", "lora_unet__")
key = key.replace("blocks.", "blocks_")
key = key.replace(".self_attn.", "_self_attn_")
key = key.replace(".cross_attn.", "_cross_attn_")
key = key.replace(".ffn.", "_ffn_")
layer, elem = key.split('.', 1)
updates[layer][elem] = value
@@ -484,6 +490,12 @@ def unmerge_lora(pipeline, lora_path, multiplier=1, device="cpu", dtype=torch.fl
updates = defaultdict(dict)
for key, value in state_dict.items():
if "diffusion_model" in key:
key = key.replace("diffusion_model.", "lora_unet__")
key = key.replace("blocks.", "blocks_")
key = key.replace(".self_attn.", "_self_attn_")
key = key.replace(".cross_attn.", "_cross_attn_")
key = key.replace(".ffn.", "_ffn_")
layer, elem = key.split('.', 1)
updates[layer][elem] = value