Skip to content
版 本

AscendDequant

产 品 支 持 情 况

  • Ascend 950PR/Ascend 950DT:支 持
  • Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品:支 持
  • Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品:支 持
  • Atlas 200I/500 A2 推 理 产 品:不 支 持
  • Atlas 推 理 系 列 产 品AI Core:支 持
  • Atlas 推 理 系 列 产 品Vector Core:不 支 持
  • Atlas 训 练 系 列 产 品:不 支 持
  • Kirin X90:支 持
  • Kirin 9030:支 持

功 能 说 明

按 元 素 做 反 量 化 计 算,比 如 将int32_t数 据 类 型 反 量 化 为half/float等 数 据 类 型。本 接 口 最 多 支 持 输 入 为 二 维 数 据,不 支 持 更 高 维 度 的 输 入。

  • 假 设 输 入srcTensor的shape为**(m, n),每 行 数 据(即n个 输 入 数 据)所 占 字 节 数 要 求32字 节 对 齐**,每 行 中 进 行 反 量 化 的 元 素 个 数 为calCount
  • 反 量 化 系 数deqScale可 以 为 标 量 或 者 向 量,为 向 量 的 情 况 下,calCount <= deqScale的 元 素 个 数,只 有 前CalCount个 反 量 化 系 数 生 效;
  • 输 出dstTensor的shape为**(m, n_dst), n * sizeof(dstT)不 满 足32字 节 对 齐 时,需 要向 上 补 齐 为32字 节**,n_dst为 向 上 补 齐 后 的 列 数。

下 面 通 过 两 个 具 体 的 示 例 来 解 释 参 数 的 配 置 和 计 算 逻 辑(下 文 中DequantParams类 型 为 存 储shape信 息 的 结 构 体{m, n, calCount}):

  • 如 下 图 示 例 中,srcTensor的 数 据 类 型 为int32_t,m = 4,n = 8,calCount = 4,表 明srcTensor中 每 行 进 行 反 量 化 的 元 素 个 数 为4,deqScale中 的 前4个 数 生 效,后12个 数 不 参 与 反 量 化 计 算;dstTensor的 数 据 类 型 为bfloat16_t,m = 4,n_dst = 16 (16 * sizeof(bfloat16_t) % 32 = 0)。计 算 逻 辑 是srcTensor的 每n个 数 为 一 行,对 于 每 行 中 的 前calCount个 元 素,该 行srcTensor的 第i个 元 素 与deqScale的 第i个 元 素 进 行 相 乘 写 入dstTensor对 应 行 的 第i个 元 素,dstTensor对 应 行 的 第calCount + 1个 元 素~第n_dst个 元 素 均 为 不 确 定 的 值。

  • 如 下 示 例 中,srcTensor的 数 据 类 型 为int32_t,m = 4,n = 8, calCount = 4,表 明srcTensor中 每 行 进 行 反 量 化 的 元 素 个 数 为4;dstTensor的 数 据 类 型 为float,m = 4,n_dst = 8 (8 * sizeof(float) % 32 = 0)。对 于srcTensor每 行 中 的 前4个 元 素 都 和 标 量deqScale相 乘 并 写 入dstTensor中 每 行 的 对 应 位 置。

当 用 户 将 模 板 参 数 中 的mode配 置 为DEQUANT_WITH_SINGLE_ROW时:

针 对DequantParams {m, n, calCount}, 若 同 时 满 足 以 下3个 条 件:

  1. m = 1
  2. calCount为 32 / sizeof(dstT)的 倍 数
  3. n % calCount = 0

此 时 {1, n, calCount}会 被 视 作 为** {n / calCount, calCount, calCount}** 进 行 反 量 化 的 计 算。

具 体 效 果 可 看 下 图 所 示,传 入 的DequantParams为 {1, 16, 8}。因 为dstT为float,所 以calCount满 足 为8的 倍 数,在DEQUANT_WITH_SINGLE_ROW模 式 下 会 将{1, 2 * 8, 8}转 换 为 {2, 8, 8}进 行 计 算。

  • PER_TOKEN反 量 化:srcTensor的 每 组token(token为n方 向,共 有m组token)中 的 元 素 共 享 一 组deqscale参 数,srcTensor为[m, n]时,deqscale为[m, 1]。

  • PER_GROUP反 量 化:这 里 定 义group的 计 算 方 向 为k方 向,srcTensor在k方 向 上 每groupSize个 元 素 共 享 一 组deqscale参 数。srcTensor为[m, n]时,如 果kDim=0,表 示k是m方 向,deqscale为[(m + groupSize - 1) / groupSize, n];如 果kDim=1,表 示k是n方 向,deqscale的shape为[m,(n + groupSize - 1) / groupSize]。

    • kDim=0:

    • kDim=1:

