本地部署开源大模型教程
在过去的几个月里,大型语言模型(LLM)获得了极大的关注,这些模型创造了令人兴奋的前景,特别是对于从事聊天机器人、个人助理和内容创作的开发人员。
大型语言模型(LLM)是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用广泛的数据集进行训练,这些数据集包括书籍、文章、网站和其他来源。通过分析数据中的统计模式,LLM 可以预测给定输入后最可能出现的单词或短语。
以上是目前的 LLM 的一个全景图。
在本文中,我将演示如何利用 LLaMA 7b 和 Langchain 从头开始创建自己的 Document Assistant。
背景知识
1. LangChain
LangChain 是一个令人印象深刻且免费的框架,它彻底改变了广泛应用的开发过程,包括聊天机器人、生成式问答(GQA)和摘要。通过将来自多个模块的组件无缝链接,LangChain 能够使用大部分的 LLM 来创建应用程序。
2. LLaMA
LLaMA 是由 Facebook 的母公司 Meta AI 设计的一个新的大型语言模型。LLaMA 拥有 70 亿到 650 亿个参数的模型集合,是目前最全面的语言模型之一。2023 年 2 月 24 日,Meta 向公众发布了 LLaMA 模型,展示了他们对开放科学的奉献精神。
3. 什么是 GGML
GGML 是一个用于机器学习的张量库,它只是一个 C++ 库,允许你在 CPU 或 CPU + GPU 上运行 LLM。它定义了用于分发大型语言模型(LLM)的二进制格式。GGML 使用了一种称为量化的技术,该技术允许大型语言模型在消费者硬件上运行。
4. 量化
我们都知道,模型的权重是浮点数。就像表示大整数(例如 1000)比表示小整数(例如 1)需要更多的空间一样,表示高精度浮点数(例如 0.0001)比表示低精度浮点数(例如 0.1)需要更多的空间。量化大型语言模型的过程涉及降低表示权重的精度,以减少使用模型所需的资源。GGML 支持许多不同的量化策略(例如 4 位、5 位和 8 位量化),每种策略在效率和性能之间提供不同的权衡。
下面是量化后模型大小的对比:
5. Streamlit
Streamlit 是一个用于构建数据科学和机器学习应用程序的开源 Python 库。它旨在使开发人员能够以简单快速的方式构建交互式应用程序,无需繁琐的前端开发。Streamlit 提供了一组简单的 API,可用于创建具有数据探索、可视化和交互功能的应用程序。只需要通过简单的 Python 脚本就可以创建一个 Web 应用程序。可以利用 Streamlit 的丰富组件库来构建用户界面,例如文本框、滑块、下拉菜单和按钮,以及可视化组件,例如图表和地图。
1. 建立虚拟环境和项目结构
设置虚拟环境为运行应用程序提供了一个受控和隔离的环境,确保其依赖关系与其他系统范围的包分离。这种方法简化了依赖关系的管理,并有助于维护不同环境之间的一致性。
然后就是创建我们的项目,一个好的结构会加速我们的开发。
在 models 的文件夹中,我们要存储下载的 LLM,setup_env.bat 将从 pipfile 中安装所有依赖项。而 run_app.bat 则是直接运行我们的 app。(以上 2 个文件都是 Windows 环境下的脚本)
2. 在本地机器上安装 LLaMA
为了有效地使用模型,必须考虑内存和磁盘。由于模型需要完全加载到内存中,因此不仅需要有足够的磁盘空间来存储它们,还需要足够的 RAM 在执行期间加载它们。比如 65B 模型,即使在量化之后,也需要 40GB 的 RAM。
所以为了在本地运行,我们将使用最小版本的 LLaMA,也就是 LLaMA 7B。虽然它是最小的版本,但是 LLaMA 7B 也提供了很好的语言处理能力,我们能够高效地实现预期的结果。
为了在本地 CPU 上执行 LLM,我们使用 GGML 格式的本地模型。这里直接从 Hugging Face Models 存储库直接下载 bin 文件,然后将文件移动到根目录下的 models 目录中。
上面我们已经是说了,GGML 是 C++ 库,所以还需要使用 Python 调用 C++ 的接口,好在这一步很简单,我们将使用 llama-cpp-python,这是 LLaMA .cpp 的 Python 绑定,它在纯 C/C++ 中充当 LLaMA 模型的推理。cpp 的主要目标是使用 4 位整数量化来运行 LLaMA 模型。这样可以可以有效地利用 LLaMA 模型,充分利用 C/C++ 的速度优势和 4 位整数量化的优势。
llama.cpp 还支持很多其他模型,下图是列表:
准备好 GGML 模型和所有依赖项之后,就可以开始 LangChain 进行集成了。但是在开始之前,我们还需要做一下测试,保证我们的 LLaMA 在本地是可用的:
看样子没有任何问题,并且程序是完全脱机并以完全随机的方式(可以使用温度超参数)运行的。


