ChatGLM3-6B:新一代開源雙語對話語言模型,流暢對話與低部署門檻再升級

汀、人工智慧發表於2023-11-15

ChatGLM3-6B:新一代開源雙語對話語言模型,流暢對話與低部署門檻再升級

1.ChatGLM3簡介

ChatGLM3 是智譜AI和清華大學 KEG 實驗室聯合釋出的新一代對話預訓練模型。ChatGLM3-6B 是 ChatGLM3 系列中的開源模型,在保留了前兩代模型對話流暢、部署門檻低等眾多優秀特性的基礎上,ChatGLM3-6B 引入瞭如下特性:

  1. 更強大的基礎模型: ChatGLM3-6B 的基礎模型 ChatGLM3-6B-Base 採用了更多樣的訓練資料、更充分的訓練步數和更合理的訓練策略。在語義、數學、推理、程式碼、知識等不同角度的資料集上測評顯示,ChatGLM3-6B-Base 具有在 10B 以下的基礎模型中最強的效能
  2. 更完整的功能支援: ChatGLM3-6B 採用了全新設計的 Prompt 格式,除正常的多輪對話外。同時原生支援工具呼叫(Function Call)、程式碼執行(Code Interpreter)和 Agent 任務等複雜場景。
  3. 更全面的開源序列: 除了對話模型 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.2torch 推薦使用 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. 創造一個舒適的睡眠環境:確保睡眠環境舒適,安靜,黑暗且溫度適宜。可以使用舒適的床上用品,並保持房間通風。
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

相關文章