实 现 原 理

以 数 据 类 型int32_t,shape为[m, n]的 输 入srcTensor,数 据 类 型scaleT,shape为[n]的 输 入deqScale和 数 据 类 型dstT,shape为[m, n]的 输 出dstTensor为 例,描 述AscendDequant高 阶API内 部 算 法 框 图,如 下 图 所 示。

图 1 AscendDequant内 部 算 法 框 图

计 算 过 程 分 为 如 下 几 步,均 在Vector上 进 行:

  1. 精 度 转 换:将srcTensor和deqScale都 转 换 成FP32精 度 的tensor,分 别 得 到srcFP32和deqScaleFP32;
  2. Mul计 算:srcFP32一 共 有m行,每 行 长 度 为n;通 过m次 循 环,将srcFP32的 每 行 与deqScaleFP32相 乘,通 过mask控 制 仅 对 前dequantParams.calcount个 数 进 行mul计 算,图 中index的 取 值 范 围 为 [0, m),对 应srcFP32的 每 一 行;计 算 所 得 结 果 为mulRes,shape为[m, n];
  3. 结 果 数 据 精 度 转 换:mulRes从FP32转 换 成dstT类 型 的tensor,所 得 结 果 为dstTensor,shape为[m, n]。

PER_TOKEN/PER_GROUP场 景 下,输 入srcTensor数 据 类 型 是int32_t/float,此 时 内 部 算 法 框 图 如 下 所 示。

图 2 AscendDequant PER_TOKEN/PER_GROUP内 部 算 法 框 图

PER_TOKEN/PER_GROUP场 景 的 计 算 逻 辑 如 下:

  1. 读 取 数 据:连 续 读 取 输 入srcTensor;根 据 不 同 的 场 景,对 输 入deqscale,采 用 不 同 的 读 取 方 式;例 如,PER_TOKEN场 景 做Broadcast处 理,PER_GROUP场 景 做Gather处 理;
  2. 精 度 转 换:根 据 不 同 输 入 的 数 据 类 型 组 合,对srcTensor/deqscale进 行 相 应 的 数 据 类 型 转 换;
  3. 计 算:对 类 型 转 换 后 的srcTensor和deqscale数 据 做 乘 法;
  4. 精 度 转 换:将 上 述 计 算 得 到 的 结 果 转 换 成dstT类 型,得 到 最 终 输 出。

函 数 原 型

  • 反 量 化 参 数deqScale为 矢 量

    • 通 过sharedTmpBuffer入 参 传 入 临 时 空 间

      Text
      template <typename dstT, typename scaleT, DeQuantMode mode = DeQuantMode::DEQUANT_WITH_SINGLE_ROW>
      __aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<int32_t>& srcTensor, const LocalTensor<scaleT>& deqScale, const LocalTensor<uint8_t>& sharedTmpBuffer, DequantParams params)
      
    • 接 口 框 架 申 请 临 时 空 间

      Text
      template <typename dstT, typename scaleT, DeQuantMode mode = DeQuantMode::DEQUANT_WITH_SINGLE_ROW>
      __aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<int32_t>& srcTensor, const LocalTensor<scaleT>& deqScale, DequantParams params)
      
    • PER_TOKEN/PER_GROUP量 化

      仅 支 持Ascend 950PR/Ascend 950DT。

      • 通 过sharedTmpBuffer入 参 传 入 临 时 空 间

        Text
        template <typename dstT, typename srcT, typename scaleT, const AscendDeQuantConfig& config, const AscendDeQuantPolicy& policy>
        __aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<srcT>& srcTensor, const LocalTensor<scaleT>& scaleTensor, const LocalTensor<scaleT>& offsetTensor, const LocalTensor<uint8_t>& sharedTmpBuffer, const AscendDeQuantParam& para)
        
      • 接 口 框 架 申 请 临 时 空 间

        Text
        template <typename dstT, typename srcT, typename scaleT, const AscendDeQuantConfig& config, const AscendDeQuantPolicy& policy>
        __aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<srcT>& srcTensor, const LocalTensor<scaleT>& scaleTensor, const LocalTensor<scaleT>& offsetTensor, const AscendDeQuantParam& para)
        
  • 反 量 化 参 数deqScale为 标 量

    • 通 过sharedTmpBuffer入 参 传 入 临 时 空 间

      Text
      template <typename dstT, typename scaleT, DeQuantMode mode = DeQuantMode::DEQUANT_WITH_SINGLE_ROW>
      __aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<int32_t>& srcTensor, const scaleT deqScale, const LocalTensor<uint8_t>& sharedTmpBuffer, DequantParams params)
      
    • 接 口 框 架 申 请 临 时 空 间

      Text
      template <typename dstT, typename scaleT, DeQuantMode mode = DeQuantMode::DEQUANT_WITH_SINGLE_ROW>
      __aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<int32_t>& srcTensor, const scaleT deqScale, DequantParams params)
      

