Happy Infer 是一个独立开发的高性能大模型推理框架,参考了 FasterTransformer 的优秀设计理念。该框架专注于使用 CUDA 并行计算、算子融合、高性能库封装和内存映射等先进技术来提升推理性能。
目前支持 LLaMA2 和 LLaMA3 模型在 FP32 和 FP16 精度下的多轮连续对话推理任务。
- 高性能推理: 在 A800 GPU 上,LLaMA2 7B 模型 FP32 精度的 token latency 为 27ms,FP16 精度为 13ms
- 内存优化: 使用 mmap 固定内存多流异步数据传输,权重加载耗时缩短至原来的六分之一
- 算子融合: 实现多种 CUDA 算子融合,包括 attention 部分的全部算子融合
- 高效 Gemm: QKV Linear 和 Gate UP Linear 权重拼接,减少 Gemm 调用次数
- 智能批处理: Selective Batching 技术,动态优化 padding 处理
- 向量化优化: float4、half2 向量化读写,提升带宽效率
| 模型 | 精度 | Token Latency | GPU |
|---|---|---|---|
| LLaMA2 7B | FP32 | 27ms | A800 |
| LLaMA2 7B | FP16 | 13ms | A800 |
与适配 LLaMA 模型后的 FasterTransformer 推理速度基本一致
Happy_Infer/
├── src/ # 源代码目录
│ ├── kernels/ # CUDA 核心算子实现
│ │ ├── fused_decoder_self_attention.cu # 融合自注意力算子
│ │ ├── qkv_bias_and_RoPE.cu # QKV 偏置和旋转位置编码
│ │ ├── fused_addresidual_norm.cu # 融合残差连接和归一化
│ │ ├── rmsnorm_kernel.cu # RMSNorm 算子
│ │ ├── attn_softmax_kernel.cu # 注意力 Softmax 算子
│ │ ├── topK.cu # TopK 采样算子
│ │ ├── cublas_utils.cc # cuBLAS 封装
│ │ └── ... # 其他 CUDA 算子
│ ├── models/ # 模型实现
│ │ ├── llama/ # LLaMA 模型实现
│ │ ├── basemodel.h # 基础模型接口
│ │ └── tokenizer.h # 分词器实现
│ ├── layers/ # 网络层实现
│ ├── memory/ # 内存管理
│ ├── weights/ # 权重管理
│ └── utils/ # 工具函数
├── tools/ # 工具脚本
│ └── weights_convert.py # 权重转换工具
├── tests/ # 测试代码
│ └── unittests/ # 单元测试
├── build/ # 构建目录
├── CMakeLists.txt # CMake 配置文件
├── user_entry.cpp # 主程序入口
└── README.md # 项目说明文档
- 权重转换: 将模型权重转换为 FP32 类型并保存为独立的 bin 文件
- mmap 加载: 使用内存映射替代传统 ifstream 读取方式
- 异步传输: 固定内存多流异步数据传输技术
- 性能提升: 权重加载耗时缩短至原来的 1/6
- 权重拼接: QKV Linear 和 Gate UP Linear 权重拼接
- 调用优化: 减少 Gemm 调用次数,提高 GPU 并行度
- 库封装: cuBLAS 库 Gemm 运算封装,简化调用流程
- 计算强度: 提升整体计算强度和效率
- Effective Transformer: 计算多 batch 填充值偏移量
- 动态 Padding: attention 计算时拆分 batch 动态添加 padding
- 资源优化: 其他部分合并 batch 动态移除 padding
- 利用率提升: 优化计算资源利用率
- 向量化算子: RMSNorm、Scale、Add、Softmax 等算子 float4、half2 向量化
- 带宽优化: 提升内存带宽效率
- 全融合: self decoder 阶段 attention 部分全部算子融合
- Gemv 优化: 向量化访存与 Gemv 运算优化
- 贪婪搜索: 实现高效贪婪搜索算法
- TopK 采样: 使用小根堆和 cub 块内归约分组排序
- 计算优化: softmax 计算后移,减少不必要的计算开销
- 模块化设计: 算子封装组合成不同层次的模块和网络层
- 代码复用: 提高代码复用率和可扩展性
- 显存管理: 避免推理过程中频繁申请释放显存
- 碎片化优化: 减少显存碎片化,提高执行效率
- 进行 CUDA 算子的全面单元测试
- 与 CPU 实现对比确保结果准确性
- 覆盖所有核心计算算子
- 与 transformers 推理结果进行端到端测试
- 通过输出 tensor 对比验证
- 确保推理精度完全对齐
- CUDA: 10.0 或更高版本
- C++: C++11 标准
- CMake: 3.18 或更高版本
- GPU: 支持 Compute Capability 7.0+ (Tesla V100, RTX 20/30/40 系列, A100, A800 等)
# 克隆项目
git clone <repository-url>
cd happy_infer
# 创建构建目录
mkdir -p build
cd build
# 配置和编译
cmake ..
make -j$(nproc)
# 可选的编译选项
# cmake .. -DPERF=ON # 启用性能测量
# cmake .. -DPRINT_DATA=ON # 启用调试输出
# cmake .. -DSAVE_DATA=ON # 启用数据保存该项目支持以下 GPU 架构:
- sm_70: Tesla V100, Titan V
- sm_75: RTX 20 系列, Tesla T4
- sm_80: A100, RTX 30 系列
- sm_86: RTX 40 系列
使用提供的权重转换工具:
python tools/weights_convert.py --input_dir /path/to/llama/model --output_dir /path/to/converted/weights# 编译后运行主程序
./build/bin/main=== LLaMA 多轮对话系统 (mmap权重加载) ===
正在创建模型...
模型创建完成,耗时: 1500 毫秒
=== 开始多轮对话 ===
输入 'quit' 或 'exit' 退出对话
输入 'clear' 清空对话历史
----------------------------------------
用户: i love you
助手: 开始处理输入...
当前输入编码完成,token数量: 3
474 5360 366
开始生成token...
第一个token生成耗时: 33.9414 ms
, and I will always be here for you.
I know that you are going through a difficult time, and I want you to know that I am here to support you. Whether you need someone to talk to, or a shoulder to cry on, I am here for you.
I know that you are strong and capable, but sometimes we all need a little help. Please don't be afraid to reach out to me, or to anyone else in your life, when you need support.
I love you more than words can express, and I will always be here for you.
生成完成,总共生成了 128 个token
[推理耗时: 3446 毫秒]
----------------------------------------
| 优化技术 | 性能提升 | 说明 |
|---|---|---|
| mmap 权重加载 | 6x 加速 | 内存映射 + 异步传输 |
| 权重拼接 | 减少 Gemm 调用 | QKV 和 Gate UP Linear 合并 |
| 算子融合 | 减少访存开销 | attention 全融合 |
| 向量化访存 | 提升带宽利用 | float4/half2 优化 |
| Selective Batching | 优化资源利用 | 动态 padding 处理 |
- 感谢 FasterTransformer 项目提供的优秀设计理念
- 感谢 NVIDIA 提供的 CUDA 和 cuBLAS 库支持
- 感谢开源社区的贡献和支持
Happy Infer - 让大模型推理更快更高效! 🚀