系列文章

  1. 大模型在自动驾驶领域的应用(上:可能性)
  2. 语言大模型的本地部署.lite
  3. 自有数据辅助的大语言模型问答精度改进
  4. 大模型在自动驾驶领域的应用(下:可行性).tbd

项目背景

本文尝试在本机部署私有大语言模型。评论系统用于收集“本地部署大模型”的散装资料。

私有语言大模型的本地部署是比较紧迫的工作——因为另一个云主机的OSINT资料膨胀地很快,却缺乏高效的数据清洗的手段。而LLM可以提供一个比较便捷的方式进行非结构化数据的整理、规范。本文工作及后续任务包括以下几项:

  1. 【本文】在本地部署私有语言大模型(Large Language Models);
  2. 【本地】LangChain的数据摄入(将OSINT数据供给本地私有LLM);
  3. 【云端】OSINT的prompt engineering,这是定制化比较高的工作;
  4. 【可视化】在自己Github的Codespaces中安装JupyterLab 4.1:

注:可视化面板用于汇聚本地数据和云端OSINT,以定制化数据面板给合伙人远程试用。

上述几项工作的排程:

本地部署现状

调研之后发,现在本地部署私有语言大模型的框架或软件主要存在以下几个分歧(为了避免不必要的麻烦,批评有些软件的时候会隐去其名称):

  1. 是否可以使用多种开源语言大模型(有些软件目前只能提供商用大模型的API);
  2. 是否保证用户的个人数据不会泄露(有些大语言平台虽然可以摄入用户数据,但是会把用户摄入的数据上传到hub中,以供训练大模型);
  3. 是否支持中文(可以参考SuperCLUE琅琊榜(语言大模型中文榜单));

以上三点是我最看重的因素。在调研中我发现一些软件提供了更加丰富的功能,譬如langgenius/dify这个软件,虽然当前它仅仅支持OpenAI的API接口,但是它声称将来会支持更多的开源LLM。当前它具有如下特色:

  1. Create AI-powered apps in minutes (prompt engineering, and so on);
  2. Use your data as the context for AI;
  3. Compatible ChatGPT Plugins;
  4. Support GPT-4 and other models(not avaliable currently);
  5. A simple set of APIs.

另外一些比较有特色的框架还有:

  1. 支持多模态的框架: go-skynet/LocalAIoobabooga/text-generation-webui,遗憾的是这俩软件没有直接提供摄入用户个人数据的界面。
  2. 支持大模型运行于低配硬件:go-skynet/LocalAI(无法直接摄入用户数据)。
  3. 支持插件功能:oobabooga/text-generation-webui(无法直接摄入用户数据) 和 langgenius/dify(目前暂时不支持开源模型)。

解决方案设计

“开源语言大模型”、“摄入用户数据”、“中文支持”——以这三个因素为标准,上一节提到的几个软件与我需求最接近;而且额外提供的诸如多模态、插件支持特别吸引人。但是满足全部要求的,却是imClumsyPanda/langchain-ChatGLMwenda-LLM/wenda。因此,为解燃眉之急,现在先用wenda-LLM/wenda救急。同时,按照优先级对下述框架进行日常的关注:

  1. langgenius/dify
  2. oobabooga/text-generation-webui
  3. go-skynet/LocalAI

项目工程实施

wenda-LLM/wenda

  1. 下载Windows懒人包:夸克链接:https://pan.quark.cn/s/c4cb08de666e 提取码:4b4R
  2. 参考懒人包进行一键安装

在安装懒人包的时候,只需实施几个关键步骤:

  1. 启动闻达启动器.bat
  2. 在主界面的程序管理点击按钮更改配置文件修改config.yml。重点配置以下字段:
    1. llm_models下的rwkvpath。指向rwkv的模型文件;
    2. 其它模型的path。譬如,glm6bpath也是指向chatglm-6b的模型文件(需要git-clone
  3. 直接运行大模型:程序运行-运行服务GLM6B-打开网页
  4. 间接运行大模型:通过其它启动器运行大模型,此时其它启动器会开启API;然后在闻达启动器-RUNNER-运行服务API-打开网页。我就是用这种方式运行RWKV模型。

langchain-ChatGLM

等待该项目的成熟度上来,再试用以下。该项目的代码简洁清晰,适合scrach自己的LLM应用时,作为参考。

讨论与总结

chatGLM-6B和RWKV-4-Raven-14B这两个对话模型均同时支持中文、英语。我试用了几天,总体感觉是:

  1. chatGLM-6B在我Nvidia 3070上运行得有些卡顿,而且上下文长度只有2048,太短了,天然的不适合大段文字。此外,由于langchain-ChatGLM在多轮对话上优化不够,据网友反映:当运行几次对话后显存会爆掉(截至2023年6月15日)。上下文长度太短、多轮对话挤爆显存——这是我暂时弃用的原因。
  2. RWKV-4-Raven-14B的运行速度还是可以接受的,推理过程中显存几乎保持稳定;而且上下文长度有8192——RWKV模型具有RNN的优势,理论上具有无限长的上下文。此外,wenda-LLM/wenda为了解耦多轮对话对显存容量的依赖,可把会话历史存储在内存中。这对于只有8G显存、却有64G内存的笔记本,是非常有用的技术。

从实用的角度,我目前暂时试用RWKV的大模型。但是其推理能力让我还是有些介意:可能是由于模型没在我的专业领域知识上训练、微调过,总是感觉在回答我专业问题是,大模型的思维模式显得非常业余。下一步我会把自己的资料作为知识库,对RWKV模型进行训练和参数微调,可以参考的框架有:

  1. imClumsyPanda/langchain-ChatGLM:学习LLMOps的程序架构。
  2. shibing624/MedicalGPT:学习如何基于专业领域知识对LLM进行参数微调。

近期出现的大模型,都是基于Transformer的网络结构。即使RWKV这个号称基于RNN的异类的大模型,有人评价说其身上也有Efficient Transformer的影子。Transformer这么厉害,我们自然要关注一番。本博客的基调是:凝练问题,给出解法,着眼于落地。因此,从预印版论文《A Comprehensive Survey on Applications of Transformers for Deep Learning Tasks - 20230611》中,我撷取了Transformer在不同应用领域的变种。有了这个guide,至少能让我们能纲举目张、给自己的研究找个定位,心里少一些迷失的焦虑感——毕竟,人类最大的恐惧来源于未知。

Application-based taxonomy of transformer models|根据应用类型分类的transformer模型