由 于 该 接 口 的 内 部 实 现 中 涉 及 复 杂 的 数 学 计 算,需 要 额 外 的 临 时 空 间 来 存 储 计 算 过 程 中 的 中 间 变 量。临 时 空 间 支 持接 口 框 架 申 请和 开 发 者通 过sharedTmpBuffer入 参 传 入两 种 方 式。

  • 接 口 框 架 申 请 临 时 空 间,开 发 者 无 需 申 请,但 是 需 要 预 留 临 时 空 间 的 大 小。

  • 通 过sharedTmpBuffer入 参 传 入,使 用 该tensor作 为 临 时 空 间 进 行 处 理,接 口 框 架 不 再 申 请。该 方 式 开 发 者 可 以 自 行 管 理sharedTmpBuffer内 存 空 间,并 在 接 口 调 用 完 成 后,复 用 该 部 分 内 存,内 存 不 会 反 复 申 请 释 放,灵 活 性 较 高,内 存 利 用 率 也 较 高。

接 口 框 架 申 请 的 方 式,开 发 者 需 要 预 留 临 时 空 间;通 过sharedTmpBuffer传 入 的 情 况,开 发 者 需 要 为sharedTmpBuffer申 请 空 间。临 时 空 间 大 小BufferSize的 获 取 方 式 如 下:通 过GetAscendDequantMaxMinTmpSize中 提 供 的GetAscendDequantMaxMinTmpSize接 口 获 取 需 要 预 留 空 间 的 范 围 大 小。

以 下 接 口 不 推 荐 使 用,新 开 发 内 容 不 要 使 用 如 下 接 口:

Text
template <typename dstT, typename scaleT, DeQuantMode mode = DeQuantMode::DEQUANT_WITH_SINGLE_ROW>
__aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<int32_t>& srcTensor, const LocalTensor<scaleT>& deqScale, const LocalTensor<uint8_t>& sharedTmpBuffer, const uint32_t calCount)
Text
template <typename dstT, typename scaleT, DeQuantMode mode = DeQuantMode::DEQUANT_WITH_SINGLE_ROW>
__aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<int32_t>& srcTensor, const LocalTensor<scaleT>& deqScale, const LocalTensor<uint8_t>& sharedTmpBuffer)
Text
template <typename dstT, typename scaleT, DeQuantMode mode = DeQuantMode::DEQUANT_WITH_SINGLE_ROW>
__aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<int32_t>& srcTensor, const LocalTensor<scaleT>& deqScale, const uint32_t calCount)
Text
template <typename dstT, typename scaleT, DeQuantMode mode = DeQuantMode::DEQUANT_WITH_SINGLE_ROW>
__aicore__ inline void AscendDequant(const LocalTensor<dstT>& dstTensor, const LocalTensor<int32_t>& srcTensor, const LocalTensor<scaleT>& deqScale)

参 数 说 明

表 1 模 板 参 数 说 明

参 数 名描 述
dstT目 的 操 作 数 的 数 据 类 型。
scaleTdeqScale的 数 据 类 型。
mode决 定 当DequantParams为{1, n, calCount}时 的 计 算 逻 辑,传 入enum DeQuantMode,支 持 以 下 2 种 配 置:
DEQUANT_WITH_SINGLE_ROW:当DequantParams {m, n, calCount} 同 时 满 足 以 下 条 件:1、m = 1;2、calCount为 32 / sizeof(dstT)的 倍 数;3、n % calCount = 0时,即 {1, n, calCount} 会 当 作 {n / calCount, calCount, calCount} 进 行 计 算。
DEQUANT_WITH_MULTI_ROW:即 使 满 足 上 述 所 有 条 件,{1, n, calCount} 依 然 只 会 当 作 {1, n, calCount} 进 行 计 算, 即 总 共n个 数,前calCount个 数 进 行 反 量 化 的 计 算。

