Projects/LLMQRT:W4A16 / W8A8 / FP8 量化推理 Runtime 与 H200 适配
Quantized Inference Runtime · CUDA · CUTLASS

LLMQRT:W4A16 / W8A8 / FP8 量化推理 Runtime 与 H200 适配

围绕模型加载、量化 schema、Linear 替换、AWQ GEMM/GEMV、CUTLASS INT8/FP8、Attention 后端与 KV Cache 建立轻量量化推理 Runtime,并在新一代 GPU 上补齐 kernel、单卡和 TP 验证。

RoleRuntime Architecture & GPU Adaptation
EnvironmentH200-oriented Validation · Single / Tensor Parallel
StackPyTorch Extension · CUDA · CUTLASS · FA2/FA4/SDPA
Status公开架构与方法 · 性能按同口径复验
Evidence Snapshot / 证据快照

用可复核的数字描述贡献,也明确数字不能证明什么。

W4A16AWQ weight-onlyCUDA GEMM / GEMV
W8A8SmoothQuantCUTLASS INT8
FP8dynamic / staticCUTLASS row/tensor-wise
FA2 / FA4 / SDPAAttention fallbackprefill / decode
System / 系统链路

从问题到验证的工程闭环

Public APIAutoQuantForCausalLM
Model LayerQwen / Llama / OPT
Quant LinearAWQ / SQ / FP8
Kernel LayerCUDA / CUTLASS / Triton
RuntimeAttention + KV cache + generate
Public Sources / 公开证据

以下正文来自 ICS6201 me 分支的脱敏文档。

内部仓库、节点、镜像、模型路径、运行标识、凭据与原始日志均不在页面中。公开数字保留原文定义和适用边界。

适配、正确性与公开边界

快照日期:2026-07-16

本专题记录在新一代 GPU 上进行量化推理 Runtime 适配、单卡/张量并行验证和性能排障的工程方法。原始工程位置、内部开发分支、模型目录、环境路径与启动命令均已删除。

主要工作

  • 定位并修复特定 GPU 架构上的量化 kernel 非法访存风险;
  • 验证权重打包、量化 schema、KV cache 与 attention 后端回退逻辑;
  • 在单卡和多卡场景检查可读输出、数值一致性和通信聚合;
  • 将后端能力检测和构建选项做成可移植配置,降低环境耦合。

复现原则

使用公开可获得的模型与本地授权环境重建基线。测试至少应记录硬件代际、软件版本、精度、并行度、输入长度、预热与重复次数;不要发布私有权重位置、服务器路径或访问方式。

证据边界

该专题中的“通过”表示已在受控测试条件下完成运行或数值检查,不等于所有模型、量化格式和并行配置都已验证。性能数据应以同一基线下的相对趋势报告。

模块、加载、Attention 与量化路径

1. 整体架构

graph TB
    subgraph "用户层"
        A[example 脚本] --> B[AutoQuantForCausalLM]
        C[chat.py 交互对话] --> B
        D[eval_acc PPL评估] --> B
    end

    subgraph "核心层 (runtime_refact/core)"
        B --> E[api.py<br/>公开API]
        E --> F[base.py<br/>BaseModelForCausalLM]
        F --> G[config.py<br/>QuantConfig解析]
    end

    subgraph "模型层 (runtime_refact/nn_models)"
        F --> H[models/]
        H --> H1[qwen2.py]
        H --> H2[qwen3.py]
        H --> H3[qwen3_moe.py]
        H --> H4[llama.py]
        H --> H5[opt.py]

        F --> I[modules/]
        I --> I1[linear/]
        I1 --> I1a[linear_awq.py<br/>W4A16]
        I1 --> I1b[linear_sq.py<br/>W8A8]
        I1 --> I1c[linear_fp8.py<br/>FP8]

        I --> I2[nonlinear/]
        I2 --> I2a[attention.py<br/>FA2/FA4/SDPA]
        I2 --> I2b[KVcache.py]
        I2 --> I2c[norm.py<br/>RMSNorm]
        I2 --> I2d[transformer_layer.py]
    end

    subgraph "Kernel层"
        I1a --> J1[csrc/awq/<br/>GEMM/GEMV CUDA]
        I1b --> J2[csrc/smoothquant/<br/>CUTLASS INT8]
        I1c --> J3[csrc/fp8/<br/>CUTLASS FP8]
        I1a --> J4[triton_kernels/<br/>AWQ Triton]
    end

    subgraph "第三方库"
        J2 --> K1[3rdparty/cutlass<br/>NVIDIA CUTLASS]
        J3 --> K1
        I2a --> K2[flash_attn<br/>FA2/FA4]
        I2a --> K3[PyTorch SDPA]
    end

    style A fill:#e1f5fe
    style C fill:#e1f5fe
    style D fill:#e1f5fe
    style B fill:#fff3e0
    style E fill:#fff3e0
    style F fill:#fff3e0
    style G fill:#fff3e0
    style I1a fill:#c8e6c9
    style I1b fill:#c8e6c9
    style I1c fill:#c8e6c9
    style J1 fill:#f3e5f5
    style J2 fill:#f3e5f5
    style J3 fill:#f3e5f5

