菜单

本地LLM管理

相关源文件

本页文档介绍了 GPT Academic 如何管理和利用本地 LLM(大型语言模型)实现。它涵盖了允许在用户本地机器上运行各种 LLM 的架构,而不是调用外部 API。有关远程 LLM 集成的信息,请参阅 LLM Bridge Architecture

概述

GPT Academic 支持在本地运行多个开源大型语言模型,包括 ChatGLM 系列、InternLM 和 ONNX 优化模型。该系统使用模块化架构来管理这些本地模型,并提供一个通用基类来处理进程隔离、资源管理以及主应用程序与模型进程之间的通信。

来源: request_llms/local_llm_class.py67-215 request_llms/bridge_chatglm3.py12-97 request_llms/bridge_chatglm.py13-78 request_llms/bridge_internlm.py37-203 request_llms/bridge_chatglmonnx.py20-72

核心架构

本地 LLM 系统采用父子进程架构,将模型加载和推理与主应用程序隔离开。这可以防止内存问题并提供更好的资源管理。

来源: request_llms/local_llm_class.py67-215

基类:LocalLLMHandle

LocalLLMHandle 类是所有本地模型实现的基石。它继承了 Python 的 Process 类,以在单独的进程中运行模型,并实现了以下方法:

  1. 加载模型信息和依赖项
  2. 管理进程状态和通信
  3. 将生成的文本流式传输回主进程

子类必须实现的键方法

方法目的进程
load_model_info()定义模型名称和安装命令子类
load_model_and_tokenizer()加载实际的模型和分词器子类
llm_stream_generator()从模型生成文本子类
try_to_import_special_deps()检查所需依赖项主进程

来源: request_llms/local_llm_class.py67-170

实例管理

本地 LLM 实例通过单例模式进行管理,以确保高效的资源利用。GetSingletonHandle 类维护一个模型实例字典,允许系统重用现有模型,而不是创建新模型。

来源: request_llms/local_llm_class.py31-44

支持的模型

ChatGLM3

ChatGLM3 通过 GetGLM3Handle 类实现。它支持多种量化选项(INT4、INT8 或全精度),并且可以在 CPU 或 GPU 上运行。

主要功能

  • 通过 CHATGLM_LOCAL_MODEL_PATH 配置模型路径
  • 通过 LOCAL_MODEL_QUANT 进行多种量化选项
  • 通过 LOCAL_MODEL_DEVICE 进行设备选择
  • 历史记录格式遵循 ChatGLM3 的对话格式

来源: request_llms/bridge_chatglm3.py12-97

ChatGLM2

ChatGLM2 通过 GetGLM2Handle 类实现,具有与 ChatGLM3 类似的功能,但使用了不同的模型架构。

模型加载选项

  • INT4: THUDM/chatglm2-6b-int4
  • INT8: THUDM/chatglm2-6b-int8
  • FP16: THUDM/chatglm2-6b

来源: request_llms/bridge_chatglm.py13-78

InternLM

InternLM 通过 GetInternlmHandle 类实现。它使用更复杂的文本生成过程,并带有自定义的提示格式。

主要功能

  • 使用 internlm/internlm-chat-7b 模型
  • 使用特定 token 的自定义提示格式
  • 详细的生成控制参数

来源: request_llms/bridge_internlm.py37-203

ChatGLM-ONNX

ChatGLM-ONNX 通过 GetONNXGLMHandle 类实现。它使用 ONNX 运行时进行优化推理。

主要功能

  • 使用 ONNX 运行时在 CPU 上实现更快的推理
  • 如果文件不存在,则从 Hugging Face 下载模型文件
  • 比全精度模型占用更少的内存

来源: request_llms/bridge_chatglmonnx.py20-72

与主系统的集成

本地 LLM 实现通过 get_local_llm_predict_fns() 生成的标准预测函数与系统其余部分集成。

来源: request_llms/local_llm_class.py216-322

预测函数

为每个模型生成两个主要函数

  1. predict_no_ui_long_connection():用于非 UI 交互,供插件和程序化访问使用
  2. predict():用于基于 UI 的交互,与聊天界面集成

两个函数都处理:

  • 检查模型状态和加载状态
  • 根据模型要求格式化对话历史
  • 将生成的文本流式传输回调用者
  • 错误处理和资源管理

来源: request_llms/local_llm_class.py219-322

线程安全与并发

本地 LLM 系统使用多种机制来确保线程安全和正确的资源管理:

  1. 进程隔离:模型在单独的进程中运行,以隔离内存使用。
  2. 线程锁:防止多个线程同时访问同一模型。
  3. 消息队列:允许进程之间的异步通信。
  4. 状态管理:跟踪模型状态(加载中、就绪、损坏)。

当多个请求同时到达时,ThreadLock 类用于同步对模型的访问。

来源: request_llms/local_llm_class.py10-29 request_llms/local_llm_class.py190-214

配置与优化

本地 LLM 的行为可以通过 config.py 中的多个参数进行配置:

参数描述用途
CHATGLM_LOCAL_MODEL_PATHChatGLM3 模型文件的路径ChatGLM3
LOCAL_MODEL_QUANT量化级别(INT4、INT8 或无)所有模型
LOCAL_MODEL_DEVICE运行模型的设备(cpu 或 cuda)所有模型

内存优化策略

  1. 量化:降低模型精度以节省内存(INT4、INT8)。
  2. ONNX Runtime:使用优化的推理引擎以提高 CPU 性能。
  3. 进程隔离:防止内存泄漏影响主应用程序。
  4. 单例模式:重用模型实例,避免重复加载模型。

来源: request_llms/bridge_chatglm3.py26-56 request_llms/bridge_chatglm.py26-41 request_llms/bridge_internlm.py54-64

使用示例

可以使用测试模块来测试本地 LLM。

来源: tests/test_llms.py36-56

错误处理与依赖管理

该系统包含强大的错误处理机制:

  1. 依赖检查:模型在加载前检查所需依赖项。
  2. 清晰的错误消息:自定义错误消息会解释安装要求。
  3. 状态报告:跟踪并向用户报告模型状态。
  4. 进程监控:看门狗机制可以检测并处理挂起的模型。

如果缺少依赖项,用户将收到一条清晰的消息。

缺少{model_name}的依赖,如果要使用{model_name},除了基础的pip依赖以外,您还需要运行{cmd_to_install}安装{model_name}的依赖。

来源: request_llms/local_llm_class.py125-134 request_llms/local_llm_class.py166-169