阅

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. 优化策略
代码库针对不同平台实现了不同的优化策略:
- ARM 优化: 使用 NEON 指令集进行向量化计算
- x86 优化: 使用 AVX/AVX2 指令集进行向量化计算
- RISC-V 优化: 使用 RVV 向量扩展进行向量化计算
- GPU 优化: 使用 CUDA 进行并行计算
7. 模型支持
根据代码库,InferLLM 支持多种模型格式:
- LLaMA 系列模型
- ChatGLM 系列模型
- Baichuan 系列模型
- 支持 int4 量化模型
8. 主要功能特性
-
多模型支持:
- ChatGLM 系列(ChatGLM、ChatGLM2、ChatGLM3)
- LLaMA 系列
- Baichuan 系列
-
多平台优化:
- x86 CPU 优化
- ARM 处理器优化
- RISC-V 向量扩展优化
- GPU 加速支持
-
工具支持:
- 模型量化工具
- 模型转换工具
- Android 构建支持
-
核心功能:
- 高效的张量计算
- 动态计算图
- 模型推理优化
- 多线程支持
- KV 缓存管理
9. 项目特点
- 跨平台支持:支持多种硬件平台和架构
- 模块化设计:核心功能、计算图、内核优化分层清晰
- 性能优化:针对不同平台提供优化的计算核心
- 完整的测试框架:包含单元测试和性能测试
- 实用工具集:提供模型转换和量化等实用工具
总结
InferLLM是一个结构清晰、模块化设计的 LLM 推理框架,通过解耦框架部分和内核部分,使得代码更易于阅读和修改。它支持多种模型格式,并针对不同平台进行了优化,可以在包括移动设备在内的多种平台上高效运行。
赏
