部署一個自己的大模型,沒事的時候玩兩下,這可能是很多技術同學想做但又遲遲沒下手的事情,沒下手的原因很可能是成本太高,近萬元的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
效果展示
先看兩個比較正常的效果:
能正常呼叫天氣工具,記得上下文,這裡點個贊!
再畫一個滿滿的愛心,畫的也不錯。
再看兩個跑瘋的效果:
我問你天氣,你不好好回答就算了,還反過來問我有啥意義,太愛管閒事。
看來ChatGLM對正六邊形的感知有誤啊,確實它還不能識別這個影像。
雖然有時不那麼如人意,不過整體用起來還是有很多可圈可點的地方,就是提示詞要好好寫一下,不能太湊合。
雲環境部署
這裡以AutoDL為例(https://www.autodl.com),AutoDL上的GPU例項價格比較公道,ChatGLM3-6B需要13G以上的視訊記憶體,可以選擇RTX4090、RTX3090、RTX3080*2、A5000等GPU規格。
這裡提供兩種方法,一是直接使用我已經建立好的映象,二是自己從基礎映象一步步安裝。
使用現有映象
建立容器例項時映象選擇“社群映象”,輸入 yinghuoai ,選擇 ChatGLM3 的最新映象。
容器例項開機成功後,點選對應例項的 JupyterLab 就能開始使用了。
這個映象包含三個Notebook,方便我們啟動WebUI伺服器和API伺服器,並進行相關的測試。我將在下文介紹具體的使用方法。
自己手動安裝
建立容器例項時我們選擇一個基礎映象 Miniconda -> conda3 -> Python 3.10(ubuntu22.04) -> Cuda11.8。
容器例項開機完畢後,點選對應例項的 JupyterLab 進入一個Web管理介面。
在“啟動頁”這裡點選“終端”,進入一個命令視窗。
首先需要設定下網路,用以加速訪問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
在終端執行命令:python basic_demo/cli_demo.py
,然後我們就可以在終端與大模型進行交流了。
本地環境安裝
注意需要13G視訊記憶體以上的Nvidia顯示卡,否則跑不起來。這裡以Windows系統為例。
首先本地要有一個Python的執行環境,建議使用 Anaconda,可以把它理解為一個Python整合環境,透過它我們可以方便的開發Python程式。Anaconda的官方下載地址是:www.anaconda.com/download
這個安裝檔案比較大,下載時間取決於你的網速,下載成功後按照提示一步步安裝就行了。
安裝成功後,啟動“Anaconda Navigator”,在其中點選“Environments”->"base(root)" ->"Open Terminal",開啟終端。
這是一個命令列工具,我們將主要在這裡邊透過執行命令安裝ChatGLM3-6B。
然後我們還需要從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
,然後我們就可以在終端與大模型進行交流了。
如果程式出現下邊的錯誤:
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 為你的模型存放地址。
然後進入 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 的值為設定的值。
最後啟動API伺服器:streamlit run composite_demo/main.py
可知這個WebUI使用的是streamlit框架。
如果是在個人電腦上安裝的,點選這裡的連線就可以在瀏覽器訪問了。
如果是在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 需要替換成你自己例項的,在例項列表中複製登入指令。
然後把它隨便貼上到一個地方,就可以得到所需的地址和埠號了:
在個人電腦的終端或者命令列工具執行上邊寫好的指令,首先需要統一新增主機(輸入 yes),然後需要輸入主機登入密碼,還是從AutoDL的例項列表複製。
登入成功後,這個介面會掛起,不會輸出任何內容。此時我們在瀏覽器位址列輸入 http://127.0.0.1:8501 就可以訪問了。
使用WebUI
這個WebUI左邊是引數區域,右邊是使用區域,有三種使用方式:Chat、Tool和Code Interpreter,分別就是聊天、工具或外掛、程式碼直譯器。相關引數我在之前的文章中介紹過,可以參考下:https://juejin.cn/post/7323449163420680202#heading-7
聊天就不用說了,我們看下工具或外掛的使用。它會完整的展現出來外掛的使用過程,使用者詢問問題,觸發大模型呼叫外掛,展現外掛返回的內容,大模型整理外掛返回的內容並輸出給使用者。中間的兩個過程這裡只是為了方便使用者瞭解原理,其實可以在展現大模型返回值時將它們過濾掉。具體的可以修改這個檔案中的第144行-198行:composite_demo/demo_tool.py 。
例項程式碼中提供了兩個工具,一個是獲取實時天氣,另一個是生成隨機數,使用者還可以修改程式碼增加自己的工具外掛,在 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畫一個愛心。
如果程式碼執行有錯誤,模型會自動修正錯誤,然後繼續生成,直到能夠正常執行成功。這個能力其實是透過系統提示詞和observation角色實現的。
在 composite_demo/demo_ci.py 中可以看到提示詞:
當程式執行出錯的時候,程式會透過observation角色把錯誤再發給ChatGLM進行分析,然後ChatGLM會修改程式碼,再重新輸出到程式中,最後使用 Jupyter 核心執行程式碼。
使用API開發應用
使用大模型API,我們可以完全自定義自己的互動頁面,增加很多有趣的功能,比如提供聯網能力。
這裡我們使用的是ChatGLM3-6B自帶的一個API示例程式,這個程式中有一個參考OpenAI介面規範開發的API服務,我們可以直接使用OpenAI的客戶端進行呼叫,這避免了很多學習成本,降低了使用難度。
啟動API服務
首先修改程式中的模型目錄,在下載程式中找到檔案 openai_api_demo/api_server.py,修改 MODEL_PATH 為你的模型存放地址。
然後進入 ChatGLM3-6B 程式的根目錄(根據自己的部署來),啟用Python虛擬環境:
cd C:\ChatGLM3
conda activate chatglm3-6b
# conda如果不行就使用 source activate chatglm3-6b
最後啟動API伺服器:python openai_api_demo/api_server.py
看到 running on http://0.0.0.0 的提示資訊就代表啟動成功了。
注意這裡的埠號,如果你是在AutoDL部署的程式,需要將埠號修改為6006,然後才能透過AutoDL提供的“自定義服務”在外網訪問,埠號在openai_api_demo/api_server.py 檔案的最末尾。
修改後重啟API服務,然後在AutoDL的容器例項列表中點選“自定義服務”,即可獲取外網訪問地址。
呼叫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='')
下邊是程式的執行結果,大模型理解的很正確,並生成了合理的輸出。
再看大模型中使用外掛的方法,這裡讓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)
執行效果如下:
以上就是本文的主要內容,有興趣的快去體驗下吧。
如需GPT賬號、學習陪伴群、AI程式設計訓練營,點此進入:大模型應用開發 | API 實操
關注螢火架構,加速技術提升!