表 2 PER_TOKEN/PER_GROUP场 景 模 板 参 数 说 明

参 数 名描 述
srcT源 操 作 数 的 数 据 类 型。
config量 化 接 口 配 置 参 数,AscendDeQuantConfig类 型,定 义 如 下 方 代 码 所 示,其 中 参 数 的 含 义 如 下。
hasOffset:量 化 参 数offset是 否 参 与 计 算。True:表 示offset参 数 参 与 计 算。False:表 示offset参 数 不 参 与 计 算。
kDim:group的 计 算 方 向,即k方 向。仅 在PER_GROUP场 景 有 效,支 持 的 取 值 如 下。0:k轴 是 第0轴,即m方 向 为group的 计 算 方 向;1:k轴 是 第1轴,即n方 向 为group的 计 算 方 向。
policy量 化 策 略 配 置 参 数,AscendDeQuantPolicy 枚 举 类 型,可 取 值 如 下:
PER_TOKEN:配 置 为PER_TOKEN模 式。
PER_GROUP:配 置 为PER_GROUP模 式。
PER_CHANNEL_PER_GROUP:预 留 参 数,暂 不 支 持。
PER_TOKEN_PER_GROUP:预 留 参 数,暂 不 支 持。
Text
struct AscendDeQuantConfig {
        bool hasOffset;
        int32_t kDim = 1;
}

表 3 接 口 参 数 说 明

参 数 名输 入/输 出描 述
dstTensor输 出目 的 操 作 数。类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。不 同 型 号 支 持 的 数 据 类 型 请 参 考dstTensor支 持 的 数 据 类 型
dstTensor的 行 数 和srcTensor的 行 数 保 持 一 致。
n * sizeof(dstT)不 满 足32字 节 对 齐 时,需 要 向 上 补 齐 为32字 节,n_dst为 向 上 补 齐 后 的 列 数。如srcTensor数 据 类 型 为int32_t,shape为 (4, 8),dstTensor为bfloat16_t,则n_dst应 从8补 齐 为16,dstTensor shape为(4, 16)。补 齐 的 计 算 过 程 为:n_dst = (8 * sizeof(bfloat16_t) + 32 - 1) / 32 * 32 / sizeof(bfloat16_t)。
srcTensor输 入源 操 作 数。类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。支 持 的 数 据 类 型 为:int32_t。

shape为 [m, n],n个 输 入 数 据 所 占 字 节 数 要 求32字 节 对 齐。
deqScale输 入源 操 作 数。类 型 为 标 量 或 者LocalTensor。类 型 为LocalTensor时,支 持 的TPosition为VECIN/VECCALC/VECOUT。不 同 型 号 支 持 的 数 据 类 型 请 参 考deqScale支 持 的 数 据 类 型

dstTensor、srcTensor、deqScale支 持 的 数 据 类 型 组 合 请 参 考 表5和 表6。
sharedTmpBuffer输 入临 时 缓 存。类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。支 持 的 数 据 类 型 为:uint8_t。

临 时 空 间 大 小BufferSize的 获 取 方 式 请 参 考GetAscendDequantMaxMinTmpSize
params输 入srcTensor的shape信 息。DequantParams类 型,定 义 如 下 方 代 码 所 示,其 中 参 数 的 含 义 如 下。
m:srcTensor的 行 数。
n:srcTensor的 列 数。
calCount:针 对srcTensor每 一 行,前calCount个 数 为 有 效 数 据,与deqScale的 前calCount个 数 或 者deqScale标 量 进 行 乘 法 计 算。

请 注 意:
DequantParams.n * sizeof(T)必 须 是32字 节 的 整 数 倍,T为srcTensor中 元 素 的 数 据 类 型。
因 为 是 每n个 数 中 的 前calCount个 数 进 行 乘 法 运 算,因 此DequantParams.n和calCount需 要 满 足 以 下 关 系:1 <= DequantParams.calCount <= DequantParams.n。
deqScale为 矢 量 时,DequantParams.calCount <= deqScale的 元 素 个 数。
Text
struct DequantParams
{
    uint32_t m;
    uint32_t n;
    uint32_t calCount;
};

表 4 PER_TOKEN/PER_GROUP场 景 接 口 参 数 说 明

参 数 名输 入/输 出描 述
dstTensor输 出目 的 操 作 数。支 持 的 数 据 类 型 为:half、bfloat16_t、float。

