Stable Diffusion学习(LoRA微调)

打印 上一主题 下一主题

主题 1861|帖子 1861|积分 5583

由于练习和推理都需要较大显存和算力,因此以后文章都围绕linux进行学习开发,便于大家花点小钱租个服务器就可以复现学习明白!(在这里许愿希望自己可以全部学完,立个flag!)
实验准备

一 、服务器

跑实验固然要租服务器了,在这里我推荐大家使用autodl(学生认证可以打折,是我用起来比力随手的了,各种环境、数据集很全,固然有点小贵)(这里会有广子吗,老板看到可以结一下)

另有一个便宜点的,但是我没怎么用过,是dbcloud,(这个也可以结一下)

至于服务器的选择,我的建议挑显存内存大的,算力不敷顶多就是跑的慢点,要是练习推理的时间显存不敷,那可就白忙活了,我用的是vGPU-32G,显存比力大,也比力便宜。

二、环境部署

1.diffusers

我们先用diffusers内置函数进行微调,也间接学习一下,首先是克隆
  1. git clone https://github.com/huggingface/diffusers.git
复制代码
2.虚拟环境

跑实验固然免不了虚拟环境,我们创建一个虚拟环境
  1. conda create -n dif python=3.10
复制代码
创建完成之后需要初始化一下终端
  1. conda init
复制代码
然后重启终端(叉掉重新开一个)激活环境
  1. conda activate dif
复制代码
3.安装各种包

需要安装的有点多,但是时间不会太久
  1. cd diffusers
  2. pip install -e .
  3. cd examples/dreambooth
  4. pip install -r requirements_sdxl.txt
  5. pip install bitsandbytes xformers
  6. accelerate config default
复制代码
三、Stable Diffusion

我们可以简单调用huggingface模型来生成一张图像,我这里使用的是stable-diffusion-v1-5,可以去huggingface上面找任何一个模型进行调用生成
首先要挂上autodl的学术加快:
  1. source /etc/network_turbo
复制代码
建议使用huggingface的镜像(制止加载模型斲丧大量时间):
  1. export HF_ENDPOINT=https://hf-mirror.com
复制代码
(可选)更改环境变量--huggingface模型缓存位置
  1. # modelsope下载模型
  2. echo 'export MODELSCOPE_CACHE="/root/autodl-tmp/model"' >> ~/.bashrc
  3. # huggingface环境变量
  4. echo 'export HF_HOME="/root/autodl-tmp/model"' >> ~/.bashrc
  5. echo 'export HUGGINGFACE_HUB_CACHE="/root/autodl-tmp/model"' >> ~/.bashrc
  6. # 使更改生效
  7. source ~/.bashrc
复制代码
登录huggingface:
  1. # 安装 huggingface_hub 库
  2. pip install huggingface_hub
  3. #登录 Hugging Face
  4. huggingface-cli login
复制代码
出现这个界面之后输入huggingface的token就可以了

token的获取:Hugging Face – The AI community building the future.点个人头像下面的Access Tokens进行获取,create一个新token,设置默认就行可以

再生成 :
  1. from diffusers import DiffusionPipeline
  2. import torch
  3. # 加载并配置模型
  4. pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", torch_dtype=torch.float16)
  5. pipeline.to("cuda")
  6. # 生成图片
  7. image = pipeline("A cat is basking in the sun").images[0]
  8. # 保存图片
  9. image.save("test.png")
复制代码
效果如下,大家可以去尝试更多更新的模型,效果会更好,stable diffusion v1-5有点老了


四、微调

在examples/dreambooth目录下,我们可以看到非常多的文件,其中sd3是针对stable diffusionv3进行微调,sdxl是针对stable-diffusion-xl-base-1.0模型进行微调,至于LoRA和dreambooth这两种方法,后面有时间再写一篇文章(预留链接)

