Fine-Tuning Stable Diffusion with LoRA (Workaround for ‘Unscale FP16 Gradients’ Error)

我是在 2024 年 3 月底写这篇文章的,距离这篇文章在 Hugging Face 上发表已经一年多了,距离 Julien Simon 发布视频解释如何使用 AWS EC2 spot instances 以不到 1 美元的价格微调 Stable Diffusion 也有几个月了。 首先,这里是你应该参考的官方页面。 不幸的是,你很可能会遇到 "Attempting to unscale FP16 gradients. "错误。 这里有多个用户报告过这个错误。 如果你也遇到了这种情况,下面是解决问题的方法。

下面是开始微调的 accelerate 命令:

export MODEL_NAME="CompVis/stable-diffusion-v1-4"
export DATASET_NAME="lambdalabs/pokemon-blip-captions"

accelerate launch --mixed_precision="fp16" --multi_gpu  train_text_to_image.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --dataset_name=$DATASET_NAME \
  --use_ema \
  --resolution=512 --center_crop --random_flip \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --gradient_checkpointing \
  --max_train_steps=15000 \
  --learning_rate=1e-05 \
  --max_grad_norm=1 \
  --lr_scheduler="constant" --lr_warmup_steps=0 \
  --output_dir="sd-pokemon-model"

Resuming from checkpoint checkpoint-35
01/03/2024 21:55:36 - INFO - accelerate.accelerator - Loading states from sd-model-finetuned-lora/checkpoint-35
Loading unet.
01/03/2024 21:55:36 - INFO - peft.tuners.tuners_utils - Already found a peft_config attribute in the model. This will lead to having multiple adapters in the model. Make sure to know what you are doing!
01/03/2024 21:55:38 - INFO - accelerate.checkpointing - All model weights loaded successfully
01/03/2024 21:55:38 - INFO - accelerate.checkpointing - All optimizer states loaded successfully
01/03/2024 21:55:38 - INFO - accelerate.checkpointing - All scheduler states loaded successfully
01/03/2024 21:55:38 - INFO - accelerate.checkpointing - All dataloader sampler states loaded successfully
01/03/2024 21:55:38 - INFO - accelerate.checkpointing - GradScaler state loaded successfully
01/03/2024 21:55:38 - INFO - accelerate.checkpointing - All random states loaded successfully
01/03/2024 21:55:38 - INFO - accelerate.accelerator - Loading in 0 custom states
Steps: 70% 35/50 [00:00<?, ?it/s]Traceback (most recent call last):
File “/content/train_text_to_image_lora_sdxl.py”, line 1261, in
main(args)
File “/content/train_text_to_image_lora_sdxl.py”, line 1077, in main
accelerator.clip_grad_norm_(params_to_optimize, args.max_grad_norm)
File “/usr/local/lib/python3.10/dist-packages/accelerate/accelerator.py”, line 2040, in clip_grad_norm_
self.unscale_gradients()
File “/usr/local/lib/python3.10/dist-packages/accelerate/accelerator.py”, line 2003, in unscale_gradients
self.scaler.unscale_(opt)
File “/usr/local/lib/python3.10/dist-packages/torch/cuda/amp/grad_scaler.py”, line 307, in unscale_
optimizer_state[“found_inf_per_device”] = self.unscale_grads(
File “/usr/local/lib/python3.10/dist-packages/torch/cuda/amp/grad_scaler.py”, line 229, in unscale_grads
raise ValueError(“Attempting to unscale FP16 gradients.”)
ValueError: Attempting to unscale FP16 gradients.

train_text_to_image_lora.py 脚本中缺少参数 --mixed_precision="fp16",因此无法正常工作。 下面是正在运行的 accelerate 命令:

export MODEL_NAME="CompVis/stable-diffusion-v1-4"
export DATASET_NAME="lambdalabs/pokemon-blip-captions"

accelerate launch --mixed_precision="fp16" --multi_gpu  train_text_to_image.py \
  --mixed_precision="fp16" \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --dataset_name=$DATASET_NAME \
  --use_ema \
  --resolution=512 --center_crop --random_flip \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --gradient_checkpointing \
  --max_train_steps=15000 \
  --learning_rate=1e-05 \
  --max_grad_norm=1 \
  --lr_scheduler="constant" --lr_warmup_steps=0 \
  --output_dir="sd-pokemon-model"
### Parameter-Efficient Fine-Tuning (PEFT) 的背景 Parameter-Efficient Fine-Tuning 是一种针对基础模型(Foundation Models)优化的技术,旨在通过仅调整一小部分参数来实现高效的微调过程。这种方法不仅减少了计算资源的需求,还提高了训练效率[^1]。 在神经网络中,通常会应用正则化技术以防止过拟合并促进泛化能力。这些技术可以强制模型学习更小的权重参数,从而减少复杂度和潜在的风险。对于大规模的基础模型而言,Parameter-Efficient Fine-Tuning 方法进一步扩展了这一理念,专注于更新少量的关键参数而非整个模型的所有参数。 ### 如何获取 PEFT 论文 PDF? 为了下载有关 **Parameter-Efficient Fine-Tuning for Foundation Models** 的论文,可以通过以下几种方式: #### 1. 使用学术搜索引擎 利用 Google Scholar 或 Semantic Scholar 这样的平台输入关键词 “Parameter-Efficient Fine-Tuning”,即可找到相关研究文章及其链接。大多数情况下,可以直接访问免费版本或者通过机构权限下载全文[^2]。 #### 2. GitHub 和开源社区 许多研究人员会在其个人主页或 GitHub 上分享研究成果以及配套代码库。例如,在 awesome-LLM-resources 项目中可能包含了大量关于大语言模型(LLMs)及相关主题的资料汇总,其中包括 PEFT 技术的应用实例与理论解释。 以下是 Python 实现的一个简单示例,展示如何加载预定义适配器来进行高效微调: ```python from peft import get_peft_model, LoraConfig, TaskType # 定义 LoRA 配置 peft_config = LoraConfig( task_type=TaskType.CAUSAL_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1, ) model = ... # 加载基础模型 peft_model = get_peft_model(model, peft_config) ``` 此脚本片段展示了基于 Hugging Face 提供的 `peft` 库创建低秩适应层的过程,这是实现 parameter-efficient fine-tuning 常见的一种方法之一。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值