大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

萤火架构發表於2024-03-20

部署一個自己的大模型,沒事的時候玩兩下,這可能是很多技術同學想做但又遲遲沒下手的事情,沒下手的原因很可能是成本太高,近萬元的RTX3090顯示卡,想想都肉疼,又或者官方的部署說明過於簡單,安裝的時候總是遇到各種奇奇怪怪的問題,難以解決。本文就來分享下我的安裝部署經驗,包括本地和租用雲伺服器的方式,以及如何透過API呼叫大模型開發自己的AI應用,希望能解決一些下不去手的問題。

ChatGLM3-6B

本次部署使用的的大模型是ChatGLM3-6B,這個大模型是清華智譜研發並開源的高效能中英雙語對話語言模型,它憑藉創新的GLM(Gated Linear Units with Memory)架構及龐大的60億引數量,在對話理解與生成能力上表現卓越。

ChatGLM3-6B不僅能夠處理複雜的跨語言對話場景,實現流暢的人機互動,還具備函式呼叫以及程式碼解釋執行的能力。這意味著開發者可以透過API呼叫,讓模型執行特定任務或編寫、解析簡單的程式碼片段,從而將應用擴充到更為廣泛的開發和智慧輔助領域。

ChatGLM3-6B還允許開發者對預訓練模型進行定製化微調,讓它在某個領域工作的更好,比如程式碼編寫、電商文案編寫等。另外開發者還能對模型進行量化,使用較低的數字精度來表示權重,這使得模型可以執行在消費級顯示卡甚至CPU上。

ChatGLM3-6B的倉庫地址:https://github.com/THUDM/ChatGLM3

效果展示

先看兩個比較正常的效果:

能正常呼叫天氣工具,記得上下文,這裡點個贊!

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

再畫一個滿滿的愛心,畫的也不錯。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

再看兩個跑瘋的效果:

我問你天氣,你不好好回答就算了,還反過來問我有啥意義,太愛管閒事。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

看來ChatGLM對正六邊形的感知有誤啊,確實它還不能識別這個影像。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

雖然有時不那麼如人意,不過整體用起來還是有很多可圈可點的地方,就是提示詞要好好寫一下,不能太湊合。

雲環境部署