然后我们需要写一个脚本去实行代码,建议大家实行之前先去看一下代码的下令行参数,方便认识了解每个参数的作用
下面是一个简单的bash样例,可以直接新建一个fine-tuning.bash文件粘贴
  1. export MODEL_NAME="stabilityai/stable-diffusion-xl-base-1.0"
  2. export INSTANCE_DIR="test"
  3. export OUTPUT_DIR="lora-trained-xl"
  4. export VAE_PATH="madebyollin/sdxl-vae-fp16-fix"
  5. accelerate launch train_dreambooth_lora_sdxl.py \
  6.   --pretrained_model_name_or_path=$MODEL_NAME  \
  7.   --instance_data_dir=$INSTANCE_DIR \
  8.   --pretrained_vae_model_name_or_path=$VAE_PATH \
  9.   --output_dir=$OUTPUT_DIR \
  10.   --mixed_precision="fp16" \
  11.   --instance_prompt="" \
  12.   --resolution=1024 \
  13.   --train_batch_size=1 \
  14.   --gradient_accumulation_steps=4 \
  15.   --learning_rate=1e-4 \
  16.   --lr_scheduler="constant" \
  17.   --lr_warmup_steps=0 \
  18.   --max_train_steps=5 \
  19.   --validation_prompt="" \
  20.   --validation_epochs=25 \
  21.   --seed="0" \
复制代码



  • accelerate 是 Hugging Face 提供的一个工具,专为加快机器学习模型练习而设计,特别是分布式练习(比如多GPU练习)。accelerate launch 用于启动分布式练习使命,它会根据硬件设置主动处理分布式练习,混合精度练习等复杂设置
  • --pretrained_model_name_or_path=$MODEL_NAME:指定使用的预练习模型。
  • --instance_data_dir=$INSTANCE_DIR:指定包含实例图像数据的目录。
  • --pretrained_vae_model_name_or_path=$VAE_PATH:指定VAE模型的路径。
  • --output_dir=$OUTPUT_DIR:设置输出目录,生存练习后的模型。
  • --mixed_precision="fp16":启用混合精度练习,使用fp16精度,这可以减少内存使用并加快练习。
  • --instance_prompt="":为练习提供形貌实例图像的提示词,帮助模型学习特定实例(根据你的图片自己添加)。
  • --resolution=1024:设置图像的分辨率为1024x1024。
  • --train_batch_size=1:每个设备的练习批次巨细为1。
  • --gradient_accumulation_steps=4:在实行梯度更新之前累积4步梯度,用于降低显存需求。
  • --learning_rate=1e-4:设置学习率为1e-4。
  • --lr_scheduler="constant":使用常数学习率调度器。
  • --lr_warmup_steps=0:学习率预热步骤为0,表示没有预热阶段。
  • --max_train_steps=500:设置最大练习步数为500步。
  • --validation_prompt="":在验证阶段使用的提示语,这有助于确认模型是否学会了特定的概念(根据你的图片自己添加)
  • --validation_epochs=25:每隔25个epoch进行一次验证。
  • --seed="0":设置随机种子为0,以确保练习的可重现性。

开始微调: 
  1. bash fine-tuning.sh
复制代码
五、生成

