Skip to content

JoyFuture/HappyInfer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Happy Infer - 高性能大模型推理框架

CUDA C++ License

📖 项目简介

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                   # 项目说明文档

🔧 技术特性详解

1. 权重导出与加载优化

  • 权重转换: 将模型权重转换为 FP32 类型并保存为独立的 bin 文件
  • mmap 加载: 使用内存映射替代传统 ifstream 读取方式
  • 异步传输: 固定内存多流异步数据传输技术
  • 性能提升: 权重加载耗时缩短至原来的 1/6

2. 高性能 Gemm 优化

  • 权重拼接: QKV Linear 和 Gate UP Linear 权重拼接
  • 调用优化: 减少 Gemm 调用次数,提高 GPU 并行度
  • 库封装: cuBLAS 库 Gemm 运算封装,简化调用流程
  • 计算强度: 提升整体计算强度和效率

3. Selective Batching 技术

  • Effective Transformer: 计算多 batch 填充值偏移量
  • 动态 Padding: attention 计算时拆分 batch 动态添加 padding
  • 资源优化: 其他部分合并 batch 动态移除 padding
  • 利用率提升: 优化计算资源利用率

4. 算子融合与向量化

  • 向量化算子: RMSNorm、Scale、Add、Softmax 等算子 float4、half2 向量化
  • 带宽优化: 提升内存带宽效率
  • 全融合: self decoder 阶段 attention 部分全部算子融合
  • Gemv 优化: 向量化访存与 Gemv 运算优化

5. 高效采样策略

  • 贪婪搜索: 实现高效贪婪搜索算法
  • TopK 采样: 使用小根堆和 cub 块内归约分组排序
  • 计算优化: softmax 计算后移,减少不必要的计算开销

6. 架构设计优化

  • 模块化设计: 算子封装组合成不同层次的模块和网络层
  • 代码复用: 提高代码复用率和可扩展性
  • 显存管理: 避免推理过程中频繁申请释放显存
  • 碎片化优化: 减少显存碎片化,提高执行效率

🔬 质量保证

算子单元测试

  • 进行 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 架构支持

该项目支持以下 GPU 架构:

  • sm_70: Tesla V100, Titan V
  • sm_75: RTX 20 系列, Tesla T4
  • sm_80: A100, RTX 30 系列
  • sm_86: RTX 40 系列

🚀 快速开始

1. 准备模型权重

使用提供的权重转换工具:

python tools/weights_convert.py --input_dir /path/to/llama/model --output_dir /path/to/converted/weights

2. 运行推理

# 编译后运行主程序
./build/bin/main

3. 多轮对话示例

=== 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 - 让大模型推理更快更高效! 🚀

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published