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

相关推荐
www4397 小时前
Vulinbox(敏感信息与敏感文件泄露)
安全
乾元7 小时前
《硅基之盾》番外篇二:算力底座的暗战——智算中心 VXLAN/EVPN 架构下的多租户隔离与防御
网络·人工智能·网络安全·架构
ALL_IN_AI7 小时前
本地部署 Ollama 大模型:零成本开启 AI 开发之旅
人工智能
木心术17 小时前
设备管理网管系统:详细下一步行动指南
前端·人工智能·opencv
小白狮ww7 小时前
Qwen3.5-27B-Claude-4.6-Opus-Reasoning-Distilled 蒸馏模型,27B 参数也能做强推理
人工智能·自然语言处理·claude·通义千问·opus·推理·qwen3.5
w_t_y_y7 小时前
python类库(一)模板
人工智能
QYR_117 小时前
2026塑料芯片卡产业全景:供应链成本结构与数字化安全趋势深度洞察
安全·市场调研
Nova_AI8 小时前
014、AI开源生态:模型、工具与社区的盈利之道
人工智能·开源
weixin_513449968 小时前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
管二狗赶快去工作!8 小时前
体系结构论文(九十八):NPUEval: Optimizing NPU Kernels with LLMs and Open Source Compilers
人工智能·深度学习·自然语言处理·体系结构