• 本地部署推理TextDiffuser-2:释放语言模型用于文本渲染的力量


    系列文章目录


    一、模型下载和环境配置

    1. 将textdiffuser-2模型仓库克隆到本地
    git clone https://github.com/microsoft/unilm/
    cd unilm/textdiffuser-2
    
    • 1
    • 2
    1. 创建并激活虚拟环境,在textdiffuser-2目录下安装需要的软件包
    conda create -n textdiffuser2 python=3.8
    conda activate textdiffuser2
    pip install -r requirements.txt
    
    • 1
    • 2
    • 3
    1. 安装与系统版本和cuda版本相匹配的torch、torchvision、xformers (我的环境下cuda是12.2的,其他版本需要自己去官网查询)
      在这里插入图片描述
    conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xformers
    
    • 1
    • 2
    1. 如果想用FastChat训练布局规划器,还需要安装flash-attention:

    先将flash-attention模型仓库克隆下来

    git clone https://github.com/Dao-AILab/flash-attention.git
    
    • 1

    然后安装对应的软件包

    pip install packaging
    pip uninstall -y ninja && pip install ninja
    conda install -c nvidia cuda
    pip install flash-attn --no-build-isolation
    
    • 1
    • 2
    • 3
    • 4
    1. 为了训练文本修复任务,还需要安装 differs 包
    pip install https://github.com/JingyeChen/diffusers_td2.git
    
    • 1

    二、模型训练

    (一)训练布局规划器

    1. 需要先下载lmsys/vicuna-7b-v1.5模型FastChat模型

    模型下载方式: 采用git远程clone下来,具体方式可以参考之前的内容:huggingface学习 | 云服务器使用git-lfs下载huggingface上的模型文件

    1. 进行训练
    CUDA_VISIBLE_DEVICES=4,5 torchrun --nproc_per_node=2 --master_port=50008 FastChat-main/fastchat/train/train_mem.py \
        --model_name_or_path vicuna-7b-v1.5  \
        --data_path data/layout_planner_data_5k.json \
        --bf16 True \
        --output_dir experiment_result \
        --num_train_epochs 6 \
        --per_device_train_batch_size 2 \
        --per_device_eval_batch_size 2 \
        --gradient_accumulation_steps 16 \
        --evaluation_strategy "no" \
        --save_strategy "steps" \
        --save_steps 500 \
        --save_total_limit 5 \
        --learning_rate 2e-5 \
        --weight_decay 0. \
        --warmup_ratio 0.03 \
        --lr_scheduler_type "cosine" \
        --logging_steps 1 \
        --fsdp "full_shard auto_wrap" \
        --fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \
        --tf32 True \
        --model_max_length 2048 \
        --gradient_checkpointing True \
        --lazy_preprocess True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    (二)训练扩散模型

    1. 需要先准备需要训练的扩散模型:stable-diffusion-v1-5模型
    2. 对于全参数训练:
    accelerate launch train_textdiffuser2_t2i_full.py \
        --pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \
        --train_batch_size=18 \
        --gradient_accumulation_steps=4 \
        --gradient_checkpointing \
        --mixed_precision="fp16" \
        --num_train_epochs=6 \
        --learning_rate=1e-5 \
        --max_grad_norm=1 \
        --lr_scheduler="constant" \
        --lr_warmup_steps=0 \
        --output_dir="diffusion_experiment_result" \
        --enable_xformers_memory_efficient_attention \
        --dataloader_num_workers=8 \
        --index_file_path='/path/to/train_dataset_index.txt' \
        --dataset_path='/path/to/laion-ocr-select/' \
        --granularity=128 \
        --coord_mode="ltrb" \
        --max_length=77 \
        --resume_from_checkpoint="latest"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    1. 对于 LoRA 训练:
    accelerate launch train_textdiffuser2_t2i_lora.py \
        --pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \
        --train_batch_size=18 \
        --gradient_accumulation_steps=4 \
        --gradient_checkpointing \
        --mixed_precision="fp16" \
        --num_train_epochs=6 \
        --learning_rate=1e-4 \
        --text_encoder_learning_rate=1e-5 \
        --lr_scheduler="constant" \
        --output_dir="diffusion_experiment_result" \
        --enable_xformers_memory_efficient_attention \
        --dataloader_num_workers=8 \
        --index_file_path='/path/to/train_dataset_index.txt' \
        --dataset_path='/path/to/laion-ocr-select/' \
        --granularity=128 \
        --coord_mode="ltrb" \
        --max_length=77 \
        --resume_from_checkpoint="latest"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    三、模型推理

    (一)准备训练好的模型checkpoint

    1. 下载官网提供的模型checkpoint:layout plannerdiffusion model (full parameter fine-tuning) diffusion model (lora fine-tuning)

    2. 准备stable-diffusion-v1-5模型

    (二)全参数推理

    CUDA_VISIBLE_DEVICES=4 accelerate launch inference_textdiffuser2_t2i_full.py \
      --pretrained_model_name_or_path="./stable-diffusion-v1-5" \
      --mixed_precision="fp16" \
      --output_dir="inference_results_1" \
      --enable_xformers_memory_efficient_attention \
      --resume_from_checkpoint="./textdiffuser2-full-ft" \
      --granularity=128 \
      --max_length=77 \
      --coord_mode="ltrb" \
      --cfg=7.5 \
      --sample_steps=20 \
      --seed=43555 \
      --m1_model_path="./textdiffuser2_layout_planner" \
      --input_format='prompt' \
      --input_prompt='a hotdog with mustard and other toppings on it'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    推理结果:
    在这里插入图片描述

    (三)LoRA微调推理

    CUDA_VISIBLE_DEVICES=4 accelerate launch inference_textdiffuser2_t2i_lora.py \
      --pretrained_model_name_or_path="./stable-diffusion-v1-5" \
      --gradient_accumulation_steps=4 \
      --gradient_checkpointing \
      --mixed_precision="fp16" \
      --output_dir="inference_results_2" \
      --enable_xformers_memory_efficient_attention \
      --resume_from_checkpoint="./textdiffuser2-lora-ft" \
      --granularity=128 \
      --coord_mode="ltrb" \
      --cfg=7.5 \
      --sample_steps=50 \
      --seed=43555 \
      --m1_model_path="./textdiffuser2_layout_planner" \
      --input_format='prompt' \
      --input_prompt='a stamp of u.s.a'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    运行结果:
    在这里插入图片描述

    四、遇到的错误

    (一)importerror,缺少某些库

    在运行过程中出现了各种各样的importerror,于是就是缺少哪个库就下载那个库:

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
    
    • 1
    pip install protobuf
    
    • 1

    (二)报错:libGL.so.1: cannot open shared object file: No such file or directory

    pip uninstall opencv-python
    pip install opencv-python-headless
    
    • 1
    • 2

    (三)各种奇奇怪怪的错误(本质上是diffusers版本不对)

    • RuntimeError: expected mat1 and mat2 to have the same dtype, but got: float != c10::Half
    • The deprecation tuple (‘LoRAXFormersAttnProcessor’, ‘0.26.0’, 'Make sure use XFormersAttnProcessor instead by settingLoRA layers to `self.
    pip install diffusers==0.24.0 -i https://pypi.mirrors.ustc.edu.cn/simple/
    
    • 1

    (四)各种库的版本不兼容

    由于作者在官网上提供了实验中使用的软件包列表可供参考,所以我直接将textdiffuser-2的assets文件夹下的refere_requirements.txt文件中的库一次性安装下来:

    cd assets
    pip install -r reference_requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple/
    
    • 1
    • 2

    在这里插入图片描述

    (五)RuntimeError: expected scalar type float Float bu found Half

    这个错误是因为安装的diffusers包里有个文件需要用官网提供的新文件进行替换
    可以先根据错误提示找到diffusers库包中attention_processor.py所在的位置,然后用assets文件夹下attention_processor.py进行替换即可解决问题。

    在这里插入图片描述

    参考:libGL.so.1: cannot open shared object file: No such file or directory

  • 相关阅读:
    JAVA计算机毕业设计疫情防控医用品管理Mybatis+源码+数据库+lw文档+系统+调试部署
    vue3中如何使用Pinia
    AIX 系统基线安全加固操作
    【Rust 基础篇】Rust中的不安全函数:解锁系统级编程的黑盒之门
    linux查找命令使用的正则表达式
    QImage相关
    计算机毕业设计php_thinkphp_vue的约课管理系统-课程预约
    go 中解析JSON的三种姿势
    学习函数式编程、可变参数及 defer - GO语言从入门到实战
    FX5800计算器测量程序集2.4
  • 原文地址:https://blog.csdn.net/weixin_47748259/article/details/136474863