TRL 文件

透過獎勵反向傳播對齊文字到影像擴散模型

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

透過獎勵反向傳播對齊文字到影像擴散模型

為什麼

如果你的獎勵函式是可微分的,那麼直接將獎勵模型的梯度反向傳播到擴散模型,比使用像 DDPO 這樣的策略梯度演算法在樣本和計算效率上高得多 (25倍)。AlignProp 透過時間進行完整的反向傳播,這使得可以透過獎勵反向傳播來更新去噪過程的早期步驟。

使用 examples/scripts/alignprop.py 入門

alignprop.py 指令碼是一個使用 AlignProp 訓練器微調 Stable Diffusion 模型的工作示例。這個示例顯式配置了與配置物件 (AlignPropConfig) 相關的整體引數的一個小子集。

注意: 推薦使用一個 A100 GPU 來執行。對於記憶體較低的設定,可以考慮將 truncated_backprop_rand 設定為 False。在預設設定下,這將執行 K=1 的截斷反向傳播。

幾乎每個配置引數都有一個預設值。使用者只需提供一個命令列標誌引數即可啟動並執行。使用者應擁有一個Hugging Face 使用者訪問令牌,該令牌將在微調後用於將模型上傳到 Hugging Face Hub。要執行,請輸入以下 bash 命令

python alignprop.py --hf_user_access_token <token>

要獲取 `stable_diffusion_tuning.py` 的文件,請執行 `python stable_diffusion_tuning.py --help`

在配置訓練器時(除了使用示例指令碼的用例外),以下是一些需要注意的事項(程式碼也會為您檢查):

  • 可配置的隨機截斷範圍 (--alignprop_config.truncated_rand_backprop_minmax=(0,50)),第一個數字應大於或等於0,而第二個數字應小於或等於擴散時間步數 (sample_num_steps)
  • 可配置的截斷反向傳播絕對步長 (--alignprop_config.truncated_backprop_timestep=49) 該數字應小於擴散時間步數 (sample_num_steps),僅當 truncated_backprop_rand 設定為 False 時才起作用。

設定影像日誌鉤子函式

該函式接收一個包含以下鍵的字典:

['image', 'prompt', 'prompt_metadata', 'rewards']

其中 `image`、`prompt`、`prompt_metadata`、`rewards` 是批處理的。你可以自由地以任何方式記錄日誌,推薦使用 `wandb` 或 `tensorboard`。

關鍵術語

  • `rewards` : 獎勵/分數是與生成影像相關的數值,是引導強化學習過程的關鍵
  • `prompt` : 提示是用於生成影像的文字
  • `prompt_metadata` : 提示元資料是與提示相關聯的元資料。當獎勵模型包含一個 `FLAVA` 設定時,這個欄位將不會為空,此時需要提供與生成影像相關的問題和標準答案(請參見這裡:https://github.com/kvablack/ddpo-pytorch/blob/main/ddpo_pytorch/rewards.py#L45
  • `image` : 由 Stable Diffusion 模型生成的影像

下面提供了使用 `wandb` 記錄取樣影像的示例程式碼。

# for logging these images to wandb

def image_outputs_hook(image_data, global_step, accelerate_logger):
    # For the sake of this example, we only care about the last batch
    # hence we extract the last element of the list
    result = {}
    images, prompts, rewards = [image_data['images'],image_data['prompts'],image_data['rewards']]
    for i, image in enumerate(images):
        pil = Image.fromarray(
            (image.cpu().numpy().transpose(1, 2, 0) * 255).astype(np.uint8)
        )
        pil = pil.resize((256, 256))
        result[f"{prompts[i]:.25} | {rewards[i]:.2f}"] = [pil]
    accelerate_logger.log_images(
        result,
        step=global_step,
    )

使用微調後的模型

假設您已經完成了所有的訓練週期,並將模型推送到了 Hub,您可以按如下方式使用微調後的模型

from diffusers import StableDiffusionPipeline
pipeline = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipeline.to("cuda")

pipeline.load_lora_weights('mihirpd/alignprop-trl-aesthetics')

prompts = ["squirrel", "crab", "starfish", "whale","sponge", "plankton"]
results = pipeline(prompts)

for prompt, image in zip(prompts,results.images):
    image.save(f"dump/{prompt}.png")

致謝

這項工作深受此處的倉庫和相關論文《透過獎勵反向傳播對齊文字到影像擴散模型》(作者:Mihir Prabhudesai, Anirudh Goyal, Deepak Pathak, Katerina Fragkiadaki)的影響。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.