Skip to content

Commit 2980add

Browse files
committed
Fix nnapi Bad data error in api < 29 conv_2d
1 parent f64b511 commit 2980add

5 files changed

Lines changed: 71 additions & 30 deletions

File tree

dnnlibrary/ModelBuilder.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ OperandType ModelBuilder::GetOperandType(const QuantInfo &quant_info,
7777
return map_type##_operand_map_[value]; \
7878
}
7979

80+
DEFINE_OPERAND_FROM_SCALAR(bool, bool, BOOL);
8081
DEFINE_OPERAND_FROM_SCALAR(uint32_t, uint32, UINT32);
8182
DEFINE_OPERAND_FROM_SCALAR(int32_t, int32, INT32);
8283
DEFINE_OPERAND_FROM_SCALAR(float, float32, FLOAT32);
@@ -381,4 +382,9 @@ dnn::optional<std::vector<Device>> ModelBuilder::GetDevices() {
381382
return dnn::nullopt;
382383
}
383384
}
385+
386+
387+
int32_t ModelBuilder::android_api_level() const {
388+
return nnapi_->android_sdk_version;
389+
}
384390
} // namespace dnn

dnnlibrary/ModelBuilderImpl.cpp

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,25 @@ expected<Unit, std::string> ModelBuilder::AddLayer_CONV_2D_Impl(
6767
bias_idx_val = operand_indexes_.at(bias.value());
6868
}
6969
input_indexes.push_back(bias_idx_val);
70-
AddScalarOperands(input_indexes, padding_left, padding_right, padding_top,
71-
padding_bottom, stride_x, stride_y, fuse_code, dilation_x,
72-
dilation_y);
70+
AddScalarOperands(input_indexes, padding_left);
71+
AddScalarOperands(input_indexes, padding_right);
72+
AddScalarOperands(input_indexes, padding_top);
73+
AddScalarOperands(input_indexes, padding_bottom);
74+
AddScalarOperands(input_indexes, stride_x);
75+
AddScalarOperands(input_indexes, stride_y);
76+
AddScalarOperands(input_indexes, fuse_code);
77+
78+
if (android_api_level() > 29) {
79+
AddScalarOperands(input_indexes, nchw);
80+
}
81+
82+
if (android_api_level() > 29) {
83+
AddScalarOperands(input_indexes, dilation_x);
84+
}
85+
86+
if (android_api_level() > 29) {
87+
AddScalarOperands(input_indexes, dilation_y);
88+
}
7389
shaper_.Conv(input, weight, padding_left, padding_right, padding_top,
7490
padding_bottom, stride_x, stride_y, nchw, dilation_x,
7591
dilation_y, output);
@@ -95,9 +111,15 @@ expected<Unit, std::string> ModelBuilder::AddLayer_AVERAGE_POOL_2D(
95111
imm_blob_inputs_.insert(input);
96112
const auto input_idx = operand_indexes_.at(input);
97113
input_indexes.push_back(input_idx);
98-
AddScalarOperands(input_indexes, padding_left, padding_right, padding_top,
99-
padding_bottom, stride_x, stride_y, kernel_width,
100-
kernel_height, fuse_code);
114+
AddScalarOperands(input_indexes, padding_left);
115+
AddScalarOperands(input_indexes, padding_right);
116+
AddScalarOperands(input_indexes, padding_top);
117+
AddScalarOperands(input_indexes, padding_bottom);
118+
AddScalarOperands(input_indexes, stride_x);
119+
AddScalarOperands(input_indexes, stride_y);
120+
AddScalarOperands(input_indexes, kernel_width);
121+
AddScalarOperands(input_indexes, kernel_height);
122+
AddScalarOperands(input_indexes, fuse_code);
101123
shaper_.Pool(input, padding_left, padding_right, padding_top,
102124
padding_bottom, stride_x, stride_y, kernel_width,
103125
kernel_height, output);
@@ -123,9 +145,15 @@ expected<Unit, std::string> ModelBuilder::AddLayer_MAX_POOL_2D(
123145
imm_blob_inputs_.insert(input);
124146
const auto input_idx = operand_indexes_.at(input);
125147
input_indexes.push_back(input_idx);
126-
AddScalarOperands(input_indexes, padding_left, padding_right, padding_top,
127-
padding_bottom, stride_x, stride_y, kernel_width,
128-
kernel_height, fuse_code);
148+
AddScalarOperands(input_indexes, padding_left);
149+
AddScalarOperands(input_indexes, padding_right);
150+
AddScalarOperands(input_indexes, padding_top);
151+
AddScalarOperands(input_indexes, padding_bottom);
152+
AddScalarOperands(input_indexes, stride_x);
153+
AddScalarOperands(input_indexes, stride_y);
154+
AddScalarOperands(input_indexes, kernel_width);
155+
AddScalarOperands(input_indexes, kernel_height);
156+
AddScalarOperands(input_indexes, fuse_code);
129157
shaper_.Pool(input, padding_left, padding_right, padding_top,
130158
padding_bottom, stride_x, stride_y, kernel_width,
131159
kernel_height, output);
@@ -315,9 +343,14 @@ expected<Unit, std::string> ModelBuilder::AddLayer_DEPTHWISE_CONV_2D(
315343
bias_idx_val = operand_indexes_.at(bias.value());
316344
}
317345
input_indexes.push_back(bias_idx_val);
318-
AddScalarOperands(input_indexes, padding_left, padding_right, padding_top,
319-
padding_bottom, stride_x, stride_y, depth_multiplier,
320-
fuse_code);
346+
AddScalarOperands(input_indexes, padding_left);
347+
AddScalarOperands(input_indexes, padding_right);
348+
AddScalarOperands(input_indexes, padding_top);
349+
AddScalarOperands(input_indexes, padding_bottom);
350+
AddScalarOperands(input_indexes, stride_x);
351+
AddScalarOperands(input_indexes, stride_y);
352+
AddScalarOperands(input_indexes, depth_multiplier);
353+
AddScalarOperands(input_indexes, fuse_code);
321354
shaper_.DepthwiseConv(input, weight, padding_left, padding_right,
322355
padding_top, padding_bottom, stride_x, stride_y,
323356
output);
@@ -406,7 +439,9 @@ expected<Unit, std::string> ModelBuilder::AddLayer_STRIDED_SLICE(
406439
"input_strides_of_" + output, &strides[0],
407440
{Type::TENSOR_INT32, Shape{static_cast<uint32_t>(strides.size())}});
408441
input_indexes.push_back(strides_idx);
409-
AddScalarOperands(input_indexes, begin_mask, end_mask, shrink_axis_mask);
442+
AddScalarOperands(input_indexes, begin_mask);
443+
AddScalarOperands(input_indexes, end_mask);
444+
AddScalarOperands(input_indexes, shrink_axis_mask);
410445
shaper_.StridedSlice(input, starts, ends, strides, begin_mask, end_mask,
411446
shrink_axis_mask, output);
412447
const OperandType operand_type =
@@ -472,7 +507,10 @@ expected<Unit, std::string> ModelBuilder::AddLayer_LOCAL_RESPONSE_NORMALIZATION(
472507
imm_blob_inputs_.insert(input);
473508
const auto input_idx = operand_indexes_.at(input);
474509
input_indexes.push_back(input_idx);
475-
AddScalarOperands(input_indexes, radius, bias, alpha, beta);
510+
AddScalarOperands(input_indexes, radius);
511+
AddScalarOperands(input_indexes, bias);
512+
AddScalarOperands(input_indexes, alpha);
513+
AddScalarOperands(input_indexes, beta);
476514
shaper_.Identity(input, output);
477515
const OperandType operand_type =
478516
GetOperandType(operand_types_.at(input).type, shaper_[output]);
@@ -880,16 +918,3 @@ ModelBuilder::IndexSeq ModelBuilder::AddOperation(
880918
}
881919

882920
} // namespace dnn
883-
884-
885-
886-
887-
888-
889-
890-
891-
892-
893-
894-
895-

generate_code.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,8 +400,14 @@ def generate_model_builder():
400400
for x in tensor_input:
401401
cogoutl(add_tensor_operand(x))
402402
# cogoutl('IndexSeq input_indexes{{{}}};'.format(', '.join([x['name'] + "_idx" for x in tensor_input])))
403-
if len(scalar_input) > 0:
404-
cogoutl('AddScalarOperands(input_indexes, {});'.format(', '.join([x['name'] for x in scalar_input])))
403+
for x in scalar_input:
404+
if 'api' in x:
405+
cogoutl(f"""
406+
if (android_api_level() > {x['api']}) {{
407+
AddScalarOperands(input_indexes, {x['name']});
408+
}}""")
409+
else:
410+
cogoutl(f"AddScalarOperands(input_indexes, {x['name']});")
405411
cogoutl('shaper_.{}({});'.format(op['shaper'],
406412
', '.join([x['name'] for x in ipt_opt if x['needed_by_shaper']])))
407413
if op['output_tensor_type'] != 'auto':

include/dnnlibrary/ModelBuilder.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class ModelBuilder {
4141
Shaper shaper_;
4242
IndexSeq input_index_vec_;
4343
IndexSeq output_index_vec_;
44+
std::map<bool, Index> bool_operand_map_;
4445
std::map<uint32_t, Index> uint32_operand_map_;
4546
std::map<int32_t, Index> int32_operand_map_;
4647
std::map<float, Index> float32_operand_map_;
@@ -64,6 +65,7 @@ class ModelBuilder {
6465
IndexSeq AddOperation(int op, IndexSeq input_indexes,
6566
OperandTypes... output_types);
6667

68+
Index OperandFromScalar(bool value);
6769
Index OperandFromScalar(int32_t value);
6870
Index OperandFromScalar(float value);
6971
Index OperandFromScalar(uint32_t value);
@@ -88,6 +90,8 @@ class ModelBuilder {
8890
android::nn::wrapper::OperandType GetOperandType(
8991
const QuantInfo &quant_info, const Shape &dims);
9092

93+
int32_t android_api_level() const;
94+
9195
const NnApi *nnapi_ = nullptr;
9296

9397
public:

ops.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
-
4545
predefined: fuse_code
4646
- name: nchw
47-
nnapi_type: bool
47+
nnapi_type: scalar
4848
cpp_type: bool
4949
needed_by_shaper: true
5050
api: 29

0 commit comments

Comments
 (0)