AIGC圖像技術在淘寶人生2的探索和應用
淘寶人生2(又名:第二人生)是淘寶的一個虛擬人裝扮類應用,承擔了用戶在淘寶的第二個人生的作用。我們旨在通過AI為淘寶人生2的用戶提供豐富有趣的可玩性內容,隨著最近火熱的AIGC技術的發展,我們也進行了相關嘗試和落地,目前已經上線了AI拍照風格化、AI寫真館、AI服飾涂鴉等項目。本文主要以AI服飾涂鴉為例介紹我們在AIGC圖像領域的探索和應用,希望能夠對大家有所啟發和幫助,也歡迎大家建議和合作。
一、項目背景
為了能夠讓淘寶人生2的用戶擁有更多可互動性的有趣玩法,提高社區內容發布量,我們開發了AI服飾涂鴉項目,能夠讓用戶自行創作生成相關服飾,增加用戶的參與感和成就感。具體玩法主要是:通過選定一張底圖,用戶可以在圖上進行自由涂鴉和創作,同時也支持輸入文字描述,然后通過AIGC算法技術,最終生成和用戶涂鴉相像的高質量風格圖像。下列涂鴉來自淘寶人生2的用戶創作:
圖1 AI服飾涂鴉示例
二、前置技術介紹
本節內容主要是簡介一些項目使用到的關鍵技術,不會長篇大論進行具體的理論分析,只是讓大家有一個大致的了解,如果想深入了解相關的原理可以查看論文或者網上大佬們的文章博客。
Stable Diffusion
在具體圖像生成算法選擇上,我們選擇以Stable Diffusion(后續簡稱為SD)技術為核心,進行開發和優化。其核心是基于Latent Diffusion Models(LDMs)實現的的文生圖模型,SD模型基于Latent的擴散模型的優勢是因為圖像的Latent空間要比Pixel空間小得多,計算效率更高效。下圖是其主要框架結構,它先采用AutoEncoder能夠將圖像壓縮到Latent空間,然后通過擴散模型并在U-Net中引入TextCondition來實現基于文本生成圖像的Latents,最后送入AutoEncoder的Decoder模塊解碼得到生成的圖像。
圖2 基于Latent的擴散模型結構
SD模型主要包括了三大件:圖像壓縮還原模型(變分自編碼器VAE),文本編碼器(CLIP Text Encoder)和潛空間擴散模型(U-Net結構)。
- VAE:其分為Encoder和Decoder兩部分,Encoder將圖像壓縮到Latent空間,而Decoder將Latent解碼為圖像。
- CLIPTextEncoder:理解輸入的文字描述,把文字信息轉換成特征向量,并注入到擴散模型的UNet中,指導圖像生成。
- UNet:擴散模型的主體,在潛空間中逐步處理擴散信息,用來實現文本引導下的圖像Latent生成。
SD更深入的原理和具體訓練過程和我們在這不詳細展開,我們關注其整體的推理部分,我們將上述三個大模塊組合一下,以一個具體示例進行展示:
圖3 SD模型三大件工作流程
通過上面展示的SD流程,我們即可實現給定一段文本描述prompt后生成相關的圖像。
ControlNet
上面SD模型能夠通過prompt以及image的輸入,生成一張圖像,但是其生成的圖像不太可控,具有一定的抽卡性質,有非常多千差萬別的圖像符合輸入描述的文本。
而ControlNet的出現,將AI繪畫推向了高峰,ControlNet是一個神經網絡架構,該網絡可以控制SD模型使其支持更多的輸入條件,提高圖像生成模型在特定結構和布局控制上的能力。
圖4 ControlNet結構
圖中ControlNet結果的locked部分固定了原始模型的權重,保留原始模型已經學習到的圖像生成能力,通過額外學習網絡參數加入到原始模型中,以最終控制圖像的生成。其中zero convolution是一個1x1的卷積層,初始化權重和偏差都為0,以保證訓練初始階段隨機噪聲不會影響主干網絡。ControlNet在SD模型中應用的結構如下:
圖5 ControlNet和StableDiffusion結合
通過不同的控制條件作為輸入輸出訓練,即可實現通過物體邊緣、人物姿態、深度圖等等條件來控制SD模型推理得到的圖達到和輸入布局類似的效果。一些不同控制條件下的SD+ControlNet生圖效果:
圖6 不同控制條件下的SD+ControlNet生圖效果
LoRA
由于大模型的訓練需要非常高的數據和機器資源成本,即使是進行 Fine-tuning微調也需要較多算力資源的消耗。而LoRA(Low-Rank Adaptation)的提出,便大大節約了算力、提高了效率,它能夠讓下游細分領域任務的微調大面積應用起來。其最初是為LLM大語言模型設計的低秩適配器,一開始SD并不支持LoRA,據說Simo Ryu是第一個讓SD支持LoRA的人。
其主要原理是假設模型在適配特定任務時的參數改變量是低秩的,通過低秩分解來模擬參數的改變量,從而實現間接的訓練神經網絡的參數,由此引出低秩自適應方法LoRA。
圖7 LoRA結構
LoRA在SD模型中的訓練邏輯是首先凍結SD模型的權重,然后在SD模型的U-Net結構中注入LoRA模塊,并將其與CrossAttention模塊結合,并只對這部分參數進行微調訓練,其中低秩分解是由兩個低秩矩陣的乘積組成。LoRA模型能在較小的數據集上進行訓練,即使是幾張圖像也能夠完成特定的細分領域微調任務。
雖然LoRA模型能夠比較好的適應特定的任務比如圖像風格化,但是總體來說在圖像的多樣性和泛化性上還是有所欠缺的,因此我們在項目中大部分情況下不同的風格還是選擇使用不同的底模。
三、生圖服務部署
目前大家常用的SD服務,主要是SD-WebUI和ComfyUI,但是對于一個有特定業務需求且要提供給大量用戶使用的在線服務而言,穩定性、代碼可控性、定制開發、開源協議等等方面都有一定的要求,因此我們基于集團內部已有的能力,站在巨人的肩膀上搭建了基于diffusers庫二次開發以適應我們自己業務的SD生圖框架。
圖8 SD生圖工程框架
該框架能夠通過json入參配置SD絕大部分功能如ControlNet、LoRA、VAE、Sampler等等模塊,并使用集團模型加速庫來實現高效的文生圖和圖生圖等。
同時也提供了類似于sd-webui的界面方便進行prompt和模型等的參數調優,對模型的下載加載、生命周期管理和圖像的管理也進行了開發和優化。
模型管理
我們對原始SD代碼流程進行了優化,將ControlNet作為可插拔的模塊進行管理,對ControlNet模型進行緩存,在初始構建SD的Pipeline時,不指定使用的ControlNet,而是在SD模型推理的時候,根據參數來決定動態加入ControlNet,這樣做的好處是帶ControlNet和不帶ControlNet的SD可以共用一個Pipeline,在輸入參數變化的時候避免Pipeline切換帶來的開銷,同時對ControlNet模型的單獨管理,也能夠使ControlNet在不同底模上的復用。同理,LoRA模型也是類似。
圖9 推理時動態加載ControlNet模型
對于場景只有單個底模的業務來說,提前初始化好Pipeline并加載好底模,問題不大。但是許多業務場景下存在多個底模切換推理的問題,而底模通常都非常大,直接從磁盤加載會存在高達幾十秒的耗時,這對于在線推理來說是不可忍受的。
顯然,我們可以把需要的底模都提前加載到GPU,切換的時候就不需要再重新load,反正推理的時候還是只有一個模型在推理,不會影響推理速度,實現無縫切換。但是GPU顯存畢竟是有限的,考慮到從內存轉移到顯存比直接從磁盤load還是快很多的,而內存可以擴展的更大,因此對于底模的管理,我們加入了顯存-內存的LRU隊列汰換策略,可以做到支持同時load n個模型進顯存(取決于你的GPU顯存),同時將m個模型load進內存(取決于你的內存容量),然后通根據入參通過LRU策略進行顯存和內存之間的轉移和推理。
圖10 推理模型內存-顯存LRU隊列汰換
服務部署
一般常規的方式,是用戶發起請求,服務器接受請求,然后分發到空閑的GPU機器進行推理,最后返回。我們采用集團的TPP服務平臺,由vipserver綁定了多臺GPU機器,然后通過TPP調用vipserver的方式進行服務調用,但是發現實際調度的時候存在負載不均衡的情況,會出現1臺機器空著,1臺機器在排隊的情況,以及存在超時的問題??赡苁怯捎谖覀兊臉I務場景相對來說QPS較小推理時長較大,對于這種方式的調度沒有做針對性優化。
因此,我們需要尋找一種可以榨干GPU的方案??梢韵氲降氖牵约航⒁粋€中心化的請求服務器,所有GPU機器向它報告自己的空閑狀態,然后根據機器狀態進行用戶請求任務的分發。同時我們了解到服務端同學那邊之前已經為離線渲染任務做了請求輪詢拉取的方案,由于時間和成本關系,于是我們就直接采用了這種方式。所有請求先進入服務端的任務隊列,由服務端進行超時、重試、限流等策略控制,算法部署的GPU機器直接對任務隊列進行輪詢,只要拉取到任務后進行推理返回即可。這樣就解決了負載均衡的問題,但是不足的是可能存在輪詢的百ms級的時延問題,但是對于大模型推理時間來說這也是可以接受。
圖11 服務請求流程
涂鴉項目
回到我們的AI服飾涂鴉項目,我們整體的Pipeline是采用基于SD的文+圖+Controlnets來對用戶涂鴉進行風格化。針對每期的主題風格,我們會對模型、prompt等參數進行調優和部署,其中用戶的涂鴉和背景底圖是分別進行傳輸的,我們對其進行合成后編碼成圖像潛空間特征,作為初始噪聲替代原始SD文生圖的隨機噪聲,文本輸入我們以預先設定的prompt和用戶自己輸入的prompt疊加進行文本特征提取,再選擇幾個合適的ControlNet對生成圖像布局進行一定的約束,最終生成和用戶涂鴉相似又不失美感的服飾圖像。
圖12 AI服飾涂鴉生圖流程
考慮到用戶有調皮鬼,可能會把圖全部涂黑或者涂滿隨便畫,所以需要加入ControlNet的Pose模型來約束生成人物,同時考慮到用戶涂鴉后會破壞人物Pose的識別,所以使用的是對涂鴉前的原圖進行識別,最后這樣即使亂涂也能生成一定的人物。
圖13 全黑圖人物生成
生成多張圖
為了讓用戶一次涂鴉生成多張圖片進行挑選,一種最簡單的方式就是直接使用4個不同隨機種子作為噪聲擾動,生成4張不同的圖,而由于我們的Pipeline加入了較多的約束信息,會導致這種方式生成的圖結果差異性不大。于是我們提供了2個底模4套參數分別來生成4張圖,使其跟涂鴉圖相似的同時又具有較大的差異性。
圖14 一次性涂鴉生成4張具有差異性的圖
目前為了生成較為精美的圖像,我們使用了較大分辨率和較高的迭代步數,以至于生成一張圖像要接近10s。如果生成4張圖,直接串行生成,時間上要比較久了,考慮到用戶體驗肯定不能讓用戶等這么久。怎么辦?
第一種方式:一張一張逐步返回。每生成完一張圖返回一張,讓用戶每隔一段時間看到一張圖,不至于等很長時間再一次性出圖,但全部生成完的總體時間還是比較長。第二種方式:加錢。凡是能用錢解決的問題都不是問題,增加GPU推理機器,將用戶的一次請求,由服務端分成4個并行任務,然后算法分別在4臺機器上同時推理進行返回。最后選擇了第二種方案,加機器減少用戶的等待時間。
圖15 單次請求分成4份并行處理
這時候有同學可能就要問了,不能直接在一臺機器上同時推理嗎?問得好,我們確實嘗試過在一臺機器上多實例同時進行模型推理,但是結果發現推理時長變長了,應該是受限于計算帶寬的瓶頸,不足以支撐多個任務同時推理。
部分優化
我們將部分圖片如背景底圖和人物Pose圖進行了緩存,因為這兩種圖像數量和樣式是由運營配置的,是固定有限的,只需要第一次下載加載緩存后,后續遇到同樣的圖像可以直接取出進行處理,減少耗時開銷。
隨著生圖分辨率增大,推理時長急劇上漲,于是思考是不是可以先生成小分辨率的圖再超分到大分辨率,說干就干。干完后發現耗時確實可以少不少時間,但是隨之而來的是由于是生成全身像,臉部和手部的區域占比較小,導致其生成的崩壞問題比較明顯,這顯然無法通過超分解決,遂作罷,并將面部和手部修復作為后續優化手段。
圖16 先生成小圖再變成大圖
對于我們現在使用的生圖分辨率來說,總體來看人臉部分相對來說還是較小,還是會出現生成的人臉有點不和諧的情況,所以加入面部修復被提上了日程。我們首先對SD生成的圖像進行人臉檢測,然后對人臉部分再使用SD的圖生圖功能,對人臉部分進行重新生成,最后將生成的人臉進行Blur后貼回到前面的圖上。
圖17 面部修復流程
隨著我們主題的上新,模型數量也在不斷增加,為了保證耗時和資源利用率,除了通過之前介紹的底模LRU汰換策略之外,我們也在探索其他可優化的方式。
敏感圖問題
為了避免有比較暴露的圖出現,我們加入了一些策略來進行控制。首先我們對輸入敏感詞進行了一定的過濾,在SD生圖中也加入了一些負向提示詞,然后SD模型提供了SafetyChecker能夠對生成的圖像進行過濾,但是其對偏卡通的圖像存在一些誤檢情況,我們對其閾值進行了調整,最后由服務端再送入集團綠網進行檢測過濾。
圖18 敏感圖過濾
上線撒花
經歷了種種磨難,最終成功上線,撒花。用戶反響不錯,用戶的創作水平也非常的可以!放幾張來自用戶的創作:
圖19 用戶創作的涂鴉生成圖
快來淘寶APP進入淘寶人生2,開啟你的第二人生,創作屬于你的AI涂鴉服飾吧!
四、引用
[1] ??https://arxiv.org/abs/2112.10752??
[2] https://arxiv.org/abs/2302.05543
[3] https://arxiv.org/abs/2106.09685
[4] https://github.com/AUTOMATIC1111/stable-diffusion-webui
[5] https://github.com/comfyanonymous/ComfyUI
[6] https://github.com/huggingface/diffusers
五、團隊介紹
我們是淘天集團-FC技術部-智能策略團隊,主要負責手機天貓搜索、推薦、AI創新等業務研發,以及淘寶人生的AI互動玩法的研發,致力于運用搜推算法、計算機視覺、AIGC等前沿技術,為用戶帶來更好的購物體驗和內容創作。歡迎搜索推薦相關以及AIGC相關的算法同學加入我們,簡歷可投遞至zhujianbo.zjb@taobao.com。
本文轉載自大淘寶技術,作者:玄羿