微调之后的模型文件会生存在lora-trained-xl文件夹下,我们可以使用它来生成看一下效果,或者使用stable diffusion UI进行可视化展示、负责、定制化推理(里面一些默认参数要根据自己的情况改一下):
  1. import torch
  2. from diffusers import FluxPipeline
  3. import os
  4. from PIL import Image
  5. def generate_flux_lora_image(
  6.     prompt,
  7.     output_dir="output",
  8.     base_model_path="black-forest-labs/FLUX.1-dev",
  9.     lora_model_path="trained-flux",
  10.     negative_prompt="blurry, low quality, cartoon, anime, illustration",
  11.     num_images=1,
  12.     start_seed=42,
  13.     num_inference_steps=30,
  14.     guidance_scale=7.0,
  15.     filename_prefix="flux_lora_generated"
  16. ):
  17.     """
  18.     使用FLUX模型和LoRA权重生成图像
  19.    
  20.     参数:
  21.     prompt (str): 生成图像的提示词
  22.     output_dir (str): 输出图像的目录
  23.     base_model_path (str): 基础FLUX模型路径
  24.     lora_model_path (str): LoRA模型目录路径
  25.     negative_prompt (str): 负面提示词
  26.     num_images (int): 要生成的图像数量
  27.     start_seed (int): 起始随机种子
  28.     num_inference_steps (int): 推理步骤数
  29.     guidance_scale (float): 提示词引导强度
  30.     filename_prefix (str): 输出文件名前缀
  31.    
  32.     返回:
  33.     list: 生成的图像文件路径列表
  34.     """
  35.     # 确保输出目录存在
  36.     os.makedirs(output_dir, exist_ok=True)
  37.    
  38.     # 定义LoRA权重文件路径
  39.     lora_weights_file = os.path.join(lora_model_path, "pytorch_lora_weights.safetensors")
  40.    
  41.     # 检查权重文件是否存在
  42.     if not os.path.exists(lora_weights_file):
  43.         raise FileNotFoundError(f"错误: LoRA权重文件 {lora_weights_file} 不存在")
  44.    
  45.     # 加载基础模型
  46.     print("正在加载基础模型...")
  47.     pipeline = FluxPipeline.from_pretrained(base_model_path, torch_dtype=torch.float16)
  48.    
  49.     # 如果有GPU则使用GPU
  50.     if torch.cuda.is_available():
  51.         pipeline = pipeline.to("cuda")
  52.         print("使用GPU进行推理")
  53.     else:
  54.         print("使用CPU进行推理 (这可能会很慢)")
  55.    
  56.     # 加载LoRA权重
  57.     print(f"正在加载LoRA权重: {lora_weights_file}")
  58.     pipeline.load_lora_weights(lora_weights_file, adapter_name="default", unet_prefix="unet")
  59.     print("LoRA权重加载成功!")
  60.    
  61.     # 存储生成的图像路径
  62.     generated_image_paths = []
  63.    
  64.     # 生成图像
  65.     for i in range(num_images):
  66.         # 使用递增的种子
  67.         seed = start_seed + i
  68.         generator = torch.Generator("cuda" if torch.cuda.is_available() else "cpu").manual_seed(seed)
  69.         
  70.         # 生成图像
  71.         print(f"正在生成第 {i+1}/{num_images} 张图像 (种子: {seed})...")
  72.         image = pipeline(
  73.             prompt=prompt,
  74.             negative_prompt=negative_prompt,
  75.             generator=generator,
  76.             num_inference_steps=num_inference_steps,
  77.             guidance_scale=guidance_scale,
  78.         ).images[0]
  79.         
  80.         # 创建输出文件路径
  81.         if num_images == 1:
  82.             image_path = os.path.join(output_dir, f"{filename_prefix}.png")
  83.         else:
  84.             image_path = os.path.join(output_dir, f"{filename_prefix}_{i+1}.png")
  85.         
  86.         # 保存图像
  87.         image.save(image_path)
  88.         print(f"图像已保存到 {image_path}")
  89.         
  90.         # 添加到结果列表
  91.         generated_image_paths.append(image_path)
  92.    
  93.     return generated_image_paths
  94. # 示例用法
  95. if __name__ == "__main__":
  96.     # 基本使用示例
  97.     prompt = "overhead view, A highway cuts through the plains flanked by wind turbines electric poles and scattered trees, high quality"
  98.    
  99.     # 高级使用示例 - 生成多张图像
  100.     images = generate_flux_lora_image(
  101.         prompt=prompt,
  102.         output_dir="my_generated_images",
  103.         num_images=3,
  104.         guidance_scale=8.0,
  105.         num_inference_steps=40,
  106.         filename_prefix="overhead_view"
  107.     )
  108.     print(f"生成了 {len(images)} 张图像")
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表