如何真(zhen)正“不花一分錢”部署一個屬于你的大模(mo)型
前言
看了(le)那么多(duo)chatGPT的(de)(de)(de)(de)(de)文章,作為一名不精(jing)通算(suan)法的(de)(de)(de)(de)(de)開發,也(ye)對大模(mo)型(xing)(xing)心癢癢。但(dan)想要部署自(zi)己(ji)的(de)(de)(de)(de)(de)大模(mo)型(xing)(xing),且(qie)不說沒有算(suan)法相關的(de)(de)(de)(de)(de)經驗了(le),光是(shi)大模(mo)型(xing)(xing)占用的(de)(de)(de)(de)(de)算(suan)力資(zi)源,手(shou)頭的(de)(de)(de)(de)(de)個人電腦(nao)其實(shi)也(ye)很難獨立部署。就算(suan)使用算(suan)法壓(ya)縮后的(de)(de)(de)(de)(de)大模(mo)型(xing)(xing),部署在個人電腦(nao)上,還要忍受(shou)極端緩慢的(de)(de)(de)(de)(de)計(ji)算(suan)速度以及與chatGPT相差(cha)甚遠的(de)(de)(de)(de)(de)模(mo)型(xing)(xing)效(xiao)果。
有什么辦法能夠(gou)部(bu)署屬(shu)于(yu)我們自(zi)己(ji)的大模型呢?其(qi)實很簡單(dan),我們將目標拆解(jie)一下(xia):
- 有編程基礎:作為一個合格的程序員,這應該是必備素質。
- 有足夠的算力資源:專業GPU自己買不起怎么辦,阿里云最近推出了”飛天“免費試用計劃,AI模型訓練,GPU資源免費用!
- 要懂大模型:真的要精通大模型嗎?不需要。如果只是簡單的模型部署和使用,現在的開源模型部署已經非常簡單化,只需要掌握基礎的Python知識就可以。
隨著chatGPT的火爆,許(xu)多開源愛好(hao)者(zhe)涌入(ru)AI領(ling)域,將許(xu)多與大型(xing)(xing)模(mo)型(xing)(xing)相關的工(gong)具進行進一(yi)步(bu)封裝(zhuang),使(shi)得我們(men)這(zhe)些AI初學者(zhe)也能夠用很少的工(gong)作量(liang)搭建一(yi)個(ge)私有(you)大型(xing)(xing)語言模(mo)型(xing)(xing)。而且,有(you)許(xu)多成熟的工(gong)具可供(gong)我們(men)使(shi)用,可以幫助我們(men)進一(yi)步(bu)使(shi)用和微調大型(xing)(xing)模(mo)型(xing)(xing)。
因此,本文是為AI初學者們(包括我自己)編寫的保姆級大型模型部署和使用指南。現在正值阿里云免費試用計劃,我們可以不花一分錢就可以體驗部署自己的大型模型的樂趣。
下圖便是(shi)我通過阿里云(yun)免費申(shen)請的PAI平臺資源(yuan)(顯卡是(shi)Nvidia V100),部署的清華大學chatGLM對話(hua)大模型,在網頁端(duan)和手機端(duan)都能直接(jie)體(ti)驗:
電腦端
手機端
下(xia)文圍繞(rao)如何手把手搭建(jian)一個大(da)模型Demo展開,文章主要目錄(lu):
- 領取阿里云免費使用資源
- 創建并使用PAI平臺實例
- 部署清華ChatGLM大模型
- 加餐:免費額度用量查詢
- 總結和展望
領取阿里云免費使用資源
免費試用活動頁
只(zhi)要(yao)沒(mei)有申(shen)請(qing)過PAI-DSW資源的新老用戶皆可申(shen)請(qing)5000CU的免費(fei)額度,3個月內使用。
至于5000CU能用多久,和實(shi)際(ji)申(shen)請實(shi)例的性能相關,在下(xia)面會講解(jie)。
創建并使用PAI平臺實例
官方有PAI-DSW使用教(jiao)程,教(jiao)你如何用領(ling)取的(de)免(mian)費資源(yuan)搭建(jian)一個Stable Diffusion來做AI畫圖,如果(guo)對SD感(gan)興趣,可以按照官方教(jiao)程實踐。
我們領(ling)取(qu)額度后(hou),秒(miao)到賬(zhang)。之后(hou)在阿里(li)云頁面內搜索PAI平臺,點(dian)擊立即開通,開通PAI控制臺。
開通時的頁面沒有截圖,其中有一些可選的開通項,比如NAS,比如網關等,可以按照自己需求選取,比如希望保存自己的模型,那可以關聯(lian)NAS資(zi)源(yuan)(yuan)。我當時沒(mei)有選其(qi)他資(zi)源(yuan)(yuan),僅(jin)開通了PAI,這樣沒(mei)有額外的收費。
隨后進入控制臺,創建DSW實(shi)例。
這(zhe)里(li)選取(qu)資源,注意選擇GPU資源,并選擇支持資源包抵扣的(de)資源。比(bi)如(ru)下(xia)圖(tu)的(de)ecs.gn6v-c8g1.2xlarg。可(ke)以看到(dao)他們的(de)價格里(li),寫明了每(mei)小時消耗(hao)的(de)CU,你(ni)可(ke)以大(da)致計算一(yi)下(xia),5000CU可(ke)以用(yong)多久,ecs.gn6v-c8g1.2xlarg這(zhe)個型號可(ke)以跑333小時,大(da)概(gai)連續(xu)13天(tian)。
系統(tong)可以任(ren)意選(xuan)擇(ze),本文為了部(bu)署(shu)chatGLM,選(xuan)擇(ze)pytorch1.12
當然,中間你可以隨時停止機器,就不會繼續扣費。注意,這里的(de)機(ji)器(qi),是只(zhi)有系(xi)統(tong)盤的(de),如果停止了機(ji)器(qi),掛載的(de)系(xi)統(tong)盤會(hui)(hui)被回收(shou),你在上面下(xia)載的(de)各種文件,模型(xing),都(dou)會(hui)(hui)回收(shou)掉(diao)。你重(zhong)新(xin)啟動,是新(xin)的(de)系(xi)統(tong)盤,文件需要(yao)重(zhong)新(xin)下(xia)載。(別問(wen)我怎么知道的(de)- -!)
創建(jian)完成后,點擊(ji)打開,就進(jin)入了交互式的Web頁面,可以開始你(ni)的模型開發(fa)之旅。
部署清華ChatGLM大模型
上面(mian)已經講完(wan)了資源(yuan)(yuan)的(de)(de)(de)(de)申請(qing)和實例的(de)(de)(de)(de)創(chuang)建(jian)、使用,之后小(xiao)伙伴們可以自行發揮(hui),部署自己的(de)(de)(de)(de)大模(mo)型(或者任何AI相關資源(yuan)(yuan))。本文后半部分介紹一下(xia)我自己折騰部署ChatGLM對(dui)話大模(mo)型的(de)(de)(de)(de)過程,給完(wan)全(quan)不(bu)了解(jie)大模(mo)型的(de)(de)(de)(de)小(xiao)伙伴打個(ge)樣。
ChatGLM代(dai)碼(ma)倉庫:
大家(jia)完全可以(yi)按照官方(fang)文(wen)檔自行部署,忽略我(wo)下面的(de)教程。也可以(yi)按照我(wo)下方(fang)的(de)流程來操作,避免再(zai)把我(wo)踩(cai)得坑再(zai)踩(cai)一遍(bian)。
下載模型
由于模型(xing)較(jiao)大(da)(13G左右(you)),我(wo)們最(zui)好先把模型(xing)拉到本地(di),再運行(xing)。
當然,如果你也可(ke)以不下(xia)載離線模型,直接在運行時(shi)拉取(qu)模型文件(jian)。
模型文件倉庫:
下(xia)載模(mo)型倉庫,需要安(an)裝Git LFS(Large File Storage),它(ta)用來拉去(qu)Git倉庫中的(de)大(da)型文件,比如這次用到的(de)模(mo)型bin文件。
由于(yu)我(wo)們申請(qing)的系統(tong)正好是Ubuntu,在(zai)Ubuntu下安(an)裝(zhuang)Git LFS,可以使用如(ru)下命令:
sudo apt-get update
sudo apt-get install git-lfs
完(wan)成后,克隆(long)模型倉庫(ku):
git clone
有可(ke)能網絡波動,會(hui)導致(zhi)拉取(qu)卡住,可(ke)以手動停止(zhi)掉,然(ran)后進入文件夾內:
git lfs pull
這(zhe)樣會拉取到上(shang)圖紅框中LFS文件。
部署模型
完成模型下載后,我們下載模型運行代碼(ma):
git clone
進入文件夾,創建python的虛擬(ni)環(huan)境:
virtualenv -p /usr/bin/python3.8 venv
激活Python虛擬環境:
source venv/bin/activate
如(ru)果遇到如(ru)下(xia)的報錯(cuo),需要額外安裝一下(xia)python3-dev:
Could not build wheels for pycocotools, which is required to install pyproject.toml-based projects
error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
sudo apt-get install python3-dev
由(you)于我們本地(di)提前(qian)下載好了模(mo)型,我們修改一(yi)下代(dai)碼,使用(yong)本地(di)模(mo)型的路(lu)徑。
將使用到的(de)(de)(de)代(dai)(dai)碼(ma)中,路徑都(dou)(dou)從THUDM/chatglm-6b改為你的(de)(de)(de)路徑,比如我(wo)們的(de)(de)(de)模型(xing)下(xia)(xia)載在/mnt/workspace/chatglm-6b,我(wo)們將兩種部署(shu)模型(xing)的(de)(de)(de)主代(dai)(dai)碼(ma)文件(jian)都(dou)(dou)修(xiu)改一下(xia)(xia),都(dou)(dou)修(xiu)改為如下(xia)(xia)圖(tu)所示的(de)(de)(de)路徑:
- cli_demo.py: 命令行交互界面
- web_demo.py:Web圖形交互界面
我(wo)們直(zhi)接用(yong)官(guan)方提供(gong)的網頁(ye)版Demo來跑模(mo)型(xing),啟動web_demo.py,開始(shi)模(mo)型(xing)部署(shu),首先會將模(mo)型(xing)讀(du)入(ru)內存,占用(yong)約13個(ge)G。
完成后(hou),內(nei)存會被(bei)釋放,開始(shi)占(zhan)用(yong)GPU顯存13g。
最終(zhong),部署完成會得(de)到服(fu)務公(gong)網(wang)和(he)本地網(wang)址。
對話效果展示
回(hui)答還(huan)是比(bi)較(jiao)快的,在我們V100顯(xian)卡的機器(qi)上,提問后(hou)1-2秒(miao)內就會開始回(hui)答問題。
以下是一個完整的對話:
我:寫一個(ge)Java單例模式代碼
ChatGLM:以下是一個簡單(dan)的Java單(dan)例模式(shi)代碼(ma)示例:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
在這個示例中,Singleton 類是一個靜態類,它有一個靜態成員變量 INSTANCE,它初始化為一個單例對象。getInstance 方法返回這個單例對象的實例,可以像任何其他方法一樣使用。
單例對象通常被用于確保一個類只有一個實例,并提供全局訪問點。使用 getInstance 方法可以方便地獲取單例對象,而無需擔心多個線程同時訪問同一個對象。
需要注意的(de)是,在(zai)實(shi)際應用中,單例對象應該盡量避(bi)免被頻(pin)繁(fan)創建(jian)和(he)銷毀,因為這樣會增加內存開銷和(he)維護成本(ben)。因此(ci),可以考慮(lv)使用懶(lan)加載(lazy loading)的(de)方(fang)式來避(bi)免頻(pin)繁(fan)創建(jian)單例對象。
我(wo):可以換(huan)一(yi)個(ge)方式(shi)實現嗎,比如懶漢式(shi)?
ChatGLM:當然可以,懶漢式單例模式的(de)具體實(shi)現(xian)方(fang)式如下(xia):
- 將 Singleton 類做成一個接口。
- 實現 Singleton 接口的類可以是多個,但它們都應該使用 getInstance 方法來獲取單例對象,并返回一個指向該對象的引用。
- 實現 Singleton 接口的類中,可以有一個內部類來負責創建單例對象。
- 內部類應該實現 static 關鍵字,并使用 synchronized 關鍵字實現線程安全。
- 內部類應該覆蓋 getInstance 方法,以實現懶加載。例如,可以創建一個靜態變量來存儲單例對象,并在需要時才創建該變量。
- 在需要使用單例對象的地方,可以調用內部類的方法,來獲取單例對象。
以下是一個懶漢式單例模式的示例代碼:
public interface Singleton {
static Singleton INSTANCE;
}
public class ConcreteSingleton implements Singleton {
private static Singleton INSTANCE = new ConcreteSingleton();
@Override
public Singleton getInstance() {
return INSTANCE;
}
}
public class LazySingleton implements Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
synchronized (LazySingleton.class) {
return INSTANCE;
}
}
}
在這個示例中,ConcreteSingleton 類使用 getInstance 方法來創建單例對象,并使用 synchronized 關鍵字實現線程安全。LazySingleton 類使用 synchronized 關鍵字實現懶加載,只有在需要時才創建單例對象。
需要(yao)注意的(de)是,懶(lan)漢(han)式(shi)單例(li)模式(shi)仍(reng)然需要(yao)保證線程安全,因此在使用懶(lan)加載時,需要(yao)考慮線程安全問題(ti)。此外,懶(lan)漢(han)式(shi)單例(li)模式(shi)可(ke)能(neng)無(wu)法充分利(li)用類的(de)空間,因為它需要(yao)使用共享對(dui)象(xiang)來實現懶(lan)加載,因此需要(yao)考慮如何提高類的(de)性能(neng)和(he)空間利(li)用率(lv)。
查看免費額度使用量
免(mian)費的(de)5000CU額(e)度是(shi)有(you)(you)三(san)個月時效的(de),超過三(san)個月會直接過期(qi)。想要做到心中有(you)(you)數,防(fang)止超過免(mian)費額(e)度導致扣費。我們可(ke)以查看(kan)免(mian)費額(e)度的(de)用(yong)量(liang)。在頁面右上角有(you)(you)“費用(yong)”標簽,選(xuan)擇(ze)“資(zi)源(yuan)實(shi)例管理(li)”,點擊“資(zi)源(yuan)包”,能看(kan)到你的(de)免(mian)費資(zi)源(yuan)包的(de)用(yong)量(liang)。
點(dian)擊每(mei)行中的統計,可(ke)以看到(dao)是哪(na)個實(shi)例在消耗CU。
總結
整(zheng)個部署流程,我自己折騰(teng)下來也只花了(le)半天(tian)時間,就能夠搭建好一(yi)個完整(zheng)、可用(yong)的Demo。
不(bu)得不(bu)說,當AI逐漸破(po)圈,成為一個風(feng)口(kou)時,真的(de)是豬都會飛,普(pu)通程(cheng)序員(yuan)上(shang)手AI的(de)難度(du)瞬間(jian)被(bei)拉低(di)了一個數(shu)量級。開(kai)源(yuan)開(kai)發者的(de)不(bu)斷貢獻讓(rang)各種工具和(he)文(wen)檔(dang)變得更容易上(shang)手。每(mei)天數(shu)以萬計的(de)大模(mo)型相關issue和(he)pr,讓(rang)Github遇到了久違的(de)繁(fan)榮。
在AI席卷全球的(de)(de)(de)這(zhe)一刻,作為(wei)一名程序員,我(wo)們無疑是(shi)對(dui)這(zhe)個時(shi)代更有體感(gan)的(de)(de)(de)那群人。此時(shi)此刻,非我(wo)莫屬。要充(chong)分關注AI技術的(de)(de)(de)應用(yong)場景和發(fa)(fa)展(zhan)趨(qu)勢,積極(ji)探索AI與其他領(ling)域(yu)的(de)(de)(de)結合,為(wei)自己(ji)的(de)(de)(de)職業發(fa)(fa)展(zhan)和未來規劃(hua)提供更多的(de)(de)(de)可能(neng)性。
