~/blog/train-character-lora-wan22-rtx5090

Character LoRA · part 1

[LoRA] 在 RTX 5090 訓練自己的 AI 角色:一張圖到能跑的角色

cat --toc

TL;DR

我用一張參考圖,在自己的 RTX 5090 上訓練了第一顆角色 LoRA(銀髮天使「Hina」)。流程:一張圖 → 本地生 28 張角色表 → ai-toolkit 用 4-bit 量化訓練(14B 的 Wan 2.2 塞進 32GB)→ 約 1.3 小時拿到可用的 checkpoint。成果是一個可以換衣服、換場景、換畫風、還能生成影片的固定角色,純文字就能用,免付雲端費用。這篇講整條從零到能用的路;踩坑和進階調參另開兩篇。

白話版:把一個角色「教」給 AI,之後文字就能叫她出來

平常用 AI 生圖,你每生一次,人都長得不一樣 —— 換個 prompt 臉就變了。角色 LoRA 就是教模型認得「某一個特定的人」:訓練完之後,只要在 prompt 裡寫她的名字,模型就會生出同一個人,你可以隨意換她的衣服、場景、姿勢、甚至畫風,她還是她。

我這次教的是一個銀髮、有白色翅膀的天使角色,叫 Hina。上面那段影片就是訓練完之後,我只打了一段文字叫她「穿著動畫風在東京夜晚的街頭奔跑」生出來的 —— 從頭到尾沒有用任何一張現成的圖。


前言

如果說生圖模型是一個畫師,那它的問題是失憶 —— 你今天請它畫一個銀髮女生,明天再請一次,它畫出來是完全不同的兩個人。角色 LoRA 就是給這個畫師一本「這個人長這樣」的參考冊,讓它每次都畫同一個。

這是「在自己機器上訓練角色」系列的第一篇。我不靠任何雲端服務、不付任何 API 費用,整個流程跑在我自己的 RTX 5090 上,而且這個 stack 沒有內容審查。這篇講我怎麼從一張圖走到一個能用的角色;訓練過程踩的坑(HuggingFace 下載卡死、Windows 依賴地獄、訓練被睡眠砍掉)我另開一個 Troubleshooting 系列細寫,怎麼調參數控制畫風、寫實度、身份則是本系列下一篇。

我要的:一個能換衣服、換場景、換畫風的固定角色

目標很具體:一個彈性的角色。同一個人,但我能叫她換不同衣服、擺不同姿勢、進不同場景,連畫風都能換 —— 寫實、動畫、甚至生成影片。重點是「她」要穩定,其他都可以變。

Wan 2.2 而不是純圖模型,是因為它本來就是影片模型,人物在大動作下不容易崩 —— 我最後要的是會動的角色,不是只有靜圖。

一張參考圖 → 28 張角色表 → 一顆 LoRA

訓練資料不用真人照片。我只有一張這個角色的參考圖,所以先在本地用 Z-Image Turbo 以它為基底(img2img),生出 28 張同一個人、但不同衣服和姿勢的「角色表」當訓練集。

關鍵是故意讓衣服和姿勢有變化,但臉、髮色、翅膀這些「她之所以是她」的特徵保持一致。後面訓練的時候,模型就會把「不變的」學成身分、把「會變的」當成可調的東西。

訓練框架用 ai-toolkit。最現實的問題是記憶體:Wan 2.2(A14B)是雙 expert 架構——兩個 expert 各約 14B、加起來約 27B,每步只動其中一個(~14B);光一個 expert 用 bf16 就要 28GB,加上 optimizer 根本塞不進 32GB。解法是 4-bit(uint4)量化訓練,配一個 Accuracy Recovery Adapter 把精度補回來,再加上「一次只訓一個專家、另一個先卸到 CPU」。這樣 14B 的訓練在 5090 上跑得很舒服,大約 1.3 小時就有第一個堪用的 checkpoint,跑滿 2500 步約 2.2 小時。

我也沒寫任何 caption。28 張圖全部共用一個觸發字(我設成 Yuneth),訓練時只把這個字綁到角色身上 —— 這叫 trigger-only 訓練,省事也省記憶體。所以這個角色「對外」叫 Hina,但 prompt 裡召喚她的字是 Yuneth

文字就能叫出她:開關 LoRA 的差別

訓練完最直接的驗證:同一段 prompt、同一個亂數種子,掛 LoRA 跟不掛 LoRA 比一比

關掉 LoRA 是隨機的通用天使,打開 LoRA 是訓練出來的那個特定角色

