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也作为下一轮量化的输入。
优化器计算公式:
函数原型
每个算子分为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。不支持undefined,undefined支持ND。
- grad(aclTensor*, 计算输入):Device侧的aclTensor,梯度,公式中的gt,数据类型支持FLOAT16、BFLOAT16、FLOAT32,且与varRef保持一致,shape要求与“varRef”参数一致,不支持undefined,undefined支持ND。
- mRef(aclTensor*, 计算输入/计算输出):Device侧的aclTensor,adamw优化器公式中m参数量化前的索引值,根据索引导出qmapM中具体的值,数据类型支持UINT8,shape要求与”varRef“参数一致,不支持undefined,undefined支持ND。
- vRef(aclTensor*, 计算输入/计算输出):Device侧的aclTensor,adamw优化器公式中v参数量化前的索引值,根据索引导出qmapV中具体的值,数据类型支持UINT8,shape要求与”varRef“参数一致,不支持undefined,undefined支持ND。
- qmapM(aclTensor*, 计算输入):Device侧的aclTensor,量化映射表升序排列,数据类型支持FLOAT32,数据格式要求为ND,shape要求为[256,],不支持undefined,undefined支持ND。
- qmapV(aclTensor*, 计算输入):Device侧的aclTensor,量化映射表升序排列,数据类型支持FLOAT32,数据格式要求为ND,shape要求为[256,],不支持undefined,undefined支持ND。
- absmaxMRef(aclTensor*, 计算输入/计算输出) :Device侧的aclTensor,计算输入为本次反量化阶段将分位数反归一化(乘以absmaxMRef),计算输出为本次量化和下一轮反量化的参数,数据类型支持FLOAT32,shape要求为每256个m对应一个最值,shape要求为“absmaxMRef.size = m.size/blockSize”,不支持undefined,undefined支持ND。
- absmaxVRef(aclTensor*, 计算输入/计算输出) :Device侧的aclTensor,计算输入为本次反量化阶段将分位数反归一化(乘以absmaxVRef),计算输出为本次量化和下一轮反量化的参数,数据类型支持FLOAT32,shape要求为每256个v对应一个最值,shape要求为“absmaxVRef.size = m.size/blockSize”,不支持undefined,undefined支持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]