类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。
srcTensor输 入源 操 作 数。支 持 的 数 据 类 型 为:int32_t、float。

类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。
sharedTmpBuffer输 入临 时 缓 存。支 持 的 数 据 类 型 为:uint8_t。

类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。

临 时 空 间 大 小BufferSize的 获 取 方 式 请 参 考GetAscendQuantMaxMinTmpSize
scaleTensor输 入量 化 参 数scale。支 持 的 数 据 类 型 为:half、bfloat16_t、float。

类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。
offsetTensor输 入量 化 参 数offset。支 持 的 数 据 类 型 和scaleTensor保 持 一 致。预 留 参 数,当 前 暂 不 支 持。

类 型 为LocalTensor,支 持 的TPosition为VECIN/VECCALC/VECOUT。
para输 入反 量 化 接 口 的 参 数,定 义 如 下 方 代 码 所 示,其 中 参 数 的 含 义 如 下。
m:m方 向 元 素 个 数。
n:n方 向 元 素 个 数。n值 对 应 的 数 据 大 小 需 满 足32B对 齐 的 要 求,即shape最 后 一 维 为n的 输 入 输 出 均 需 要 满 足 该 维 度 上32B对 齐 的 要 求。
calCount:参 与 计 算 的 元 素 个 数。calCount必 须 是n的 整 数 倍。
groupSize :PER_GROUP场 景 有 效,表 示groupSize行/列 数 据 共 用 一 个scale/offset。groupSize的 取 值 必 须 大 于0且 是32的 整 倍 数。
Text
struct AscendDeQuantParam {
        uint32_t m;
        uint32_t n;
        uint32_t calCount;
        uint32_t groupSize = 0;
}

表 5 支 持 的 数 据 类 型 组 合(deqScale为LocalTensor)

dstTensorsrcTensordeqScale
halfint32_tuint64_t

注 意:当deqScale的 数 据 类 型 是uint64_t时,数 值 低32位 是 参 与 计 算 的 数 据,数 据 类 型 是float,数 值 高32位 是 一 些 控 制 参 数,本 接 口 不 使 用。
floatint32_tfloat
floatint32_tbfloat16_t
bfloat16_tint32_tbfloat16_t
bfloat16_tint32_tfloat

表 6 支 持 的 数 据 类 型 组 合(deqScale为 标 量)

dstTensorsrcTensordeqScale
bfloat16_tint32_tbfloat16_t
bfloat16_tint32_tfloat
floatint32_tbfloat16_t
floatint32_tfloat

表 7 PER_TOKEN/PER_GROUP场 景 支 持 的 数 据 类 型 组 合

srcDtypescaleDtypedstDtype
int32_thalfhalf
int32_tbfloat16_tbfloat16_t
int32_tfloatfloat
int32_tfloathalf
int32_tfloatbfloat16_t
floathalfhalf
floatbfloat16_tbfloat16_t
floatfloatfloat
floatfloathalf
floatfloatbfloat16_t

返 回 值 说 明

约 束 说 明

  • 不 支 持 源 操 作 数 与 目 的 操 作 数 地 址 重 叠。

  • 操 作 数 地 址 对 齐 要 求 请 参 见通 用 地 址 对 齐 约 束

  • PER_TOKEN/PER_GROUP场 景,连 续 计 算 方 向(即n方 向)的 数 据 量 要 求32B对 齐。

  • 非PER_TOKEN/PER_GROUP场 景dstTensor支 持 的 数 据 类 型

    Ascend 950PR/Ascend 950DT,支 持 的 数 据 类 型 为:half、bfloat16_t、float。

    Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,支 持 的 数 据 类 型 为:half、bfloat16_t、float。

    Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,支 持 的 数 据 类 型 为:half、bfloat16_t、float。

    Atlas 推 理 系 列 产 品AI Core,支 持 的 数 据 类 型 为:half、float。

    Kirin X90,支 持 的 数 据 类 型 为:half、float。

    Kirin 9030,支 持 的 数 据 类 型 为:half、float。

  • 非PER_TOKEN/PER_GROUP场 景deqScale支 持 的 数 据 类 型

    Ascend 950PR/Ascend 950DT,当deqScale为 矢 量 时,支 持 的 数 据 类 型 为:uint64_t、float、bfloat16_t;当deqScale为 标 量 时,支 持 的 数 据 类 型 为bfloat16_t、float。

    Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品,当deqScale为 矢 量 时,支 持 的 数 据 类 型 为:uint64_t、float、bfloat16_t;当deqScale为 标 量 时,支 持 的 数 据 类 型 为bfloat16_t、float。

    Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品,当deqScale为 矢 量 时,支 持 的 数 据 类 型 为:uint64_t、float、bfloat16_t;当deqScale为 标 量 时,支 持 的 数 据 类 型 为bfloat16_t、float。

    Atlas 推 理 系 列 产 品AI Core,当deqScale为 矢 量 时,支 持 的 数 据 类 型 为:uint64_t、float;当deqScale为 标 量 时,支 持 的 数 据 类 型 为float。

    Kirin X90,当deqScale为 矢 量 时,支 持 的 数 据 类 型 为:uint64_t、float;当deqScale为 标 量 时,支 持 的 数 据 类 型 为float。

    Kirin 9030,当deqScale为 矢 量 时,支 持 的 数 据 类 型 为:uint64_t、float;当deqScale为 标 量 时,支 持 的 数 据 类 型 为float。

