LLM离线包:开箱即用的知识库问答平台
今天详细讲一下离线部署大语言模型问答应用。看完此文,你应该可以直接在本地部署出一套完成度较高的,可提供问答服务的大语言模型应用。 全新搭建可以看之前的介绍 高效搭建离线大语言模型问答平台:实用指南。今天主要讲离线包,包括开源项目代码,模型文件,docker images, Python环境和包等。但本地的Docker环境,Nvidia驱动,Cuda环境等还是得根据情况自己解决。
说明
本着快速,好用,完成度高,可扩展的原则,我的选型如下
LLM: ChatGLM2-6B 应用平台:FastGPT
架构示意图
后端LLM部署出来后,要转换成OpenAI API接口规范。 One API为可选部署,可以简单的把它理解为后端LLM的负载均衡器,方便做流量切换,或者用量管控。 应用平台目前推荐FastGPT,其它平台各有优势。
基于FastGPT的应用配置和开发
下载
offlineglm.part1.rar https://cowtransfer.com/s/37225e2a0b5349 offlineglm.part2.rar https://cowtransfer.com/s/f9ded651670c46 offlineglm.part3.rar https://cowtransfer.com/s/f34cdd5cc4714d offlineglm.part4.rar https://cowtransfer.com/s/2c4b4a6aaabc4f
下载完成后是4个rar压缩文件,选中任一rar,解压到当前文件夹,你会得到一个offlineglm文件夹。
解压后的文件在offlineglm中,包括源码,模型文件,docker镜像文件,python运行环境。
启动LLM
如果你的机器内存>32GB,现在可直接以cpu方式跑量化版的ChatGLM2-6b-4int.
跑前需要改一下 ./chatglm2-m3e/.env
文件里的modelname路径,也就是模型文件存放的路径。
然后双击运行 "1. 开启ChatGLM2, M3E API服务(4bit 6G).bat"
如果提示少package,可试着安装./system/python/Scripts/pip3 install -r ./chatglm2-m3e/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
正常运行后,可以用Postman测试接口,也可以这样测试两个模型接口。
curl --location --request POST 'http://localhost:6006/v1/embeddings' \
--header 'Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "m3e",
"input": ["hello world"]
}'
curl --location --request POST 'http://localhost:6006/v1/chat/completions' \
--header 'Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "chatglm2",
"messages": [{"role": "user", "content": "Hello!"}]
}'
如果要以GPU方式启动LLM,则改./chatglm2-m3e/.env
里的device为gpu, 还要保证cuda, 环境中的pytorch匹配。 参考下面"安装cuda"。
安装cuda
如果没有N卡,跳过此节。
安装Nvidia显卡驱动 https://www.nvidia.com/download/index.aspx 安装cuda toolkit https://developer.nvidia.com/cuda-downloads 安装cudnn https://developer.nvidia.com/rdp/cudnn-download 参考 https://zhuanlan.zhihu.com/p/102966512
cuda版本要跟pytorch版本一致 (血泪教训)
如果nvcc -V
查看的版本和 nvidia-smi
看到的CUDA VERSION不一样,以nvcc -V
看到的为准。 nvcc是NVIDIA dev toolkit安装来的,nvidia-smi是GPU driver安装时带的。不一致问题不大。
可运行 check_cpu_ready.bat
查看离线包里安装的pytorch版本。 或者运行
./system/python/python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
最后显示 True
则表示Python环境可正常使用GPU。
Testing GPU compatibility with PyTorch...
2.0.1+cu118
True
如果上面的结果是False, pytorch安装要跟cuda版本匹配着来。重新安装前确保之前的torch已清理。反正记住,在离线环境中, python 用 ./system/python/python
, pip用./system/python/Scripts/pip3
替代。
1.清理已安装的: ./system/python/Scripts/pip3 uninstall -y torch torchvision torchaudio
2.安装pytorch: 从这里获取命令,https://pytorch.org/get-started/locally/ , 运行时加前缀,比如
./system/python/Scripts/pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
再次运行 check_cpu_ready.bat
检查
导入Docker image
启动Docker Desktop,启动Git Bash, 进入dockerimages目录,用下面的命令导入docker images
docker load < chatgpt-web.tar
docker load < fastgpt.tar
docker load < mongo.tar
docker load < pg.tar
docker load < oneapi.tar
导入后的镜像如下
启动OneAPI
你可参考Repo中的Guide来启动,也可用Docker方式更方便的启动。这里-p 3000:3000
表示主机和container里的端口映射关系,冒号前主机端口,冒号后是container里的端口。
docker run --name one-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v D:\\data:/data justsong/one-api
启动OneAPI后,访问http://localhost:3000/ root/123456 配置后端自定义端渠道和对外Token。
创建渠道页面中,注意Base URL就不要填localhost了,因为这是在container环境中访问的,这里填主机上的局域网IP,保证container里可访问到上面跑起来的LLM和Embedding模型。所以,我这里定义了两个渠道。
对外Token就简单了,新建一个,按需求设置过期时间和额度。 创建好后,复制sk-开头的Token,后面有用。
启动FastGPT
你可参考Repo中的Guide来启动,也可用Docker方式更方便的启动。用docker compose方式可快速的启动FastGPT所需要的前后端(fastgpt fe, mongo db, postgres db). 启动前,我们需要配置docker compose参数,文件在FastGPT\files\deploy\fastgpt\docker-compose.yml
。
ports中第一个port不能用3000了,因为前面OneAPI用了,随便换个别的 OPENAI_BASE_URL 设置为OneAPI的地址,因为是Container里访问,不要写localhost, 注意后面加了 /v1
。CHAT_API_KEY 设置为上面新建的Token。
FastGPT\files\deploy\fastgpt\docker-compose.yml
fastgpt:
container_name: fastgpt
image: ghcr.io/labring/fastgpt:latest # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:latest # 阿里云
ports:
- 3003:3000
environment:
# root 密码,用户名为: root
- DEFAULT_ROOT_PSW=1234
# 中转地址,如果是用官方号,不需要管
- OPENAI_BASE_URL=http://192.168.101.87:3000/v1
- CHAT_API_KEY=sk-SUe2yUeKMDPumpcj84F6E4Ef564049A5968dF11a85234f6b
默认还通过config.json传入一些变量的,所以在FastGPT\files\deploy\fastgpt\config.json
也更新一下可用的LLM和Embedding 模型。
model 值就是上面OneAPI中添加渠道时填入的模型名 name 你可以自定义 price 根据你的需要来,OneAPI是可能方便控制使用量的。
"ChatModels": [
//已有模型
{
"model": "chatglm2-6b-int4",
"name": "chatglm2",
"contextMaxToken": 8000,
"quoteMaxToken": 4000,
"maxTemperature": 1.2,
"price": 0,
"defaultSystem": ""
}
],
"VectorModels": [
{
"model": "m3e",
"name": "M3E(测试使用)",
"price": 0.0,
"defaultToken": 500,
"maxToken": 1800
}
],
更新好后,就启动FastGPT的3个container吧。
cd FastGPT\files\deploy\fastgpt
docker-compose up -d #运行
docker-compose restart #重启
docker-compose down #关闭
启动完成后会看到4个跑着的containers.
使用FastGPT
访问FastGPT http://localhost:3003/ root/1234
新建知识库-导入数据。 这里使用QA拆分,这种导入方法会将你上传的文档读取并理解后,拆分成一些问答对。也就是知识梳理了一遍,对于后续回答准确度能有较大提升。 当然,你也可以试其它导入方式。导入时间与文档大小,后端LLM能力,机器性能相关。耐心等待吧。
新建一个应用,选择 知识训+对话引导
选择模型,关联刚才创建的知识库,就可以问知识库里的东西了。 http://localhost:3003/ 点“外接”可以创建对话应用URL,直接访问,或iframe方式嵌入到已有页面。
点API访问可创建此对话应用的API,基于此API,可二次开发或接入其它应用。下面讲到。
应用二次开发
上面应用界面上点API访问后,有3个信息出现。其中 <API密钥>-<AppID>
组合在一起就是一个API Key(Token), 配合API服务器,就可以用在其它应用中了。
所以, 总结一下,全篇讲了有3处API和API BASE URL (它们都符合OPenAI API规范,具体怎样的请查阅OpenAI文档)。 这3处API对应最开始两张图中的3个标记。以下是用例说明。
LLM自身的API (OpenAI格式化)
$ curl --location --request POST 'http://localhost:6006/v1/chat/completions' --headeon/json' --data-raw '{
"model": "chatglm2",
"messages": [{"role": "user", "content": "Hello!"}]
}'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 273 100 193 100 80 18 7 0:00:11 0:00:10 0:00:01 48{"modentent":"Hello! How can I assist you today?"},"finish_reason":"stop"}],"created":1694
OneAPI对外的Token, 这里就可以选择模型(如果渠道配置得有多个的话,只改调用模型)。 这里用它来启动一个chatgpt套壳项目。 启动后访问 http://localhost:3002 就可直接与LLM对话。
docker run --name chatgpt-web -d -p 3002:3002 --env OPENAI_API_KEY=sk-SUe2yUeKMDPumpcj84F6E4Ef564049A5968dF11a85234f6b -e OPENAI_API_BASE_URL=http://192.168.101.87:3000 -e MAX_REQUEST_PER_HOUR=15 -e OPENAI_API_MODEL=chatglm2-6b-int8 chenzhaoyu94/chatgpt-web
FastGPT 应用的API,这个API是密钥+AppID而成,比如上面创建的是基于知识库的对话应用,与些API对话,就会查询该知识库。下面命令启动后, 访问 http://localhost:3005 可询问知识库, 比如 《父辈的荣耀》一共有多少集?
docker run --name chatgpt-web3 -d -p 3005:3002 --env OPENAI_API_KEY=fastgpt-eaams5ahnylfd0jdfmcsr29m-650423d8ac2ab10b9a40079d -e OPENAI_API_BASE_URL=http://192.168.101.87:3003/api/openapi -e MAX_REQUEST_PER_HOUR=15 -e OPENAI_API_MODEL=chatglm2-6b-int8 chenzhaoyu94/chatgpt-web