這裡以AutoDL為例(https://www.autodl.com),AutoDL上的GPU例項價格比較公道,ChatGLM3-6B需要13G以上的視訊記憶體,可以選擇RTX4090、RTX3090、RTX3080*2、A5000等GPU規格。

這裡提供兩種方法,一是直接使用我已經建立好的映象,二是自己從基礎映象一步步安裝。

使用現有映象

建立容器例項時映象選擇“社群映象”,輸入 yinghuoai ,選擇 ChatGLM3 的最新映象。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

容器例項開機成功後,點選對應例項的 JupyterLab 就能開始使用了。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

這個映象包含三個Notebook,方便我們啟動WebUI伺服器和API伺服器,並進行相關的測試。我將在下文介紹具體的使用方法。

自己手動安裝

建立容器例項時我們選擇一個基礎映象 Miniconda -> conda3 -> Python 3.10(ubuntu22.04) -> Cuda11.8。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

容器例項開機完畢後,點選對應例項的 JupyterLab 進入一個Web管理介面。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

在“啟動頁”這裡點選“終端”,進入一個命令視窗。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

首先需要設定下網路,用以加速訪問Github。這是AutoDL例項才能使用的,本地無效。

source /etc/network_turbo

然後需要把程式碼下載到本地,使用Git即可。

git clone https://github.com/THUDM/ChatGLM3
cd ChatGLM3

然後建立一個Python的虛擬環境,這樣方便隔離不同專案對Python環境的不同要求。這裡使用 source activate 啟用虛擬環境,很多文章中是 conda activate,這和conda的版本有關係,AutoDL中的版本不支援 conda activate。

conda create -n chatglm3-6b python=3.10.8 
source activate chatglm3-6b

然後使用 uv 安裝依賴的程式包。為什麼用uv?因為requirements中很多包的版本要求都是 >=,直接使用pip的時候會安裝最新的版本,最新的版本往往和開發者使用的版本不同,這會導致一些相容問題,所以最好就是 == 的那個版本,這個版本能用,而且一般就是開發者使用的版本。

pip install uv
uv pip install --resolution=lowest-direct -r requirements.txt

然後我們還要下載大模型檔案,這裡從AutoDL的模型庫中下載,速度比較快。下邊的模型檔案是別人分享出來的,我們使用AutoDL提供的一個下載工具進行下載。下載目標目錄是/root/autodl-tmp,會自動在這個目錄中建立一個名為 chatglm3-6b 的子目錄,並儲存這些檔案。

pip install codewithgpu
cg down xxxiu/chatglm3-6b/config.json -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/configuration_chatglm.py -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/gitattributes -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/model.safetensors.index.json -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/MODEL_LICENSE -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/model-00001-of-00007.safetensors -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/model-00002-of-00007.safetensors -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/model-00003-of-00007.safetensors -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/model-00004-of-00007.safetensors -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/model-00005-of-00007.safetensors -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/model-00006-of-00007.safetensors -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/model-00007-of-00007.safetensors -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/modeling_chatglm.py -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/pytorch_model.bin.index.json -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/quantization.py -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/README.md -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/tokenization_chatglm.py -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/tokenizer.model -t /root/autodl-tmp
cg down xxxiu/chatglm3-6b/tokenizer_config.json -t /root/autodl-tmp

最後我們做一個簡單的測試,找到這個檔案:ChatGLM3/basic_demo/cli_demo.py,修改其中的模型路徑為上邊的下載路徑:/root/autodl-tmp/chatglm3-6b

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

在終端執行命令:python basic_demo/cli_demo.py,然後我們就可以在終端與大模型進行交流了。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

本地環境安裝

注意需要13G視訊記憶體以上的Nvidia顯示卡,否則跑不起來。這裡以Windows系統為例。

首先本地要有一個Python的執行環境,建議使用 Anaconda,可以把它理解為一個Python整合環境,透過它我們可以方便的開發Python程式。Anaconda的官方下載地址是:www.anaconda.com/download

這個安裝檔案比較大,下載時間取決於你的網速,下載成功後按照提示一步步安裝就行了。

安裝成功後,啟動“Anaconda Navigator”,在其中點選“Environments”->"base(root)" ->"Open Terminal",開啟終端。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

這是一個命令列工具,我們將主要在這裡邊透過執行命令安裝ChatGLM3-6B。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

然後我們還需要從Github上下載程式碼到本地,推薦使用Git,沒有Git的同學可以先去安裝一個:https://git-scm.com/。當然直接從Github下載程式包到本地也可以,不方便訪問Github的同學也可以使用我整理的程式包,給公眾號“螢火遛AI”發訊息 ChatGLM3 即可獲取。

這裡我將程式放到了C盤下的ChatGLM3目錄。

cd C:\
git clone https://github.com/THUDM/ChatGLM3
cd ChatGLM3

使用下邊的命令建立一個Python的虛擬環境並啟用,這樣方便隔離不同專案對Python環境的不同要求。

conda create -n chatglm3-6b python=3.10.8 
conda activate chatglm3-6b

然後還需要把相關模型檔案下載到本地,為了防止下載方式失效,這裡提供多種方法:

(1)下載AutoDL使用者分享的模型,執行下邊的命令,它會下載到 C:\ChatGLM3\THUDM,速度還可以。

pip install requests
pip install codewithgpu
cg down xxxiu/chatglm3-6b/config.json -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/configuration_chatglm.py -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/gitattributes -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/model.safetensors.index.json -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/MODEL_LICENSE -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/model-00001-of-00007.safetensors -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/model-00002-of-00007.safetensors -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/model-00003-of-00007.safetensors -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/model-00004-of-00007.safetensors -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/model-00005-of-00007.safetensors -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/model-00006-of-00007.safetensors -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/model-00007-of-00007.safetensors -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/modeling_chatglm.py -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/pytorch_model.bin.index.json -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/quantization.py -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/README.md -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/tokenization_chatglm.py -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/tokenizer.model -t C:\ChatGLM3\THUDM
cg down xxxiu/chatglm3-6b/tokenizer_config.json -t C:\ChatGLM3\THUDM

(2)從HuggingFace的映象下載,地址是:https://hf-mirror.com/THUDM/chatglm3-6b/tree/main

(3)給公眾號“螢火遛AI”發訊息 ChatGLM3 獲取最新下載方式。

最後我們做一個簡單的測試,執行命令:python basic_demo/cli_demo.py,然後我們就可以在終端與大模型進行交流了。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

如果程式出現下邊的錯誤:

RuntimeError: "addmm_impl_cpu_" not implemented for 'Half'

首先確定你的電腦是安裝了Nvida顯示卡的,然後使用下邊的命令補充安裝相關的pytorch-cuda包。

conda install pytorch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 pytorch-cuda=11.8 -c pytorch -c nvidia
pip install chardet

使用WebUI體驗

ChatGLM提供了一個Web介面,使用者可以直接在這個頁面上聊天、使用外掛,以及執行Python程式碼,就像使用大多數的大語言模型一樣。額外的使用者還可以配置一些引數,比如一次生成Token的數量、系統提示詞、取樣的隨機性控制等。

啟動WebUI服務

首先修改程式中的模型目錄,在下載程式中找到檔案 composite_demo/client.py,修改 MODEL_PATH 為你的模型存放地址。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

然後進入 ChatGLM3-6B 程式的根目錄(根據自己的部署來),啟用Python虛擬環境:

cd /root/ChatGLM3
conda activate chatglm3-6b
# conda如果不行就使用 source activate chatglm3-6b

因為需要執行程式碼,我們還要安裝 Jupyter 核心:

ipython kernel install --name chatglm3-6b --user

並修改檔案 composite_demo/demo_ci.py 中的 IPYKERNEL 的值為設定的值。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

最後啟動API伺服器:streamlit run composite_demo/main.py 可知這個WebUI使用的是streamlit框架。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

如果是在個人電腦上安裝的,點選這裡的連線就可以在瀏覽器訪問了。

如果是在AutoDL上的例項,還需要再折騰一下。因為這個WebUI使用了WebSocket,但是AutoDL開放的外網埠不支援WebSocket。此時可以透過SSH隧道的方式來打通本地與AutoDL例項的網路。

我們需要類似下邊這樣的一條指令:

sudo ssh -CNg -L 8501:127.0.0.1:8501 root@connect.westb.seetacloud.com -p 12357

其中的 connect.westb.seetacloud.com 和 10757 需要替換成你自己例項的,在例項列表中複製登入指令。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

然後把它隨便貼上到一個地方,就可以得到所需的地址和埠號了:

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

在個人電腦的終端或者命令列工具執行上邊寫好的指令,首先需要統一新增主機(輸入 yes),然後需要輸入主機登入密碼,還是從AutoDL的例項列表複製。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

登入成功後,這個介面會掛起,不會輸出任何內容。此時我們在瀏覽器位址列輸入 http://127.0.0.1:8501 就可以訪問了。

使用WebUI

這個WebUI左邊是引數區域,右邊是使用區域,有三種使用方式:Chat、Tool和Code Interpreter,分別就是聊天、工具或外掛、程式碼直譯器。相關引數我在之前的文章中介紹過,可以參考下:https://juejin.cn/post/7323449163420680202#heading-7

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

聊天就不用說了,我們看下工具或外掛的使用。它會完整的展現出來外掛的使用過程,使用者詢問問題,觸發大模型呼叫外掛,展現外掛返回的內容,大模型整理外掛返回的內容並輸出給使用者。中間的兩個過程這裡只是為了方便使用者瞭解原理,其實可以在展現大模型返回值時將它們過濾掉。具體的可以修改這個檔案中的第144行-198行:composite_demo/demo_tool.py 。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

例項程式碼中提供了兩個工具,一個是獲取實時天氣,另一個是生成隨機數,使用者還可以修改程式碼增加自己的工具外掛,在 composite_demo/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
    """
    ...

再看看程式碼直譯器的效果,模型會根據對任務完成情況的理解自動地連續執行多個程式碼塊,直到任務完成。比如讓它用Python畫一個愛心。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

如果程式碼執行有錯誤,模型會自動修正錯誤,然後繼續生成,直到能夠正常執行成功。這個能力其實是透過系統提示詞和observation角色實現的。

在 composite_demo/demo_ci.py 中可以看到提示詞:

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

當程式執行出錯的時候,程式會透過observation角色把錯誤再發給ChatGLM進行分析,然後ChatGLM會修改程式碼,再重新輸出到程式中,最後使用 Jupyter 核心執行程式碼。

使用API開發應用

使用大模型API,我們可以完全自定義自己的互動頁面,增加很多有趣的功能,比如提供聯網能力。

這裡我們使用的是ChatGLM3-6B自帶的一個API示例程式,這個程式中有一個參考OpenAI介面規範開發的API服務,我們可以直接使用OpenAI的客戶端進行呼叫,這避免了很多學習成本,降低了使用難度。

啟動API服務

首先修改程式中的模型目錄,在下載程式中找到檔案 openai_api_demo/api_server.py,修改 MODEL_PATH 為你的模型存放地址。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

然後進入 ChatGLM3-6B 程式的根目錄(根據自己的部署來),啟用Python虛擬環境:

cd C:\ChatGLM3
conda activate chatglm3-6b
# conda如果不行就使用 source activate chatglm3-6b

最後啟動API伺服器:python openai_api_demo/api_server.py

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

看到 running on http://0.0.0.0 的提示資訊就代表啟動成功了。

注意這裡的埠號,如果你是在AutoDL部署的程式,需要將埠號修改為6006,然後才能透過AutoDL提供的“自定義服務”在外網訪問,埠號在openai_api_demo/api_server.py 檔案的最末尾。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

修改後重啟API服務,然後在AutoDL的容器例項列表中點選“自定義服務”,即可獲取外網訪問地址。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

呼叫API服務

這裡還是以Python為例,首先使用pip安裝OpenAI的SDK。

pip install --upgrade openai httpx[socks]

我準備了兩個簡單的應用示例,一個是簡單的聊天程式,另一個是在大模型中使用外掛的方法。

先看聊天程式,這裡讓它扮演一個數學老師進行出題,之前我寫過一篇文章介紹相關引數的含義,這裡就不羅嗦了,需要的請看:https://juejin.cn/post/7323449163420680202

# 一個簡單的聊天程式

from openai import OpenAI

client = OpenAI(api_key='not-need-key',base_url="http://127.0.0.1:6006/v1")
stream = client.chat.completions.create(
    messages=[{
        "role": "system", "content": "你是一名數學老師,從事小學數學教育30年,精通設計各種數學考試題"
    },{
        "role": "user", "content": "請給我出10道一年級的計算題。"
    }],
    model='chatglm3-6b',
    max_tokens=1024,
    #temperature=0.1,
    top_p=0.3,
    #frequency_penalty=0.5,
    presence_penalty=0.2,
    seed=12345,
    #stop='30年',
    response_format={ "type": "json_object" },
    n=1,
    stream=True
)

for chunk in stream:
    msg = chunk.choices[0].delta.content
    if msg is not None:
        print(msg, end='')

下邊是程式的執行結果,大模型理解的很正確,並生成了合理的輸出。

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型

再看大模型中使用外掛的方法,這裡讓ChatGLM根據使用者要求呼叫天氣函式查詢實時天氣,注意ChatGLM3-6B呼叫函式的方法沒有支援最新的OpenAI API規範,目前只實現了一半,能透過tools傳入函式,但是響應訊息中命中函式還是使用的 function_call,而不是最新的 tool_calls。相關引數我也在別的文章中做過詳細介紹,請參考:https://juejin.cn/post/7325360810226630706

from openai import OpenAI
import json
import requests
import time

# 獲取天氣的方法
def get_city_weather(param):
    city = json.loads(param)["city"]
    r = requests.get(f"https://wttr.in/{city}?format=j1")

    data = r.json()["current_condition"]
    #print(json.dumps(data))
    temperature = data[0]['temp_C']
    humidity= data[0]['humidity']
    text = data[0]['weatherDesc'][0]["value"]
    return "當前天氣:"+text+",溫度:"+temperature+ "℃,溼度:"+humidity+"%"

# 天氣外掛的定義
weather_tool = {
    "type": "function",
    "function": {
        "name": "get_city_weather",
        "description": "獲取某個城市的天氣",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {
                    "type": "string",
                    "description": "城市名稱",
                },
            },
            "required": ["city"],
        },
    }
}

# 建立OpenAI客戶端,獲取API Key請看文章最後
client = OpenAI(api_key='no-need-key', base_url="http://127.0.0.1:6006/v1")

# 定義請求GPT的通用方法
def create_completion():
    return client.chat.completions.create(
        messages=messages,
        model='chatglm3-6b',
        stream=False,
        tool_choice="auto",
        tools=[weather_tool]
    )


# 我的三個問題
questions = ["請問上海天氣怎麼樣?","請問廣州天氣怎麼樣?","成都呢?","北京呢?"]

# 聊天上下文,初始為空
messages=[]

print("---GLM天氣外掛演示--- ")

# 遍歷詢問我的問題
for question in questions:  

    # 將問題新增到上下文中
    messages.append({
        "role": "user",
        "content": question,
    })
    print("路人甲: ",question)

    # 請求GPT,並拿到響應
    response_message = create_completion().choices[0].message
    # 把響應新增到聊天上下文中
    messages.append(response_message)
    #print(response_message)
    # 根據外掛命中情況,執行外掛邏輯
    if response_message.function_call is not None:
        function_call = response_message.function_call
        # 追加外掛生成的天氣內容到聊天上下文
        weather_info = get_city_weather(function_call.arguments)
        #print(weather_info)
        messages.append({
            "role": "function",
            "content": weather_info,
            "name": function_call.name
        })
        # 再次發起聊天
        second_chat_completion = create_completion()
        gpt_output = second_chat_completion.choices[0].message.content
        # 列印GPT合成的天氣內容
        print("GLM: ",gpt_output)
        time.sleep(0.2)
        # 將GPT的回答也追加到上下文中
        messages.append({
            "role": "assistant",
            "content": gpt_output,
        })
    else:
        print("GLM: ",response_message.content)

執行效果如下:

大模型應用開發:手把手教你部署並使用清華智譜GLM大模型


以上就是本文的主要內容,有興趣的快去體驗下吧。

如需GPT賬號、學習陪伴群、AI程式設計訓練營,點此進入:大模型應用開發 | API 實操

關注螢火架構,加速技術提升!

相關文章