LLMs之ChatGLM2:ChatGLM2-6B的簡介、安裝、使用方法之詳細(xì)攻略
導(dǎo)讀:2023年06月25日,清華大學(xué)開源了 ChatGLM2-6B 模型,是 ChatGLM 模型的升級(jí)版本。ChatGLM2-6B 在多個(gè)方面有顯著提升:模型性能更強(qiáng),在各種測(cè)試集上的表現(xiàn)更好;支持更長的上下文,最大上下文長度提升到 32k;推理速度提高42%,能支持更長的生成;開源許可更加開放,允許商業(yè)使用。ChatGLM2-6B在多個(gè)維度的能力上取得了巨大提升,包括數(shù)理邏輯、知識(shí)推理和長文檔理解。
模型性能提升主要來自升級(jí)的基座模型、混合了 GLM 目標(biāo)函數(shù)、使用 FlashAttention 和Multi-Query Attention 技術(shù)。它整合了最新技術(shù),在推理速度、生成長度、知識(shí)涵蓋等方面取得突破,使人機(jī)對(duì)話能力更強(qiáng)大。
>> 更強(qiáng)大的性能=混合目標(biāo)函數(shù)+1.4T中英標(biāo)識(shí)符
>> 更長的上下文=Flash?Attention技術(shù)+上下文長度擴(kuò)展到32K+8K訓(xùn)練+多輪對(duì)話
>> 更高效的推理=Multi-Query Attention技術(shù)+INT4量化
>> 更開放的協(xié)議
? ? ? ? ? ChatGLM2-6B 是開源中英雙語對(duì)話模型?ChatGLM-6B 的第二代版本,在保留了初代模型對(duì)話流暢、部署門檻較低等眾多優(yōu)秀特性的基礎(chǔ)之上,ChatGLM2-6B 引入了如下新特性:
>> 更強(qiáng)大的性能=混合目標(biāo)函數(shù)+1.4T中英標(biāo)識(shí)符:基于 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)爭力。
>> 更長的上下文=Flash?Attention技術(shù)+上下文長度擴(kuò)展到32K+8K訓(xùn)練+多輪對(duì)話:基于 Flash?Attention 技術(shù),我們將基座模型的上下文長度(Context Length)由 ChatGLM-6B 的 2K 擴(kuò)展到了 32K,并在對(duì)話階段使用 8K 的上下文長度訓(xùn)練,允許更多輪次的對(duì)話。但當(dāng)前版本的 ChatGLM2-6B 對(duì)單輪超長文檔的理解能力有限,我們會(huì)在后續(xù)迭代升級(jí)中著重進(jìn)行優(yōu)化。
>> 更高效的推理=Multi-Query Attention技術(shù)+INT4量化:基于 Multi-Query Attention 技術(shù),ChatGLM2-6B 有更高效的推理速度和更低的顯存占用:在官方的模型實(shí)現(xiàn)下,推理速度相比初代提升了 42%,INT4 量化下,6G 顯存支持的對(duì)話長度由 1K 提升到了 8K。
>> 更開放的協(xié)議:ChatGLM2-6B 權(quán)重對(duì)學(xué)術(shù)研究完全開放,在獲得官方的書面許可后,亦允許商業(yè)使用。如果您發(fā)現(xiàn)我們的開源模型對(duì)您的業(yè)務(wù)有用,我們歡迎您對(duì)下一代模型 ChatGLM3 研發(fā)的捐贈(zèng)。
GitHub地址:https://github.com/THUDM/ChatGLM2-6B
huggingface地址:https://huggingface.co/THUDM/chatglm2-6b
git clone https://github.com/THUDM/ChatGLM2-6B
cd ChatGLM2-6B
pip install -r requirements.txt
其中 transformers 庫版本推薦為 4.30.2,torch 推薦使用 2.0 以上的版本,以獲得最佳的推理性能。
可以通過如下代碼調(diào)用 ChatGLM2-6B 模型來生成對(duì)話:
>>> from transformers import AutoTokenizer, AutoModel
>>> tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
>>> model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True, device='cuda')
>>> model = model.eval()
>>> response, history = model.chat(tokenizer, "你好", history=[])
>>> print(response)
你好👋!我是人工智能助手 ChatGLM2-6B,很高興見到你,歡迎問我任何問題。
>>> response, history = model.chat(tokenizer, "晚上睡不著應(yīng)該怎么辦", history=history)
>>> print(response)
晚上睡不著可能會(huì)讓你感到焦慮或不舒服,但以下是一些可以幫助你入睡的方法:
1. 制定規(guī)律的睡眠時(shí)間表:保持規(guī)律的睡眠時(shí)間表可以幫助你建立健康的睡眠習(xí)慣,使你更容易入睡。盡量在每天的相同時(shí)間上床,并在同一時(shí)間起床。
2. 創(chuàng)造一個(gè)舒適的睡眠環(huán)境:確保睡眠環(huán)境舒適,安靜,黑暗且溫度適宜??梢允褂檬孢m的床上用品,并保持房間通風(fēng)。
3. 放松身心:在睡前做些放松的活動(dòng),例如泡個(gè)熱水澡,聽些輕柔的音樂,閱讀一些有趣的書籍等,有助于緩解緊張和焦慮,使你更容易入睡。
4. 避免飲用含有咖啡因的飲料:咖啡因是一種刺激性物質(zhì),會(huì)影響你的睡眠質(zhì)量。盡量避免在睡前飲用含有咖啡因的飲料,例如咖啡,茶和可樂。
5. 避免在床上做與睡眠無關(guān)的事情:在床上做些與睡眠無關(guān)的事情,例如看電影,玩游戲或工作等,可能會(huì)干擾你的睡眠。
6. 嘗試呼吸技巧:深呼吸是一種放松技巧,可以幫助你緩解緊張和焦慮,使你更容易入睡。試著慢慢吸氣,保持幾秒鐘,然后緩慢呼氣。
如果這些方法無法幫助你入睡,你可以考慮咨詢醫(yī)生或睡眠專家,尋求進(jìn)一步的建議。
以上代碼會(huì)由?transformers
?自動(dòng)下載模型實(shí)現(xiàn)和參數(shù)。完整的模型實(shí)現(xiàn)在?Hugging Face Hub。如果你的網(wǎng)絡(luò)環(huán)境較差,下載模型參數(shù)可能會(huì)花費(fèi)較長時(shí)間甚至失敗。此時(shí)可以先將模型下載到本地,然后從本地加載。
從 Hugging Face Hub 下載模型需要先安裝Git LFS,然后運(yùn)行
git clone https://huggingface.co/THUDM/chatglm2-6b
如果你從 Hugging Face Hub 上下載 checkpoint 的速度較慢,可以只下載模型實(shí)現(xiàn)
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm2-6b
然后從這里手動(dòng)下載模型參數(shù)文件,并將下載的文件替換到本地的?chatglm2-6b
?目錄下。
將模型下載到本地之后,將以上代碼中的?THUDM/chatglm2-6b
?替換為你本地的?chatglm2-6b
?文件夾的路徑,即可從本地加載模型。
模型的實(shí)現(xiàn)仍然處在變動(dòng)中。如果希望固定使用的模型實(shí)現(xiàn)以保證兼容性,可以在?from_pretrained
?的調(diào)用中增加?revision="v1.0"
?參數(shù)。v1.0
?是當(dāng)前最新的版本號(hào),完整的版本列表參見?Change Log。
首先安裝 Gradio:pip install gradio
,然后運(yùn)行倉庫中的?web_demo.py:
python web_demo.py
程序會(huì)運(yùn)行一個(gè) Web Server,并輸出地址。在瀏覽器中打開輸出的地址即可使用。
默認(rèn)使用了?
share=False
?啟動(dòng),不會(huì)生成公網(wǎng)鏈接。如有需要公網(wǎng)訪問的需求,可以修改為?share=True
?啟動(dòng)。
感謝?@AdamBear?實(shí)現(xiàn)了基于 Streamlit 的網(wǎng)頁版 Demo?web_demo2.py
。使用時(shí)首先需要額外安裝以下依賴:
pip install streamlit streamlit-chat
然后通過以下命令運(yùn)行:
streamlit run web_demo2.py
經(jīng)測(cè)試,如果輸入的 prompt 較長的話,使用基于 Streamlit 的網(wǎng)頁版 Demo 會(huì)更流暢。
運(yùn)行倉庫中?cli_demo.py:
python cli_demo.py
程序會(huì)在命令行中進(jìn)行交互式的對(duì)話,在命令行中輸入指示并回車即可生成回復(fù),輸入?clear
?可以清空對(duì)話歷史,輸入?stop
?終止程序。
首先需要安裝額外的依賴?pip install fastapi uvicorn
,然后運(yùn)行倉庫中的?api.py:
python api.py
默認(rèn)部署在本地的 8000 端口,通過 POST 方法進(jìn)行調(diào)用
curl -X POST "http://127.0.0.1:8000" -H 'Content-Type: application/json' -d '{"prompt": "你好", "history": []}'
得到的返回值為
{
"response":"你好👋!我是人工智能助手 ChatGLM2-6B,很高興見到你,歡迎問我任何問題。",
"history":[["你好","你好👋!我是人工智能助手 ChatGLM2-6B,很高興見到你,歡迎問我任何問題。"]],
"status":200,
"time":"2023-03-23 21:38:40"
}
感謝?@hiyouga?實(shí)現(xiàn)了 OpenAI 格式的流式 API 部署,可以作為任意基于 ChatGPT 的應(yīng)用的后端,比如?ChatGPT-Next-Web??梢酝ㄟ^運(yùn)行倉庫中的openai_api.py?進(jìn)行部署:
python openai_api.py
進(jìn)行 API 調(diào)用的示例代碼為
import openai
if __name__ == "__main__":
openai.api_base = "http://localhost:8000/v1"
openai.api_key = "none"
for chunk in openai.ChatCompletion.create(
model="chatglm2-6b",
messages=[
{"role": "user", "content": "你好"}
],
stream=True
):
if hasattr(chunk.choices[0].delta, "content"):
print(chunk.choices[0].delta.content, end="", flush=True)
默認(rèn)情況下,模型以 FP16 精度加載,運(yùn)行上述代碼需要大概 13GB 顯存。如果你的 GPU 顯存有限,可以嘗試以量化方式加載模型,使用方法如下:
# 按需修改,目前只支持 4/8 bit 量化
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).quantize(8).cuda()
模型量化會(huì)帶來一定的性能損失,經(jīng)過測(cè)試,ChatGLM2-6B 在 4-bit 量化下仍然能夠進(jìn)行自然流暢的生成。
如果你的內(nèi)存不足,可以直接加載量化后的模型:
model = AutoModel.from_pretrained("THUDM/chatglm2-6b-int4",trust_remote_code=True).cuda()
如果你沒有 GPU 硬件的話,也可以在 CPU 上進(jìn)行推理,但是推理速度會(huì)更慢。使用方法如下(需要大概 32GB 內(nèi)存)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).float()
如果你的內(nèi)存不足的話,也可以使用量化后的模型
model = AutoModel.from_pretrained("THUDM/chatglm2-6b-int4",trust_remote_code=True).float()
在 cpu 上運(yùn)行量化后的模型需要安裝?gcc
?與?openmp
。多數(shù) Linux 發(fā)行版默認(rèn)已安裝。對(duì)于 Windows ,可在安裝?TDM-GCC?時(shí)勾選?openmp
。 Windows 測(cè)試環(huán)境?gcc
?版本為?TDM-GCC 10.3.0
, Linux 為?gcc 11.3.0
。在 MacOS 上
model = AutoModel.from_pretrained("your local path", trust_remote_code=True).to('mps')
請(qǐng)參考?Q1。
對(duì)于搭載了 Apple Silicon 或者 AMD GPU 的 Mac,可以使用 MPS 后端來在 GPU 上運(yùn)行 ChatGLM2-6B。需要參考 Apple 的?官方說明?安裝 PyTorch-Nightly(正確的版本號(hào)應(yīng)該是2.x.x.dev2023xxxx,而不是 2.x.x)。
目前在 MacOS 上只支持從本地加載模型。將代碼中的模型加載改為從本地加載,并使用 mps 后端:
加載半精度的 ChatGLM2-6B 模型需要大概 13GB 內(nèi)存。內(nèi)存較小的機(jī)器(比如 16GB 內(nèi)存的 MacBook Pro),在空余內(nèi)存不足的情況下會(huì)使用硬盤上的虛擬內(nèi)存,導(dǎo)致推理速度嚴(yán)重變慢。 此時(shí)可以使用量化后的模型 chatglm2-6b-int4。因?yàn)?GPU 上量化的 kernel 是使用 CUDA 編寫的,因此無法在 MacOS 上使用,只能使用 CPU 進(jìn)行推理。 為了充分使用 CPU 并行,還需要單獨(dú)安裝 OpenMP。
如果你有多張 GPU,但是每張 GPU 的顯存大小都不足以容納完整的模型,那么可以將模型切分在多張GPU上。首先安裝 accelerate:?pip install accelerate
,然后通過如下方法加載模型:
from utils import load_model_on_gpus
model = load_model_on_gpus("THUDM/chatglm2-6b", num_gpus=2)
即可將模型部署到兩張 GPU 上進(jìn)行推理。你可以將?num_gpus
?改為你希望使用的 GPU 數(shù)。默認(rèn)是均勻切分的,你也可以傳入?device_map
?參數(shù)來自己指定。
聯(lián)系客服