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