调 用 示 例

Text
// dstLocal: 存 放 反 量 化 计 算 的 结 果Tensor
// srcLocal: 存 放 反 量 化 计 算 的 输 入Tensor
// deqScaleLocal: 存 放 反 量 化 计 算 量 反 量 化 系 数 的 输 入Tensor
// sharedTmpBuffer: 存 放 反 量 化 计 算 过 程 中 临 时 缓 存 的Tensor

uint32_t m = 4;  // srcTensor的 行 数
uint32_t n = 8;  // srcTensor的 列 数
uint32_t calCount = 6;  // 每 行srcTensor的 前calCount个 数 参 与 反 量 化 计 算

// 反 量 化 参 数deqScale为 矢 量,通 过sharedTmpBuffer入 参 传 入 临 时 空 间。
AscendC::AscendDequant(dstLocal, srcLocal, deqScaleLocal, sharedTmpBuffer, {m, n, calCount});

// 反 量 化 参 数deqScale为 矢 量,通 过 接 口 框 架 申 请 临 时 空 间。
AscendC::AscendDequant(dstLocal, srcLocal, deqScaleLocal, {m, n, calCount});

// 反 量 化 参 数deqScale为 标 量,通 过sharedTmpBuffer入 参 传 入 临 时 空 间。
AscendC::AscendDequant(dstLocal, srcLocal, static_cast<float>(2.2), sharedTmpBuffer, {m, n, calCount});
// 反 量 化 参 数deqScale为 标 量,通 过 接 口 框 架 申 请 临 时 空 间。
AscendC::AscendDequant(dstLocal, srcLocal, static_cast<float>(2.2), {m, n, calCount});

结 果 示 例 如 下:

Text
输 入 数 据(srcLocal) int32_t数 据 类 型:
[[-16 -15 -14 -13 -12 -11 -10  -9]
 [ -8  -7  -6  -5  -4  -3  -2  -1]
 [  0   1   2   3   4   5   6   7]
 [  8   9  10  11  12  13  14  15]]

反 量 化 参 数deqScaleLocal float数 据 类 型:
[2.2  -2.2  2.2  -2.2  2.2  -2.2  0.  0.]

输 出 数 据(dstLocal) float数 据 类 型:
[[-35.2  33.  -30.8  28.6 -26.4  24.2 -10.   -9. ]
 [-17.6  15.4 -13.2  11.   -8.8   6.6  -2.   -1. ]
 [  0.   -2.2   4.4  -6.6   8.8 -11.    6.    7. ]
 [ 17.6 -19.8  22.  -24.2  26.4 -28.6  14.   15. ]]

PER_TOKEN/PER_GROUP场 景 调 用 示 例 如 下。

Text
// 注 意m,n需 从 外 部 传 入
constexpr static bool isReuseSource = false;
constexpr static AscendDeQuantConfig config = {has_offset, -1};
constexpr static AscendDeQuantPolicy policy = AscendDeQuantPolicy::PER_TOKEN; // 可 修 改 枚 举 值 以 开 启PER_GROUP
AscendDeQuantParam para;
para.m = m;
para.n = n;
para.calCount = calCount;
AscendDequant<dstType, srcType, scaleType, config, policy>(dstLocal, srcLocal, scaleLocal, offsetLocal, para);

免 责 声 明:本 站 内 容 由 asc-devkit 仓 master 分 支 自 动 编 译 生 成,属 于 持 续 开 发 版 本,可 能 存 在 缺 陷,仅 供 预 览 与 参 考。如 需 稳 定 及 商 用 资 料,请 查 阅 官 方 昇 腾 社 区