
diffusers 中训练 CogView4 Control为 CogView4-6B 注入结构控制条件的 LoRA 与全参微调实战【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers本指南以 diffusers 仓库 examples/cogview4-control 目录为核心系统讲解如何基于THUDM/CogView4-6B训练带额外结构控制深度图、姿态等的 Control 模型从将模型输入通道从 64 扩展到 128的原理到 Control LoRA 训练、DeepSpeed Zero2 加速、CogView4ControlPipeline推理再到全参微调full fine-tuning的完整流程。读完本文你将掌握 CogView4 Control 从数据准备、训练启动到推理验证的一整套可复现方案并理解底层patch_embed扩展与条件潜变量拼接的实现机制。提示该示例属于**实验性experimental**代码主要用于教学与社区探索官方明确表示针对不同条件可能需要自行调参才能获得理想效果。CogView4 Control 的原理输入通道 64 → 128 的结构扩展CogView4 的 Control 系列通过在输入侧注入额外条件来实现可控生成其核心设计非常直接将 CogView4 的输入特征通道从 64 扩展到 128。前 64 个通道对应原始待去噪的输入潜变量latents后 64 个通道对应控制条件潜变量control latents例如姿态图、深度图经过 VAE 编码后的结果。这一扩展发生在模型的patch_embed层——拼接后的 128 通道输入会在该层被投影到网络其余部分所需的特征维度。训练完成后推理阶段使用CogView4ControlPipeline完成带条件的生成。源码级的通道扩展实现以仓库中的全参微调脚本 train_control_cogview4.py 为例通道扩展的代码逻辑清晰可见patch_size cogview4_transformer.config.patch_size initial_input_channels cogview4_transformer.config.in_channels * patch_size**2 new_linear torch.nn.Linear( cogview4_transformer.patch_embed.proj.in_features * 2, cogview4_transformer.patch_embed.proj.out_features, biascogview4_transformer.patch_embed.proj.bias is not None, dtypecogview4_transformer.dtype, devicecogview4_transformer.device, ) new_linear.weight.zero_() new_linear.weight[:, :initial_input_channels].copy_(cogview4_transformer.patch_embed.proj.weight) if cogview4_transformer.patch_embed.proj.bias is not None: new_linear.bias.copy_(cogview4_transformer.patch_embed.proj.bias) cogview4_transformer.patch_embed.proj new_linear这段代码的要点构造一个新的Linear层输入特征数翻倍in_features * 2输出维度不变新权重先全部置零再把原始patch_embed.proj的权重复制到前initial_input_channels列保证初始行为与预训练模型等价新扩展出来的条件分支从零开始学习代码随后还用assert校验了新增列的权重确实为 0最后通过register_to_config把模型的in_channels更新为原来的两倍、out_channels保持原值使后续训练与保存加载保持一致。从模型侧看CogView4PatchEmbed定义于 transformer_cogview4.py其proj nn.Linear(in_channels * patch_size**2, hidden_size)正是被上面这段逻辑替换的层。推理时如何拼接条件推理时CogView4ControlPipeline源码见 pipeline_cogview4_control.py会先对控制图像执行 VAE 编码prepare_imageself.vae.encode然后在去噪循环中把条件潜变量与当前噪声潜变量沿通道维拼接latent_model_input torch.cat([latents, control_image], dim1).to(transformer_dtype)注意 pipeline_cogview4_control.py 中通过latent_channels self.transformer.config.in_channels // 2只初始化一半通道的随机噪声——因为另一半通道由控制图像编码而来这正是64 通道噪声 64 通道条件设计在推理端的对应实现。前置准备模型授权、环境与数据集1. Gated 模型授权与登录THUDM/CogView4-6B是一个受控gated模型。首次使用前必须前往其 Hugging Face 模型页面填写申请表并接受授权条款通过后需要在本地完成登录让系统识别到你的授权状态hf auth login2. 安装依赖训练脚本要求 diffusers 的最低版本为0.41.0.dev0脚本开头通过check_min_version(0.41.0.dev0)强制校验。本目录的依赖声明见 requirements.txttransformers5.3.0 wandb torch torchvision accelerate1.2.0 peft0.14.0说明README 中提及的 LoRA 训练脚本train_control_lora_cogview4.py随一个待合并的 PR 提供在 PR 合并前需要从该 PR 分支安装diffusers合并后则从main分支安装。当前仓库快照中examples/cogview4-control 目录实际包含的是全参微调脚本 train_control_cogview4.pyLoRA 训练命令仍可按下文方式运行脚本就绪后。3. 数据集示例使用raulc0399/open_pose_controlnet数据集——它已经内置了原图的姿态条件pose condition因此无需额外计算姿态。数据集默认按三个列名组织image目标图像、conditioning_image控制条件图像、text描述文本可通过脚本的--image_column、--conditioning_image_column、--caption_column参数覆盖。如果你有自己的数据也可以使用--jsonl_for_train传入本地 jsonl 文件路径来替代 Hub 数据集两者二选一脚本会强制校验。训练 Control LoRA以姿态控制为例下面的命令演示如何为姿态条件启动 Control LoRA 微调accelerate launch train_control_lora_cogview4.py \ --pretrained_model_name_or_pathTHUDM/CogView4-6B \ --dataset_nameraulc0399/open_pose_controlnet \ --output_dirpose-control-lora \ --mixed_precisionbf16 \ --train_batch_size1 \ --rank64 \ --gradient_accumulation_steps4 \ --gradient_checkpointing \ --use_8bit_adam \ --learning_rate1e-4 \ --report_towandb \ --lr_schedulerconstant \ --lr_warmup_steps0 \ --max_train_steps5000 \ --validation_imageopenpose.png \ --validation_promptA couple, 4k photo, highly detailed \ --offload \ --seed0 \ --push_to_hub其中openpose.png来自Adapter/t2iadapter仓库的示例资源。命令中的关键参数说明如下参数作用与建议--pretrained_model_name_or_path基础模型即受控的THUDM/CogView4-6B--dataset_name训练数据集Hub 数据集名或本地数据集路径--rankLoRA 秩示例取 64秩越大可学习容量越高但参数量与显存占用也随之增加--train_batch_size1--gradient_accumulation_steps4单卡 batch 为 1通过 4 步梯度累积等效扩大批量降低显存压力--gradient_checkpointing开启梯度检查点以更慢的反向传播换取显存节省--use_8bit_adam使用 bitsandbytes 的 8-bit AdamAdamW8bit显著降低优化器显存占用--mixed_precisionbf16bfloat16 混合精度需要 PyTorch ≥ 1.10 且 NVIDIA Ampere 及以上 GPUMPS 设备不支持 bf16脚本会直接报错提示改用 fp16--report_towandb训练日志与验证图像上报到 wandb也可用tensorboard默认或comet_mlall表示全部--lr_scheduler/--lr_warmup_steps学习率调度策略与预热步数示例用constant且不预热--validation_image/--validation_prompt训练中定期生成验证图像便于监控收敛--offload在不使用 VAE 与文本编码器时将其卸载到 CPU显著降低显存峰值--push_to_hub训练结束后把模型上传到 Hub可用--hub_model_id指定仓库名可选的扩展训练参数训练脚本还暴露了若干便于实验的附加 CLI 参数use_lora_bias开启后额外训练lora_B层的偏置bias。默认偏置不参与训练开启后可小幅提升表达能力但会增加参数量。train_norm_layers开启后额外训练归一化层的缩放系数normalization scales脚本会处理好相应的保存与加载逻辑。在 train_control_cogview4.py 中可以看到归一化层前缀被定义为NORM_LAYER_PREFIXES [norm_q, norm_k, norm_added_q, norm_added_k]说明这些 attention 内部归一化层是 LoRA/可训练化的目标之一。lora_layers指定要对哪些层施加 LoRA若设为all-linear则所有线性层都会挂载 LoRA。这些参数与仓库中 examples/flux-control/train_control_lora_flux.py 所采用的 Flux Control LoRA 训练方案一脉相承是 diffusers 社区在 Control LoRA 上通用的参数设计。使用 DeepSpeed Zero2 训练示例支持 DeepSpeed推荐使用其Zero2系统优化。将以下配置保存为 YAML 文件可按需修改compute_environment: LOCAL_MACHINE debug: false deepspeed_config: gradient_accumulation_steps: 1 gradient_clipping: 1.0 offload_optimizer_device: cpu offload_param_device: cpu zero3_init_flag: false zero_stage: 2 distributed_type: DEEPSPEED downcast_bf16: no enable_cpu_affinity: false machine_rank: 0 main_training_function: main mixed_precision: bf16 num_machines: 1 num_processes: 1 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false然后启动训练时显式传入配置文件accelerate launch --config_fileCONFIG_FILE.yaml ...源码中针对 DeepSpeed 做了专门适配在 train_control_cogview4.py 中DeepSpeed 模式下会通过CogView4Transformer2DModel.from_pretrained(input_dir, subfoldertransformer)重新加载 transformer 权重普通分布式模式下则从 models 列表弹栈获取保存 checkpoint 时DeepSpeed 要求每个设备都保存权重因此脚本在accelerator.distributed_type DistributedType.DEEPSPEED时也会触发保存逻辑见训练循环中global_step % args.checkpointing_steps 0分支。推理使用 CogView4ControlPipeline 生成数据集的姿态图像是使用controlnet_aux库计算得到的推理前先安装它pip install controlnet_auxLoRA 版本推理from controlnet_aux import OpenposeDetector from diffusers import CogView4ControlPipeline from diffusers.utils import load_image from PIL import Image import numpy as np import torch pipe CogView4ControlPipeline.from_pretrained(THUDM/CogView4-6B, dtypetorch.bfloat16).to(cuda) pipe.load_lora_weights(...) # 改成你的 LoRA 权重路径 open_pose OpenposeDetector.from_pretrained(lllyasviel/Annotators) # 准备姿态条件。 url https://huggingface.co/Adapter/t2iadapter/resolve/main/people.jpg image load_image(url) image open_pose(image, detect_resolution512, image_resolution1024) image np.array(image)[:, :, ::-1] image Image.fromarray(np.uint8(image)) prompt A couple, 4k photo, highly detailed gen_images pipe( promptprompt, control_imageimage, num_inference_steps50, joint_attention_kwargs{scale: 0.9}, guidance_scale25., ).images[0] gen_images.save(output.png)这里有两个值得留意的推理参数num_inference_steps50去噪步数更多步数通常质量更高但更慢guidance_scale25.无分类器引导CFG强度。注意CogView4ControlPipeline.__call__的默认值是5.0示例中人为调高到 25 以强化文本引导源码中do_classifier_free_guidance在guidance_scale 1时为 True此时会对条件与无条件各做一次 transformer 前向再按noise_pred noise_pred_uncond guidance_scale * (noise_pred_cond - noise_pred_uncond)融合见 pipeline_cogview4_control.py。此外joint_attention_kwargs{scale: 0.9}用于调节注意力机制相关参数attention_kwargs会被透传给 transformer 的 AttentionProcessor。管道默认生成 1024×1024 图像height/width未指定时取transformer.config.sample_size * vae_scale_factor且要求宽高都能被 16 整除。全参微调Full Fine-tuning除 LoRA 外目录还提供了非 LoRA 的全参微调脚本 train_control_cogview4.py。示例命令如下accelerate launch --config_fileaccelerate_ds2.yaml train_control_cogview4.py \ --pretrained_model_name_or_pathTHUDM/CogView4-6B \ --dataset_nameraulc0399/open_pose_controlnet \ --output_dirpose-control \ --mixed_precisionbf16 \ --train_batch_size2 \ --dataloader_num_workers4 \ --gradient_accumulation_steps4 \ --gradient_checkpointing \ --use_8bit_adam \ --proportion_empty_prompts0.2 \ --learning_rate5e-5 \ --adam_weight_decay1e-4 \ --report_towandb \ --lr_schedulercosine \ --lr_warmup_steps1000 \ --checkpointing_steps1000 \ --max_train_steps10000 \ --validation_steps200 \ --validation_image 2_pose_1024.jpg 3_pose_1024.jpg \ --validation_prompt two friends sitting by each other enjoying a day at the park, full hd, cinematic person enjoying a day at the park, full hd, cinematic \ --offload \ --seed0 \ --push_to_hub请根据实际数据替换validation_image与validation_prompt。全参脚本的关键参数与源码细节基于 train_control_cogview4.py 的参数解析parse_args与主流程main补充说明几个影响训练效果与资源消耗的核心参数参数默认值说明--resolution1024训练/验证图像统一缩放的分辨率脚本要求能被 8 整除否则报错以保证 VAE 与 transformer 编码后尺寸一致--max_sequence_length128提示词最大 token 长度--proportion_empty_prompts0将图像提示替换为空串的比例范围 [0, 1]全参示例取 0.2即 20% 样本做无条件训练有助于 CFG 效果--weighting_schemenone时间步采样/损失加权方案可选sigma_sqrt、logit_normal、mode、cosmap、nonenone 表示均匀采样时间步 均匀损失另有--logit_mean、--logit_std、--mode_scale等配套参数--guidance_scale3.5验证阶段生成图像所用的引导强度--only_target_transformer_blocks关闭只训练 transformer 块与输入层x_embedder即patch_embed.proj冻结其余部分可显著减少训练参数量--upcast_before_saving关闭保存前把训练层上转为 float32默认保持训练精度以省显存--checkpointing_steps/--checkpoints_total_limit500 / 无每 N 步保存一次训练状态checkpoints_total_limit限制保留的 checkpoint 数量超出时自动删除最旧的--resume_from_checkpoint无从指定 checkpoint 恢复训练传latest自动选择最新--scale_lr关闭按GPU 数 × 梯度累积步数 × batch size等比放大学习率--allow_tf32关闭Ampere 架构 GPU 上允许 TF32 以加速训练--report_totensorboard日志后端注意--report_towandb与--hub_token不能同时使用存在 token 泄露风险脚本会直接报错要求改用hf auth login--max_train_samples无调试或快速验证时截断训练样本数训练主循环的机制要点全参脚本的训练逻辑与 LoRA 版一致核心流程可以从 train_control_cogview4.py 的主循环中读到VAE 编码分别对目标图像与控制图像做 VAE 编码得到pixel_latents与control_latents编码时应用shift_factor与scaling_factor时间步采样通过compute_density_for_timestep_sampling按加权方案采样u映射到FlowMatchEulerDiscreteScheduler的 timesteps 与 sigmas并依据 CogView4 的图像序列长度计算动态缩放系数scale_factors加噪noisy_model_input (1 - scale_factors) * pixel_latents scale_factors * noise通道拼接concatenated_noisy_model_input torch.cat([noisy_model_input, control_latents], dim1)与推理端一一对应文本编码借助一个轻量版CogView4ControlPipelinetransformerNone, vaeNone调用encode_prompt获得prompt_embeds与pooled_prompt_embeds--offload时该管道在 GPU/CPU 间移动Flow Matching 损失目标为target noise - pixel_latents按compute_loss_weighting_for_sd3计算加权 MSE 损失并反向传播验证与保存每--validation_steps步调用log_validation构造完整CogView4ControlPipeline生成图像并上报到 wandb/TensorBoard训练结束若指定--push_to_hub还会自动生成模型卡片包含验证图像并上传上传时忽略step_*、epoch_*、checkpoint-*等中间产物。全参模型的推理全参微调保存的是 transformer 权重因此推理时需要单独加载CogView4Transformer2DModel再注入管道from controlnet_aux import OpenposeDetector from diffusers import CogView4ControlPipeline, CogView4Transformer2DModel from diffusers.utils import load_image from PIL import Image import numpy as np import torch transformer CogView4Transformer2DModel.from_pretrained(...) # 改成你的训练输出目录 pipe CogView4ControlPipeline.from_pretrained( THUDM/CogView4-6B, transformertransformer, dtypetorch.bfloat16 ).to(cuda) open_pose OpenposeDetector.from_pretrained(lllyasviel/Annotators) # 准备姿态条件。 url https://huggingface.co/Adapter/t2iadapter/resolve/main/people.jpg image load_image(url) image open_pose(image, detect_resolution512, image_resolution1024) image np.array(image)[:, :, ::-1] image Image.fromarray(np.uint8(image)) prompt A couple, 4k photo, highly detailed gen_images pipe( promptprompt, control_imageimage, num_inference_steps50, guidance_scale25., ).images[0] gen_images.save(output.png)注意训练脚本在结束时会把 transformer 保存到--output_dircogview4_transformer.save_pretrained(args.output_dir)因此CogView4Transformer2DModel.from_pretrained直接指向该目录即可管道其余组件VAE、文本编码器 GLM、tokenizer、scheduler仍从基础模型THUDM/CogView4-6B加载。注意事项与社区建议实验性代码本目录脚本以教学和探索为目的针对特定条件pose、depth、canny 等可能需要反复调整超参数与结构细节才能获得理想效果官方鼓励社区共同打磨。内存优化脚本本身未做激进的内存优化但指定--offload时会在 VAE 与文本编码器空闲时将其卸载到 CPU从而降低显存峰值全参脚本在训练早期还会把 VAE 保持在 float32 并置于 CPU。从全参模型提取 LoRA官方目前没有提供现成的提取工具但社区可以参考Stability-AI/stability-ComfyUI-nodes仓库中的control_lora_create.py脚本实现类似功能从微调后的完整模型权重中抽取 LoRA 权重。许可协议THUDM/CogView4-6B为受控模型训练产物上传 Hub 时生成的模型卡片会提示遵守模型原始许可条款见 train_control_cogview4.py 中save_model_card的 License 说明。小结CogView4 Control 的训练思路清晰而优雅不动模型主体结构只把patch_embed的输入通道翻倍64 → 128让网络在去噪的同时看到结构条件。结合本仓库提供的 LoRA 训练命令、DeepSpeed Zero2 配置与全参微调脚本你可以轻松复现姿态控制等场景的可控生成推理侧统一由CogView4ControlPipeline完成控制图 VAE 编码 → 通道拼接 → 条件去噪的完整链路。建议在动手前先确认模型授权hf auth login、按 requirements.txt 装齐依赖并优先从 1024 分辨率、bf16 混合精度与--offload起步在资源与效果之间找到平衡。【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考