不掛的時候,prompt 裡寫「銀髮天使」只會給你一個隨機的銀髮天使 —— 每次都是不同的臉。掛上 LoRA,出來的就是 Hina 本人,而且這還是大動作(轉身露背 → 轉回來 → 走向鏡頭)—— 這種旋轉正是一般生成最容易把人物臉糊掉的情況,她全程沒崩。

換衣服、換姿勢、換畫風,還是同一個人

這才是「彈性角色」真正的價值。我換掉 prompt 裡的衣服和場景,人不變:

換成紅色和服在鳥居前跳舞,造型場景全新但還是同一個人

紅和服、鳥居、跳舞 —— 全是 prompt 新給的,訓練資料裡根本沒有這套造型,但臉、銀髮、翅膀都還是 Hina。

連畫風都能換。疊一顆復古 90 年代動畫風的 style LoRA,她就從半寫實變成手繪賽璐珞動畫:

疊上動畫 style LoRA,同一個角色變成 90 年代 cel 動畫風

值得一提:這個 stack 沒有內容審查,訓練資料也包含了裸體參考圖,所以這個角色的身體也是一致的、能生成 NSFW —— 細節這篇先不細講,但本地、無審查是它跟雲端服務最大的差別之一。

文字直接生一段動畫影片

最後把全部疊起來:角色 LoRA + 動畫 style LoRA + 一段文字,直接生出本文開頭那段影片 —— Hina 穿動畫風在東京霓虹夜街奔跑。

影片逐幀:動畫風 + 銀髮白翼身份穩定 + 霓虹夜街 + 奔跑拖尾

沒有用任何起始圖,純文字。動畫風、角色身份、東京夜晚的氛圍、奔跑的動態,全部一次到位。這支花了約 14 分鐘 —— 高畫質影片是有代價的,但免付雲端費、沒有浮水印、沒有審查。

我學到的:身份和畫風是兩條軸

整趟做下來,最重要的一個觀念:「她是誰」和「她長什麼畫風」是兩條獨立的軸

角色 LoRA 只管「誰」—— 臉、髮、翅膀。畫風、衣服、場景是另一條軸,由 prompt 和 style LoRA 控制。所以同一個 Hina,我可以讓她寫實、可以讓她動畫、可以換和服、可以丟進任何場景,她都還是同一個人。

同一個亂數種子 + 同一段動作,只換髮色:動作幾乎不變,人變了顏色

連「鎖住動作只換外觀」都做得到:同一個種子 + 同一段動作描述,動作軌跡幾乎一樣,但髮色可以換。這背後其實有一整組可以調的參數 —— 觸發字的力道、畫風的強度、寫實 vs 速度的取捨 —— 這些是下一篇控制盤的主題。

收穫

從一張參考圖到一個能換衣服、換畫風、會動、還跑在自己機器上的固定角色 —— 整條路不用碰雲端、不用付錢、沒有審查。對我來說這才是本地生成真正有意思的地方:不是「省下訂閱費」,而是你能訓練一個只屬於你的角色,然後把她放進任何你想要的畫面。

接下來這個系列:

  • 下一篇(本系列 Part 2):角色 LoRA 的控制盤 —— lightning 為什麼會把畫風和材質抹平、什麼時候該用全步數、style LoRA 怎麼疊、為什麼光靠觸發字綁不住外觀。把今天「能跑」的東西變成「能精準控制」。
  • Troubleshooting 系列 Part 1:這趟訓練踩的坑 —— HuggingFace 下載卡在 0 bytes 的偵探過程、Windows 上 Python 3.13 + Blackwell 的依賴地獄、怎麼讓訓練在 ssh 斷線後還活著、以及訓練跑完機器睡著差點失聯的教訓。

常見問題

訓練一顆角色 LoRA 需要多少張圖?
20 到 30 張身份一致的圖就夠。我用一張參考圖,在本地用 Z-Image 生出 28 張不同衣服、姿勢的角色表來當訓練集,不用真人照片。
RTX 5090 的 32GB VRAM 訓練得動 14B 的 Wan 2.2 嗎?
可以,但要用 4-bit(uint4)量化訓練 + 一次只訓一個 expert。直接用 bf16 會爆記憶體。ai-toolkit 的 24GB 範例設定在 5090 上跑得很舒服,約 1.3 到 2.2 小時。
訓練好的 LoRA 怎麼用?
丟進 ComfyUI 的 loras 資料夾,生成時掛上去 + 在 prompt 裡寫角色的觸發字。之後純文字就能生成這個角色在任何場景、任何畫風,也能生成影片。