CANN-LLM:基于昇腾 CANN 的高性能、全功能 LLM 推理引擎

在上一篇中,我们实现了 毫秒级请求取消机制 ,使系统具备了生产级的鲁棒性。现在,我们将整合前六篇的所有技术成果,构建一个完整的、可开源的 LLM 推理服务项目模板,命名为:

CANN-LLM:基于昇腾 CANN 的高性能、全功能 LLM 推理引擎

本文将提供:

  • 完整的 项目目录结构
  • CMake 构建系统配置
  • Docker 部署方案
  • 性能调优 checklist
  • 以及 如何贡献到 GitCode 开源社区

目标:让开发者 10 分钟内跑通 INT4 + Continuous Batching + QoS + StreamingLLM 的 Llama-2-7B 服务


cann组织链接:https://atomgit.com/cann

ops-nn仓库链接:https://atomgit.com/cann/ops-nn

一、项目整体架构

bash 复制代码
cann-llm/
├── cmake/                     # CMake 模块
│   ├── FindCANN.cmake         # 自动查找 CANN 安装
│   └── cann-llm-config.cmake
├── src/
│   ├── core/                  # 核心推理逻辑
│   │   ├── engine.cpp         # 主推理引擎
│   │   ├── scheduler.cpp      # QoS + Continuous Batching
│   │   ├── kv_manager.cpp     # PagedAttention + StreamingLLM
│   │   └── cancellation.cpp   # 请求取消
│   ├── model/                 # 模型加载与量化
│   │   ├── int4_loader.cpp
│   │   └── quantize_tool.py
│   ├── ops/                   # tbe 算子注册
│   │   ├── int4_gemm.cpp
│   │   ├── fused_attention.cpp
│   │   └── sparse_attention.cpp
│   ├── server/                # HTTP/WebSocket 服务
│   │   ├── http_server.cpp
│   │   └── ws_streamer.cpp
│   └── main.cpp               # 入口
├── tbe_kernels/               # Python tbe 算子源码
│   ├── int4_gemm.py
│   ├── paged_attention.py
│   └── streaming_sparse_attn.py
├── tools/
│   ├── quantize_llama.py      # 离线量化脚本
│   └── profile_cann.py        # 性能分析工具
├── configs/
│   └── llama2_7b_int4.yaml    # 模型配置
├── docker/
│   └── Dockerfile             # 一键部署
├── tests/
│   └── e2e_test.py            # 端到端测试
├── README.md
└── CMakeLists.txt

二、CMake 构建系统(关键片段)

CMakeLists.txt

cmake 复制代码
cmake_minimum_required(VERSION 3.18)
project(cann-llm LANGUAGES CXX)

# 查找 CANN
find_package(CANN REQUIRED)

