ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia
- 初
- 環境與設備
- 環境準備
- 克隆模型
- 代碼部署 ChatGLM-6B
- 完整代碼
ChatGLM-6B 是一個開源的、支持中英雙語的對話語言模型,基于 General Language Model (GLM) 架構,具有 62 億參數。結合模型量化技術,用戶可以在消費級的顯卡上進行本地部署(INT4 量化級別下最低只需 6GB 顯存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技術,針對中文問答和對話進行了優化。經過約 1T 標識符的中英雙語訓練,輔以監督微調、反饋自助、人類反饋強化學習等技術的加持,62 億參數的 ChatGLM-6B 已經能生成相當符合人類偏好的回答
本篇文章將介紹ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia GUP
初
希望能寫一些簡單的教程和案例分享給需要的人
環境與設備
系統:Ubuntu 22.04.2 LTS (ubuntu 就行)
設備:Nvidia GeForce RTX 4090 (英偉達 就行)
以下是一些推薦的消費級顯卡:
-
Nvidia GeForce RTX 3080: RTX 3080 是一款性能出色的顯卡,適用于高質量游戲和深度學習任務。它提供了強大的圖形性能和 CUDA 核心,能夠滿足許多高性能計算需求。
-
AMD Radeon RX 6800 XT: 如果你對 AMD 的顯卡感興趣,RX 6800 XT 是一款強大的選擇。它具有出色的游戲性能和計算能力,適用于多種應用場景。
-
Nvidia GeForce RTX 3070: RTX 3070 是一款性價比較高的顯卡,它在性能和價格之間找到了很好的平衡。它適用于游戲、圖形設計和一些中等規模的深度學習任務。
環境準備
在開始之前,確保 Ubuntu 系統已經安裝了Python和必要的依賴項。
輸入下面命令:判斷PIP是否安裝
pip --version
如果沒安裝,就安裝 python3-pip
sudo apt update
sudo apt install python3-pip
安裝完成后如下圖:
克隆模型
全部都完成后,我們就可以去下載模型了
去下面這個網站,下載模型
https://huggingface.co/THUDM/chatglm2-6b-32k
點擊克隆后,我們需要使用命令:
git lfs install
git clone https://huggingface.co/THUDM/chatglm2-6b-32k
這個時候,可能會遇到報錯:需要安裝 git ,還有 git-lfs
sudo apt install gitsudo apt install git-lfs
這兩個都安裝完成后,我們再克隆,我這邊會到指定的路徑克隆,大家自行選擇。
克隆成功后,如下圖:
代碼部署 ChatGLM-6B
git clone https://github.com/THUDM/ChatGLM-6B.git
代碼克隆下來后,就安裝環境 pytorch
PyTorch 是一個開源的機器學習框架,它提供了豐富的工具和庫,用于構建和訓練各種深度學習模型。它由 Facebook 的人工智能研究院(Facebook AI Research,縮寫為FAIR)開發并維護,旨在為研究人員和開發者提供一個靈活、動態的平臺來實現各種機器學習任務。
PyTorch 提供了一種動態計算圖的機制,這意味著您可以在運行時構建、修改和調整計算圖,使其更加靈活和直觀。這使得 PyTorch 在實驗和原型開發階段非常有用,因為它能夠快速適應不同的數據和模型結構。此外,PyTorch 還具有廣泛的神經網絡庫、優化算法以及用于數據加載和預處理的工具。它也支持 GPU 加速,可以在 NVIDIA CUDA 上利用 GPU 進行高效的計算,加速模型訓練過程。總之,PyTorch 是一個受歡迎的機器學習框架,廣泛用于深度學習研究、開發和應用。它以其動態計算圖、靈活性和易用性而聞名。
直接進入下面網址
https://pytorch.org/
進入頁面后,翻到下一頁,我這里是ubuntu 所以我這邊用預覽版最新的 CUDA 12.1
關于CUDA的支持可以通過命令 nvidia-smi 來查看
我們執行命令
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu121
等待安裝結束
都按照完成后,進入項目,我這里項目路徑是這個 /home/ai/dev/code
cd /home/ai/dev/code
cd /home/ai/dev/code/ChatGLM-6B
然后安裝 環境
pip install -r requirements.txt
等待這些都安裝完成后,
api.py 文件中的路徑:
將原本的:THUDM/chatglm-6b
更換成:/home/ai/dev/model/chatglm2-6b-32k
/home/ai/dev/model/chatglm2-6b-32k
執行下面命令:
python3 api.py
測試一下:
curl -X POST "http://127.0.0.1:8000" \-H 'Content-Type: application/json' \-d '{"prompt": "你好", "history": []}'
上面是 API 的效果。如果選需要 ui 版本 web_demo.py 這個文件 修改模型路徑后,執行:
python3 web_demo.py
修改截圖如下:
方便外網請求的修改地方如下:
執行結果如下:
完整代碼
api.py
from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModel
import uvicorn, json, datetime
import torchDEVICE = "cuda"
DEVICE_ID = "0"
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICEdef torch_gc():if torch.cuda.is_available():with torch.cuda.device(CUDA_DEVICE):torch.cuda.empty_cache()torch.cuda.ipc_collect()app = FastAPI()@app.post("/")
async def create_item(request: Request):global model, tokenizerjson_post_raw = await request.json()json_post = json.dumps(json_post_raw)json_post_list = json.loads(json_post)prompt = json_post_list.get('prompt')history = json_post_list.get('history')max_length = json_post_list.get('max_length')top_p = json_post_list.get('top_p')temperature = json_post_list.get('temperature')response, history = model.chat(tokenizer,prompt,history=history,max_length=max_length if max_length else 2048,top_p=top_p if top_p else 0.7,temperature=temperature if temperature else 0.95)now = datetime.datetime.now()time = now.strftime("%Y-%m-%d %H:%M:%S")answer = {"response": response,"history": history,"status": 200,"time": time}log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'print(log)torch_gc()return answerif __name__ == '__main__':tokenizer = AutoTokenizer.from_pretrained("/home/ai/dev/model/chatglm2-6b-32k", trust_remote_code=True)model = AutoModel.from_pretrained("/home/ai/dev/model/chatglm2-6b-32k", trust_remote_code=True).half().cuda()model.eval()uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)
web_demo.py
from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2htmltokenizer = AutoTokenizer.from_pretrained("/home/ai/dev/model/chatglm2-6b-32k", trust_remote_code=True)
model = AutoModel.from_pretrained("/home/ai/dev/model/chatglm2-6b-32k", trust_remote_code=True).half().cuda()
model = model.eval()"""Override Chatbot.postprocess"""def postprocess(self, y):if y is None:return []for i, (message, response) in enumerate(y):y[i] = (None if message is None else mdtex2html.convert((message)),None if response is None else mdtex2html.convert(response),)return ygr.Chatbot.postprocess = postprocessdef parse_text(text):"""copy from https://github.com/GaiZhenbiao/ChuanhuChatGPT/"""lines = text.split("\n")lines = [line for line in lines if line != ""]count = 0for i, line in enumerate(lines):if "```" in line:count += 1items = line.split('`')if count % 2 == 1:lines[i] = f'<pre><code class="language-{items[-1]}">'else:lines[i] = f'<br></code></pre>'else:if i > 0:if count % 2 == 1:line = line.replace("`", "\`")line = line.replace("<", "<")line = line.replace(">", ">")line = line.replace(" ", " ")line = line.replace("*", "*")line = line.replace("_", "_")line = line.replace("-", "-")line = line.replace(".", ".")line = line.replace("!", "!")line = line.replace("(", "(")line = line.replace(")", ")")line = line.replace("$", "$")lines[i] = "<br>"+linetext = "".join(lines)return textdef predict(input, chatbot, max_length, top_p, temperature, history):chatbot.append((parse_text(input), ""))for response, history in model.stream_chat(tokenizer, input, history, max_length=max_length, top_p=top_p,temperature=temperature):chatbot[-1] = (parse_text(input), parse_text(response)) yield chatbot, historydef reset_user_input():return gr.update(value='')def reset_state():return [], []with gr.Blocks() as demo:gr.HTML("""<h1 align="center">ChatGLM</h1>""")chatbot = gr.Chatbot()with gr.Row():with gr.Column(scale=4):with gr.Column(scale=12):user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10).style(container=False)with gr.Column(min_width=32, scale=1):submitBtn = gr.Button("Submit", variant="primary")with gr.Column(scale=1):emptyBtn = gr.Button("Clear History")max_length = gr.Slider(0, 4096, value=2048, step=1.0, label="Maximum length", interactive=True)top_p = gr.Slider(0, 1, value=0.7, step=0.01, label="Top P", interactive=True)temperature = gr.Slider(0, 1, value=0.95, step=0.01, label="Temperature", interactive=True)history = gr.State([])submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history], [chatbot, history],show_progress=True)submitBtn.click(reset_user_input, [], [user_input])emptyBtn.click(reset_state, outputs=[chatbot, history], show_progress=True)demo.queue().launch(server_name='0.0.0.0', share=False, inbrowser=True)