Skip to content

Commit 2519a95

Browse files
committed
[QualcommQnn] add ops (PaddlePaddle#9538)
support fusion_elementwise_mul_activation, fusion_elementwise_sub_activation, fusion_elementwise_div_activation, fusion_elementwise_min_activation, fusion_elementwise_max_activation, fusion_elementwise_pow_activation, instance_norm, prelu, arg_max, arg_min, flatten, flatten2, norm
1 parent 5aad528 commit 2519a95

File tree

13 files changed

+211
-72
lines changed

13 files changed

+211
-72
lines changed

lite/backends/nnadapter/nnadapter/include/nnadapter/operation/lp_normalization.h

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,33 @@
1717
namespace nnadapter {
1818
namespace operation {
1919

20-
#define LP_NORMALIZATION_OPERATION_EXTRACT_INPUTS_OUTPUTS \
21-
auto& input_operands = operation->input_operands; \
22-
auto& output_operands = operation->output_operands; \
23-
auto input_count = input_operands.size(); \
24-
auto output_count = output_operands.size(); \
25-
NNADAPTER_CHECK_EQ(input_count, 4); \
26-
NNADAPTER_CHECK_EQ(output_count, 1); \
27-
/* Input */ \
28-
auto input_operand = input_operands[0]; \
29-
NNADAPTER_VLOG(5) << "input: " << OperandToString(input_operand); \
30-
/* Output */ \
31-
auto output_operand = output_operands[0]; \
32-
NNADAPTER_VLOG(5) << "output: " << OperandToString(output_operand); \
33-
/* Axis */ \
34-
auto axis_operand = input_operands[1]; \
35-
auto axis_count = axis_operand->length / sizeof(int32_t); \
36-
auto axis_data = reinterpret_cast<int32_t*>(axis_operand->buffer); \
37-
for (uint32_t i = 0; i < axis_count; i++) { \
38-
NNADAPTER_VLOG(5) << "axis[" << i << "]=" << axis_data[i]; \
39-
} \
40-
/* P */ \
41-
auto p = *reinterpret_cast<int32_t*>(input_operands[2]->buffer); \
42-
NNADAPTER_VLOG(5) << "p: " << p; \
43-
NNADAPTER_CHECK(p == 1 || p == 2) \
44-
<< "lp normalization only support p = 1 or p = 2."; \
45-
/* Epsilon */ \
46-
auto epsilon = *reinterpret_cast<float*>(input_operands[3]->buffer); \
20+
#define LP_NORMALIZATION_OPERATION_EXTRACT_INPUTS_OUTPUTS \
21+
auto& input_operands = operation->input_operands; \
22+
auto& output_operands = operation->output_operands; \
23+
auto input_count = input_operands.size(); \
24+
auto output_count = output_operands.size(); \
25+
NNADAPTER_CHECK_EQ(input_count, 4); \
26+
NNADAPTER_CHECK_EQ(output_count, 1); \
27+
/* Input */ \
28+
auto input_operand = input_operands[0]; \
29+
NNADAPTER_VLOG(5) << "input: " << OperandToString(input_operand); \
30+
/* Output */ \
31+
auto output_operand = output_operands[0]; \
32+
NNADAPTER_VLOG(5) << "output: " << OperandToString(output_operand); \
33+
/* Axis */ \
34+
auto axis_operand = input_operands[1]; \
35+
auto axis_count = axis_operand->length / sizeof(int32_t); \
36+
auto axis_data = reinterpret_cast<int32_t*>(axis_operand->buffer); \
37+
for (uint32_t i = 0; i < axis_count; i++) { \
38+
NNADAPTER_VLOG(5) << "axis[" << i << "]=" << axis_data[i]; \
39+
} \
40+
/* P */ \
41+
auto p = *reinterpret_cast<int32_t*>(input_operands[2]->buffer); \
42+
NNADAPTER_VLOG(5) << "p: " << p; \
43+
NNADAPTER_CHECK(p == 1 || p == 2) \
44+
<< "lp normalization only support p = 1 or p = 2. Received p is " << p; \
45+
/* Epsilon */ \
46+
auto epsilon = *reinterpret_cast<float*>(input_operands[3]->buffer); \
4747
NNADAPTER_VLOG(5) << "epsilon: " << epsilon;
4848

4949
} // namespace operation

lite/backends/nnadapter/nnadapter/include/nnadapter/optimizer/convert_datalayout_nchw_to_nhwc.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,29 +36,33 @@ class NCHW2NHWCDataLayoutConverter {
3636

3737
private:
3838
// Operation converters
39+
void ConvertActivation(core::Operation* operation);
3940
void ConvertAdaptivePool2D(core::Operation* operation);
41+
void ConvertArgMinMax(core::Operation* operation);
4042
void ConvertBatchNormalization(core::Operation* operation);
4143
void ConvertCast(core::Operation* operation);
4244
void ConvertChannelShuffle(core::Operation* operation);
4345
void ConvertClip(core::Operation* operation);
4446
void ConvertComparisons(core::Operation* operation);
47+
void ConvertConcat(core::Operation* operation);
4548
void ConvertCumSum(core::Operation* operation);
4649
void ConvertDequantize(core::Operation* operation);
4750
void ConvertElementwise(core::Operation* operation);
48-
void ConvertPool2D(core::Operation* operation);
49-
void ConvertConcat(core::Operation* operation);
5051
void ConvertFill(core::Operation* operation);
5152
void ConvertFillLike(core::Operation* operation);
5253
void ConvertFlatten(core::Operation* operation);
5354
void ConvertFullyConnected(core::Operation* operation);
5455
void ConvertGather(core::Operation* operation);
5556
void ConvertGelu(core::Operation* operation);
57+
void ConvertInstanceNormalization(core::Operation* operation);
5658
void ConvertLayerNormalization(core::Operation* operation);
5759
void ConvertLeakyRelu(core::Operation* operation);
5860
void ConvertLpNormalization(core::Operation* operation);
59-
void ConvertActivation(core::Operation* operation);
61+
void ConvertMatMul(core::Operation* operation);
6062
void ConvertPad(core::Operation* operation);
6163
void ConvertPow(core::Operation* operation);
64+
void ConvertPool2D(core::Operation* operation);
65+
void ConvertPrelu(core::Operation* operation);
6266
void ConvertQuantize(core::Operation* operation);
6367
void ConvertReduce(core::Operation* operation);
6468
void ConvertReshape(core::Operation* operation);
@@ -73,7 +77,6 @@ class NCHW2NHWCDataLayoutConverter {
7377
void ConvertStack(core::Operation* operation);
7478
void ConvertTile(core::Operation* operation);
7579
void ConvertTranspose(core::Operation* operation);
76-
void ConvertMatMul(core::Operation* operation);
7780
void ConvertUnsqueeze(core::Operation* operation);
7881
void ConvertUnstack(core::Operation* operation);
7982

lite/backends/nnadapter/nnadapter/src/optimizer/convert_datalayout_nchw_to_nhwc.cc

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,46 @@ void NCHW2NHWCDataLayoutConverter::ConvertAdaptivePool2D(
171171
SetOperationLayout(operation);
172172
}
173173

174+
void NCHW2NHWCDataLayoutConverter::ConvertArgMinMax(
175+
core::Operation* operation) {
176+
auto& input_operands = operation->input_operands;
177+
auto& output_operands = operation->output_operands;
178+
auto input_count = input_operands.size();
179+
auto output_count = output_operands.size();
180+
NNADAPTER_CHECK_EQ(input_count, 4);
181+
NNADAPTER_CHECK_EQ(output_count, 1);
182+
auto input_operand = input_operands[0];
183+
auto input_dimensions_count = input_operand->type.dimensions.count;
184+
auto axis = reinterpret_cast<int32_t*>(input_operands[1]->buffer);
185+
if (*axis < 0) {
186+
*axis += input_dimensions_count;
187+
}
188+
auto keepdim = *reinterpret_cast<bool*>(input_operands[2]->buffer);
189+
auto output_operand = output_operands[0];
190+
auto input_permutation = GetPermutation(input_operand);
191+
if (keepdim) {
192+
// Recalculate the axis according to the dimorder vector of the input
193+
// operand
194+
*axis = TransposeAxis(*axis, input_permutation);
195+
TransposeOperand(output_operand, input_permutation);
196+
SetPermutation(output_operand, input_permutation);
197+
} else {
198+
// Force to restore the dimorder vector of the input operand
199+
auto transpose_input_permutation = InversePermutation(input_permutation);
200+
if (!IsIdentityPermutation(transpose_input_permutation)) {
201+
auto transpose_input_operand = AppendTransposeOperation(
202+
model_, input_operand, transpose_input_permutation);
203+
UpdateOperationInputOperands(
204+
{operation}, input_operand, transpose_input_operand);
205+
SetPermutation(transpose_input_operand,
206+
IdentityPermutation(input_dimensions_count));
207+
}
208+
int output_dimensions_count = output_operand->type.dimensions.count;
209+
SetPermutation(output_operand,
210+
IdentityPermutation(output_dimensions_count));
211+
}
212+
}
213+
174214
void NCHW2NHWCDataLayoutConverter::ConvertBatchNormalization(
175215
core::Operation* operation) {
176216
auto& input_operands = operation->input_operands;
@@ -704,6 +744,38 @@ void NCHW2NHWCDataLayoutConverter::ConvertPow(core::Operation* operation) {
704744
SetPermutation(output_operand, input_permutation);
705745
}
706746

747+
void NCHW2NHWCDataLayoutConverter::ConvertPrelu(core::Operation* operation) {
748+
auto& input_operands = operation->input_operands;
749+
auto& output_operands = operation->output_operands;
750+
auto input_count = input_operands.size();
751+
auto output_count = output_operands.size();
752+
NNADAPTER_CHECK_EQ(input_count, 2);
753+
NNADAPTER_CHECK_EQ(output_count, 1);
754+
auto input_operand = input_operands[0];
755+
auto output_operand = output_operands[0];
756+
auto input_permutation = GetPermutation(input_operand);
757+
auto slope_size = input_operands[1]->type.dimensions.data[0];
758+
if (slope_size == 1) {
759+
// The input and output operands share the same dimorder vector
760+
TransposeOperand(output_operand, input_permutation);
761+
SetPermutation(output_operand, input_permutation);
762+
} else {
763+
// Force to apply the dimorder vector of NCHW2NHWC conversion
764+
auto transpose_input_permutation =
765+
MultiplyPermutation(InversePermutation(input_permutation), kNCHW2NHWC);
766+
if (!IsIdentityPermutation(transpose_input_permutation)) {
767+
auto transpose_input_operand = AppendTransposeOperation(
768+
model_, input_operand, transpose_input_permutation);
769+
UpdateOperationInputOperands(
770+
{operation}, input_operand, transpose_input_operand);
771+
SetPermutation(transpose_input_operand, kNCHW2NHWC);
772+
}
773+
TransposeOperand(output_operand, kNCHW2NHWC);
774+
SetPermutation(output_operand, kNCHW2NHWC);
775+
SetOperationLayout(operation);
776+
}
777+
}
778+
707779
void NCHW2NHWCDataLayoutConverter::ConvertQuantize(core::Operation* operation) {
708780
auto& input_operands = operation->input_operands;
709781
auto& output_operands = operation->output_operands;
@@ -921,6 +993,32 @@ void NCHW2NHWCDataLayoutConverter::ConvertFlatten(core::Operation* operation) {
921993
SetPermutation(output_operand, IdentityPermutation(output_dimensions_count));
922994
}
923995

996+
void NCHW2NHWCDataLayoutConverter::ConvertInstanceNormalization(
997+
core::Operation* operation) {
998+
auto& input_operands = operation->input_operands;
999+
auto& output_operands = operation->output_operands;
1000+
auto input_count = input_operands.size();
1001+
auto output_count = output_operands.size();
1002+
NNADAPTER_CHECK_EQ(input_count, 4);
1003+
NNADAPTER_CHECK_EQ(output_count, 1);
1004+
auto input_operand = input_operands[0];
1005+
auto output_operand = output_operands[0];
1006+
// Force to apply the dimorder vector of NCHW2NHWC conversion
1007+
auto input_permutation = GetPermutation(input_operand);
1008+
auto transpose_input_permutation =
1009+
MultiplyPermutation(InversePermutation(input_permutation), kNCHW2NHWC);
1010+
if (!IsIdentityPermutation(transpose_input_permutation)) {
1011+
auto transpose_input_operand = AppendTransposeOperation(
1012+
model_, input_operand, transpose_input_permutation);
1013+
UpdateOperationInputOperands(
1014+
{operation}, input_operand, transpose_input_operand);
1015+
SetPermutation(transpose_input_operand, kNCHW2NHWC);
1016+
}
1017+
TransposeOperand(output_operand, kNCHW2NHWC);
1018+
SetPermutation(output_operand, kNCHW2NHWC);
1019+
SetOperationLayout(operation);
1020+
}
1021+
9241022
void NCHW2NHWCDataLayoutConverter::ConvertLayerNormalization(
9251023
core::Operation* operation) {
9261024
auto& input_operands = operation->input_operands;
@@ -1297,6 +1395,10 @@ void NCHW2NHWCDataLayoutConverter::Apply(core::Model* model) {
12971395
case NNADAPTER_ADAPTIVE_AVERAGE_POOL_2D:
12981396
ConvertAdaptivePool2D(operation);
12991397
break;
1398+
case NNADAPTER_ARG_MAX:
1399+
case NNADAPTER_ARG_MIN:
1400+
ConvertArgMinMax(operation);
1401+
break;
13001402
case NNADAPTER_AVERAGE_POOL_2D:
13011403
case NNADAPTER_MAX_POOL_2D:
13021404
ConvertPool2D(operation);
@@ -1354,6 +1456,9 @@ void NCHW2NHWCDataLayoutConverter::Apply(core::Model* model) {
13541456
case NNADAPTER_GELU:
13551457
ConvertGelu(operation);
13561458
break;
1459+
case NNADAPTER_INSTANCE_NORMALIZATION:
1460+
ConvertInstanceNormalization(operation);
1461+
break;
13571462
case NNADAPTER_LAYER_NORMALIZATION:
13581463
ConvertLayerNormalization(operation);
13591464
break;
@@ -1372,6 +1477,9 @@ void NCHW2NHWCDataLayoutConverter::Apply(core::Model* model) {
13721477
case NNADAPTER_POW:
13731478
ConvertPow(operation);
13741479
break;
1480+
case NNADAPTER_PRELU:
1481+
ConvertPrelu(operation);
1482+
break;
13751483
case NNADAPTER_QUANTIZE:
13761484
ConvertQuantize(operation);
13771485
break;

lite/backends/nnadapter/nnadapter/src/optimizer/convert_quantization_symm_to_asymm.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ NNADAPTER_EXPORT void ConvertQuantizationSymmToAsymm(core::Model* model) {
101101
ConvertOperandSymmToAsymm(output_operands[0], 128);
102102
} break;
103103
case NNADAPTER_ABS:
104+
case NNADAPTER_ARG_MAX:
105+
case NNADAPTER_ARG_MIN:
104106
case NNADAPTER_AVERAGE_POOL_2D:
105107
case NNADAPTER_BATCH_NORMALIZATION:
106108
case NNADAPTER_CAST:
@@ -114,11 +116,14 @@ NNADAPTER_EXPORT void ConvertQuantizationSymmToAsymm(core::Model* model) {
114116
case NNADAPTER_GELU:
115117
case NNADAPTER_HARD_SIGMOID:
116118
case NNADAPTER_HARD_SWISH:
119+
case NNADAPTER_INSTANCE_NORMALIZATION:
117120
case NNADAPTER_LAYER_NORMALIZATION:
118121
case NNADAPTER_LEAKY_RELU:
119122
case NNADAPTER_LOG:
123+
case NNADAPTER_LP_NORMALIZATION:
120124
case NNADAPTER_MAX_POOL_2D:
121125
case NNADAPTER_PAD:
126+
case NNADAPTER_PRELU:
122127
case NNADAPTER_REDUCE_MAX:
123128
case NNADAPTER_REDUCE_MEAN:
124129
case NNADAPTER_REDUCE_SUM:

0 commit comments

Comments
 (0)