昇腾社区首页
中文
注册

aclnnApplyAdamWQuant

产品支持情况

产品 是否支持
[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]
[object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]
[object Object]Atlas 200I/500 A2 推理产品[object Object] ×
[object Object]Atlas 推理系列产品 [object Object] ×
[object Object]Atlas 训练系列产品[object Object] ×

功能说明

  • 算子功能: 对优化器输入的m和v作为索引,取出各自qmap中的值,乘以每个blockSize对应的absmax进行反量化,而后实现adamW优化器功能,更新后的m和v每blockSize中取一个最大值,每blockSize个m和v对应一个absmax,进行一次norm归一化,利用二分法找到对应m和v对应qmap中的索引作为输出,absmax也作为下一轮量化的输入。

  • 优化器计算公式:

    mt=β1mt1+(1β1)gtm_{t}=\beta_{1} m_{t-1}+\left(1-\beta_{1}\right) g_{t} \\ vt=β2vt1+(1β2)gt2v_{t}=\beta_{2} v_{t-1}+\left(1-\beta_{2}\right) g_{t}^{2} m^t=mt1β1t\hat{m}_{t}=\frac{m_{t}}{1-\beta_{1}^{t}} \\ v^t=vt1β2t\hat{v}_{t}=\frac{v_{t}}{1-\beta_{2}^{t}} \\ θt+1=θtηv^t+ϵm^tηλθt1\theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{\hat{v}_{t}}+\epsilon} \hat{m}_{t}-\eta \cdot \lambda \cdot \theta_{t-1}

函数原型

每个算子分为undefined,必须先调用“aclnnApplyAdamWQuantGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnApplyAdamWQuant”接口执行计算。

  • aclnnStatus aclnnApplyAdamWQuantGetWorkspaceSize(aclTensor *varRef, const aclTensor *grad, aclTensor *mRef, aclTensor *vRef, const aclTensor *qmapM, const aclTensor *qmapV, aclTensor *absmaxMRef, aclTensor *absmaxVRef, const aclTensor *step, double lr, double beta1, double beta2, double weightDecay, double eps, double gnormScale, char *quantModeOptional, int64_t blockSize, uint64_t *workspaceSize, aclOpExecutor **executor);
  • aclnnStatus aclnnApplyAdamWQuant(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream);

aclnnApplyAdamWQuantGetWorkspaceSize

  • 参数说明:

    • varRef(const aclTensor*,计算输入/计算输出):Device侧的aclTensor,公式中的theta,待计算的权重输入同时也是输出。数据类型支持FLOAT、FLOAT16、BFLOAT16。不支持undefinedundefined支持ND。
    • grad(aclTensor*, 计算输入):Device侧的aclTensor,梯度,公式中的gt,数据类型支持FLOAT16、BFLOAT16、FLOAT32,且与varRef保持一致,shape要求与“varRef”参数一致,不支持undefinedundefined支持ND。
    • mRef(aclTensor*, 计算输入/计算输出):Device侧的aclTensor,adamw优化器公式中m参数量化前的索引值,根据索引导出qmapM中具体的值,数据类型支持UINT8,shape要求与”varRef“参数一致,不支持undefinedundefined支持ND。
    • vRef(aclTensor*, 计算输入/计算输出):Device侧的aclTensor,adamw优化器公式中v参数量化前的索引值,根据索引导出qmapV中具体的值,数据类型支持UINT8,shape要求与”varRef“参数一致,不支持undefinedundefined支持ND。
    • qmapM(aclTensor*, 计算输入):Device侧的aclTensor,量化映射表升序排列,数据类型支持FLOAT32,数据格式要求为ND,shape要求为[256,],不支持undefinedundefined支持ND。
    • qmapV(aclTensor*, 计算输入):Device侧的aclTensor,量化映射表升序排列,数据类型支持FLOAT32,数据格式要求为ND,shape要求为[256,],不支持undefinedundefined支持ND。
    • absmaxMRef(aclTensor*, 计算输入/计算输出) :Device侧的aclTensor,计算输入为本次反量化阶段将分位数反归一化(乘以absmaxMRef),计算输出为本次量化和下一轮反量化的参数,数据类型支持FLOAT32,shape要求为每256个m对应一个最值,shape要求为“absmaxMRef.size = m.size/blockSize”,不支持undefinedundefined支持ND。
    • absmaxVRef(aclTensor*, 计算输入/计算输出) :Device侧的aclTensor,计算输入为本次反量化阶段将分位数反归一化(乘以absmaxVRef),计算输出为本次量化和下一轮反量化的参数,数据类型支持FLOAT32,shape要求为每256个v对应一个最值,shape要求为“absmaxVRef.size = m.size/blockSize”,不支持undefinedundefined支持ND。
    • step(aclTensor*):Device侧的aclTensor,公式中的t,迭代次数,数据类型支持INT64,shape为[1,],undefined支持ND。
    • lr(float*, 计算输入):学习率,公式中的eta,推荐1e-3,1e-5,1e-8,范围0~1,数据类型支持float。
    • beta1(float*, 计算输入):adamw优化器公式中beta1参数,推荐0.9,范围0~1,数据类型支持float。
    • beta2(float*, 计算输入):adamw优化器公式中beta2参数,推荐0.99,范围0~1,数据类型支持float。
    • weightDecay(float*, 计算输入):权重衰减系数,adamw优化器公式中lambda参数,推荐0.999,范围0~1,数据类型支持float。
    • eps(float*, 计算输入):adamw优化器公式中epsilon参数,加在分母中用来防止除0,推荐1e-8,数据类型支持float。
    • gnormScale(float*, 计算输入): 对输入参数grad进行缩放的参数,推荐0.999,范围0~1,数据类型支持float。
    • blockSize(int64*, 计算输入):每个block参与计算的大小,固定为256,数据类型支持int64。
    • quantModeOptional(char*, 计算输入):保留参数。
    • workspaceSize(uint64_t*, 出参):返回用户需要在npu device侧申请的workspace大小。
    • executor(aclOpExecutor**, 出参):返回op执行器,包含了算子计算流程。
  • 返回值:

    aclnnStatus: 返回状态码,具体参见undefined

    [object Object]

aclnnApplyAdamWQuant

  • 参数说明:

    • workspace(void *, 入参): 在Device侧申请的workspace内存地址。
    • workspaceSize(uint64_t, 入参): 在Device侧申请的workspace大小,由第一段接口aclnnApplyAdamWQuantGetWorkspaceSize获取。
    • executor(aclOpExecutor *, 入参): op执行器,包含了算子计算流程。
    • stream(aclrtStream, 入参): 指定执行任务的Stream。
  • 返回值:

    aclnnStatus: 返回状态码,具体参见undefined

约束说明

varRef的shape满足约束:

  • varRef.shape = grad.shape
  • varRef.shape = mRef.shape
  • varRef.shape = vRef.shape
  • varRef.size/blockSize = absmaxMRef.size
  • varRef.size/blockSize = absmaxVRef.size

调用示例

示例代码如下,仅供参考,具体编译和执行过程请参考undefined

[object Object]