Datawhale X 魔搭 AI夏令營 AIGC方向 Task1

qaz961501發表於2024-08-11

AIGC簡介

AIGC是指由AI自動創作生成的內容( AI Generated Content),即AI接收到人下達的任務指令,透過處理人的自然語言,自動生成圖片、影片、音訊等。

打個通俗點的比方,AIGC就像一支馬良神筆,擁有的無盡創造力。這支筆的特別之處在於,是由AI打造的。來自AI的理解力、想象力和創作力的加持,它可以根據指定的需求和樣式,創作出各種內容:文章、短篇小說、報告、音樂、影像,甚至是影片。AIGC的出現,就像是開啟了一個全新的創作世界,為人們提供了無盡的可能性。從使用者生成內容(UGC),到專業生成內容(PGC),再到現在的人工智慧生成內容(AIGC),我們看到了內容創作方式的巨大變革和進步。


LoRA模型

LoRA模型,全稱Low-Rank Adaptation of Large Language Models,是一種用於微調大型語言模型的低秩適應技術。它最初應用於NLP領域,特別是用於微調GPT-3等模型。LoRA透過僅訓練低秩矩陣,然後將這些引數注入到原始模型中,從而實現對模型的微調。這種方法不僅減少了計算需求,而且使得訓練資源比直接訓練原始模型要小得多,因此非常適合在資源有限的環境中使用。

在Stable Diffusion(SD)模型的應用中,LoRA被用作一種外掛,允許使用者在不修改SD模型的情況下,利用少量資料訓練出具有特定畫風、IP或人物特徵的模型。這種技術在社群使用和個人開發者中非常受歡迎。例如,可以透過LoRA模型改變SD模型的生成風格,或者為SD模型新增新的人物/IP。

LoRA模型的使用涉及安裝外掛和配置引數。使用者需要下載適合的LoRA模型和相應的checkpoint模型,並將其安裝到相應的目錄。在使用時,可以將LoRA模型與大模型結合使用,透過調整LoRA的權重來控制生成圖片的結果。LoRA模型的優點包括訓練速度快、計算需求低、訓練權重小,因為原始模型被凍結,我們注入新的可訓練層,可以將新層的權重儲存為一個約3MB大小的檔案,比UNet模型的原始大小小了近一千倍。

總的來說,LoRA模型是一種高效、靈活且適用於多種場景的模型微調技術,它在保持原始模型效能的同時,允許使用者根據需要進行定製化調整。


任務一便是呼叫下面這段程式碼進行文生圖處理,下面是其中最重要的載入模型部分。

# 下載模型
from diffsynth import download_models

download_models(["Kolors", "SDXL-vae-fp16-fix"])
# 檢視輸入引數
!python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py -h
# 開始訓練

# 提示:

#1.  在訓練命令中填入 `--modelscope_model_id xxxxx` 以及 `--modelscope_access_token xxxxx` 後,訓練程式會在結束時自動上傳模#型到 ModelScope
#2.  部分引數可根據實際需求調整,例如 `lora_rank` 可以控制 LoRA 模型的引數量
import os

cmd = """
python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \
  --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \
  --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \
  --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \
  --lora_rank 16 \
  --lora_alpha 4.0 \
  --dataset_path data/lora_dataset_processed \
  --output_path ./models \
  --max_epochs 1 \
  --center_crop \
  --use_gradient_checkpointing \
  --precision "16-mixed"
""".strip()

os.system(cmd)
from diffsynth import ModelManager, SDXLImagePipeline
from peft import LoraConfig, inject_adapter_in_model
import torch


def load_lora(model, lora_rank, lora_alpha, lora_path):
    lora_config = LoraConfig(
        r=lora_rank,
        lora_alpha=lora_alpha,
        init_lora_weights="gaussian",
        target_modules=["to_q", "to_k", "to_v", "to_out"],
    )
    model = inject_adapter_in_model(lora_config, model)
    state_dict = torch.load(lora_path, map_location="cpu")
    model.load_state_dict(state_dict, strict=False)
    return model


# Load models
model_manager = ModelManager(torch_dtype=torch.float16, device="cuda",
                             file_path_list=[
                                 "models/kolors/Kolors/text_encoder",
                                 "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors",
                                 "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors"
                             ])
pipe = SDXLImagePipeline.from_model_manager(model_manager)

# Load LoRA
pipe.unet = load_lora(
    pipe.unet,
    lora_rank=16, # This parameter should be consistent with that in your training script.
    lora_alpha=2.0, # lora_alpha can control the weight of LoRA.
    lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt"
)

還並不理解這些程式碼,只是先跑通了得到了正確結果,之後再細細研究。

相關文章