音乐播放器
sola的小屋
 
文章 标签
20

Powered by Gridea | Theme: Fog
载入天数...
载入时分秒...
总访问量:  |   访问人数:

InferLLM大模型推理框架项目(01)——项目概括

InferLLM是一个来自旷视天元MegEngine的 C++ 大模型推理框架项目,主要参考和借鉴了llama.cpp工程。

为什么不选择llama.cpp做为大模型推理框架学习入门?

  • llama.cpp核心代码大都在少量文件中,并且使用大量的宏。
  • InferLLM对 Kernel 部分进行解耦;定义 KVstorage 类型,方便缓存管理;对多平台进行了优化。

InferLLM是一个 C++ 大语言模型推理框架项目。首先从整体上分析其结构和功能:

InferLLM 代码库结构分析

InferLLM 是一个轻量级的 LLM (大型语言模型) 推理框架,主要参考和借鉴了 llama.cpp 工程,但进行了更好的结构化设计。下面是对整个代码库结构的分析:

1. 顶层目录结构

InferLLM/
├── application/     # 应用程序目录,包含各种模型的应用实现
├── assets/          # 资源文件
├── docs/            # 文档
├── include/         # 公共头文件
├── src/             # 源代码
├── test/            # 测试代码
├── third-party/     # 第三方依赖
└── tools/           # 工具脚本

2. 核心代码结构 (src/)

2.1 核心模块 (src/core/)

核心模块包含了框架的基础组件:

  • tensor.h: 张量定义,是框架的基本数据结构
  • graph.h: 计算图定义,包含了模型的结构和执行逻辑
  • op.h: 算子定义,实现各种计算操作
  • kvstorage.h: KV存储,用于缓存和管理键值对
  • thread_pool.h: 线程池实现,用于并行计算

2.2 计算内核 (src/kern/)

计算内核部分包含了不同平台的优化实现:

  • naive/: 朴素实现,作为基准和兜底方案
  • optimized/: 针对不同平台的优化实现
    • arm/: ARM 平台优化
    • x86/: x86 平台优化
    • rvv/: RISC-V 向量扩展优化
  • gpu/: GPU 实现,主要是 CUDA 相关代码
  • kernel_define.h: 内核定义和接口

2.3 图结构 (src/graph/)

包含了不同模型的图结构实现:

  • 各种模型的具体实现,如 LLaMA、ChatGLM 等

3. 应用程序 (application/)

包含了各种模型的应用实现:

  • chat.cpp: 通用聊天应用
  • llama/: LLaMA 模型应用
  • chatglm/: ChatGLM 模型应用
  • baichuan/: Baichuan 模型应用
  • quantizer.cpp: 量化工具

4. 测试代码 (test/)

测试代码分为 CPU 和 GPU 两部分:

  • CPU/: CPU 相关测试
  • GPU/: GPU 相关测试
  • checker.h/cpp: 测试辅助工具
  • op_create.cpp: 算子创建测试

5. 关键数据结构和类

5.1 Tensor

张量是基本数据结构,用于表示多维数组数据。

5.2 Graph

计算图是模型的骨架,定义了计算流程和模型结构:

class Graph : public std::enable_shared_from_this<Graph> {
    // ...
    virtual void construct_llm() = 0;
    // ...
}

5.3 OprModuleBase

算子模块是计算图中的基本单元,实现各种计算操作:

class OprModuleBase {
    // ...
    virtual void execute(WorkSpace* workspace, uint32_t nr_past, bool is_prefill = false);
    // ...
}

5.4 KvStorage

KV存储用于缓存和管理键值对,特别是在推理过程中:

class KvStorage : public Tensor {
    // ...
    void* get_current_data();
    size_t add_id(uint32_t id);
    void reset_id();
    // ...
}

5.5 WorkSpace

工作空间用于临时存储计算过程中的数据:

class WorkSpace {
    // ...
    void* ptr();
    size_t length();
    // ...
}

6. 优化策略

代码库针对不同平台实现了不同的优化策略:

  1. ARM 优化: 使用 NEON 指令集进行向量化计算
  2. x86 优化: 使用 AVX/AVX2 指令集进行向量化计算
  3. RISC-V 优化: 使用 RVV 向量扩展进行向量化计算
  4. GPU 优化: 使用 CUDA 进行并行计算

7. 模型支持

根据代码库,InferLLM 支持多种模型格式:

  • LLaMA 系列模型
  • ChatGLM 系列模型
  • Baichuan 系列模型
  • 支持 int4 量化模型

8. 主要功能特性

  1. 多模型支持

    • ChatGLM 系列(ChatGLM、ChatGLM2、ChatGLM3)
    • LLaMA 系列
    • Baichuan 系列
  2. 多平台优化

    • x86 CPU 优化
    • ARM 处理器优化
    • RISC-V 向量扩展优化
    • GPU 加速支持
  3. 工具支持

    • 模型量化工具
    • 模型转换工具
    • Android 构建支持
  4. 核心功能

    • 高效的张量计算
    • 动态计算图
    • 模型推理优化
    • 多线程支持
    • KV 缓存管理

9. 项目特点

  1. 跨平台支持:支持多种硬件平台和架构
  2. 模块化设计:核心功能、计算图、内核优化分层清晰
  3. 性能优化:针对不同平台提供优化的计算核心
  4. 完整的测试框架:包含单元测试和性能测试
  5. 实用工具集:提供模型转换和量化等实用工具

总结

InferLLM是一个结构清晰、模块化设计的 LLM 推理框架,通过解耦框架部分和内核部分,使得代码更易于阅读和修改。它支持多种模型格式,并针对不同平台进行了优化,可以在包括移动设备在内的多种平台上高效运行。