多模態預訓練模型在 OPPO 端云場景的落地實踐
一、端側圖文檢索技術研究
1. 解決了什么問題?
首先來介紹圖文檢索技術。以前在手機端相冊搜索照片,都是基于標簽來搜索。從 CLIP 模型出現后開始做自然語言搜索。目前正在解決端側性能、搜索效果、安全等問題。技術難度并不大,重點在于提高搜索速度。并且要保持與云側模型相同的精度,供斷網時使用。
2. 算法優化
算法優化集中在壓縮算法。用 CLIP 模型做圖文匹配,算法簡單,訓練支持大規模并行,但對細粒度理解有問題。采用 ALBEF 單流場景,最后需要把圖片和 Query 做融合計算,在端側無法落地。由于 CLIP 模型的模態信息保留最后的輸出層,端側可以做單雙流融合,把兩個模型的能力蒸餾到小模型上面。因為圖像和文本的模態在ALBEF 中間已經融合,所以設計 Projector 再分離出來,經過組合得到單雙流的細粒度特征和全局特征的融合,獲得輸出,最后蒸餾出 Student。蒸餾的過程采用 contrastive loss 算法。整體算法的目的是為了得到端側的 CLIP 架構小模型,實現離線編碼和在線搜索。
由于圖片數量有限,沒有采用像 IVF-PQ 向量引擎。實際在 10 萬級圖片壓測下,直接做向量乘法也足夠,fp16 最終速度都很快,因此最終采用了簡單架構。
3. 學術集效果
從上圖數據中可以看出,單純CLIP 或者 ALBEF 效果、不如融合之后效果好。由于沒有增加推理成本,最終落地效果與云上 V100 GPU 速度相當,搜索時間為 14 毫秒。image 編碼時間也很短,基本達到了云端先進 GPU 的能力。
4. 真實場景效果
上圖中展示了真實場景中構建相冊、照片的效果。最終優化為全域優化。
5. 細粒度優化
CLIP 算法優化是以海量數據訓練。想做到更細致的優化,由于本身沒有識別屬性能力,對圖片款式、顏色狀態、細膩度屬性識別比較差,對文生圖影響很大。我們針對業務場景改進了方法,在 Query 里面做細粒度屬性詞替換。這種替換方法,無論用人工方式還是文本模型找屬性詞都可使用。最終把比較細的負樣本構造出來,做負樣本的采樣訓練,強制讓模型判斷出哪些是錯誤屬性,搜索時就能排除錯誤。這是實踐中非常行之有效的方法。注意一定要加上 LWF(Learning Without Forgetting)抗遺忘的方法,以保留之前的數據和訓練,才能保持通用能力不下降。這個方法對已有模型優化非常有效。
二、文圖生成&理解態模型的應用優化
文圖生成&理解態模型的優化主要是對生成進行優化。而理解是在圖片生成后加上文本生成,做出圖文并茂的效果。
1. 中文文生圖大模型繼續預訓練
鑒于業界沒有特別好的開源中文大模型,很多人直接用英文模型加上翻譯來做。這樣會帶來很多問題,例如繼續訓練怎么做。從頭訓練做自己的大模型,畢竟不一定都有資源;如果質量不好,調整也很費時間。我們的方案是用開源的英文優質模型做繼續預訓練,并涉及如何對齊中文語言文化。
另外一個難題是生成圖像質量的細節提升。上圖中展示了我們的解決方案,經過實驗,如果有很好的英文模型適配中文,不需改動所有的模塊,包括 unet、text encoder,只要加一個 adapter,通過訓練 adapter 就能實現多語言輸入,并得到同樣質量的輸出。最初是通過做 text encoder 再對齊,但 text encoder 對齊非常復雜。實踐中把后面的Unet 加上去蒸餾,就會很容易對齊。Adapter 只需做簡單的mapping,最后發現前面的特征空間沒有對齊、也不需要對齊。只需在 Unet 空間做出正確的生成。
在有了一個中文的模型后,后面需要進行中文語言文化的繼續訓練。我們也嘗試了一些方案,其中包括微調的方案。業界常用 LoRA 做垂域優化,LoRA 最大的問題是遺忘性。上圖右下側展示的是 2023 年的一篇 NIPS 文章,采用的方法很簡單,LoRA 在原參數上乘 R 正交矩陣,目的是希望訓練參數不去動幅度,只動角度。很早有實驗證明,把特征相位抽出來,就能完全呈現圖像,幅度 W 沒有太多作用。所以在生成時考慮調整參數旋轉角度,以適應新的數據。這在實踐中證實是一種非常好用的方法,只要加少量以前的數據,去做抗遺忘的 replay,就能很好地實現數據遷移,保持語言模型的通用能力,并持續增加新場景的能力。我們還會用這個方法持續做各種各樣新效果對齊,并且訓練速度非常快。
上圖右側表中可以看到,2,000 萬 Sample 就達到了收斂效果。如果資源不多,用單臺機器兩天內可完成訓練,硬件資源消耗也少。原模型缺乏中文能力,不理解中文詩句和場景,而我們用非常少量的數據就讓其適應了模型,并且沒有出現通用質量下降。
Adapter 適用于任何開源場景的社區的模型,將其接到后面相同架構的無論是XL 模型還是 SD 模型都可以適用。在每一個場景中,無論 Finetune 模型還是 LoRA,unet模型的參數都可能發生變化,把中間的 adapter 加過去,就可適應做出各種中文的效果。其他方法包括 Controlnet、最新的加速方法、小模型、inpainting 都可以用。
我們用非常低的成本實現了場景的中文遷移,尤其語境上的繼續預訓練能力得到了提升。如果缺乏資源訓練理想的基礎模型,推薦這種方案。
2. 通用優化應用
要提升基礎能力做通用模型,再逐漸優化后續能力,是個漫長的迭代過程。我們在春節檔上線了 AI 壁紙專欄,說明 AIGC 的落地沒有太多質量上的障礙,用戶可以接受,但需要謹慎考慮安全和版權問題。
另一個典型案例是鎖屏場景。手機圖文是手機廠商的主要流量,可以用 AI 生成圖文對,并插入廣告等內容。圖中是 2023 年上半年 Top 排行圖文組內容,質量非常好。文本用多模態大語言模型,用 LLAVA 進行微調,其中大語言模型來自其他團隊,基于微調 Projector 和大語言模型,實現有詩意的文字生成。
以上是實現 AIGC 在 ToC 端落地的場景。
上圖中的場景是圖文生成相關的一個暢想,即針對用戶照片進行配套生成。例如在用戶旅游時上傳照片,幫助用戶寫一篇完整游記,發布小紅書、知乎。更具優勢的是生成文章插圖,用戶自由選擇,或選擇其他圖片。如果覺得自己拍的照片不好,可以用生成模型生成圖片。這是完整的 Pipeline 鏈路,可以用自己的照片、網上搜索的圖片、生成的圖片,模型解決文章的結構和插圖位置的問題。下一步是考慮整個文章和圖片的內容匹配度以及文章圖片本身的質量問題。
3. 垂域優化-人像垂域
垂域優化的典型場景是手機廠商瀏覽器中的廣告場景。小型 ToB 的廠商投廣告,特別重視人像垂域中幾個生成的問題:
(1)人臉和人手的崩潰問題。大部分開源模型都比較差。
(2)太過精致、質感太好的問題。尤其是社交工具的用戶,覺得不真實;真實的資源都是普通人,這種反向需求就需要考慮如何去做垂域的優化。
(3)細粒度屬性和文字不匹配的問題。
用 CLIP 做主觀意愿落地的 Fusion 都有這種問題,對語言理解力不夠,特別是美容、整容廣告都非常看重這種問題,例如做大眼睛美女卻生成了小眼睛。需要做文本描述和生成實體的對齊。這個問題從數據角度上可以解決。針對實際業務場景,構建了豐富的數萬張美容、整容關注的人臉屬性數據集,進行數據收集和非常精確的標簽打標。數萬張圖片對于模型微調來說已經非常多了。通常用幾十張對微調就會具有非常好的效果。因此構造細粒度數據,人工逐個打上標簽,人臉或者人像的標簽區就會非常細致、豐富。
(4)優化位置的問題。
上圖中的總結表來自于 Github,非常詳細地描述了 LoRA 微調某層對人像五官產生的最大影響;包括了對人體的上半身、下半身、背景需要微調 unet 具體層。2 代表變化很大,1 代表稍微小一點,其他位置幾乎無變化。想調整什么地方,對照表去調相應層參數就會非常有效。比如:豐唇廣告,之前生成薄唇效果,現在改為厚唇,找到效果好的微調位置,調整數據就能得到滿意效果。
以上兩圖中展示了更多其他的例子。比如:鼻子類,控制同一個人、同種鼻子效果;紋眉可以實現粗眉細眉。這套 Pipeline 出來之后,可以做任何五官,總體感受是一條比較有效的 Pipeline。注意:并非每個微調都會有好效果,某些太細微的特征需要用其它算法調整和解決。
通過以上實踐,我們總結出了一些經驗:
- 微調時,需要大量數據提升模型對新概念的泛化能力,數據質量不一定高。比如:人像,需要較多的人像數據,用于認識和識別、尤其是亞洲人。
- 需要稍高質量的數據精調,特別是在第一個模型之后,需要幾十張高質量的精調數據,可以把效果做出來。
典型案例還有人像修復 Pipeline。比如:古風游戲或者是古風小說,需要做古風場景生成。模型肯定沒見過,可以先塞一些劇照,后面再用 80 張圖片做古風的生成。直接生成圖片交由用戶去挑選。
最終生成效果非常好,適用于各種中文的語境場景,比如小說廣告。當然,生成圖片里面的人臉、人手問題仍未解決,對基礎模型的要求會更高,微調無法解決這個問題。
上圖是一個廣告營銷工具,主要面向小型 ToB 用戶。首先確定行業和風格,寫實、動漫、或者古風。在完成生成后,加上自己的產品或者小說、APP 等去投放。這套 Pipeline 工具業務定位就是人像垂域。
4. 文字渲染
壁紙生成主要是做高質量高分辨率場景。例如:年初有做新春快樂、兔年大吉壁紙的需求。大家都知道,文生圖對圖中文本的渲染生成有很大問題。隨著對算法的深入了解、實踐和越來越多的文章可借鑒,算法也逐漸精細。當時只考慮輸入 prompt,然后輸出圖片的場景,由業務人員去挑選調用。
文字渲染從算法角度,是構造文本和圖像對應的數據。把圖像中的文本摳出來,然后對應位置,描述里面也要包含文本。這種需求做了長數據處理,沒有過多考慮質量和長度問題。可以采用百萬級數據量,收集也比較快。這種條件生成的算法框架就是提取需要關注的信息,把信息當作條件,注入到后面 Unet 或者輸出層、Text encoder,中間的細節做一些調整。最終目的是強化整個需要生成的細節內容對最后Unet 的影響。推理的時候也是一樣的用法,把文字當作特征直接輸入,不僅僅是 prompt,而是要把 prompt 里面的引號中文字內容取出來,做字體都可以用,這個Font 最終自己會泛化出來。
上圖是文字數據集的效果。加了上述算法后,能力得到了大幅提升。
上圖是一些反應主觀效果的例子。壁紙應用相對來說比較簡單,業界、學術界后續做了很多精細工作,除了能生成這種 PS 的文字,也能生成真實場景下雕刻版文字或長文字、書籍,甚至編輯自己指定字體。
5. 個性化生成
后續又擴展到主體個性化生成,應用更加廣泛,如:DreamBooth、Textual Inversion。大家都希望輸入圖片,并在各種各樣場景中做生成,也是典型的廣告場景需求。比如:之前的廣告都是文生圖;現在的廣告可以根據用戶的產品,幫助其生成各種場景下的廣告再去做投放。這種需求也是前面工作的延續。為什么之前沒有用DreamBooth,是因為 DreamBooth 要做 test-time 微調,每張圖片要微調較長時間,算力消耗也很大。理想情況是上傳產品后,幾秒鐘之內就給出結果。當時考慮采用開放域、無需微調的生成方法、實現各種各樣的功能。
跟前面的工作一樣,都是先做數據。數據集與文本不同,要做細粒度分割。分割完之后在每個實體得到實體信息。這在早期不容易實現,直到 SAM 出來后對方法做了推動,SAM 可以做自動化的分割,分割完之后再用 Grounding DINO 方式做開放域的識別,就能實現非常詳細的細粒度分割,包含圖片的 tag 標簽和整體 Caption 的數據集。這個數據集構造的數據量比 SAM 還要大很多,達到 7,600 萬個。用這批數據做預訓練,得到了 test-time free 的主體個性化的生成模型。
模型架構跟前面一樣,是一脈相承的想法,差別是特征提取自圖片中物體的特征,再把物體特征送到 Unet 里面當作 Condition。也可以在 Text 里進行操作,比如提取特征、特征力度、送到 Unet 的位置。
最終做到了和 DreamBooth 微調方法差不多的效果。其中保真最重要,商品要真實。會犧牲部分可編輯性,不能像 DreamBooth 那樣生成非常豐富的背景,這是后面需要改進的算法問題。
舉例:投放的廣告是一個包,可以設置各種用戶想要的背景。但可編輯性沒那么強,不能做到像貓狗一樣的姿態變化,這是現存的問題。但已滿足當前場景的需求。
多個實體同樣可以做生成。
人像也可以做,但問題是對于正面照無法生成側面照,因為單張圖片的泛化能力僅限于此。這些方向發展非常迅速。最近的文章在保真性和可編輯性上都做得比較好。我們會及時跟蹤算法、方案并更新產品。
上圖中產品做了比較完整的廣告營銷方案。有些商品需要做概念圖,就直接用文生圖生成;有些已有商品可以直接用產品圖。個性化生成會根據商品生成比較適合推廣的廣告圖,然后在上面加文案,或者文案自己加。這種 Pipeline 從設計到營銷,中間沒有商品生產這一環節。用戶可以不做生產,直接用 Pipeline 先把廣告打出去,然后再去生產實際商品。
上圖是一些提包的實際案例,用戶用一個商品,生成各種背景,然后再加上文案。
這種都是用英文模型輸入,然后生成背景,但有些錯誤,用戶可以自己選擇圖片。
最終形態如瀏覽器中的廣告,對質量要求不是很高。主要關注實效性、用戶能立刻看到效果圖,所以貼的字都比較粗糙。圖片生成是主要業務需求。
三、文圖生成模型的端側輕量化
手機廠商在云側圖片生成的應用不多,需要做更精細化的結果,讓用戶得到更多的價值,比如減少用戶的工作量,這種情況多為小型 ToB 用戶。前面內容落地都在云上,成本會很高,所以端側廠商的優勢就是把所有算法都搬到手機上,用芯片去計算實現無任何成本、無隱私的問題,愿意怎么用就怎么用。后續工作重點在文生圖模型端側輕量化,接下來的介紹將更多涉及技術細節和工程方面,不涉及落地場景問題。
1. 技術路線-模型結構優化
通過我們的實踐,從 Difusion 端側優化分成三個方向:
模型的壓縮。一般大模型都會壓縮模型,Unet 也不例外,因為 Stable Diffusion 最主要還是 Unet 壓縮。對 Unet 的每層進行分析,尋找效果影響最小、整個時效和內存要求最高的層,剔除這些層,再去繼續訓練,得到 Tradeoff 模型。我們的 Tradeoff 小模型,比原版 SD 參數量少大概 1/3。在這個模型的基礎上,再按上述方法訓練一輪,用蒸餾方法做中文小模型,得到內存可控的端側模型。這是常規的模型壓縮方法。
Stable Diffusion 對采樣要求比較高,采樣是主要的時間消耗。蒸餾主要用 SDXL 效果比較好、相對比較小的 SD_base 模型。用它自己的 text encoder 或者 VAE decoder 做前處理和后處理。重點是 Unet 的循環蒸餾該怎么做,其算法會更深一些,也是學術界研究比較深入的一個方向。
2. 技術路線-采樣加速
SD 做迭代采樣時間會成倍增長。最開始的云側模型用了 25 步 DPM-Solver,這個時間成本比較高。遵循圖中提到的做法,把 Diffusion 步數逐漸縮減,四步縮減兩步,兩步縮減一步,蒸餾兩步的輸出效果、做到一步實現。這是 Progressive distillation 方法。
另一個方法是 Classifier-free guidance distillation。在 Stable Diffusion 里面增加泛化性、多樣性和質量評估,都用 W 參數控制深層的多樣性和效果的平衡參數。在 inference 時需要做兩步才能合成最后一步,所以實際步數都會乘以 2。但是下面這篇文章把 CFG 蒸餾和原始蒸餾合成了一步,使用 CFG 蒸餾一步來做,節約了一半時間。
最后的蒸餾流程用以前訓練好的 SD 小模型,先做 Progressive distillation 的蒸餾,再做 CFG 模型蒸餾,然后把這兩塊合在一起。逐漸迭代,從最開始用 32 步,然后迭代到 16 步、8 步,最后做到 4 步。重點是訓練蒸餾數據,做出高質量數據,保證蒸餾質量沒有損失。
3. 技術路線-效果對比
表中展示了最終實現的效果。從起初的 10 秒以上,到現在的 2.5 秒,相比之前有了大幅度提升。目前已進入端側 Diffusion model 落地的時代。前不久,高通和聯發科都發布了廣告,能夠把 Stable Diffusion 做到 1 秒以內,其中包括在算子優化上非常多的工作。我們和他們緊密合作,在沒有做任何算子上的優化情況下,上述純算法優化版本我們做到了 2.5 秒。下一步會做算子加算法的綜合優化。最終的目標是達到用戶無感知的生成,并保證效果。
上圖已經實現相同效果。上面是 SD 原版模型,在 DPM solver 25 步的結果,云上可以采用這種采樣方法。端側可以做到 4 步,然后做 W8 的量化。這個小模型是用更強的大模型蒸餾出來的,所以在指標上比 SD 更好。實現在端側做到用戶基本無感生成,把 SD 能力完全繼承的效果。預計明年手機廠商會考慮把整個生成的模型搬到端側,直接在手機上即可生成。
以上就是關于端側落地技術優化場景的分享。后續問題是對于集模型,在端側除生成速度還要考慮內存問題。無論個性化生成、還是 LoRA 微調,都只能在這個集模型上加小模塊。把這些模塊堆疊起來,如何使用、調度還需要制定策略和編寫算法。真正實現全端側、生成 AIGC 的 Pipeline 工具還需要一段時間。