运行Diffusers的train_text_to_image_lora.py时报错:Attempting to unscale FP16 gradients.

项目地址:

GitHub - huggingface/diffusers: 🤗 Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch🤗 Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch - huggingface/diffusersicon-default.png?t=N7T8https://github.com/huggingface/diffusers/tree/main在运行Lora微调案例:train_text_to_image_lora.py时出现如下报错:

Traceback (most recent call last):
  File "/root/LoRA/diffusers/examples/text_to_image/train_text_to_image_lora.py", line 969, in <module>
    main()
  File "/root/LoRA/diffusers/examples/text_to_image/train_text_to_image_lora.py", line 796, in main
    accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)
  File "/root/miniconda3/envs/myconda/lib/python3.10/site-packages/accelerate/accelerator.py", line 2101, in clip_grad_norm_
    self.unscale_gradients()
  File "/root/miniconda3/envs/myconda/lib/python3.10/site-packages/accelerate/accelerator.py", line 2064, in unscale_gradients
    self.scaler.unscale_(opt)
  File "/root/miniconda3/envs/myconda/lib/python3.10/site-packages/torch/cuda/amp/grad_scaler.py", line 284, in unscale_
    optimizer_state["found_inf_per_device"] = self._unscale_grads_(optimizer, inv_scale, found_inf, False)
  File "/root/miniconda3/envs/myconda/lib/python3.10/site-packages/torch/cuda/amp/grad_scaler.py", line 212, in _unscale_grads_
    raise ValueError("Attempting to unscale FP16 gradients.")

issues里面提供了各种方法,但是尝试了一遍都没有解决(也可能是我没理解)

最后,误打误撞:

解决办法:把FP16改成了bf16解决了(注意在accelerate config和训练脚本里面都要设置成bf16

accelerate launch --mixed_precision="bf16"  train_text_to_image_lora.py \ # 这里原来是fp16
  --pretrained_model_name_or_path=$MODEL_NAME \
  --dataset_name=$DATASET_NAME \
  --dataloader_num_workers=8 \
  --resolution=512 \
  --center_crop \
  --random_flip \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=15000 \
  --learning_rate=1e-04 \
  --max_grad_norm=1 \
  --lr_scheduler="cosine" \
  --lr_warmup_steps=0 \
  --output_dir=${OUTPUT_DIR} \
  --push_to_hub \
  --hub_model_id=${HUB_MODEL_ID} \
  --report_to=wandb \
  --checkpointing_steps=500 \
  --validation_prompt="A pokemon with blue eyes." \
  --seed=1337

### Hugging Face Diffusers 库中 ControlNet 训练示例代码解析 `train_controlnet.py` 是 Hugging Face Diffusers 提供的一个脚本,用于训练 ControlNet 模型。以下是该源码的关键部分及其功能的详细解析。 #### 1. 导入库和初始化参数 在 `train_controlnet.py` 中,首先导入必要的库并定义超参数。这些库包括 PyTorch、Transformers 和 Diffusers 等核心工具包。此外,还加载了预训练的基础扩散模型(如 Stable Diffusion),以及控制信号提取器(如 Canny 边缘检测器或其他视觉特征提取网络)[^1]。 ```python from diffusers import UNet2DConditionModel, AutoencoderKL, DDPMScheduler, PNDMScheduler import torch from torchvision.transforms.functional import pil_to_tensor from datasets import load_dataset ``` 上述代码片段展示了如何引入主要依赖项,并准备后续的数据处理与模型构建工作。 --- #### 2. 数据集准备 为了训练 ControlNet,通常会使用带有标注信息的图像数据集(例如 Fill50K 或其他自定义数据集)。以下是一些常见的操作: - **加载数据集**:通过 `datasets.load_dataset()` 函数读取指定路径下的图片和标签。 - **预处理函数**:将输入图像转换为张量形式,并应用标准化和其他增强技术。 ```python def preprocess(image): image = pil_to_tensor(image).to(torch.float32) / 255.0 return {"pixel_values": image.unsqueeze(0), "conditioning_pixel_values": canny_detector(image)} ``` 此段代码实现了对原始图像的规范化处理,并调用了边缘检测算法生成条件输入[^3]。 --- #### 3. 构建模型架构 ControlNet 的设计允许其附加到现有的 U-Net 结构之上,在编码阶段注入额外的信息流。具体实现如下所示: - 加载基础 U-Net 和 VAE 权重作为初始状态; - 修改标准 U-Net 层次结构,使其能够接受来自辅助分支(即 Condition Net)的梯度更新。 ```python unet = UNet2DConditionModel.from_pretrained(pretrained_model_name_or_path="CompVis/stable-diffusion-v1-4", subfolder="unet") controlnet = ControlNetModel( in_channels=unet.config.in_channels, down_block_types=["CrossAttnDownBlock2D"] * unet.config.down_blocks, block_out_channels=unet.config.block_out_channels[:len(unet.config.down_blocks)], ) ``` 这里明确了如何基于已有的 Stable Diffusion 主干创建一个新的可控变体[^2]。 --- #### 4. 定义损失函数与优化策略 对于监督学习模式下的 ControlNet 训练而言,目标是最小化预测分布同真实样本之间的差异。因此采用均方误差 (MSE Loss),并通过 AdamW 进行参数调整。 ```python optimizer = torch.optim.AdamW(controlnet.parameters(), lr=args.learning_rate) for epoch in range(args.num_epochs): for batch in dataloader: optimizer.zero_grad() noise_pred = model(batch["pixel_values"], timesteps=batch["timestep"]) loss = F.mse_loss(noise_pred, batch["noisy_latents"]) loss.backward() optimizer.step() ``` 以上伪代码概括了整个迭代过程中涉及的主要计算逻辑。 --- #### 5. 错误排查提示 如果运行期间遇到诸如 `"RuntimeError"` 类别的异常,则可能是由于缺少某些必需组件所致。比如当尝试加载 Transformer 相关资源触发缺失句法单元错误,则需单独安装第三方扩展包 `sentencepiece` 解决此类问题[^4]。 ```bash pip install sentencepiece ``` 执行这条命令即可完成修复动作。 --- ### 总结 通过对 `train_controlnet.py` 文件逐条分析可以看出,它不仅涵盖了完整的端到端解决方案框架搭建思路,而且充分体现了模块化设计理念的优势所在——既保留原有体系灵活性的同又增强了可定制能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值