查看原文
其他

LLM离线包:开箱即用的知识库问答平台

Yaha 越山集
2024-08-30

今天详细讲一下离线部署大语言模型问答应用。看完此文,你应该可以直接在本地部署出一套完成度较高的,可提供问答服务的大语言模型应用。 全新搭建可以看之前的介绍 高效搭建离线大语言模型问答平台:实用指南。今天主要讲离线包,包括开源项目代码,模型文件,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 torchaudio2.安装pytorch: 从这里获取命令,https://pytorch.org/get-started/locally/  , 运行时加前缀,比如

./system/python/Scripts/pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
  1. 再次运行 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

  1. 新建知识库-导入数据。 这里使用QA拆分,这种导入方法会将你上传的文档读取并理解后,拆分成一些问答对。也就是知识梳理了一遍,对于后续回答准确度能有较大提升。 当然,你也可以试其它导入方式。导入时间与文档大小,后端LLM能力,机器性能相关。耐心等待吧。

  2. 新建一个应用,选择 知识训+对话引导选择模型,关联刚才创建的知识库,就可以问知识库里的东西了。http://localhost:3003/

  3. 点“外接”可以创建对话应用URL,直接访问,或iframe方式嵌入到已有页面。

  4. 点API访问可创建此对话应用的API,基于此API,可二次开发或接入其它应用。下面讲到。

应用二次开发

上面应用界面上点API访问后,有3个信息出现。其中 <API密钥>-<AppID>组合在一起就是一个API Key(Token), 配合API服务器,就可以用在其它应用中了。

所以, 总结一下,全篇讲了有3处API和API BASE URL (它们都符合OPenAI API规范,具体怎样的请查阅OpenAI文档)。 这3处API对应最开始两张图中的3个标记。以下是用例说明。

  1. 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

  1. 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
  1. 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


继续滑动看下一个
越山集
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存