# 编译 tbe 算子(自动调用 te_build)
add_custom_target(tbe_ops ALL
    COMMAND python ${CMAKE_SOURCE_DIR}/tbe_kernels/build_all.py
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tbe_kernels
    DEPENDS ${CMAKE_SOURCE_DIR}/tbe_kernels/*.py
)

# 主程序
add_executable(llm_server
    src/main.cpp
    src/core/engine.cpp
    src/core/scheduler.cpp
    src/model/int4_loader.cpp
    src/server/http_server.cpp
    # ... 其他源文件
)

# 链接 CANN 库
target_link_libraries(llm_server
    PRIVATE
        ${CANN_LIBRARIES}
        pthread
        dl
)

# 依赖 tbe 算子
add_dependencies(llm_server tbe_ops)

# 安装规则
install(TARGETS llm_server DESTINATION bin)
install(DIRECTORY configs/ DESTINATION etc/cann-llm)

cmake/FindCANN.cmake

cmake 复制代码
find_path(CANN_INCLUDE_DIR ge/ge_api.h
    PATHS /usr/local/Ascend/ascend-toolkit/latest/include
          $ENV{ASCEND_HOME}/include
)

find_library(CANN_GE_LIB ge
    PATHS /usr/local/Ascend/ascend-toolkit/latest/lib64
)

set(CANN_LIBRARIES ${CANN_GE_LIB} ${CANN_RUNTIME_LIB} ...)
set(CANN_FOUND TRUE)

三、Docker 一键部署

docker/Dockerfile

dockerfile 复制代码
FROM ascend-cann-toolkit:8.0.RC1

WORKDIR /app
COPY . .

# 安装 Python 依赖(用于量化 & tbe)
RUN pip install torch transformers sentencepiece

# 构建 C++ 引擎
RUN mkdir build && cd build && \
    cmake .. -DCMAKE_BUILD_TYPE=Release && \
    make -j$(nproc) && \
    make install

# 量化模型(示例)
RUN python tools/quantize_llama.py \
    --model meta-llama/Llama-2-7b-hf \
    --output ./models/llama2-7b-int4

EXPOSE 8080
CMD ["llm_server", "--model", "/app/models/llama2-7b-int4", "--port", "8080"]

构建与运行:

bash 复制代码
docker build -t cann-llm -f docker/Dockerfile .
docker run -d --device=/dev/davinci0 --name llm-server cann-llm

四、启动与测试

启动服务

bash 复制代码
./build/llm_server \
  --model ./models/llama2-7b-int4 \
  --max-batch-size 8 \
  --window-size 2048 \
  --sink-size 4 \
  --port 8080

调用 API

bash 复制代码
# 1. 提交请求
REQ_ID=$(curl -s -X POST http://localhost:8080/generate \
  -H "X-Priority: high" \
  -d '{"prompt": "Explain quantum computing in simple terms."}' | jq -r .id)

# 2. 流式获取结果
curl -N http://localhost:8080/stream/$REQ_ID

# 3. 取消请求(如需要)
curl -X DELETE http://localhost:8080/requests/$REQ_ID

五、性能调优 Checklist

组件 调优项 建议值
tbe 算子 BLOCK_M / BLOCK_N 根据 NPU UB 大小调整(通常 64~128)
PagedAttention block_size 16 或 32(平衡碎片与管理开销)
Continuous Batching max_batch_size 8~16(避免长尾延迟)
INT4 GEMM group_size 128(AWQ 默认)
StreamingLLM sink_size 4(论文推荐)
QoS High 权重 ≥5(保障实时性)

💡 使用 tools/profile_cann.py 分析 kernel 占比,定位瓶颈


六、开源贡献指南(GitCode)

  1. Fork 仓库

    https://gitcode.com/cann-community/cann-llm

  2. 提交 PR 要求

    • 新算子需包含 tbe_kernels/xxx.py + ops/xxx.cpp
    • 性能提升需附 benchmark 数据
    • 支持新模型需提供量化脚本
  3. CI/CD 流程

    • 自动编译检查
    • 单元测试(Google Test)
    • 精度回归测试(vs HF FP16)

七、结语:从技术原型到工业基石

通过 CANN-LLM 项目,我们将前六篇的先进技术------

✅ FusedAttention

✅ INT4 GEMM

✅ Continuous Batching

✅ PagedAttention

✅ StreamingLLM

✅ QoS 调度

✅ 请求取消

------整合为一个开箱即用、生产就绪的推理引擎。

这不仅是一个项目,更是:

国产 AI 软件栈走向成熟、走向生态的关键一步。

我们邀请每一位开发者:

  • 使用它:快速部署自己的 LLM 服务
  • 改进它:贡献算子、调度策略、新模型支持
  • 扩展它:构建多模态、Agent、RAG 等上层应用

🌟 CANN-LLM 将于 2026 年 Q2 在 GitCode 正式开源

关注 https://gitcode.com/cann-community 获取最新动态

相关推荐
学电子她就能回来吗8 小时前
深度学习速成:损失函数与反向传播
人工智能·深度学习·学习·计算机视觉·github
The Straggling Crow8 小时前
model training platform
人工智能
爱吃泡芙的小白白8 小时前
突破传统:CNN卷积层(普通/空洞)核心技术演进与实战指南
人工智能·神经网络·cnn·卷积层·空洞卷积·普通卷积
人道领域8 小时前
AI抢人大战:谁在收割你的红包
大数据·人工智能·算法
初恋叫萱萱8 小时前
CANN 系列深度篇:基于 ge 图引擎构建高效 AI 执行图
人工智能
qq_12498707538 小时前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
Coder_Boy_8 小时前
TensorFlow小白科普
人工智能·深度学习·tensorflow·neo4j
L、2188 小时前
CANN 中的图优化技术详解:如何让 AI 模型跑得更快、更省
人工智能
大模型玩家七七8 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习