已合并
fix(arch35): scatter 类补 AutoContiguous;LambApplyOptimizerAssign infershape 与 tiling 对齐;foreach inplace 与 ScatterList 资料订正 #8767
zl_hw创建于 8月17日
fix(arch35): scatter 类补 AutoContiguous;LambApplyOptimizerAssign infershape 与 tiling 对齐;foreach inplace 与 ScatterList 资料订正 #8767
已合并
共 19 个文件变更+187-59
| @@ -235,7 +235,7 @@ | |||
| 235 | | [aclnnForeachSubScalarInplace](../../foreach/foreach_sub_scalar_inplace/docs/aclnnForeachSubScalarInplace.md) | 对输入张量列表中的每个张量逐元素减去同一标量,结果原地更新。 | - | 默认确定性实现 | | 235 | | [aclnnForeachSubScalarInplace](../../foreach/foreach_sub_scalar_inplace/docs/aclnnForeachSubScalarInplace.md) | 对输入张量列表中的每个张量逐元素减去同一标量,结果原地更新。 | - | 默认确定性实现 | |
| 236 | | [aclnnForeachTan](../../foreach/foreach_tan/docs/aclnnForeachTan.md) | 对输入张量列表的每个张量进行正切函数运算。 | 默认确定性实现 | 默认确定性实现 | | 236 | | [aclnnForeachTan](../../foreach/foreach_tan/docs/aclnnForeachTan.md) | 对输入张量列表的每个张量进行正切函数运算。 | 默认确定性实现 | 默认确定性实现 | |
| 237 | | [aclnnForeachTanh](../../foreach/foreach_tanh/docs/aclnnForeachTanh.md) | 对输入张量列表的每个张量进行双曲正切函数运算。 | 默认确定性实现 | 默认确定性实现 | | 237 | | [aclnnForeachTanh](../../foreach/foreach_tanh/docs/aclnnForeachTanh.md) | 对输入张量列表的每个张量进行双曲正切函数运算。 | 默认确定性实现 | 默认确定性实现 | |
| 238 | -| [aclnnForeachZeroInplace](../../foreach/foreach_zero_inplace/docs/aclnnForeachZeroInplace.md) | 原地更新输入张量列表,输入张量列表的每个张量置为0。 | 默认确定性实现 | - | | 238 | +| [aclnnForeachZeroInplace](../../foreach/foreach_zero_inplace/docs/aclnnForeachZeroInplace.md) | 原地更新输入张量列表,输入张量列表的每个张量置为0。 | 默认确定性实现 | 默认确定性实现 | |
| 239 | | [aclnnFusedCrossEntropyLossWithMaxSum](../../loss/fused_cross_entropy_loss_with_max_sum/docs/aclnnFusedCrossEntropyLossWithMaxSum.md) | 词汇表并行场景下交叉熵计算模块的一部分,解决超大规模词汇表下的显存和计算效率问题,当前部分为计算loss与softMax的结果。 | 默认确定性实现 | 默认确定性实现 | | 239 | | [aclnnFusedCrossEntropyLossWithMaxSum](../../loss/fused_cross_entropy_loss_with_max_sum/docs/aclnnFusedCrossEntropyLossWithMaxSum.md) | 词汇表并行场景下交叉熵计算模块的一部分,解决超大规模词汇表下的显存和计算效率问题,当前部分为计算loss与softMax的结果。 | 默认确定性实现 | 默认确定性实现 | |
| 240 | | [aclnnFusedLinearOnlineMaxSum](../../matmul/fused_linear_online_max_sum/docs/aclnnFusedLinearOnlineMaxSum.md) | 功能等价Megatron的matmul与fused\_vocab\_parallel\_cross\_entropy的实现,支持vocabulary\_size维度切卡融合matmul与cross-entropy loss。 | 默认确定性实现 | - | | 240 | | [aclnnFusedLinearOnlineMaxSum](../../matmul/fused_linear_online_max_sum/docs/aclnnFusedLinearOnlineMaxSum.md) | 功能等价Megatron的matmul与fused\_vocab\_parallel\_cross\_entropy的实现,支持vocabulary\_size维度切卡融合matmul与cross-entropy loss。 | 默认确定性实现 | - | |
| 241 | | [aclnnFusedLinearCrossEntropyLossGrad](../../matmul/fused_linear_cross_entropy_loss_grad/docs/aclnnFusedLinearCrossEntropyLossGrad.md) | 是词汇表并行场景下交叉熵损失计算模块中的一部分,解决超大规模词汇表下的显存和计算效率问题,当前部分为梯度计算实现,用于计算叶子节点`input`和`weight`的梯度。 | 默认确定性实现 | - | | 241 | | [aclnnFusedLinearCrossEntropyLossGrad](../../matmul/fused_linear_cross_entropy_loss_grad/docs/aclnnFusedLinearCrossEntropyLossGrad.md) | 是词汇表并行场景下交叉熵损失计算模块中的一部分,解决超大规模词汇表下的显存和计算效率问题,当前部分为梯度计算实现,用于计算叶子节点`input`和`weight`的梯度。 | 默认确定性实现 | - | |
| @@ -5,8 +5,8 @@ | |||
| 5 | |产品 | 是否支持 | | 5 | |产品 | 是否支持 | |
| 6 | |:-------------------------|:----------:| | 6 | |:-------------------------|:----------:| |
| 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | | 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | |
| 8 | -| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | × | | 8 | +| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | |
| 9 | -| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | × | | 9 | +| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | |
| 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | | 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | |
| 11 | | <term>Atlas 推理系列产品</term> | × | | 11 | | <term>Atlas 推理系列产品</term> | × | |
| 12 | | <term>Atlas 训练系列产品</term> | × | | 12 | | <term>Atlas 训练系列产品</term> | × | |
| @@ -5,8 +5,8 @@ | |||
| 5 | |产品 | 是否支持 | | 5 | |产品 | 是否支持 | |
| 6 | |:-------------------------|:----------:| | 6 | |:-------------------------|:----------:| |
| 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | | 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | |
| 8 | -| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | × | | 8 | +| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | |
| 9 | -| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | × | | 9 | +| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | |
| 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | | 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | |
| 11 | | <term>Atlas 推理系列产品</term> | × | | 11 | | <term>Atlas 推理系列产品</term> | × | |
| 12 | | <term>Atlas 训练系列产品</term> | × | | 12 | | <term>Atlas 训练系列产品</term> | × | |
| @@ -5,8 +5,8 @@ | |||
| 5 | |产品 | 是否支持 | | 5 | |产品 | 是否支持 | |
| 6 | |:-------------------------|:----------:| | 6 | |:-------------------------|:----------:| |
| 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | | 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | |
| 8 | -| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | × | | 8 | +| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | |
| 9 | -| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | × | | 9 | +| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | |
| 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | | 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | |
| 11 | | <term>Atlas 推理系列产品</term> | × | | 11 | | <term>Atlas 推理系列产品</term> | × | |
| 12 | | <term>Atlas 训练系列产品</term> | × | | 12 | | <term>Atlas 训练系列产品</term> | × | |
| @@ -5,8 +5,8 @@ | |||
| 5 | |产品 | 是否支持 | | 5 | |产品 | 是否支持 | |
| 6 | |:-------------------------|:----------:| | 6 | |:-------------------------|:----------:| |
| 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | | 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | |
| 8 | -| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | × | | 8 | +| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | |
| 9 | -| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | × | | 9 | +| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | |
| 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | | 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | |
| 11 | | <term>Atlas 推理系列产品</term> | × | | 11 | | <term>Atlas 推理系列产品</term> | × | |
| 12 | | <term>Atlas 训练系列产品</term> | × | | 12 | | <term>Atlas 训练系列产品</term> | × | |
| @@ -5,8 +5,8 @@ | |||
| 5 | |产品 | 是否支持 | | 5 | |产品 | 是否支持 | |
| 6 | |:-------------------------|:----------:| | 6 | |:-------------------------|:----------:| |
| 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | | 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | |
| 8 | -| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | × | | 8 | +| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | |
| 9 | -| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | × | | 9 | +| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | |
| 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | | 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | |
| 11 | | <term>Atlas 推理系列产品</term> | × | | 11 | | <term>Atlas 推理系列产品</term> | × | |
| 12 | | <term>Atlas 训练系列产品</term> | × | | 12 | | <term>Atlas 训练系列产品</term> | × | |
| @@ -5,8 +5,8 @@ | |||
| 5 | |产品 | 是否支持 | | 5 | |产品 | 是否支持 | |
| 6 | |:-------------------------|:----------:| | 6 | |:-------------------------|:----------:| |
| 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | | 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | |
| 8 | -| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | × | | 8 | +| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | |
| 9 | -| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | × | | 9 | +| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | |
| 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | | 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | |
| 11 | | <term>Atlas 推理系列产品</term> | × | | 11 | | <term>Atlas 推理系列产品</term> | × | |
| 12 | | <term>Atlas 训练系列产品</term> | × | | 12 | | <term>Atlas 训练系列产品</term> | × | |
| @@ -5,8 +5,8 @@ | |||
| 5 | |产品 | 是否支持 | | 5 | |产品 | 是否支持 | |
| 6 | |:-------------------------|:----------:| | 6 | |:-------------------------|:----------:| |
| 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | | 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | |
| 8 | -| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | × | | 8 | +| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | |
| 9 | -| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | × | | 9 | +| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | |
| 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | | 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | |
| 11 | | <term>Atlas 推理系列产品</term> | × | | 11 | | <term>Atlas 推理系列产品</term> | × | |
| 12 | | <term>Atlas 训练系列产品</term> | × | | 12 | | <term>Atlas 训练系列产品</term> | × | |
| @@ -5,8 +5,8 @@ | |||
| 5 | |产品 | 是否支持 | | 5 | |产品 | 是否支持 | |
| 6 | |:-------------------------|:----------:| | 6 | |:-------------------------|:----------:| |
| 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | | 7 | | <term>Ascend 950PR/Ascend 950DT</term> | √ | |
| 8 | -| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | × | | 8 | +| <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | |
| 9 | -| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | × | | 9 | +| <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | |
| 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | | 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | |
| 11 | | <term>Atlas 推理系列产品</term> | × | | 11 | | <term>Atlas 推理系列产品</term> | × | |
| 12 | | <term>Atlas 训练系列产品</term> | × | | 12 | | <term>Atlas 训练系列产品</term> | × | |
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | |产品 | 是否支持 | | 5 | |产品 | 是否支持 | |
| 6 | |:-------------------------|:----------:| | 6 | |:-------------------------|:----------:| |
| 7 | -| <term>Ascend 950PR/Ascend 950DT</term> | × | | 7 | +| <term>Ascend 950PR/Ascend 950DT</term> | √ | |
| 8 | | <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | | 8 | | <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term> | √ | |
| 9 | | <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | | 9 | | <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term> | √ | |
| 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | | 10 | | <term>Atlas 200I/500 A2 推理产品</term> | × | |
| @@ -5,7 +5,7 @@ | |||
| 5 | ## 产品支持情况 | 5 | ## 产品支持情况 |
| 6 | 6 | ||
| 7 | <!-- npu="950" id1 --> | 7 | <!-- npu="950" id1 --> |
| 8 | -- <term>Ascend 950PR/Ascend 950DT</term>:不支持 | 8 | +- <term>Ascend 950PR/Ascend 950DT</term>:支持 |
| 9 | <!-- end id1 --> | 9 | <!-- end id1 --> |
| 10 | <!-- npu="A3" id2 --> | 10 | <!-- npu="A3" id2 --> |
| 11 | - <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>:支持 | 11 | - <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>:支持 |
| @@ -27,7 +27,8 @@ public: | |||
| 27 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 27 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 28 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 28 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 29 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 29 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 30 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 30 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 31 | + .AutoContiguous(); | ||
| 31 | this->Input("indices") | 32 | this->Input("indices") |
| 32 | .ParamType(REQUIRED) | 33 | .ParamType(REQUIRED) |
| 33 | .DataType({ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT64, ge::DT_INT64, | 34 | .DataType({ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT64, ge::DT_INT64, |
| @@ -35,7 +36,8 @@ public: | |||
| 35 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 36 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 36 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 37 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 37 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 38 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 38 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 39 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 40 | + .AutoContiguous(); | ||
| 39 | this->Input("updates") | 41 | this->Input("updates") |
| 40 | .ParamType(REQUIRED) | 42 | .ParamType(REQUIRED) |
| 41 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, | 43 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, |
| @@ -43,7 +45,8 @@ public: | |||
| 43 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 45 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 44 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 46 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 45 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 47 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 46 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 48 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 49 | + .AutoContiguous(); | ||
| 47 | this->Output("var") | 50 | this->Output("var") |
| 48 | .ParamType(REQUIRED) | 51 | .ParamType(REQUIRED) |
| 49 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, | 52 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, |
| @@ -51,7 +54,8 @@ public: | |||
| 51 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 54 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 52 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 55 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 53 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 56 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 54 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 57 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 58 | + .AutoContiguous(); | ||
| 55 | this->Attr("use_locking").AttrType(OPTIONAL).Bool(false); | 59 | this->Attr("use_locking").AttrType(OPTIONAL).Bool(false); |
| 56 | 60 | ||
| 57 | OpAICoreConfig aicoreConfig; | 61 | OpAICoreConfig aicoreConfig; |
| @@ -253,6 +253,13 @@ aclnnStatus aclnnScatterList( | |||
| 253 | - 确定性计算: | 253 | - 确定性计算: |
| 254 | - aclnnScatterList默认非确定性实现,支持通过aclrtCtxSetSysParamOpt开启确定性。 | 254 | - aclnnScatterList默认非确定性实现,支持通过aclrtCtxSetSysParamOpt开启确定性。 |
| 255 | 255 | ||
| 256 | +- <term>Ascend 950PR/Ascend 950DT</term>:各输入的shape需满足以下关系,不满足时第一段接口返回561002。记varRef列表中的张量个数为B。 | ||
| 257 | + - varRef:列表中每个张量的shape需相同,每个张量的维度数需大于等于1。 | ||
| 258 | + - updates:维度数等于varRef中单个张量的维度数加1;第一维大小等于B;axis轴的大小不大于varRef对应轴;其余维度与varRef一致。 | ||
| 259 | + - indice:shape支持1~2维;第一维大小等于B;为2维时,第二维大小必须为2。 | ||
| 260 | + - maskOptional:shape支持1维,第一维大小等于B。 | ||
| 261 | + - axis:归一化(负数按updates的维度数折算)后的取值必须落在开区间(0, updates的维度数)内,即不能指向第0维,也不能越界。默认值-2要求updates的维度数大于等于3。 | ||
| 262 | + | ||
| 256 | ## 调用示例 | 263 | ## 调用示例 |
| 257 | 264 | ||
| 258 | 示例代码如下,仅供参考,具体编译和执行过程请参考[编译与运行样例](../../../docs/zh/context/compile_and_run_sample.md)。 | 265 | 示例代码如下,仅供参考,具体编译和执行过程请参考[编译与运行样例](../../../docs/zh/context/compile_and_run_sample.md)。 |
| @@ -64,27 +64,32 @@ public: | |||
| 64 | .ParamType(DYNAMIC) | 64 | .ParamType(DYNAMIC) |
| 65 | .DataType(varDataType910b) | 65 | .DataType(varDataType910b) |
| 66 | .Format(format910b) | 66 | .Format(format910b) |
| 67 | - .UnknownShapeFormat(format910b); | 67 | + .UnknownShapeFormat(format910b) |
| 68 | + .AutoContiguous(); | ||
| 68 | this->Input("indice") | 69 | this->Input("indice") |
| 69 | .ParamType(REQUIRED) | 70 | .ParamType(REQUIRED) |
| 70 | .DataType(indiceDataType910b) | 71 | .DataType(indiceDataType910b) |
| 71 | .Format(format910b) | 72 | .Format(format910b) |
| 72 | - .UnknownShapeFormat(format910b); | 73 | + .UnknownShapeFormat(format910b) |
| 74 | + .AutoContiguous(); | ||
| 73 | this->Input("updates") | 75 | this->Input("updates") |
| 74 | .ParamType(REQUIRED) | 76 | .ParamType(REQUIRED) |
| 75 | .DataType(varDataType910b) | 77 | .DataType(varDataType910b) |
| 76 | .Format(format910b) | 78 | .Format(format910b) |
| 77 | - .UnknownShapeFormat(format910b); | 79 | + .UnknownShapeFormat(format910b) |
| 80 | + .AutoContiguous(); | ||
| 78 | this->Input("mask") | 81 | this->Input("mask") |
| 79 | .ParamType(OPTIONAL) | 82 | .ParamType(OPTIONAL) |
| 80 | .DataType(maskDataType910b) | 83 | .DataType(maskDataType910b) |
| 81 | .Format(format910b) | 84 | .Format(format910b) |
| 82 | - .UnknownShapeFormat(format910b); | 85 | + .UnknownShapeFormat(format910b) |
| 86 | + .AutoContiguous(); | ||
| 83 | this->Output("var") | 87 | this->Output("var") |
| 84 | .ParamType(DYNAMIC) | 88 | .ParamType(DYNAMIC) |
| 85 | .DataType(varDataType910b) | 89 | .DataType(varDataType910b) |
| 86 | .Format(format910b) | 90 | .Format(format910b) |
| 87 | - .UnknownShapeFormat(format910b); | 91 | + .UnknownShapeFormat(format910b) |
| 92 | + .AutoContiguous(); | ||
| 88 | this->Attr("reduce").AttrType(OPTIONAL).String("update"); | 93 | this->Attr("reduce").AttrType(OPTIONAL).String("update"); |
| 89 | this->Attr("axis").AttrType(OPTIONAL).Int(AXIS_DEFAULT); | 94 | this->Attr("axis").AttrType(OPTIONAL).Int(AXIS_DEFAULT); |
| 90 | 95 | ||
| @@ -105,27 +110,32 @@ public: | |||
| 105 | .ParamType(DYNAMIC) | 110 | .ParamType(DYNAMIC) |
| 106 | .DataType(varDataType310p) | 111 | .DataType(varDataType310p) |
| 107 | .Format(format310p) | 112 | .Format(format310p) |
| 108 | - .UnknownShapeFormat(format310p); | 113 | + .UnknownShapeFormat(format310p) |
| 114 | + .AutoContiguous(); | ||
| 109 | config310p.Input("indice") | 115 | config310p.Input("indice") |
| 110 | .ParamType(REQUIRED) | 116 | .ParamType(REQUIRED) |
| 111 | .DataType(indiceDataType310p) | 117 | .DataType(indiceDataType310p) |
| 112 | .Format(format310p) | 118 | .Format(format310p) |
| 113 | - .UnknownShapeFormat(format310p); | 119 | + .UnknownShapeFormat(format310p) |
| 120 | + .AutoContiguous(); | ||
| 114 | config310p.Input("updates") | 121 | config310p.Input("updates") |
| 115 | .ParamType(REQUIRED) | 122 | .ParamType(REQUIRED) |
| 116 | .DataType(varDataType310p) | 123 | .DataType(varDataType310p) |
| 117 | .Format(format310p) | 124 | .Format(format310p) |
| 118 | - .UnknownShapeFormat(format310p); | 125 | + .UnknownShapeFormat(format310p) |
| 126 | + .AutoContiguous(); | ||
| 119 | config310p.Input("mask") | 127 | config310p.Input("mask") |
| 120 | .ParamType(OPTIONAL) | 128 | .ParamType(OPTIONAL) |
| 121 | .DataType(maskDataType310p) | 129 | .DataType(maskDataType310p) |
| 122 | .Format(format310p) | 130 | .Format(format310p) |
| 123 | - .UnknownShapeFormat(format310p); | 131 | + .UnknownShapeFormat(format310p) |
| 132 | + .AutoContiguous(); | ||
| 124 | config310p.Output("var") | 133 | config310p.Output("var") |
| 125 | .ParamType(DYNAMIC) | 134 | .ParamType(DYNAMIC) |
| 126 | .DataType(varDataType310p) | 135 | .DataType(varDataType310p) |
| 127 | .Format(format310p) | 136 | .Format(format310p) |
| 128 | - .UnknownShapeFormat(format310p); | 137 | + .UnknownShapeFormat(format310p) |
| 138 | + .AutoContiguous(); | ||
| 129 | config310p.DynamicCompileStaticFlag(true) | 139 | config310p.DynamicCompileStaticFlag(true) |
| 130 | .DynamicFormatFlag(true) | 140 | .DynamicFormatFlag(true) |
| 131 | .DynamicRankSupportFlag(true) | 141 | .DynamicRankSupportFlag(true) |
| @@ -154,27 +164,32 @@ private: | |||
| 154 | .ParamType(DYNAMIC) | 164 | .ParamType(DYNAMIC) |
| 155 | .DataType(varDataType310p) | 165 | .DataType(varDataType310p) |
| 156 | .Format(format310p) | 166 | .Format(format310p) |
| 157 | - .UnknownShapeFormat(format310p); | 167 | + .UnknownShapeFormat(format310p) |
| 168 | + .AutoContiguous(); | ||
| 158 | config_kirin.Input("indice") | 169 | config_kirin.Input("indice") |
| 159 | .ParamType(REQUIRED) | 170 | .ParamType(REQUIRED) |
| 160 | .DataType(indiceDataType310p) | 171 | .DataType(indiceDataType310p) |
| 161 | .Format(format310p) | 172 | .Format(format310p) |
| 162 | - .UnknownShapeFormat(format310p); | 173 | + .UnknownShapeFormat(format310p) |
| 174 | + .AutoContiguous(); | ||
| 163 | config_kirin.Input("updates") | 175 | config_kirin.Input("updates") |
| 164 | .ParamType(REQUIRED) | 176 | .ParamType(REQUIRED) |
| 165 | .DataType(varDataType310p) | 177 | .DataType(varDataType310p) |
| 166 | .Format(format310p) | 178 | .Format(format310p) |
| 167 | - .UnknownShapeFormat(format310p); | 179 | + .UnknownShapeFormat(format310p) |
| 180 | + .AutoContiguous(); | ||
| 168 | config_kirin.Input("mask") | 181 | config_kirin.Input("mask") |
| 169 | .ParamType(OPTIONAL) | 182 | .ParamType(OPTIONAL) |
| 170 | .DataType(maskDataType310p) | 183 | .DataType(maskDataType310p) |
| 171 | .Format(format310p) | 184 | .Format(format310p) |
| 172 | - .UnknownShapeFormat(format310p); | 185 | + .UnknownShapeFormat(format310p) |
| 186 | + .AutoContiguous(); | ||
| 173 | config_kirin.Output("var") | 187 | config_kirin.Output("var") |
| 174 | .ParamType(DYNAMIC) | 188 | .ParamType(DYNAMIC) |
| 175 | .DataType(varDataType310p) | 189 | .DataType(varDataType310p) |
| 176 | .Format(format310p) | 190 | .Format(format310p) |
| 177 | - .UnknownShapeFormat(format310p); | 191 | + .UnknownShapeFormat(format310p) |
| 192 | + .AutoContiguous(); | ||
| 178 | return config_kirin; | 193 | return config_kirin; |
| 179 | } | 194 | } |
| 180 | }; | 195 | }; |
| @@ -22,7 +22,8 @@ public: | |||
| 22 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 22 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 23 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 23 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 24 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 24 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 25 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 25 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 26 | + .AutoContiguous(); | ||
| 26 | this->Input("indices") | 27 | this->Input("indices") |
| 27 | .ParamType(REQUIRED) | 28 | .ParamType(REQUIRED) |
| 28 | .DataType({ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT64, ge::DT_INT64, | 29 | .DataType({ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT64, ge::DT_INT64, |
| @@ -30,7 +31,8 @@ public: | |||
| 30 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 31 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 31 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 32 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 32 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 33 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 33 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 34 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 35 | + .AutoContiguous(); | ||
| 34 | this->Input("updates") | 36 | this->Input("updates") |
| 35 | .ParamType(REQUIRED) | 37 | .ParamType(REQUIRED) |
| 36 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, | 38 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, |
| @@ -38,7 +40,8 @@ public: | |||
| 38 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 40 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 39 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 41 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 40 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 42 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 41 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 43 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 44 | + .AutoContiguous(); | ||
| 42 | this->Output("var") | 45 | this->Output("var") |
| 43 | .ParamType(REQUIRED) | 46 | .ParamType(REQUIRED) |
| 44 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, | 47 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, |
| @@ -46,7 +49,8 @@ public: | |||
| 46 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 49 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 47 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 50 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 48 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 51 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 49 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 52 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 53 | + .AutoContiguous(); | ||
| 50 | this->Attr("use_locking").AttrType(OPTIONAL).Bool(false); | 54 | this->Attr("use_locking").AttrType(OPTIONAL).Bool(false); |
| 51 | 55 | ||
| 52 | OpAICoreConfig aicoreConfig; | 56 | OpAICoreConfig aicoreConfig; |
| @@ -22,7 +22,8 @@ public: | |||
| 22 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 22 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 23 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 23 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 24 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 24 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 25 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 25 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 26 | + .AutoContiguous(); | ||
| 26 | this->Input("indices") | 27 | this->Input("indices") |
| 27 | .ParamType(REQUIRED) | 28 | .ParamType(REQUIRED) |
| 28 | .DataType({ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT64, ge::DT_INT64, | 29 | .DataType({ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT64, ge::DT_INT64, |
| @@ -30,7 +31,8 @@ public: | |||
| 30 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 31 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 31 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 32 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 32 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 33 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 33 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 34 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 35 | + .AutoContiguous(); | ||
| 34 | this->Input("updates") | 36 | this->Input("updates") |
| 35 | .ParamType(REQUIRED) | 37 | .ParamType(REQUIRED) |
| 36 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, | 38 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, |
| @@ -38,7 +40,8 @@ public: | |||
| 38 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 40 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 39 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 41 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 40 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 42 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 41 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 43 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 44 | + .AutoContiguous(); | ||
| 42 | this->Output("var") | 45 | this->Output("var") |
| 43 | .ParamType(REQUIRED) | 46 | .ParamType(REQUIRED) |
| 44 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, | 47 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, |
| @@ -46,7 +49,8 @@ public: | |||
| 46 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 49 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 47 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 50 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 48 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 51 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 49 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 52 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 53 | + .AutoContiguous(); | ||
| 50 | this->Attr("use_locking").AttrType(OPTIONAL).Bool(false); | 54 | this->Attr("use_locking").AttrType(OPTIONAL).Bool(false); |
| 51 | 55 | ||
| 52 | OpAICoreConfig aicoreConfig; | 56 | OpAICoreConfig aicoreConfig; |
| @@ -27,7 +27,8 @@ public: | |||
| 27 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 27 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 28 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 28 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 29 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 29 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 30 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 30 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 31 | + .AutoContiguous(); | ||
| 31 | this->Input("indices") | 32 | this->Input("indices") |
| 32 | .ParamType(REQUIRED) | 33 | .ParamType(REQUIRED) |
| 33 | .DataType({ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT64, ge::DT_INT64, | 34 | .DataType({ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT32, ge::DT_INT64, ge::DT_INT64, |
| @@ -35,7 +36,8 @@ public: | |||
| 35 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 36 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 36 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 37 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 37 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 38 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 38 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 39 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 40 | + .AutoContiguous(); | ||
| 39 | this->Input("updates") | 41 | this->Input("updates") |
| 40 | .ParamType(REQUIRED) | 42 | .ParamType(REQUIRED) |
| 41 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, | 43 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, |
| @@ -43,7 +45,8 @@ public: | |||
| 43 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 45 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 44 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 46 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 45 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 47 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 46 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 48 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 49 | + .AutoContiguous(); | ||
| 47 | this->Output("var") | 50 | this->Output("var") |
| 48 | .ParamType(REQUIRED) | 51 | .ParamType(REQUIRED) |
| 49 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, | 52 | .DataType({ge::DT_FLOAT16, ge::DT_FLOAT, ge::DT_INT32, ge::DT_INT8, ge::DT_UINT8, ge::DT_FLOAT16, |
| @@ -51,7 +54,8 @@ public: | |||
| 51 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 54 | .Format({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 52 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) | 55 | ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 53 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, | 56 | .UnknownShapeFormat({ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, |
| 54 | - ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}); | 57 | + ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND, ge::FORMAT_ND}) |
| 58 | + .AutoContiguous(); | ||
| 55 | this->Attr("use_locking").AttrType(OPTIONAL).Bool(false); | 59 | this->Attr("use_locking").AttrType(OPTIONAL).Bool(false); |
| 56 | 60 | ||
| 57 | OpAICoreConfig aicoreConfig; | 61 | OpAICoreConfig aicoreConfig; |
| @@ -23,6 +23,7 @@ namespace ops { | |||
| 23 | constexpr size_t GRAD_IDX = 0; | 23 | constexpr size_t GRAD_IDX = 0; |
| 24 | constexpr size_t INPUTV_IDX = 1; | 24 | constexpr size_t INPUTV_IDX = 1; |
| 25 | constexpr size_t INPUTM_IDX = 2; | 25 | constexpr size_t INPUTM_IDX = 2; |
| 26 | +constexpr size_t INPUT3_IDX = 3; | ||
| 26 | constexpr size_t OUTPUT0_IDX = 0; | 27 | constexpr size_t OUTPUT0_IDX = 0; |
| 27 | constexpr size_t OUTPUTV_IDX = 1; | 28 | constexpr size_t OUTPUTV_IDX = 1; |
| 28 | constexpr size_t OUTPUTM_IDX = 2; | 29 | constexpr size_t OUTPUTM_IDX = 2; |
| @@ -35,6 +36,8 @@ static ge::graphStatus InferShape4LambApplyOptimizerAssign(gert::InferShapeConte | |||
| 35 | OP_CHECK_NULL_WITH_CONTEXT(context, inputv_shape); | 36 | OP_CHECK_NULL_WITH_CONTEXT(context, inputv_shape); |
| 36 | auto inputm_shape = context->GetInputShape(INPUTM_IDX); | 37 | auto inputm_shape = context->GetInputShape(INPUTM_IDX); |
| 37 | OP_CHECK_NULL_WITH_CONTEXT(context, inputm_shape); | 38 | OP_CHECK_NULL_WITH_CONTEXT(context, inputm_shape); |
| 39 | + auto input3_shape = context->GetInputShape(INPUT3_IDX); | ||
| 40 | + OP_CHECK_NULL_WITH_CONTEXT(context, input3_shape); | ||
| 38 | auto output0_shape = context->GetOutputShape(OUTPUT0_IDX); | 41 | auto output0_shape = context->GetOutputShape(OUTPUT0_IDX); |
| 39 | OP_CHECK_NULL_WITH_CONTEXT(context, output0_shape); | 42 | OP_CHECK_NULL_WITH_CONTEXT(context, output0_shape); |
| 40 | auto outputv_shape = context->GetOutputShape(OUTPUTV_IDX); | 43 | auto outputv_shape = context->GetOutputShape(OUTPUTV_IDX); |
| @@ -42,21 +45,31 @@ static ge::graphStatus InferShape4LambApplyOptimizerAssign(gert::InferShapeConte | |||
| 42 | auto outputm_shape = context->GetOutputShape(OUTPUTM_IDX); | 45 | auto outputm_shape = context->GetOutputShape(OUTPUTM_IDX); |
| 43 | OP_CHECK_NULL_WITH_CONTEXT(context, outputm_shape); | 46 | OP_CHECK_NULL_WITH_CONTEXT(context, outputm_shape); |
| 44 | 47 | ||
| 45 | - OP_CHECK_IF(!BroadcastShape(grad_shape, inputv_shape, output0_shape), | 48 | + // inputv、inputm 承载动量的更新结果,内核按广播出的完整网格计算并写回它们, |
| 46 | - OP_LOGE(context->GetNodeName(), "shape %s and %s cannot broadcast!", ToString(*grad_shape).c_str(), | 49 | + // 故输出形状由 inputv/inputm 决定,grad 与 input3 只能向上广播进来。 |
| 47 | - ToString(*inputv_shape).c_str()), | 50 | + // 此处的判定与 tiling 的 CheckInplaceShapeConstraint 保持一致,避免两个 host |
| 51 | + // 阶段对同一组合给出不同结论。 | ||
| 52 | + OP_CHECK_IF(!(*inputv_shape == *inputm_shape), | ||
| 53 | + OP_LOGE(context->GetNodeName(), | ||
| 54 | + "inputv %s and inputm %s must have the same shape, they carry the moment update outputs!", | ||
| 55 | + ToString(*inputv_shape).c_str(), ToString(*inputm_shape).c_str()), | ||
| 48 | return ge::GRAPH_FAILED); | 56 | return ge::GRAPH_FAILED); |
| 49 | 57 | ||
| 50 | - OP_CHECK_IF(!BroadcastShape(grad_shape, inputv_shape, outputv_shape), | 58 | + gert::Shape broadcast_shape; |
| 51 | - OP_LOGE(context->GetNodeName(), "shape %s and %s cannot broadcast!", ToString(*grad_shape).c_str(), | 59 | + OP_CHECK_IF(!BroadcastShape(grad_shape, inputv_shape, &broadcast_shape) || !(broadcast_shape == *inputv_shape), |
| 52 | - ToString(*inputv_shape).c_str()), | 60 | + OP_LOGE(context->GetNodeName(), "grad %s must be broadcastable into the moment shape %s!", |
| 61 | + ToString(*grad_shape).c_str(), ToString(*inputv_shape).c_str()), | ||
| 53 | return ge::GRAPH_FAILED); | 62 | return ge::GRAPH_FAILED); |
| 54 | 63 | ||
| 55 | - OP_CHECK_IF(!BroadcastShape(grad_shape, inputm_shape, outputm_shape), | 64 | + OP_CHECK_IF(!BroadcastShape(input3_shape, inputv_shape, &broadcast_shape) || !(broadcast_shape == *inputv_shape), |
| 56 | - OP_LOGE(context->GetNodeName(), "shape %s and %s cannot broadcast!", ToString(*grad_shape).c_str(), | 65 | + OP_LOGE(context->GetNodeName(), "input3 %s must be broadcastable into the moment shape %s!", |
| 57 | - ToString(*inputm_shape).c_str()), | 66 | + ToString(*input3_shape).c_str(), ToString(*inputv_shape).c_str()), |
| 58 | return ge::GRAPH_FAILED); | 67 | return ge::GRAPH_FAILED); |
| 59 | 68 | ||
| 69 | + *output0_shape = *inputv_shape; | ||
| 70 | + *outputv_shape = *inputv_shape; | ||
| 71 | + *outputm_shape = *inputm_shape; | ||
| 72 | + | ||
| 60 | return GRAPH_SUCCESS; | 73 | return GRAPH_SUCCESS; |
| 61 | } | 74 | } |
| 62 | IMPL_OP_INFERSHAPE(LambApplyOptimizerAssign).InferShape(InferShape4LambApplyOptimizerAssign); | 75 | IMPL_OP_INFERSHAPE(LambApplyOptimizerAssign).InferShape(InferShape4LambApplyOptimizerAssign); |
Moptim/lamb_apply_optimizer_assign/tests/ut/op_host/test_lamb_apply_optimizer_assign_infershape.cpp+77-0
| @@ -102,3 +102,80 @@ TEST_F(LambApplyOptimizerAssignProtoTest, lamb_apply_optimizer_assign_case_fp16_ | |||
| 102 | auto od2 = holder.GetContext<gert::InferShapeContext>()->GetOutputShape(2); | 102 | auto od2 = holder.GetContext<gert::InferShapeContext>()->GetOutputShape(2); |
| 103 | ASSERT_EQ(Ops::Base::ToString(*od2), Ops::Base::ToString(expShape)); | 103 | ASSERT_EQ(Ops::Base::ToString(*od2), Ops::Base::ToString(expShape)); |
| 104 | } | 104 | } |
| 105 | + | ||
| 106 | +namespace { | ||
| 107 | +// 按 grad / inputv / inputm / input3 四个张量的形状跑一次 infershape, | ||
| 108 | +// 标量输入统一用 {1}。用于核对 infershape 与 tiling 的支持范围是否一致。 | ||
| 109 | +ge::graphStatus RunInferShape(const gert::Shape& grad, const gert::Shape& inputv, const gert::Shape& inputm, | ||
| 110 | + const gert::Shape& input3, gert::Shape* out0, gert::Shape* out1, gert::Shape* out2) | ||
| 111 | +{ | ||
| 112 | + auto inferShapeFunc = gert::OpImplRegistry::GetInstance().GetOpImpl("LambApplyOptimizerAssign")->infer_shape; | ||
| 113 | + gert::Shape g = grad; | ||
| 114 | + gert::Shape v = inputv; | ||
| 115 | + gert::Shape m = inputm; | ||
| 116 | + gert::Shape p = input3; | ||
| 117 | + gert::Shape s = {1}; | ||
| 118 | + auto holder = gert::InferShapeContextFaker() | ||
| 119 | + .NodeIoNum(12, 3) | ||
| 120 | + .IrInstanceNum({1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}) | ||
| 121 | + .InputShapes({&g, &v, &m, &p, &s, &s, &s, &s, &s, &s, &s, &s}) | ||
| 122 | + .OutputShapes({out0, out1, out2}) | ||
| 123 | + .NodeInputTd(0, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 124 | + .NodeInputTd(1, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 125 | + .NodeInputTd(2, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 126 | + .NodeInputTd(3, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 127 | + .NodeInputTd(4, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 128 | + .NodeInputTd(5, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 129 | + .NodeInputTd(6, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 130 | + .NodeInputTd(7, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 131 | + .NodeInputTd(8, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 132 | + .NodeInputTd(9, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 133 | + .NodeInputTd(10, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 134 | + .NodeInputTd(11, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 135 | + .NodeOutputTd(0, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 136 | + .NodeOutputTd(1, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 137 | + .NodeOutputTd(2, ge::DT_FLOAT, ge::FORMAT_ND, ge::FORMAT_ND) | ||
| 138 | + .Build(); | ||
| 139 | + auto ctx = holder.GetContext<gert::InferShapeContext>(); | ||
| 140 | + auto ret = inferShapeFunc(ctx); | ||
| 141 | + if (ret == ge::GRAPH_SUCCESS) { | ||
| 142 | + // faker 内部持有输出 shape 的副本,需从 context 取回 | ||
| 143 | + *out0 = *ctx->GetOutputShape(0); | ||
| 144 | + *out1 = *ctx->GetOutputShape(1); | ||
| 145 | + *out2 = *ctx->GetOutputShape(2); | ||
| 146 | + } | ||
| 147 | + return ret; | ||
| 148 | +} | ||
| 149 | +} // namespace | ||
| 150 | + | ||
| 151 | +// inputv/inputm 承载动量更新结果,输出形状由它们决定;grad 更小时向上广播进来。 | ||
| 152 | +TEST_F(LambApplyOptimizerAssignProtoTest, moment_shape_decides_output_shape) | ||
| 153 | +{ | ||
| 154 | + gert::Shape o0 = {}, o1 = {}, o2 = {}; | ||
| 155 | + gert::Shape expect = {512, 1024}; | ||
| 156 | + ASSERT_EQ(RunInferShape({1, 1024}, {512, 1024}, {512, 1024}, {512, 1024}, &o0, &o1, &o2), ge::GRAPH_SUCCESS); | ||
| 157 | + ASSERT_EQ(Ops::Base::ToString(o0), Ops::Base::ToString(expect)); | ||
| 158 | + ASSERT_EQ(Ops::Base::ToString(o1), Ops::Base::ToString(expect)); | ||
| 159 | + ASSERT_EQ(Ops::Base::ToString(o2), Ops::Base::ToString(expect)); | ||
| 160 | +} | ||
| 161 | + | ||
| 162 | +// grad 大于动量形状:结果无处容纳,infershape 须与 tiling 一样拒收。 | ||
| 163 | +TEST_F(LambApplyOptimizerAssignProtoTest, grad_larger_than_moment_is_rejected) | ||
| 164 | +{ | ||
| 165 | + gert::Shape o0 = {}, o1 = {}, o2 = {}; | ||
| 166 | + ASSERT_EQ(RunInferShape({512, 1024}, {1, 1024}, {1, 1024}, {1, 1024}, &o0, &o1, &o2), ge::GRAPH_FAILED); | ||
| 167 | +} | ||
| 168 | + | ||
| 169 | +// input3 大于动量形状:同上。 | ||
| 170 | +TEST_F(LambApplyOptimizerAssignProtoTest, input3_larger_than_moment_is_rejected) | ||
| 171 | +{ | ||
| 172 | + gert::Shape o0 = {}, o1 = {}, o2 = {}; | ||
| 173 | + ASSERT_EQ(RunInferShape({1, 1024}, {1, 1024}, {1, 1024}, {512, 1024}, &o0, &o1, &o2), ge::GRAPH_FAILED); | ||
| 174 | +} | ||
| 175 | + | ||
| 176 | +// 两个动量形状不一致:无法确定唯一的输出形状,须拒收。 | ||
| 177 | +TEST_F(LambApplyOptimizerAssignProtoTest, inputv_inputm_mismatch_is_rejected) | ||
| 178 | +{ | ||
| 179 | + gert::Shape o0 = {}, o1 = {}, o2 = {}; | ||
| 180 | + ASSERT_EQ(RunInferShape({512, 1024}, {512, 1024}, {1, 1024}, {512, 1024}, &o0, &o1, &o2), ge::GRAPH_FAILED); | ||
| 181 | +} | ||