2. 模型加载流程

sequenceDiagram
    participant User as 用户脚本
    participant API as AutoQuantForCausalLM
    participant Base as BaseModelForCausalLM
    participant Config as QuantConfig
    participant Model as 具体模型 (如Qwen3)
    participant Linear as 自定义Linear
    participant CUDA as CUDA Kernel

    User->>API: from_quantized(model_path)
    API->>Base: from_quantized(model_path)

    Base->>Config: 解析 quantization_config
    Config-->>Base: quant_method (awq/sq/fp8)

    Base->>Model: 创建空壳模型
    Model-->>Base: model with nn.Linear

    Base->>Linear: 替换 nn.Linear → 自定义Linear
    Linear->>CUDA: 编译/加载 CUDA扩展
    CUDA-->>Linear: .so 扩展模块

    Base->>Base: load_checkpoint (加载量化权重)
    Base->>Base: fuse_layers (QKV融合等)
    Base->>Base: model.eval()

    Base-->>User: 可推理的量化模型
    User->>Model: model.generate(inputs)
    Model->>Linear: forward(x)
    Linear->>CUDA: 调用量化kernel
    CUDA-->>Linear: 量化计算结果
    Linear-->>Model: output
    Model-->>User: 生成的token

3. Attention 后端选择流程

flowchart TD
    A[Attention.forward] --> B{seqlen > 1?}

    B -->|Yes: Prefill| C{use_flash_attn?}
    C -->|Yes| D{FA2 可用?}
    D -->|Yes| E[flash_attn_func<br/>FA2]
    D -->|No| F{FA4 可用?}
    F -->|Yes| G[flash_attn_func<br/>FA4 cute]
    F -->|No| H[回退到其他后端]

    C -->|No| I{SDPA 可用?}
    I -->|Yes| J{softcap > 0?}
    J -->|No| K[PyTorch SDPA<br/>按优先级尝试]
    J -->|Yes| L[手动matmul<br/>+ softcap]

    I -->|No| M[Torch Attention<br/>手动matmul+softmax]

    B -->|No: Decode| N{FA2 可用?}
    N -->|Yes| O[flash_attn_with_kvcache<br/>FA2 + KV Cache]
    N -->|No| P[Torch Attention<br/>读取KV Cache]

    K --> Q{cudnn}
    K --> R{flash}
    K --> S{efficient}
    K --> T{math}

    style E fill:#c8e6c9
    style G fill:#c8e6c9
    style O fill:#c8e6c9
    style K fill:#bbdefb
    style M fill:#fff9c4
    style P fill:#fff9c4

4. 量化方法对比

graph LR
    subgraph "AWQ W4A16"
        A1[Weight: 4-bit<br/>per-group g=128] --> A2[Activation: FP16<br/>不量化]
        A2 --> A3[Kernel: 手写CUDA<br/>GEMM/GEMV]
        A3 --> A4[适用: 所有模型<br/>精度损失最小]
    end

    subgraph "SmoothQuant W8A8"
        B1[Weight: INT8<br/>per-tensor] --> B2[Activation: INT8<br/>per-tensor]
        B2 --> B3[Kernel: CUTLASS<br/>INT8 GEMM]
        B3 --> B4[适用: OPT<br/>Qwen2输出异常]
    end

    subgraph "FP8 Dynamic"
        C1[Weight: FP8<br/>per-channel] --> C2[Activation: FP8<br/>per-token 动态]
        C2 --> C3[Kernel: CUTLASS<br/>FP8 rowwise]
        C3 --> C4[适用: 所有模型<br/>推理时动态量化]
    end

    subgraph "FP8 Static"
        D1[Weight: FP8<br/>per-tensor] --> D2[Activation: FP8<br/>per-tensor 静态]
        D2 --> D3[Kernel: CUTLASS<br/>FP8 tensorwise]
        D3 --> D4[适用: 所有模型<br/>需要预计算scale]
    end

    style A1 fill:#ffcdd2
    style A2 fill:#ffcdd2
    style B1 fill:#c8e6c9
    style B2 fill:#c8e6c9
    style C1 fill:#bbdefb
    style C2 fill:#bbdefb
    style D1 fill:#e1bee7
    style D2 fill:#e1bee7

