拿大模型代碼來(lái)訓練自用小模型
1 前言
上一期所刊登的《從CLIP 應用領(lǐng)會(huì )隱空間的魅力》一文里,就是一個(gè)典型的范例:從Github 網(wǎng)頁(yè)下載OpenAI 公司的CLIP 源代碼(Source code),然后搭配自己收集的小數據來(lái)訓練一個(gè)給超市商家使用的小模型( 圖1)。
圖1 Github上的免費CLIP源碼
那么,這大模型與小模型,兩者的代碼之間,有何不同呢? 這可能會(huì )出乎您的預料,其核心模型的代碼,大多是一致的、相容的。常常僅是大模型的參數量很大,而小模型參數量較少而已。
于是就能免費拿來(lái)大模型的開(kāi)源代碼,把其參數量調小,搭配企業(yè)自有IP 的數據( 訓練數據量較少),在較省算力的計算機上即可把代碼跑起來(lái),訓練出企業(yè)自有IP 的中小模型了。免費代碼既省成本、可靠、省算力、又自有IP,可謂取之不盡、用之不竭的資源,豈不美哉!
例如,在上一期的文章里,就以商店柜臺的產(chǎn)品推薦應用為例演示了:拿CLIP 的源代碼,搭配商家自有產(chǎn)品圖像(Image) 和圖像敘述文句(Text),來(lái)訓練出企業(yè)自用的CLIP 小模型。
然而,上一期文章里,并沒(méi)有詳細說(shuō)明其訓練的流程。于是,本文就拿另一個(gè)范例來(lái)演示,并且說(shuō)明其開(kāi)發(fā)流程。由于本文的主題是代碼,如果您有些Python代碼的基礎知識,就會(huì )更容易理解。
2 以”訓練Diffusion寫(xiě)書(shū)法”為例
在之前的文章《細觀(guān)Diffusion 隱空間里UNet 的訓練流程》里,曾經(jīng)介紹過(guò)Diffusion 架構,及其訓練方法。在A(yíng)IGC 潮流中,SD(Stable Diffusion) 產(chǎn)品的推出是AIGC 圖像生成發(fā)展歷程中的一個(gè)里程碑,提供了高性能模型,能快速生成創(chuàng )意十足的圖像。
于是,本范例就拿Diffusion 來(lái)學(xué)習,及創(chuàng )作書(shū)法字體,也就是俗稱(chēng)的:寫(xiě)書(shū)法。雖然Diffusion 也能學(xué)習依循標準筆順,來(lái)逐筆寫(xiě)出字形。為了從簡(jiǎn)單范例出發(fā),本文先讓Diffusion 來(lái)學(xué)習程生成整個(gè)字形,而不是逐一生成各筆劃。
在SD 里,UNet 模型扮演關(guān)鍵性角色。在SD 的隱空間里,它使用了一個(gè)UNet 模型,并搭配一個(gè)時(shí)間調度(Scheduling) 器,來(lái)?yè)螆D像生成的核心任務(wù)。而擴散(Diffusion) 一詞則描述了SD 隱空間里進(jìn)行的圖像生成情形,整個(gè)過(guò)程都是在隱空間里逐步推進(jìn)(Step by step) 的,現在就依循開(kāi)發(fā)流程來(lái)逐步說(shuō)明之。
Step-1:從Github網(wǎng)頁(yè)下載Diffusers源碼首先訪(fǎng)問(wèn)這個(gè)Huggingface 網(wǎng)頁(yè)( 圖2),然后,按下”code”就自動(dòng)把Diffusers 源碼下載到本機里了。這源碼本身并不大,只有4.5MB 大小而已。
圖2 Github上的免費Diffusers源碼
Step-2:把Code放置于Python 的IDLE環(huán)境里
把剛才下載的Diffusers代碼壓縮檔解開(kāi),放置于Wibdows 本機的Python 工作區里,例如 /Python310/ 目錄區里( 圖3),這樣,就能先在本機里做簡(jiǎn)單的測試,例如創(chuàng )建模型并拿簡(jiǎn)單數據( 或假數據) 來(lái)測試,有助于提升成功的自信心。
圖3 放置于本機的Python環(huán)境里
Step-3:找出Diffusion的核心模型---UNet
由于小模型常常只需要部份代碼就足夠了,所以就打開(kāi)上圖里的/diffusers/ 活頁(yè)夾,就會(huì )看到所需要的UNet 模型代碼文件--- unet_2d_condition.py 檔案,如圖4 所示。
圖4 放置于本機的Python環(huán)境里
接著(zhù),打開(kāi)這個(gè)unet_2d_condition.py 檔案,可以看到內含的類(lèi)(Class) 定義:
class UNet2DConditionModel(…):
……………
……………
這個(gè)UNet2DCondition 類(lèi)就是所需要的UNet 模型的定義了。
Step-4:準備訓練數據(Training data)在本文的范例里,收集了”春、滿(mǎn)、干、坤”四個(gè)字的書(shū)法圖像,各5 個(gè)圖像,如圖5 所示。
圖5 訓練數據
總共有20 個(gè)書(shū)法字體的圖像。使用這20 張書(shū)法圖像,來(lái)讓UNet 模型學(xué)習,就能讓它”畫(huà)”出書(shū)法字了。之后,也能進(jìn)一步讓它學(xué)習沒(méi)一個(gè)字的筆順,來(lái)逐筆地”寫(xiě)”出書(shū)法字體了。
Step-5:編寫(xiě)”模型訓練”主程序,然后展開(kāi)訓練
準備好了訓練數據( 書(shū)法圖像),就來(lái)編寫(xiě)一個(gè)主程序,使用UNet2DCondition 類(lèi)來(lái)創(chuàng )建一個(gè)UNet 模型。主程序的代碼如下:
接著(zhù),就拿剛才所準備的訓練圖像,來(lái)展開(kāi)訓練,也就是讓UNet 模型來(lái)學(xué)習了。其代碼如下:
在SD 隱空間里,它使用了一個(gè)UNet 模型,并搭配一個(gè)時(shí)間調度(Scheduling) 器,來(lái)?yè)螆D像生成的核心任務(wù)。執行到上圖紅色框的指令時(shí),就會(huì )把隨機噪音添加到書(shū)法圖像里,成為”含噪音圖像”(Image noisy)。然后把它輸入給UNet 模型,讓它預測出此圖像所含的噪音。在SD 里,使用數學(xué)運算,根據時(shí)間步數(即上圖里的ts) 來(lái)決定將多少噪音量添加到原圖像里。這樣地重復訓練500 回合。如果圖像數量增大時(shí),在單機上訓練,可能速度非常緩慢。此時(shí)可以把這些代碼遷移到有GPU 的機器上進(jìn)行訓練,能大幅提高效率。
Step-6:編寫(xiě)”圖像生成”主程序,然后展開(kāi)創(chuàng )作
訓練好了,就得到了自用小模型了。最后就可編寫(xiě)另一個(gè)主程序,來(lái)讓UNet 模型生成各種創(chuàng )意的書(shū)法作品了。例如,把字寫(xiě)在唐宋時(shí)期的國畫(huà)里,如圖6 所示。
圖6 AI的書(shū)法創(chuàng )作
每次執行這個(gè)書(shū)法主程序,都會(huì )有一些不一樣的創(chuàng )新,例如圖-6 的左右兩項書(shū)法創(chuàng )作。
3 結語(yǔ)
基于本文的范例,可以繼續微調、優(yōu)化這UNet 模型及主程序代碼,讓AI 做出更多的創(chuàng )新作品。例如,也能進(jìn)一步讓它學(xué)習沒(méi)一個(gè)字的筆順,來(lái)逐筆地“寫(xiě)”出書(shū)法字體了( 圖7)。
圖7 AI依筆順而逐筆創(chuàng )作
本文以AI “畫(huà)”書(shū)法為例,說(shuō)明如何從Github 園地里,挖掘自己想要的大模型源代碼,搭配自己收集的書(shū)法圖像,來(lái)訓練出有趣的AI 書(shū)法小模型。如果能善用這些免費代碼,既能省成本、又可靠、省算力、甚至能擁有自己有IP,可謂取之不盡、用之不竭的資源,不亦美哉!
(本文來(lái)源于EEPW 2023年12月期)
評論