大家好,我是微學(xué)AI,今天教你們本地CPU環(huán)境部署清華大ChatGLM-6B模型,利用量化模型,每個人都能跑動大模型。ChatGLM-6B是一款出色的中英雙語對話模型,擁有超過62億個參數(shù),可高效地處理日常對話場景。與GLM-130B模型相比,ChatGLM-6B在對話場景處理能力方面表現(xiàn)更加卓越。此外,在使用體驗(yàn)方面,ChatGLM-6B采用了模型量化技術(shù)和本地部署技術(shù),為用戶提供更加便利和靈活的使用方式。值得一提的是,該模型還能夠在單張消費(fèi)級顯卡上順暢運(yùn)行,速度較快,是一款非常實(shí)用的對話模型。
ChatGLM-6B是清華開發(fā)的中文對話大模型的小參數(shù)量版本,目前已經(jīng)開源了,可以單卡部署在個人電腦上,利用?INT4 量化還可以最低部署到?6G 顯存的電腦上,在 CPU 也可以運(yùn)行起來的。
項(xiàng)目地址:mirrors / THUDM / chatglm-6b · GitCode
第1步:下載:
git clone https://gitcode.net/mirrors/THUDM/chatglm-6b.git
第2步:進(jìn)入ChatGLM-6B-main目錄下,安裝相關(guān)依賴
pip install -r requirements.txt
其中 torch安裝CPU版本即可。
第3步:打開ChatGLM-6B-main目錄的web_demo.py文件,源代碼:
from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2html
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
model = model.eval()
這個是在GPU版本下的代碼,現(xiàn)在改為CPU版本下的代碼:
from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2html
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).float()
model = model.eval()
模型下載改成THUDM/chatglm-6b-int4,也就是int4量化版本。模型量化到int4是一種將神經(jīng)網(wǎng)絡(luò)模型中的參數(shù)從浮點(diǎn)數(shù)格式調(diào)整為4位精度的整數(shù)格式的技術(shù),可以顯著提高硬件設(shè)備的效率和速度,并且適用于需要在低功耗設(shè)備上運(yùn)行的場景。
INT4量化的預(yù)訓(xùn)練文件下載地址:https://huggingface.co/THUDM/chatglm-6b-int4/tree/main
?第4步:kernel的編譯
CPU版本的安裝還需要安裝好C/C++的編譯環(huán)境。這里大家可以安裝TDM-GCC。
下載地址:https://jmeubank.github.io/tdm-gcc/,大家選擇選取TDM-GCC 10.3.0 release下載安裝。特別注意:安裝的時候在選項(xiàng)gcc選項(xiàng)下方,勾選openmp,這個很重要,踩過坑,直接安裝的話后續(xù)會報(bào)錯。
?安裝完在cmd中運(yùn)行”gcc -v”測試是否成功即可。
安裝gcc的目的是為了編譯c++文件,quantization_kernels.c
和quantization_kernels_parallel.c
?quantization_kernels.c文件:
void compress_int4_weight(void *weight, void *out, int n, int m)
{
for(int i=0;i<n*m;i++)
{
(*(unsigned char*)(out)) = ((*(unsigned char*)(weight)) << 4);
weight += sizeof(char);
(*(unsigned char*)(out)) |= ((*(unsigned char*)(weight)) & 15);
weight += sizeof(char);
out += sizeof(char);
}
}
void extract_int8_weight_to_float(void *weight, void *scale_list, void *out, int n, int m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
(*(float*)(out + sizeof(float) * (i * m + j))) = (*(float*)(scale_list + sizeof(float) * i)) * (*(char*)(weight + sizeof(char) * (i * m + j)));
}
void extract_int4_weight_to_float(void *weight, void *scale_list, void *out, int n, int m)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
(*(float*)(out)) = (*(float*)(scale_list)) * ((*(char*)(weight)) >> 4);
out += sizeof(float);
(*(float*)(out)) = (*(float*)(scale_list)) * (((char)((*(unsigned char*)(weight)) << 4))>> 4);
out += sizeof(float);
weight += sizeof(char);
}
scale_list += sizeof(float);
}
}
以上C++程序?qū)τ诿總€8位的輸入權(quán)重值,都會被壓縮成一個4位的輸出權(quán)重值,并存儲到指定的輸出數(shù)組中。這種權(quán)重量化方式可以有效減小模型的內(nèi)存占用,提高模型的推理速度。
?第5步:運(yùn)行web_demo.py文件
注意:如果大家在運(yùn)行中遇到了錯誤提示,說明兩個文件編譯出問題。我們可以手動去編譯這兩個文件:即在上面下載的D:..\
chatglm-6b-int4本地目錄下進(jìn)入cmd,運(yùn)行兩個編譯命令:
gcc -fPIC -pthread -fopenmp -std=c99 quantization_kernels.c -shared -o quantization_kernels.so
gcc -fPIC -pthread -fopenmp -std=c99 quantization_kernels_parallel.c -shared -o quantization_kernels_parallel.so
沒有報(bào)錯說明運(yùn)行成功,目錄下看到下面兩個新的文件:quantization_kernels_parallel.so
和quantization_kernels.so
。說明編譯成功,后面我們手動載入,這里要多加一行代碼
model = model.quantize(bits=4, kernel_file="D:..\\chatglm-6b-int4\\quantization_kernels.so")
如果原來代碼沒有錯可以去掉這行。
?第6步:web_demo.py文件運(yùn)行成功
?出現(xiàn)地址就大功告成了。
?第7步:測試問題
1.魯迅和周樹人是同一個人嗎?
ChatGLM的結(jié)果:
?ChatGPT的結(jié)果:
?2.樹上9只鳥,用槍打掉1只,還剩幾只?
ChatGLM的結(jié)果:
?ChatGPT的結(jié)果:
ChatGLM在某些中文問題和常識問題上超過ChatGPT,但是總體上是不如ChatGPT,他在總結(jié)任務(wù)上,代碼編寫上不如ChatGPT,總體達(dá)到ChatGPT的80%左右,可以做簡單的任務(wù)。文章來源:http://www.zghlxwxcb.cn/news/detail-428572.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-428572.html
到了這里,關(guān)于手把手教你本地CPU環(huán)境部署清華大模型ChatGLM-6B,利用量化模型,本地即可開始智能聊天,達(dá)到ChatGPT的80%的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!