5. 性能加速比

xychart-beta
    title "LLMQRT vs Baseline 延迟对比 (ms)"
    x-axis ["AWQ Prefill", "SQ Prefill", "SQ Decode", "FP8 Dyn Prefill", "FP8 Dyn Decode"]
    y-axis "延迟 (ms)" 0 --> 200
    bar [183.05, 103.10, 100.75, 80.54, 76.07]
    bar [30.22, 49.07, 52.86, 43.97, 38.41]

6. 目录结构与数据流

graph TD
    subgraph "输入"
        M[量化模型目录<br/>config.json + weights]
        T[Tokenizer]
        P[用户Prompt]
    end

    subgraph "runtime_refact/core"
        API[AutoQuantForCausalLM] --> BASE[BaseModelForCausalLM]
        BASE --> CFG[QuantConfig]
    end

    subgraph "runtime_refact/nn_models"
        BASE --> MOD[具体模型类<br/>Qwen3/LLaMA/OPT]
        MOD --> LIN[自定义Linear<br/>AWQ/SQ/FP8]
        MOD --> ATTN[Attention<br/>FA2/FA4/SDPA]
        MOD --> NORM[RMSNorm]
        MOD --> KV[KV Cache]
    end

    subgraph "runtime_refact/csrc"
        LIN --> CUDA_AWQ[awq/kernel.cu]
        LIN --> CUDA_SQ[sq_gemm.cu]
        LIN --> CUDA_FP8[fp8/*.cu]
    end

    subgraph "输出"
        MOD --> GEN[generate<br/>HF TextStreamer]
        GEN --> OUT[生成文本]
    end

    M --> API
    T --> API
    P --> GEN

    style M fill:#e8f5e9
    style T fill:#e8f5e9
    style P fill:#e8f5e9
    style OUT fill:#fff3e0
    style CUDA_AWQ fill:#f3e5f5
    style CUDA_SQ fill:#f3e5f5
    style CUDA_FP8 fill:#f3e5f5

架构适配与测试方法

问题与目标

在新一代 GPU 上验证 LLM Runtime 的量化推理路径,并处理架构适配、kernel 正确性、张量并行和性能测量问题。目标是建立可回退、可验证、可移植的推理工作流,而非披露特定部署环境。

关键进展

  1. 建立运行环境自检:确认驱动、CUDA、框架、编译器和依赖版本兼容。
  2. 修复手写量化 kernel 在目标架构上的越界/非法访问风险,并用内存检查和小样本对比验证。
  3. 核对量化权重 schema、打包布局、零点/scale 处理和 tokenizer 输入,避免把格式不兼容误判为算子错误。
  4. 建立单卡与张量并行两条验证路径,分别检查输出可读性、数值容差、通信聚合和显存行为。
  5. 为 attention 后端和构建加速工具增加能力检测与回退逻辑,降低运行环境依赖。

测试方法

  • 先以小模型、小输入和短输出完成正确性 smoke;
  • 再增加上下文长度、生成长度、batch 与并行度;
  • 性能测量包含预热、重复运行和稳定统计,且与同版本 baseline 对照;
  • 对失败案例按加载、量化、kernel、通信和调度分层定位。

公开边界

不收录专有模型清单、权重大小、路径、运行命令、环境目录、GPU 节点和原始日志。本文中的结论仅描述已验证方法,具体性能需在公开或授权环境中重新测量。

结论边界

公开页面强调架构、正确性与适配方法;任何延迟或加速结论都需要在同一模型、版本、输入和 baseline 下重新测量,不能由单个 kernel 数字外推端到端收益。