语言大模型的本地部署.lite
系列文章
项目背景
私有语言大模型的本地部署是比较紧迫的工作——因为另一个云主机的OSINT资料膨胀地很快,却缺乏高效的数据清洗的手段。而LLM可以提供一个比较便捷的方式进行非结构化数据的整理、规范。本文工作及后续任务包括以下几项:
- 【本文】在本地部署私有语言大模型(Large Language Models);
- 【本地】LangChain的数据摄入(将OSINT数据供给本地私有LLM);
- 【云端】OSINT的prompt engineering,这是定制化比较高的工作;
- 【可视化】在自己Github的Codespaces中安装
JupyterLab 4.1
:
注:可视化面板用于汇聚本地数据和云端OSINT,以定制化数据面板给合伙人远程试用。
上述几项工作的排程:
flowchart TB 1("1.locally deploy private LLM for:       a. local data,       b. remote OSINT") -->|next action| a("2.LangChain local data") & c("4. deploy JupyterLab 4.1 in Github Codespaces") -->|next action| b("3.local prompt for remote OSINT") subgraph Dataview ["           Dataview Panel"] direction LR a("2.LangChain local data") -.data flow.-> c("4. deploy JupyterLab 4.1 in Github Codespaces") end style Dataview fill:#ffffde, stroke:none classDef default stroke:#333, stroke-width:0.2px, text-align:left;
本地部署现状
调研之后发,现在本地部署私有语言大模型的框架或软件主要存在以下几个分歧(为了避免不必要的麻烦,批评有些软件的时候会隐去其名称):
- 是否可以使用多种开源语言大模型(有些软件目前只能提供商用大模型的API);
- 是否保证用户的个人数据不会泄露(有些大语言平台虽然可以摄入用户数据,但是会把用户摄入的数据上传到hub中,以供训练大模型);
- 是否支持中文(可以参考SuperCLUE琅琊榜(语言大模型中文榜单));
以上三点是我最看重的因素。在调研中我发现一些软件提供了更加丰富的功能,譬如langgenius/dify这个软件,虽然当前它仅仅支持OpenAI的API接口,但是它声称将来会支持更多的开源LLM。当前它具有如下特色:
- Create AI-powered apps in minutes (prompt engineering, and so on);
- Use your data as the context for AI;
- Compatible ChatGPT Plugins;
- Support GPT-4 and other models(not avaliable currently);
- A simple set of APIs.
另外一些比较有特色的框架还有:
- 支持多模态的框架: go-skynet/LocalAI 和 oobabooga/text-generation-webui,遗憾的是这俩软件没有直接提供摄入用户个人数据的界面。
- 支持大模型运行于低配硬件:go-skynet/LocalAI(无法直接摄入用户数据)。
- 支持插件功能:oobabooga/text-generation-webui(无法直接摄入用户数据) 和 langgenius/dify(目前暂时不支持开源模型)。
解决方案设计
“开源语言大模型”、“摄入用户数据”、“中文支持”——以这三个因素为标准,上一节提到的几个软件与我需求最接近;而且额外提供的诸如多模态、插件支持特别吸引人。但是满足全部要求的,却是imClumsyPanda/langchain-ChatGLM 和 wenda-LLM/wenda。因此,为解燃眉之急,现在先用wenda-LLM/wenda救急。同时,按照优先级对下述框架进行日常的关注:
项目工程实施
wenda-LLM/wenda
- 下载Windows懒人包:夸克链接:https://pan.quark.cn/s/c4cb08de666e 提取码:4b4R
- 参考懒人包进行一键安装
在安装懒人包的时候,只需实施几个关键步骤:
- 启动
闻达启动器.bat
; - 在主界面的程序管理点击按钮更改配置文件修改
config.yml
。重点配置以下字段:llm_models
下的rwkv
的path
。指向rwkv的模型文件;- 其它模型的
path
。譬如,glm6b
的path
也是指向chatglm-6b
的模型文件(需要git-clone
)
- 直接运行大模型:程序运行-运行服务GLM6B-打开网页
- 间接运行大模型:通过其它启动器运行大模型,此时其它启动器会开启API;然后在闻达启动器-RUNNER-运行服务API-打开网页。我就是用这种方式运行RWKV模型。
langchain-ChatGLM
等待该项目的成熟度上来,再试用以下。该项目的代码简洁清晰,适合scrach自己的LLM应用时,作为参考。
讨论与总结
chatGLM-6B和RWKV-4-Raven-14B这两个对话模型均同时支持中文、英语。我试用了几天,总体感觉是:
- chatGLM-6B在我Nvidia 3070上运行得有些卡顿,而且上下文长度只有2048,太短了,天然的不适合大段文字。此外,由于langchain-ChatGLM在多轮对话上优化不够,据网友反映:当运行几次对话后显存会爆掉(截至2023年6月15日)。上下文长度太短、多轮对话挤爆显存——这是我暂时弃用的原因。
- RWKV-4-Raven-14B的运行速度还是可以接受的,推理过程中显存几乎保持稳定;而且上下文长度有8192——RWKV模型具有RNN的优势,理论上具有无限长的上下文。此外,
wenda-LLM/wenda
为了解耦多轮对话对显存容量的依赖,可把会话历史存储在内存中。这对于只有8G显存、却有64G内存的笔记本,是非常有用的技术。
从实用的角度,我目前暂时试用RWKV的大模型。但是其推理能力让我还是有些介意:可能是由于模型没在我的专业领域知识上训练、微调过,总是感觉在回答我专业问题是,大模型的思维模式显得非常业余。下一步我会把自己的资料作为知识库,对RWKV模型进行训练和参数微调,可以参考的框架有:
- imClumsyPanda/langchain-ChatGLM:学习LLMOps的程序架构。
- shibing624/MedicalGPT:学习如何基于专业领域知识对LLM进行参数微调。