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个 条 件:
- m = 1
- calCount为 32 / sizeof(dstT)的 倍 数
- 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上 进 行:
- 精 度 转 换:将srcTensor和deqScale都 转 换 成FP32精 度 的tensor,分 别 得 到srcFP32和deqScaleFP32;
- Mul计 算:srcFP32一 共 有m行,每 行 长 度 为n;通 过m次 循 环,将srcFP32的 每 行 与deqScaleFP32相 乘,通 过mask控 制 仅 对 前dequantParams.calcount个 数 进 行mul计 算,图 中index的 取 值 范 围 为 [0, m),对 应srcFP32的 每 一 行;计 算 所 得 结 果 为mulRes,shape为[m, n];
- 结 果 数 据 精 度 转 换: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场 景 的 计 算 逻 辑 如 下:
- 读 取 数 据:连 续 读 取 输 入srcTensor;根 据 不 同 的 场 景,对 输 入deqscale,采 用 不 同 的 读 取 方 式;例 如,PER_TOKEN场 景 做Broadcast处 理,PER_GROUP场 景 做Gather处 理;
- 精 度 转 换:根 据 不 同 输 入 的 数 据 类 型 组 合,对srcTensor/deqscale进 行 相 应 的 数 据 类 型 转 换;
- 计 算:对 类 型 转 换 后 的srcTensor和deqscale数 据 做 乘 法;
- 精 度 转 换:将 上 述 计 算 得 到 的 结 果 转 换 成dstT类 型,得 到 最 终 输 出。
函 数 原 型
反 量 化 参 数deqScale为 矢 量
通 过sharedTmpBuffer入 参 传 入 临 时 空 间
Texttemplate <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)接 口 框 架 申 请 临 时 空 间
Texttemplate <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入 参 传 入 临 时 空 间
Texttemplate <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)接 口 框 架 申 请 临 时 空 间
Texttemplate <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入 参 传 入 临 时 空 间
Texttemplate <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)接 口 框 架 申 请 临 时 空 间
Texttemplate <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接 口 获 取 需 要 预 留 空 间 的 范 围 大 小。
以 下 接 口 不 推 荐 使 用,新 开 发 内 容 不 要 使 用 如 下 接 口:
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)
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)
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)
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 | 目 的 操 作 数 的 数 据 类 型。 |
| scaleT | deqScale的 数 据 类 型。 |
| 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:预 留 参 数,暂 不 支 持。 |
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的 元 素 个 数。 |
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的 整 倍 数。 |
struct AscendDeQuantParam {
uint32_t m;
uint32_t n;
uint32_t calCount;
uint32_t groupSize = 0;
}
表 5 支 持 的 数 据 类 型 组 合(deqScale为LocalTensor)
| dstTensor | srcTensor | deqScale |
|---|---|---|
| half | int32_t | uint64_t 注 意:当deqScale的 数 据 类 型 是uint64_t时,数 值 低32位 是 参 与 计 算 的 数 据,数 据 类 型 是float,数 值 高32位 是 一 些 控 制 参 数,本 接 口 不 使 用。 |
| float | int32_t | float |
| float | int32_t | bfloat16_t |
| bfloat16_t | int32_t | bfloat16_t |
| bfloat16_t | int32_t | float |
表 6 支 持 的 数 据 类 型 组 合(deqScale为 标 量)
| dstTensor | srcTensor | deqScale |
|---|---|---|
| bfloat16_t | int32_t | bfloat16_t |
| bfloat16_t | int32_t | float |
| float | int32_t | bfloat16_t |
| float | int32_t | float |
表 7 PER_TOKEN/PER_GROUP场 景 支 持 的 数 据 类 型 组 合
| srcDtype | scaleDtype | dstDtype |
|---|---|---|
| int32_t | half | half |
| int32_t | bfloat16_t | bfloat16_t |
| int32_t | float | float |
| int32_t | float | half |
| int32_t | float | bfloat16_t |
| float | half | half |
| float | bfloat16_t | bfloat16_t |
| float | float | float |
| float | float | half |
| float | float | bfloat16_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。
调 用 示 例
// 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});
结 果 示 例 如 下:
输 入 数 据(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场 景 调 用 示 例 如 下。
// 注 意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);