本地化部署大语言模型 ChatGLM
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。
前期筹备
GitHub 基础包
GitHub: ChatGLM-6B
下载 ChatGLM-6B 压缩包到本地
![请添加图片描述](https://img-blog.csdnimg.cn/d1df5b15e3b9483f8a1ed5c29a9a0521.png)
语言模型文件
Hugging Face: Model
下载 训练好的 语言模型文件
![请添加图片描述](https://img-blog.csdnimg.cn/948db8ef6108489f957a72162f3ff12f.png)
每一个都要下载
![请添加图片描述](https://img-blog.csdnimg.cn/d387451c84cd4c2e8271b6ed40f766c1.png)
基础配置
解压 ChatGLM-6B-main.zip 文件
![请添加图片描述](https://img-blog.csdnimg.cn/4316039a08f2451797d9a9b7d80dae21.png)
新建一个名为 model 的文件夹
![请添加图片描述](https://img-blog.csdnimg.cn/ce7eeee19bf84c35b00748262c04870f.png)
把刚才在 Hugging Face 上下载的所有文件都放进来
应该是 20 个 检查一下
![请添加图片描述](https://img-blog.csdnimg.cn/20472e24413e44ad8058c43f9b98abc1.png)
返回 ChatGLM-6B-main 跟目录 找到名为 web_demo.py 的文件
![请添加图片描述](https://img-blog.csdnimg.cn/eec51938cb01486f8c964d202563c481.png)
可以用记事本 或则 其他工具打开
![请添加图片描述](https://img-blog.csdnimg.cn/33e7203702494280a33e8b72229b30e8.png)
更改第 4、5行代码
原本代码:
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
修改过后代码:
tokenizer = AutoTokenizer.from_pretrained("model", trust_remote_code=True)
model = AutoModel.from_pretrained("model", trust_remote_code=True).half().quantize(4).cuda()
就是把 THUDM/chatglm-6b 更改为 model
并在 half()方法之后添加 quantize(4) 方法
![请添加图片描述](https://img-blog.csdnimg.cn/867ec66902974847ac53a6af6ac183fc.png)
量化需求:
如果显存小于14G 就使用 quantize(4) 方法 如果你要使用 quantize(8)你就要关闭所有应用
说一下我的电脑配置:i7、16G内存、2060ti显卡(6G显存)
各位看官老爷自己对比一下
![在这里插入图片描述](https://img-blog.csdnimg.cn/6416d3a3691647cc8c36237d9f5b1e32.png)
显存查看方法
Win + R 键 打开命令窗口
输入 dxdiag 然后点击确认
![请添加图片描述](https://img-blog.csdnimg.cn/1288aae2daa847038c58e588e6ba30a1.png)
打开系统自带的诊断工具之后 随便点一个显示
![请添加图片描述](https://img-blog.csdnimg.cn/0d52d0e971eb44dd9211c7d276ba8702.png)
这个显示内存就是你的 显存
![请添加图片描述](https://img-blog.csdnimg.cn/6edd98c819564f16aca93243aa1500ea.png)
Anaconda 模块
Anaconda 官网: Anaconda 官网
ChatGLM-6B 网页部署
Anaconda 环境创建
打开 Anaconda 点击 Environments
![请添加图片描述](https://img-blog.csdnimg.cn/d0406a73a14e43afaef9bfc6f2e0a3d2.png)
新建一个环境
![请添加图片描述](https://img-blog.csdnimg.cn/08c41f65d35245be853f5bcd9beb9a14.png)
起一个名字
注意:记住 Python 版本 有点重要 最好使用 3.10.10
如果没有可以在官网重新下载 更新一下
![请添加图片描述](https://img-blog.csdnimg.cn/3586215aabd940a0ac23dae4352c9d7c.png)
点击那个运行按钮 并打开 Open Terminal
![在这里插入图片描述](https://img-blog.csdnimg.cn/359eda56215a48d1a0633f3500211146.png)
根目录操作
输入 D: 进入相应硬盘
![请添加图片描述](https://img-blog.csdnimg.cn/3a7637fa202741ceb6754486ca5beb6b.png)
使用 cd 命令 进入到 ChatGML 根目录
我这边是 D:\Unity\ChatGLM-6B\ChatGLM-6B-main
大家根据自己的 解压路径进行 打开
![请添加图片描述](https://img-blog.csdnimg.cn/a82837a46d954ba79973d05162e66a51.png)
基础依赖加载
键入 pip install -r requirements.txt
加载依赖项 反正我这边是会加载不完全
![请添加图片描述](https://img-blog.csdnimg.cn/ccf871b46efc4cdeb5d8cd94f0fa0d21.png)
transformers 和 protobuf 库加载
下载 protobuf 和 transformers 库支持
pip install protobuf==3.20.0 transformers==4.27.1 icetk cpm_kernels
![请添加图片描述](https://img-blog.csdnimg.cn/41ab89a5ab4841d4a2db8402be927e7c.png)
因为要使用 Web 显示 所以也需要加载 gradio库
pip install gradio
![请添加图片描述](https://img-blog.csdnimg.cn/5d07e8b6714542d2972bd3863e0d5558.png)
先启动跑一下看看 能不能运行的起来 万一可以呢 是吧
python web_demo.py
![请添加图片描述](https://img-blog.csdnimg.cn/bd5765cc2bbf45218a948f9f3c8fb21f.png)
Pytorch 源修改
Pytorch: Pytorch
报错:AssertionError: Torch not compiled with CUDA enabled
这个就是 只支持 CPU 的 CUDR 问题不大
去 Pytorch 找到对应的 直接 conda
![请添加图片描述](https://img-blog.csdnimg.cn/2915b9f9ce164102979df0407638fd73.png)
注意选择对啊
如果conda 实在是卡的不能行的话 你就试试 pip
两个命令都给你:
conda: conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
pip: pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
![请添加图片描述](https://img-blog.csdnimg.cn/7a2dcd1c12104a34ae348e4ab2dffd64.png)
![请添加图片描述](https://img-blog.csdnimg.cn/9305cc928dc24743ae558c467c0d497e.png)
当出现这一句的时候 你直接 输入 y 回车就行
![请添加图片描述](https://img-blog.csdnimg.cn/60a99b7f4ead4570b9592795b59afe49.png)
依赖库补充
下载完毕之后你会发现 还是缺少依赖库 找到相应名称
比如这个 chardet 直接 pip install
pip install chardet
![请添加图片描述](https://img-blog.csdnimg.cn/dd1c43416b474e7084c52c5b9d8c5547.png)
再次运行 python web_demo.py 命令
![请添加图片描述](https://img-blog.csdnimg.cn/91d06dbf27da4a819faa0d4b0435aad3.png)
好吧 果然不可以 缺少 cchardet库
那就继续下载呗
pip install cchardet
![请添加图片描述](https://img-blog.csdnimg.cn/0b55f17e54014571aa459ed4f6304bf2.png)
来了来了 全场最大的麻烦来了
明明下载都下载好了 就是无法执行 你气不气
![请添加图片描述](https://img-blog.csdnimg.cn/4893f9b0dc3d412d8c305a2a6176f1a4.png)
找了一百年 重新下载也不行 换成清华源 也不行
最后的最后 就想着要不换下轮子呢
![请添加图片描述](https://img-blog.csdnimg.cn/4ee57e922abd44c2bb9ad6de2e2eeac8.png)
补充依赖 pypi 配置
pypi: pypi官网
在搜索框输入 你想要查询库名称
![请添加图片描述](https://img-blog.csdnimg.cn/5ac9598bc0094c4885a2b11e0f333357.png)
注意选择对应的 系统 我是 win64 所以就选择了第一个
这里还有一个坑
![请添加图片描述](https://img-blog.csdnimg.cn/ea3517ece2b644748ea76025a9cab147.png)
cd 到你存放 刚刚下载文件的目录
![请添加图片描述](https://img-blog.csdnimg.cn/c2c8dd3cd4944ac294b639381ec21d5b.png)
cchardet 依赖错误解决
输入 pip install D:\Unity\ChatGLM-6B\cchardet-2.1.7-cp39-cp39-win_amd64.whl
这是我的路径 各位 自行更改哈
然后你会发现 又错了!!!
不能用 完犊子 真的差点吐血 好在是解决了
![请添加图片描述](https://img-blog.csdnimg.cn/e2bb277557624d60855b6cef5d186b98.png)
回到下载文件夹 各位还记得 自己创建环境时的 Python 版本吗 对 就是那个!
原本名称是 cp39 改成 cp310 就能用了
真真不想吐槽了
![请添加图片描述](https://img-blog.csdnimg.cn/30446da5417a47e38101598c4538e1c5.png)
你要是不知道自己环境对应的 就输入:
pip debug --verbose
按照对应的更改一下就行了
![请添加图片描述](https://img-blog.csdnimg.cn/7fb1d329e3834848a85d9af9bd04bbc6.png)
执行 pip install D:\Unity\ChatGLM-6B\cchardet-2.1.7-cp310-cp310-win_amd64.whl
![请添加图片描述](https://img-blog.csdnimg.cn/d0b2df3d76a24213b36b89087bbf6b90.png)
成功 毫无悬念
![请添加图片描述](https://img-blog.csdnimg.cn/83a40e073629424ba2ce8fd37e895520.png)
cd 到ChatGLM 根目录
cd D:\Unity\ChatGLM-6B\ChatGLM-6B-main
![请添加图片描述](https://img-blog.csdnimg.cn/a33d616d935d4fd7a65a822b0e3aa2e4.png)
再次运行 python web_demo.py
发现还是不行 那还说什么 上大招
![请添加图片描述](https://img-blog.csdnimg.cn/4e74e424d8314597a677750dec5f825c.png)
强制 归一化
强制 最新归一化
pip install --force-reinstall charset-normalizer==3.1.0
![请添加图片描述](https://img-blog.csdnimg.cn/6844e2ea198a4148998678d13dd5bbda.png)
再次启动
python web_demo.py
搓手等待...
![请添加图片描述](https://img-blog.csdnimg.cn/75b16575be1d4aee9e5a3155882e1ce7.png)
网页部署成功
天见犹怜 终于终于 成功了
真是一波三折 再三折 好在是成功了
![请添加图片描述](https://img-blog.csdnimg.cn/3fc544a4bf4a4625b0f8fb0b8e401a6f.png)
好了大家可以尽情的调教自己的 GPT 了
![请添加图片描述](https://img-blog.csdnimg.cn/9e9d44e6d279454aa1661e7ea301fc8f.png)
ChatGLM-6B 本地部署
Anaconda Terminal
在上面创建好的环境下 重新打开 执行 Terminal
![在这里插入图片描述](https://img-blog.csdnimg.cn/e63be926da1b43af9263ad6252dd8577.png)
导航到 根目录
![请添加图片描述](https://img-blog.csdnimg.cn/adcad441efa941f7aa5598d1d1c24983.png)
依赖项加载
使用 pip install fastapi uvicorn 命令安装相关 依赖
![请添加图片描述](https://img-blog.csdnimg.cn/385abd74459144f3a579c184bc6ceea1.png)
api.py 文件修改
在根目录找到 api.py 文件并打开
![请添加图片描述](https://img-blog.csdnimg.cn/f204373940674c5c8c306750bc44214a.png)
初始代码:这两句在 53、54行
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
更改为下面的:稍微解释一下。
因为我的模型放在了根目录的 model 文件夹下 所以把 "THUDM/chatglm-6b" 更改为了 "model"
你们也可以按需更改。
tokenizer = AutoTokenizer.from_pretrained("model", trust_remote_code=True)
model = AutoModel.from_pretrained("model", trust_remote_code=True).half().cuda()
可以直接替换的完整代码:
from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModel
import uvicorn, json, datetime
import torch
DEVICE = "cuda"
DEVICE_ID = "0"
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE
def 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, tokenizer
json_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 answer
if __name__ == '__main__':
tokenizer = AutoTokenizer.from_pretrained("model", trust_remote_code=True)
model = AutoModel.from_pretrained("model", trust_remote_code=True).half().cuda()
model.eval()
uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)
api.py 执行
执行命令:python api.py
![请添加图片描述](https://img-blog.csdnimg.cn/a4b829ddfa8a4d5c8e32281ea9b9c80e.png)
本地化部署 成功
可以自己设置访问网址和端口 只要设置好就行。
我这边直接使用的是默认的:http://127.0.0.1:8000 或者 http://0.0.0.0:8000
![请添加图片描述](https://img-blog.csdnimg.cn/aa73e64392754c0f9d1390f49f6024ce.png)
发送 Json 数据 Unity 模块
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 发送 数据
/// </summary>
[System.Serializable]
public class PostDataJson_ZH
{
/// <summary>
/// 发送信息
/// </summary>
public string prompt;
/// <summary>
/// 细节
/// </summary>
public List<string> history;
}
接收 Json 数据 Unity 模块
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 接收 数据
/// </summary>
[System.Serializable]
public class AcceptJson_ZH
{
/// <summary>
/// 返回消息
/// </summary>
public string response;
/// <summary>
/// 多个回答
/// </summary>
public List<List<string>> history;
/// <summary>
/// 状态
/// </summary>
public int status;
/// <summary>
/// 返回事件
/// </summary>
public string time;
}
Unity 结合
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class ChatGLM_ZH : MonoBehaviour
{
[Header("本地化访问网址")]
public string _OpenAIUrl= "http://127.0.0.1:8000";
[Header("基础模板设置")]
[SerializeField]
public PostDataJson_ZH _PostData = new PostDataJson_ZH();
[Header("接收数据")]
public string _RobotChatText;
[Header("问题")]
public string _SendMessage= "你好";
void Update()
{
if (Input.GetKeyDown(KeyCode.Q))
{
_SendMessage = GameObject.Find("输入").GetComponent<InputField>().text;
StartCoroutine(GetPostData(_SendMessage));
}
}
/// <summary>
/// POST 方法请求
/// </summary>
/// <param 问题="_SendMessage"></param>
/// <returns></returns>
private IEnumerator GetPostData(string _SendMessage)
{
using (UnityWebRequest _Request = new UnityWebRequest(_OpenAIUrl, "POST"))
{
//{"prompt": "你好", "history": []}
_PostData.prompt = _SendMessage;
//数据转换
string _JsonText = JsonUtility.ToJson(_PostData);
print(_JsonText);
byte[] _Data = System.Text.Encoding.UTF8.GetBytes(_JsonText);
//数据上传 等待响应
_Request.uploadHandler = new UploadHandlerRaw(_Data);
_Request.downloadHandler = new DownloadHandlerBuffer();
//数据重定向
_Request.SetRequestHeader("Content-Type", "application/json");
//等待响应 开始与远程服务器通信
yield return _Request.SendWebRequest();
//数据返回
if (_Request.responseCode == 200)
{
//接收返回信息
string _Message = _Request.downloadHandler.text;
print(_Message);
//数据转换
AcceptJson_ZH _Textback = JsonUtility.FromJson<AcceptJson_ZH>(_Message);
//确保当前有消息传回
if (_Textback.response != null)
{
//输出显示
_RobotChatText = _Textback.response;
GameObject.Find("输出").GetComponent<Text>().text = _RobotChatText;
}
}
}
}
}
本地化 运行 效果
命令行 输出
![请添加图片描述](https://img-blog.csdnimg.cn/551f513d23b84602850e0fa6716b98a6.png)
Unity 输出
![请添加图片描述](https://img-blog.csdnimg.cn/780c4abba9a5492e8606762944bedb38.png)
使用网址合集
GitHub: ChatGLM-6B
Hugging Face: Model
Anaconda 官网: Anaconda 官网
Pytorch: Pytorch
Pypi: pypi官网
清华大学镜像网站: 清华大学镜像网站
执行命令合集
//基础包依赖加载
pip install -r requirements.txt
//transformers 和 protobuf 依赖加载
pip install protobuf==3.20.0 transformers==4.27.1 icetk cpm_kernels
//网页使用 gradio 库 加载
pip install gradio
//网页 启动命令
python web_demo.py
//CPU 转换
conda: conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
pip: pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
//chardet 库 补充依赖
pip install chardet
//cchardet 库 补充依赖
pip install cchardet
//查看当前平台支持的版本
pip debug --verbose
//cchardet 库 轮子 加载
pip install D:\Unity\ChatGLM-6B\cchardet-2.1.7-cp310-cp310-win_amd64.whl
//强制 最新归一化
pip install --force-reinstall charset-normalizer==3.1.0
//启动命令
python web_demo.py
//本地化 依赖加载
pip install fastapi uvicorn
//本地化 启动命令
python api.py
//断开服务
Ctrl + C
//清华源 镜像
核心句式:-i https://pypi.tuna.tsinghua.edu.cn/simple
例如下载的是:cchardet
正常下载是:pip install cchardet
清华源下载是:pip install cchardet -i https://pypi.tuna.tsinghua.edu.cn/simple
暂时先这样吧,如果有时间的话就会更新模型微调文章以及抽时间更新GLM130B的部署,实在看不明白就留言,看到我会回复的。
路漫漫其修远兮,与君共勉。