十年 C++ 后端 GAP 六个月,写了一个近 3 万行的LLM推理框架
1. 为什么写这个框架?
作为工作多年的 C++ 后端开发者,面对如今 AI 大一统的局势,相信很多小伙伴应该和我一样都很焦虑吧。在 AI 迭代如此之快的当下,怎么样从一个传统后端转型为 AI 行业从业者,相信很多和我类似的小伙伴都会或多或少有过这样的想法。毕竟当下 AI 太火了,薪资过于诱人,哈哈哈。
去年由于家里人生病缘故,需要照顾家里,因此思虑再三过后决定裸辞。天知道大龄程序员裸辞需要多大的勇气。裸辞后,除了处理家里事情以外,每天都在思考自己未来的职业规划。无时无刻都在焦虑,不知道过段时间自己是否还可以找到一份薪资相当的工作。毕竟我也是有房贷的打工仔。那段时间真的是每天晚上都很难入睡,每天刷着招聘软件看看目前热招的岗位,然后思考该何去何从。
这样持续了大概一个月后,也就是去年国庆节前后,我开始觉得一直这么想东想西没有任何的意义。不如利用 GAP 期间自己写点东西,反正在家闲着也是闲着。思考再三后,我决定利用 GAP 期间自己写一个 LLM推理框架,因为自己之前有相关 GPU 算子优化的经验,加之一直也想转 AI。就这样开始了这个项目。
一开始也没想写太复杂,就想着写一个最简的 LLM推理框架。可能后来写着写着经过不断的重构,最后拉通第一个版本有了近 3 万行代码。到这里可能很多人觉得 3 万行也不算啥,确实,但是这确实也远超我最开始的目标了。不管怎样,在每天的焦虑中,经过不断的重构再重构,最终在春节前夕拉通了第一个版本(虽然后来发现有很多问题,但是当时跑起来时确实还是蛮开心的)。
后面陆陆续续修修补补,到目前基本上支持 Q8 量化的 QWEN3-8B 模型的推理了。也支持算子融合、图优化、显存优化、KV Cache 优化等等功能。过程虽然有点痛苦,但是写完后觉得还是非常开心的。
未来我会定期更新自己整个从 0 到 1 的过程,虽然和目前开源的一些推理框架相比还有很大的差距,但是至少还是能提供一些参考。也希望小伙伴们喜欢这个项目,也欢迎大家提 issue,一起交流。
2. 项目概览
TFFInfer - LLM推理框架
项目地址: Gitee - gitee.com/NKK_Ovit/tf… GitHub - github.com/NKKdev/TFFi…
2.1 项目概述
TFFInfer 是一个从零自主研发的大语言模型(LLM)推理框架,采用现代 C++20 标准开发,支持 CUDA GPU 加速。项目代码量近 3 万行, 实现了完整的 LLM推理流水线,包括模型加载、计算图构建、图优化、显存管理、KV Cache 优化、任务调度等核心功能。
2.2 技术栈
| 类别 | 技术选型 | 说明 |
|---|---|---|
| 编程语言 | C++20 | 现代 C++ 特性,概念、协程等 |
| GPU 后端 | CUDA 12.x | 支持 Compute Capability 12.0 |
| 构建系统 | CMake 3.18+ | 跨平台构建工具 |
| 日志系统 | Google glog | 高性能日志库 |
| 任务调度 | Taskflow v3.10.0 | DAG 任务流引擎 |
| 数学优化 | libdivide v5.2.0 | 快速除法运算 |
| 数据解析 | nlohmann/json v4.0.0 | JSON 处理 |
2.3 支持的模型
- ✅ Qwen3-8B (Q8_0 量化版本)
- ✅ GGUF 格式 模型加载
- ✅ 可扩展 的模型架构设计(支持自定义模型接入)
3. 核心特性
3.1 🚀 计算图优化
| 特性 | 说明 | 收益 |
|---|---|---|
| DAG 计算图 | 基于有向无环图的计算图表示,支持自动拓扑排序 | 清晰的依赖关系,便于优化 |
| 算子融合 | 自动检测并融合可合并的算子(如 Element-wise 操作) | 减少 Kernel 启动开销 |
| 死代码消除 | 移除未使用的计算节点 | 降低显存占用,提升执行效率 |
| 设备分配优化 | 智能分配计算任务到最优设备(CPU/GPU) | 最大化硬件利用率 |
| 生命周期分析 | 精确计算张量生命周期,实现显存复用 | 减少峰值显存占用 |
3.2 💾 显存优化
| 技术 | 实现方式 | 效果 |
|---|---|---|
| 动态显存管理 | 基于生命周期的显存分配策略 | 按需分配,避免浪费 |
| 灵活的层间显存复用 | 不同层的中间激活共享显存空间,支持自定义层间显存复用 | 显著降低显存需求 |
| 内存池技术 | 预分配大块显存,避免频繁分配/释放 | 减少显存碎片化 |
| 延迟回收 | 利用 CUDA Stream 实现异步内存释放 | 避免阻塞计算流 |
| 对齐优化 | 256 字节对齐,提升内存访问效率 | 提升内存带宽利用率 |
3.3 📦 KV Cache 优化
| 优化点 | 实现方式 | |
|---|---|---|
| KV Cache 预分配 | 预分配 KV Cache,避免动态分配 | 提升性能 |
| KV Cache 缓存复用 | 相同PROMPT的KV Cache复用 | |
| KV Cache 支持PAGED | paged attention 查表获取kv cache |
3.4 🚀 支持多设备扩展
| 设备类型 | 说明 |
|---|---|
| CPU | 支持多核CPU计算(目前CPU上仅用来作必要的输入及输出计算,未来扩展CPU算子后支持CPU全流程推理) |
| GPU | 支持多块GPU计算 |
| CPU和GPU异步计算 | 支持CPU与GPU的异步协同 |
4. 快速开始
- 安装依赖库 glog,taskflow,libdivide(不是必须),json等三方库,项目CmakeList文件中已配置好依赖库安装,如果网络原因太慢可以自行下载源码并编译安装。
- 内置tffInfer_test测试程序,运行如下命令 编译:test 目录小运行: cmake . && make -j8
5. 未来计划
- 添加更多模型支持
- 添加更多算子支持
- 添加Dynamic Batching以及Continuous Batching功能
- 定期更新项目编写历程以及遇到的问题。
- 后续业余时间还会持续优化相关算子并分享优化过程,也欢迎感兴趣的小伙伴提issue,一起交流。有兴趣的小伙伴也可以加入到项目里来。