Skip to content

[CANN] Support q4_1, q8_1 quant #19

@thefish111

Description

@thefish111

Prerequisites

  • I am running the latest code. Mention the version if possible as well.
  • I carefully followed the README.md.
  • I searched using keywords relevant to my issue to make sure that I am creating a new issue that is not already open (or closed).
  • I reviewed the Discussions, and have a new and useful enhancement to share.

Feature Description

[CANN] 添加对于q4_1,q8_1量化类型的支持

概述 (Summary)

添加对于q4_1,q8_1量化类型的支持

问题描述

当前项目并未支持q4_1,q8_1量化类型到CANN后端的前向逻辑

Motivation

背景 (Motivations)

  • q4_0将参数量化到一个对称的有符号整数表示范围内,限制了非对称分布参数的表示范围。q4_1通过每个block添加一个最小值offset的方式来支持非对阵表示,从而减小了量化对于精度的损失
  • q8_1每个block中添加一个sum记录block内qs的和,该操作能够起到加速内积运算的作用

目标 (Goals)

  • 添加q4_1, q8_1量化格式接口
  • 添加q4_1, q8_1 CANN后端上的前向转换功能

Possible Implementation

详细设计 (Detailed Design)

通过MUL_MAT testcases主要需要添加block q4_1, block q8_1数据类型,及其到cann接口支持类型的转换和反转换逻辑,并在调用时添加q4_1, q8_1的入口。

q4_1,q8_1 block格式定义内容:

#define QK4_1 32
typedef struct {
    float   d;          // delta
    float   m;          // min
    uint8_t qs[QK4_1 / 2];  // nibbles / quants
} block_q4_1;


#define QK8_1 32
typedef struct {
    GGML_EXTENSION union {
        struct {
            ggml_half d; // delta
            ggml_half s; // d * sum(qs[i])
        } GGML_COMMON_AGGR_S;
        ggml_half2 ds;
    } GGML_COMMON_AGGR_U;
    int8_t qs[QK8_1]; // quants
} block_q8_1;

ggml_cann_compute_forward->ggml_cann_mul_mat->ggml_cann_mul_mat_quant

修改sgml_cann_mul_mat_quant添加q4_1, q8_1入口,并添加对于两个新类型中多出的一个半精度位的读取与传入逻辑。

随后为了适应CANN后端提供的WeightQuantBatchMatmulV2接口,完成对应的新类型的数据转换逻辑,主要分为格式和数值两个方面的操作,最终统一转化为acl支持类型的tensor传入。

针对格式部分,将blockwise存储的量化格式权重按元素类别分别重排并创建tensor

针对数值部分,对q4_1进行反量化时添加对于反转换的逻辑支持,主要包括向qs向有符号数转换,然后对offset添加8*d的补偿。对q8_1只修改block内部的读取逻辑,数值转换上不做处理。

细节见ggml_cann.cpp文件中的transform/transform_back相关函数实现

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions