ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级
ChatGLM3-6B:新一代開源雙語對話語言模型,流暢對話與低部署門檻再升級
1.ChatGLM3簡介
ChatGLM3 是智譜AI和清華大學(xué) KEG 實(shí)驗(yàn)室聯(lián)合發(fā)布的新一代對話預(yù)訓(xùn)練模型。ChatGLM3-6B 是 ChatGLM3 系列中的開源模型,在保留了前兩代模型對話流暢、部署門檻低等眾多優(yōu)秀特性的基礎(chǔ)上,ChatGLM3-6B 引入了如下特性:
- 更強(qiáng)大的基礎(chǔ)模型: ChatGLM3-6B 的基礎(chǔ)模型 ChatGLM3-6B-Base 采用了更多樣的訓(xùn)練數(shù)據(jù)、更充分的訓(xùn)練步數(shù)和更合理的訓(xùn)練策略。在語義、數(shù)學(xué)、推理、代碼、知識等不同角度的數(shù)據(jù)集上測評顯示,ChatGLM3-6B-Base 具有在 10B 以下的基礎(chǔ)模型中最強(qiáng)的性能。
- 更完整的功能支持: ChatGLM3-6B 采用了全新設(shè)計(jì)的 Prompt 格式,除正常的多輪對話外。同時原生支持工具調(diào)用(Function Call)、代碼執(zhí)行(Code Interpreter)和 Agent 任務(wù)等復(fù)雜場景。
- 更全面的開源序列: 除了對話模型 ChatGLM3-6B 外,還開源了基礎(chǔ)模型 ChatGLM3-6B-Base、長文本對話模型 ChatGLM3-6B-32K。以上所有權(quán)重對學(xué)術(shù)研究完全開放,在填寫問卷進(jìn)行登記后亦允許免費(fèi)商業(yè)使用。
ChatGLM3 開源模型旨在與開源社區(qū)一起推動大模型技術(shù)發(fā)展,懇請開發(fā)者和大家遵守開源協(xié)議,勿將開源模型和代碼及基于開源項(xiàng)目產(chǎn)生的衍生物用于任何可能給國家和社會帶來危害的用途以及用于任何未經(jīng)過安全評估和備案的服務(wù)。目前,本項(xiàng)目團(tuán)隊(duì)未基于 ChatGLM3 開源模型開發(fā)任何應(yīng)用,包括網(wǎng)頁端、安卓、蘋果 iOS 及 Windows App 等應(yīng)用。
盡管模型在訓(xùn)練的各個階段都盡力確保數(shù)據(jù)的合規(guī)性和準(zhǔn)確性,但由于 ChatGLM3-6B 模型規(guī)模較小,且模型受概率隨機(jī)性因素影響,無法保證輸出內(nèi)容的準(zhǔn)確。同時模型的輸出容易被用戶的輸入誤導(dǎo)。本項(xiàng)目不承擔(dān)開源模型和代碼導(dǎo)致的數(shù)據(jù)安全、輿情風(fēng)險或發(fā)生任何模型被誤導(dǎo)、濫用、傳播、不當(dāng)利用而產(chǎn)生的風(fēng)險和責(zé)任。
1.1 模型列表
| Model | Seq Length | Download |
|---|---|---|
| ChatGLM3-6B | 8k | HuggingFace | ModelScope |
| ChatGLM3-6B-Base | 8k | HuggingFace | ModelScope |
| ChatGLM3-6B-32K | 32k | HuggingFace | ModelScope |
對 ChatGLM3 進(jìn)行加速的開源項(xiàng)目:
- chatglm.cpp: 類似 llama.cpp 的量化加速推理方案,實(shí)現(xiàn)筆記本上實(shí)時對話
- ChatGLM3-TPU: 采用TPU加速推理方案,在算能端側(cè)芯片BM1684X(16T@FP16,內(nèi)存16G)上實(shí)時運(yùn)行約7.5 token/s
1.2評測結(jié)果
1.2.1 典型任務(wù)
我們選取了 8 個中英文典型數(shù)據(jù)集,在 ChatGLM3-6B (base) 版本上進(jìn)行了性能測試。
| Model | GSM8K | MATH | BBH | MMLU | C-Eval | CMMLU | MBPP | AGIEval |
|---|---|---|---|---|---|---|---|---|
| ChatGLM2-6B-Base | 32.4 | 6.5 | 33.7 | 47.9 | 51.7 | 50.0 | - | - |
| Best Baseline | 52.1 | 13.1 | 45.0 | 60.1 | 63.5 | 62.2 | 47.5 | 45.8 |
| ChatGLM3-6B-Base | 72.3 | 25.7 | 66.1 | 61.4 | 69.0 | 67.5 | 52.4 | 53.7 |
Best Baseline 指的是截止 2023年10月27日、模型參數(shù)在 10B 以下、在對應(yīng)數(shù)據(jù)集上表現(xiàn)最好的預(yù)訓(xùn)練模型,不包括只針對某一項(xiàng)任務(wù)訓(xùn)練而未保持通用能力的模型。
對 ChatGLM3-6B-Base 的測試中,BBH 采用 3-shot 測試,需要推理的 GSM8K、MATH 采用 0-shot CoT 測試,MBPP 采用 0-shot 生成后運(yùn)行測例計(jì)算 Pass@1 ,其他選擇題類型數(shù)據(jù)集均采用 0-shot 測試。
我們在多個長文本應(yīng)用場景下對 ChatGLM3-6B-32K 進(jìn)行了人工評估測試。與二代模型相比,其效果平均提升了超過 50%。在論文閱讀、文檔摘要和財(cái)報分析等應(yīng)用中,這種提升尤為顯著。此外,我們還在 LongBench 評測集上對模型進(jìn)行了測試,具體結(jié)果如下表所示
| Model | 平均 | Summary | Single-Doc QA | Multi-Doc QA | Code | Few-shot | Synthetic |
|---|---|---|---|---|---|---|---|
| ChatGLM2-6B-32K | 41.5 | 24.8 | 37.6 | 34.7 | 52.8 | 51.3 | 47.7 |
| ChatGLM3-6B-32K | 50.2 | 26.6 | 45.8 | 46.1 | 56.2 | 61.2 | 65 |
2.快速使用
2.1 環(huán)境安裝
首先需要下載本倉庫:
git clone https://github.com/THUDM/ChatGLM3
cd ChatGLM3
然后使用 pip 安裝依賴:
pip install -r requirements.txt
其中 transformers 庫版本推薦為 4.30.2,torch 推薦使用 2.0 及以上的版本,以獲得最佳的推理性能。
2.2 ChatGLM3 Web Demo
- 安裝
我們建議通過 Conda 進(jìn)行環(huán)境管理。
執(zhí)行以下命令新建一個 conda 環(huán)境并安裝所需依賴:
conda create -n chatglm3-demo python=3.10
conda activate chatglm3-demo
pip install -r requirements.txt
請注意,本項(xiàng)目需要 Python 3.10 或更高版本。
此外,使用 Code Interpreter 還需要安裝 Jupyter 內(nèi)核:
ipython kernel install --name chatglm3-demo --user
- 運(yùn)行
運(yùn)行以下命令在本地加載模型并啟動 demo:
streamlit run main.py
之后即可從命令行中看到 demo 的地址,點(diǎn)擊即可訪問。初次訪問需要下載并加載模型,可能需要花費(fèi)一定時間。
如果已經(jīng)在本地下載了模型,可以通過 export MODEL_PATH=/path/to/model 來指定從本地加載模型。如果需要自定義 Jupyter 內(nèi)核,可以通過 export IPYKERNEL=<kernel_name> 來指定。
- 使用
ChatGLM3 Demo 擁有三種模式:
- Chat: 對話模式,在此模式下可以與模型進(jìn)行對話。
- Tool: 工具模式,模型除了對話外,還可以通過工具進(jìn)行其他操作。
- Code Interpreter: 代碼解釋器模式,模型可以在一個 Jupyter 環(huán)境中執(zhí)行代碼并獲取結(jié)果,以完成復(fù)雜任務(wù)。
- 對話模式
對話模式下,用戶可以直接在側(cè)邊欄修改 top_p, temperature, System Prompt 等參數(shù)來調(diào)整模型的行為。例如
- 工具模式
可以通過在 tool_registry.py 中注冊新的工具來增強(qiáng)模型的能力。只需要使用 @register_tool 裝飾函數(shù)即可完成注冊。對于工具聲明,函數(shù)名稱即為工具的名稱,函數(shù) docstring 即為工具的說明;對于工具的參數(shù),使用 Annotated[typ: type, description: str, required: bool] 標(biāo)注參數(shù)的類型、描述和是否必須。
例如,get_weather 工具的注冊如下:
@register_tool
def get_weather(
city_name: Annotated[str, 'The name of the city to be queried', True],
) -> str:
"""
Get the weather for `city_name` in the following week
"""
...
此外,你也可以在頁面中通過 Manual mode 進(jìn)入手動模式,在這一模式下你可以通過 YAML 來直接指定工具列表,但你需要手動將工具的輸出反饋給模型。
- 代碼解釋器模式
由于擁有代碼執(zhí)行環(huán)境,此模式下的模型能夠執(zhí)行更為復(fù)雜的任務(wù),例如繪制圖表、執(zhí)行符號運(yùn)算等等。模型會根據(jù)對任務(wù)完成情況的理解自動地連續(xù)執(zhí)行多個代碼塊,直到任務(wù)完成。因此,在這一模式下,你只需要指明希望模型執(zhí)行的任務(wù)即可。
例如,我們可以讓 ChatGLM3 畫一個愛心:
- 額外技巧
- 在模型生成文本時,可以通過頁面右上角的
Stop按鈕進(jìn)行打斷。 - 刷新頁面即可清空對話記錄。
2.3 代碼調(diào)用
可以通過如下代碼調(diào)用 ChatGLM 模型來生成對話:
>>> from transformers import AutoTokenizer, AutoModel
>>> tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True)
>>> model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True, device='cuda')
>>> model = model.eval()
>>> response, history = model.chat(tokenizer, "你好", history=[])
>>> print(response)
你好??!我是人工智能助手 ChatGLM3-6B,很高興見到你,歡迎問我任何問題。
>>> response, history = model.chat(tokenizer, "晚上睡不著應(yīng)該怎么辦", history=history)
>>> print(response)
晚上睡不著可能會讓你感到焦慮或不舒服,但以下是一些可以幫助你入睡的方法:
1. 制定規(guī)律的睡眠時間表:保持規(guī)律的睡眠時間表可以幫助你建立健康的睡眠習(xí)慣,使你更容易入睡。盡量在每天的相同時間上床,并在同一時間起床。
2. 創(chuàng)造一個舒適的睡眠環(huán)境:確保睡眠環(huán)境舒適,安靜,黑暗且溫度適宜。可以使用舒適的床上用品,并保持房間通風(fēng)。
3. 放松身心:在睡前做些放松的活動,例如泡個熱水澡,聽些輕柔的音樂,閱讀一些有趣的書籍等,有助于緩解緊張和焦慮,使你更容易入睡。
4. 避免飲用含有咖啡因的飲料:咖啡因是一種刺激性物質(zhì),會影響你的睡眠質(zhì)量。盡量避免在睡前飲用含有咖啡因的飲料,例如咖啡,茶和可樂。
5. 避免在床上做與睡眠無關(guān)的事情:在床上做些與睡眠無關(guān)的事情,例如看電影,玩游戲或工作等,可能會干擾你的睡眠。
6. 嘗試呼吸技巧:深呼吸是一種放松技巧,可以幫助你緩解緊張和焦慮,使你更容易入睡。試著慢慢吸氣,保持幾秒鐘,然后緩慢呼氣。
如果這些方法無法幫助你入睡,你可以考慮咨詢醫(yī)生或睡眠專家,尋求進(jìn)一步的建議。
- 從本地加載模型
以上代碼會由transformers自動下載模型實(shí)現(xiàn)和參數(shù)。完整的模型實(shí)現(xiàn)在 Hugging Face Hub。如果你的網(wǎng)絡(luò)環(huán)境較差,下載模型參數(shù)可能會花費(fèi)較長時間甚至失敗。此時可以先將模型下載到本地,然后從本地加載。
從 Hugging Face Hub 下載模型需要先安裝Git LFS,然后運(yùn)行
git clone https://huggingface.co/THUDM/chatglm3-6b
如果從你從 HuggingFace 下載比較慢,也可以從 ModelScope
中下載。
2.4 模型微調(diào)
請參考 ChatGLM3-6B 微調(diào)示例。
2.5 網(wǎng)頁版對話 Demo
可以通過以下命令啟動基于 Gradio 的網(wǎng)頁版 demo:
python web_demo.py
可以通過以下命令啟動基于 Streamlit 的網(wǎng)頁版 demo:
streamlit run web_demo2.py
網(wǎng)頁版 demo 會運(yùn)行一個 Web Server,并輸出地址。在瀏覽器中打開輸出的地址即可使用。 經(jīng)測試,基于 Streamlit 的網(wǎng)頁版 Demo 會更流暢。
2.6 命令行對話 Demo
運(yùn)行倉庫中 cli_demo.py:
python cli_demo.py
程序會在命令行中進(jìn)行交互式的對話,在命令行中輸入指示并回車即可生成回復(fù),輸入 clear 可以清空對話歷史,輸入 stop 終止程序。
LangChain Demo
請參考 基于 LangChain 的工具調(diào)用 Demo。
工具調(diào)用
關(guān)于工具調(diào)用的方法請參考 工具調(diào)用。
API 部署
可以通過運(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="chatglm3-6b",
messages=[
{"role": "user", "content": "你好"}
],
stream=True
):
if hasattr(chunk.choices[0].delta, "content"):
print(chunk.choices[0].delta.content, end="", flush=True)
3.低成本部署
3.1模型量化
默認(rèn)情況下,模型以 FP16 精度加載,運(yùn)行上述代碼需要大概 13GB 顯存。如果你的 GPU 顯存有限,可以嘗試以量化方式加載模型,使用方法如下:
model = AutoModel.from_pretrained("THUDM/chatglm3-6b",trust_remote_code=True).quantize(4).cuda()
模型量化會帶來一定的性能損失,經(jīng)過測試,ChatGLM3-6B 在 4-bit 量化下仍然能夠進(jìn)行自然流暢的生成。
3.2CPU 部署
如果你沒有 GPU 硬件的話,也可以在 CPU 上進(jìn)行推理,但是推理速度會更慢。使用方法如下(需要大概 32GB 內(nèi)存)
model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True).float()
3.3 Mac 部署
對于搭載了 Apple Silicon 或者 AMD GPU 的 Mac,可以使用 MPS 后端來在 GPU 上運(yùn)行 ChatGLM3-6B。需要參考 Apple 的 官方說明 安裝 PyTorch-Nightly(正確的版本號應(yīng)該是2.x.x.dev2023xxxx,而不是 2.x.x)。
目前在 MacOS 上只支持從本地加載模型。將代碼中的模型加載改為從本地加載,并使用 mps 后端:
model = AutoModel.from_pretrained("your local path", trust_remote_code=True).to('mps')
加載半精度的 ChatGLM3-6B 模型需要大概 13GB 內(nèi)存。內(nèi)存較小的機(jī)器(比如 16GB 內(nèi)存的 MacBook Pro),在空余內(nèi)存不足的情況下會使用硬盤上的虛擬內(nèi)存,導(dǎo)致推理速度嚴(yán)重變慢。
3.4 多卡部署
如果你有多張 GPU,但是每張 GPU 的顯存大小都不足以容納完整的模型,那么可以將模型切分在多張GPU上。首先安裝 accelerate: pip install accelerate,然后通過如下方法加載模型:
from utils import load_model_on_gpus
model = load_model_on_gpus("THUDM/chatglm3-6b", num_gpus=2)
即可將模型部署到兩張 GPU 上進(jìn)行推理。你可以將 num_gpus 改為你希望使用的 GPU 數(shù)。默認(rèn)是均勻切分的,你也可以傳入 device_map 參數(shù)來自己指定。
- 項(xiàng)目參考鏈接
https://github.com/THUDM/ChatGLM3
總結(jié)
以上是生活随笔為你收集整理的ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸿蒙开发学习(一)之ArkTS
- 下一篇: 将强化学习引入NLP:原理、技术和代码实