一、機(jī)器環(huán)境及LLM環(huán)境
筆者的機(jī)器環(huán)境是純國(guó)產(chǎn)操作系統(tǒng)Deepin社區(qū)免費(fèi)版V20.9。要想玩轉(zhuǎn)大語(yǔ)言模型LLM必須搭建深度學(xué)習(xí)環(huán)境。主流的都是使用Python加上深度學(xué)習(xí)框架。深度學(xué)習(xí)框架有很多,最先火起來的是TensorFlow,但是這幾年P(guān)yTorch特別受歡迎,不論學(xué)術(shù)界還是工業(yè)界都受追捧。國(guó)產(chǎn)的還有百度飛槳PaddlePaddle,華為的MindSpore等。這些深度學(xué)習(xí)框架基本都是開源的,用哪個(gè)看讀者喜好。
說一下筆者的選擇:
硬件:UNC X15準(zhǔn)系統(tǒng)筆記本,GPU為英偉達(dá)3070,8GB顯存。
軟件:操作系統(tǒng)是Deepin V20.9;顯卡驅(qū)動(dòng)最新;CUDA Toolkit?安裝了cuda11.8;Python 3.8.5;PyTorch安裝了2.0版;開發(fā)IDE選擇了微軟的VisualCode,安裝了筆記本插件,支持.ipynb格式,這種格式適合教學(xué)和實(shí)驗(yàn)、調(diào)試程序,非常方便。調(diào)試通過了再粘貼到.py里面。VisualCode兼容各種格式,使用方便,不用換來?yè)Q去。關(guān)鍵還免費(fèi),筆者整個(gè)生態(tài)都是開源免費(fèi)。
(注:這里環(huán)境的搭建請(qǐng)搭建先參照網(wǎng)上基于Ubuntu系統(tǒng)的相關(guān)文章,后面筆者有時(shí)間也會(huì)整理出文章來。)
二、部署本地LLM:ChatGLM2-6B
ChatGLM2-6B 是開源中英雙語(yǔ)對(duì)話模型?ChatGLM-6B?的第二代版本,在保留了初代模型對(duì)話流暢、部署門檻較低等眾多優(yōu)秀特性的基礎(chǔ)之上,ChatGLM2-6B 引入了如下新特性:
更強(qiáng)大的性能:基于 ChatGLM 初代模型的開發(fā)經(jīng)驗(yàn),我們?nèi)嫔?jí)了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了?GLM?的混合目標(biāo)函數(shù),經(jīng)過了 1.4T 中英標(biāo)識(shí)符的預(yù)訓(xùn)練與人類偏好對(duì)齊訓(xùn)練,評(píng)測(cè)結(jié)果顯示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等數(shù)據(jù)集上的性能取得了大幅度的提升,在同尺寸開源模型中具有較強(qiáng)的競(jìng)爭(zhēng)力。
更長(zhǎng)的上下文:基于?FlashAttention?技術(shù),我們將基座模型的上下文長(zhǎng)度(Context Length)由 ChatGLM-6B 的 2K 擴(kuò)展到了 32K,并在對(duì)話階段使用 8K 的上下文長(zhǎng)度訓(xùn)練。對(duì)于更長(zhǎng)的上下文,我們發(fā)布了?ChatGLM2-6B-32K?模型。LongBench?的測(cè)評(píng)結(jié)果表明,在等量級(jí)的開源模型中,ChatGLM2-6B-32K 有著較為明顯的競(jìng)爭(zhēng)優(yōu)勢(shì)。
更高效的推理:基于?Multi-Query Attention?技術(shù),ChatGLM2-6B 有更高效的推理速度和更低的顯存占用:在官方的模型實(shí)現(xiàn)下,推理速度相比初代提升了 42%,INT4 量化下,6G 顯存支持的對(duì)話長(zhǎng)度由 1K 提升到了 8K。
更開放的協(xié)議:ChatGLM2-6B 權(quán)重對(duì)學(xué)術(shù)研究完全開放,在填寫問卷進(jìn)行登記后亦允許免費(fèi)商業(yè)使用。
到github上克隆最新版ChatGLM2-6B。
git clone https://github.com/THUDM/ChatGLM2-6B.git
然后安裝必須的支持包:
pip install -r requirements.txt
按照README說明到huggingface上下載預(yù)訓(xùn)練模型,根據(jù)機(jī)器配置下載合適版本。筆者只有8GB顯存,下載的是chatglm2-6b-int4量化版。
修改web_demo2.py中關(guān)于加載模型的代碼。
@st.cache_resource
def get_model():
? ? tokenizer = AutoTokenizer.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True)
? ? model = AutoModel.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True).cuda()
其中"./chatglm2-6b-int4"是筆者的模型路徑,就放到了ChatGLM2-6B下面。修改成你下載下來的預(yù)訓(xùn)練模型路徑即可。然后敲如下命令測(cè)試:
streamlit run web_demo.py
這個(gè)web演示是用streamlit寫的。我們要使用LangChain調(diào)用,所以要使用ChatGLM2的api。修改根目錄下api.py加載模型代碼:
if __name__ == '__main__':
? ? tokenizer = AutoTokenizer.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True)
? ? model = AutoModel.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True).cuda()
確保"./chatglm2-6b-int4"替換成你下載的預(yù)訓(xùn)練模型路徑。啟動(dòng)api服務(wù):
Python api.py
輸出如下:
INFO: Started server process [16048]
INFO:? ? Waiting for application startup.
INFO:? ? Application startup complete.
INFO:? ? Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
表明服務(wù)地址為本機(jī),端口為8000。訪問http://127.0.0.1:8000即可。
三、安裝LangChain
LangChain在GitHub上開源,可以下載源代碼。也可以直接安裝:
pip install LangChain
四、定制LangChain的LLM類
定義一個(gè)LLM類繼承自langchain.llms.base.LLM,用于調(diào)用ChatGLM2的api。代碼如下:
from langchain.llms.base import LLM
from typing import List, Optional
import requests
import json
LLM_MODEL='http://127.0.0.1:8000'
class ChatGLM2(LLM):
? ? max_token: int = 10000
? ? temperature: float = 0.1
? ? top_p = 0.9
? ? history_len:int=100
? ? #history = []
? ? def __init__(self):
? ? ? ? super().__init__()
? ? @property
? ? def _llm_type(self) -> str:
? ? ? ? return "http"
? ? def _call(self, prompt: str, stop: Optional[List[str]] = None):
? ? ? ? headers = {'Content-Type': 'application/json'}
? ? ? ? #history+=stop
? ? ? ? data=json.dumps({
? ? ? ? ? ? 'prompt':prompt,
? ? ? ? ? ? 'temperature':self.temperature,
? ? ? ? ? ? 'stop':stop,
? ? ? ? ? ? 'max_length':self.max_token
? ? ? ? ? ? })
? ? ? ? response = requests.post(LLM_MODEL,headers=headers,data=data)
? ? ? ? if response.status_code!=200:
? ? ? ? ? ? return "查詢結(jié)果錯(cuò)誤",[['查詢結(jié)果錯(cuò)誤','error']]
? ? ? ? resp = response.json()
? ? ? ? response=resp['response']
? ? ? ? return response
五、測(cè)試并開啟新征程
下面我們寫一段代碼,測(cè)試一下我們的LLM類是否好用。
llm=ChatGLM2() #用前面自定義的LLM類聲明并初始化一個(gè)實(shí)例
print(llm("你好")) #開始對(duì)話
如果你看到下面輸出:
你好??!我是人工智能助手 ChatGLM2-6B,很高興見到你,歡迎問我任何問題。
恭喜你成功了。從此可以不用申請(qǐng)openai 的key也可以學(xué)習(xí)langchain了,我們將一起學(xué)習(xí)全部開源的大語(yǔ)言模型應(yīng)用開發(fā)實(shí)用技術(shù)。