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 获取最新动态

相关推荐
恋猫de小郭34 分钟前
AI 正在造就你的「认知卸载」,但是时代如此
前端·人工智能·ai编程
飞哥数智坊8 小时前
我的“龙虾”罢工了!正好对比下GLM、MiniMax、Kimi 3家谁更香
人工智能
风象南9 小时前
很多人说,AI 让技术平权了,小白也能乱杀老师傅 ?
人工智能·后端
董董灿是个攻城狮10 小时前
大模型连载1:了解 Token
人工智能
RoyLin13 小时前
沉睡三十年的标准:HTTP 402、生成式 UI 与智能体原生软件的时代
人工智能
cipher14 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
needn15 小时前
TRAE为什么要发布SOLO版本?
人工智能·ai编程
毅航15 小时前
自然语言处理发展史:从规则、统计到深度学习
人工智能·后端
前端付豪15 小时前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
ursazoo16 小时前
写了一份 7000字指南,让 AI 帮我消化每天的信息流
人工智能·开源·github