Apollo 11.0
自动驾驶开放平台
mi_net.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2022 The Apollo Authors. All Rights Reserved.
3 *
45 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
18
19#include <algorithm>
20#include <cmath>
21#include <sstream>
22#include <utility>
23
24#include "absl/strings/str_cat.h"
25
26#include "cyber/common/log.h"
28
29#define PRINT_DEBUG 1
30
31#define DEBUG_GET_FN_NAME() \
32 (LoggingParseFunction(__func__, __PRETTY_FUNCTION__))
33
34#if PRINT_DEBUG
35#define DEBUG_LOG(...) \
36 { \
37 AINFO << "INFO [" << DEBUG_GET_FN_NAME() << "] " << __VA_ARGS__ \
38 << std::endl; \
39 }
40#else
41#define DEBUG_LOG(...) \
42 {}
43#endif
44
46std::string LoggingParseFunction(const char *func, const char *pretty_func) {
47 std::string fname{func};
48 if (fname != "operator()") return fname;
49 const std::string pf{pretty_func};
50 const std::string pf_tail{pf.substr(0, pf.find_first_of('('))};
51 return pf_tail.substr(1 + pf_tail.find_last_of(':'));
52}
53
54namespace apollo {
55namespace perception {
56namespace inference {
57
58Dims GetDims(std::vector<size_t> lens, bool remove_batch = true) {
59 Dims dims;
60
61 // remove batch dimension for compatibility with Dims
62 if (remove_batch) lens.erase(lens.begin());
63
64 dims.nbDims = lens.size();
65 for (size_t j = 0; j < lens.size(); j++) {
66 dims.d[j] = lens[j];
67 }
68
69 return dims;
70}
71
72void MINet::ConstructMap(const LayerParameter &layer_param,
73 std::vector<Tensor> outputs, TensorMap *tensor_map,
74 TensorModifyMap *tensor_modify_map) {
75 CHECK_EQ(outputs.size(), static_cast<size_t>(layer_param.top_size()));
76
77 for (int i = 0; i < layer_param.top_size(); ++i) {
78 std::string top_name = layer_param.top(i);
79 TensorModifyMap::iterator it;
80 it = tensor_modify_map->find(top_name);
81 if (it != tensor_modify_map->end()) {
82 std::string modify_name = top_name + "_" + layer_param.name();
83 top_name = modify_name;
84 it->second = top_name;
85 } else {
86 tensor_modify_map->insert(
87 std::pair<std::string, std::string>(top_name, top_name));
88 }
89
90 const Tensor layer_out = outputs[i];
91
92 if (std::find(output_names_.begin(), output_names_.end(), top_name) !=
93 output_names_.end()) {
94 const auto out_param_name =
95 "main:#output_" + std::to_string(outputs_.size());
96 const Tensor out_param =
97 network_->add_parameter(out_param_name, layer_out->get_shape());
98 const Tensor out = network_->add_instruction(
99 migraphx::make_op("hip::copy"), layer_out, out_param);
100
101 output_param_map_[top_name] = out_param_name;
102 outputs_[top_name] = out;
103 }
104
105 DEBUG_LOG(top_name << ", " << layer_out->get_shape());
106 tensor_map->insert(std::pair<std::string, Tensor>(top_name, layer_out));
107 }
108}
109
110void MINet::addConvLayer(const LayerParameter &layer_param,
111 Tensor const *inputs, WeightMap *weight_map,
112 migraphx::module *net, TensorMap *tensor_map,
113 TensorModifyMap *tensor_modify_map) {
114 const ConvolutionParameter conv_param = layer_param.convolution_param();
115 ConvParam param;
116
117 ACHECK(ParserConvParam(conv_param, &param));
118
119 const auto input = inputs[0];
120 const auto data_shape = input->get_shape();
121
122 const size_t K = conv_param.num_output();
123 const size_t C = data_shape.lens()[1] / param.group;
124 const size_t R = param.kernel_h;
125 const size_t S = param.kernel_w;
126
127 const auto weights = (*weight_map)[layer_param.name().c_str()];
128 const Shape filter_shape{Shape::float_type, {K, C, R, S}};
129
130 CHECK_EQ(weights[0].bytes(), filter_shape.bytes());
131
132 const Tensor filter =
133 net->add_literal(migraphx::literal(filter_shape, weights[0].data()));
134
135 const Operation conv = migraphx::make_op(
136 "convolution", {{"padding", {param.padding_h, param.padding_w}},
137 {"stride", {param.stride_h, param.stride_w}},
138 {"dilation", {param.dilation, param.dilation}},
139 {"group", param.group}});
140 Tensor out = net->add_instruction(conv, input, filter);
141
142 if (weights.size() > 1) {
143 const Shape out_shape = out->get_shape();
144 const Shape bias_shape{Shape::float_type, {out_shape.lens()[1]}};
145
146 CHECK_EQ(weights[1].bytes(), bias_shape.bytes());
147
148 const Operation broadcast = migraphx::make_op(
149 "broadcast", {{"axis", 1}, {"out_lens", out_shape.lens()}});
150 const Tensor bias =
151 net->add_literal(migraphx::literal(bias_shape, weights[1].data()));
152 const Tensor broadcasted_bias = net->add_instruction(broadcast, bias);
153
154 out = net->add_instruction(migraphx::make_op("add"), out, broadcasted_bias);
155 }
156
157 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
158}
159
160void MINet::addDeconvLayer(const LayerParameter &layer_param,
161 Tensor const *inputs, WeightMap *weight_map,
162 migraphx::module *net, TensorMap *tensor_map,
163 TensorModifyMap *tensor_modify_map) {
164 const ConvolutionParameter conv = layer_param.convolution_param();
165 ConvParam param;
166
167 ACHECK(ParserConvParam(conv, &param));
168
169 const auto input = inputs[0];
170 const auto data_shape = input->get_shape();
171
172 const size_t K = data_shape.lens()[1] / param.group;
173 const size_t C = conv.num_output();
174 const size_t R = param.kernel_h;
175 const size_t S = param.kernel_w;
176
177 const auto weights = (*weight_map)[layer_param.name().c_str()];
178
179 const Shape filter_shape{Shape::float_type, {K, C, R, S}};
180 CHECK_EQ(weights[0].bytes(), filter_shape.bytes());
181
182 const Tensor filter =
183 net->add_literal(migraphx::literal(filter_shape, weights[0].data()));
184
185 const Operation deconv = migraphx::make_op(
186 "deconvolution", {{"padding", {param.padding_h, param.padding_w}},
187 {"stride", {param.stride_h, param.stride_w}},
188 {"dilation", {param.dilation, param.dilation}},
189 {"group", param.group}});
190
191 Tensor out = net->add_instruction(deconv, input, filter);
192
193 if (weights.size() > 1) {
194 const Shape out_shape = out->get_shape();
195 const Shape bias_shape{Shape::float_type, {out_shape.lens()[1]}};
196
197 CHECK_EQ(weights[1].bytes(), bias_shape.bytes());
198
199 const Operation broadcast = migraphx::make_op(
200 "broadcast", {{"axis", 1}, {"out_lens", out_shape.lens()}});
201 const Tensor bias =
202 net->add_literal(migraphx::literal(bias_shape, weights[1].data()));
203 const Tensor broadcasted_bias = net->add_instruction(broadcast, bias);
204
205 out = net->add_instruction(migraphx::make_op("add"), out, broadcasted_bias);
206 }
207
208 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
209}
210
211void MINet::addActiveLayer(const LayerParameter &layer_param,
212 Tensor const *inputs, int nbInputs,
213 migraphx::module *net, TensorMap *tensor_map,
214 TensorModifyMap *tensor_modify_map) {
215 const auto input = inputs[0];
216
217 if (layer_param.type() == "ReLU" &&
218 layer_param.relu_param().negative_slope() > 0.0f) {
219 const Operation leaky_relu = migraphx::make_op(
220 "leaky_relu", {{"alpha", layer_param.relu_param().negative_slope()}});
221 const Tensor out = net->add_instruction(leaky_relu, input);
222
223 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
224 } else {
225 // caffe default activation type is sigmoid
226 std::string activation_type = "sigmoid";
227
228 auto pair = active_map.find(layer_param.type());
229 if (pair != active_map.end()) {
230 activation_type = pair->second;
231 }
232
233 const Operation activation = migraphx::make_op(activation_type);
234 const Tensor out = net->add_instruction(activation, input);
235
236 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
237 }
238}
239
240void MINet::addConcatLayer(const LayerParameter &layer_param,
241 Tensor const *inputs, int nbInputs,
242 migraphx::module *net, TensorMap *tensor_map,
243 TensorModifyMap *tensor_modify_map) {
244 const ConcatParameter params = layer_param.concat_param();
245 // default caffe concat axis is 1
246 const size_t axis = params.has_axis() ? params.axis() : 1;
247
248 CHECK_EQ(nbInputs, layer_param.bottom_size());
249
250 Tensor out = inputs[0];
251
252 for (int i = 1; i < nbInputs; ++i) {
253 const Tensor input_first = out;
254 const Tensor input_second = inputs[i];
255 const Shape first_shape = input_first->get_shape();
256 const Shape second_shape = input_second->get_shape();
257
258 CHECK_EQ(first_shape.lens().size(), second_shape.lens().size());
259 for (size_t j = 0; j < first_shape.lens().size(); ++j) {
260 if (j == axis) continue;
261 CHECK_EQ(first_shape.lens()[j], second_shape.lens()[j]);
262 }
263
264 const Operation concat = migraphx::make_op("concat", {{"axis", axis}});
265 out = net->add_instruction(concat, input_first, input_second);
266 }
267
268 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
269}
270
272 Tensor const *inputs, migraphx::module *net,
273 TensorMap *tensor_map,
274 TensorModifyMap *tensor_modify_map) {
275 PoolingParameter params = layer_param.pooling_param();
276
277 // dont support STOCHASTIC pooling mode yet
278 CHECK_NE(params.pool(), PoolingParameter_PoolMethod_STOCHASTIC);
279
280 // caffe default pooling mode is MAX
281 const std::string pool_mode =
282 (params.pool() == PoolingParameter_PoolMethod_AVE) ? "average" : "max";
283
284 ACHECK(modify_pool_param(&params));
285
286 const Operation pooling = migraphx::make_op(
287 "pooling", {{"mode", pool_mode},
288 {"padding", {params.pad_h(), params.pad_w()}},
289 {"stride", {params.stride_h(), params.stride_w()}},
290 {"lengths", {params.kernel_h(), params.kernel_w()}}});
291 const Tensor out = net->add_instruction(pooling, inputs[0]);
292
293 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
294}
295
296void MINet::addSliceLayer(const LayerParameter &layer_param,
297 Tensor const *inputs, int nbInputs,
298 migraphx::module *net, TensorMap *tensor_map,
299 TensorModifyMap *tensor_modify_map) {
300 const SliceParameter param = layer_param.slice_param();
301 // default caffe concat axis is 1
302 const size_t axis = param.has_axis() ? param.axis() : 1;
303
304 const auto input = inputs[0];
305 const auto input_shape = input->get_shape();
306
307 CHECK_GT(param.slice_point_size(), 0);
308 CHECK_GT(input_shape.lens().size(), axis);
309
310 std::vector<Operation> ops;
311
312 for (int i = 0; i < param.slice_point_size(); ++i) {
313 const size_t slice_point = param.slice_point(i);
314
315 if (i == 0) {
316 ops.push_back(migraphx::make_op(
317 "slice",
318 {{"axes", {axis}}, {"starts", {0}}, {"ends", {slice_point}}}));
319 } else {
320 const size_t slice_point_prev = param.slice_point(i - 1);
321 ops.push_back(migraphx::make_op("slice", {{"axes", {axis}},
322 {"starts", {slice_point_prev}},
323 {"ends", {slice_point}}}));
324 }
325 }
326
327 const size_t last_slice_point =
328 param.slice_point(param.slice_point_size() - 1);
329 const size_t axis_size = input_shape.lens()[axis];
330
331 ops.push_back(migraphx::make_op("slice", {{"axes", {axis}},
332 {"starts", {last_slice_point}},
333 {"ends", {axis_size}}}));
334
335 std::vector<Tensor> outputs;
336 for (auto &op : ops) {
337 Tensor out = net->add_instruction(op, input);
338 // keep standard NCHW layout
339 out = net->add_instruction(migraphx::make_op("contiguous"), out);
340 outputs.push_back(out);
341 }
342
343 ConstructMap(layer_param, outputs, tensor_map, tensor_modify_map);
344}
345
347 Tensor const *inputs, WeightMap *weight_map,
348 migraphx::module *net, TensorMap *tensor_map,
349 TensorModifyMap *tensor_modify_map) {
350 InnerProductParameter params = layer_param.inner_product_param();
351 const size_t num_outputs = params.num_output();
352
353 const auto input = inputs[0];
354 const auto input_shape = input->get_shape();
355 const auto input_lens = input_shape.lens();
356
357 // Add FullyConnected layer as convolution
358 const size_t K = num_outputs;
359 const size_t C = input_lens[1];
360 const size_t R = input_lens[2];
361 const size_t S = input_lens[3];
362
363 const Operation conv = migraphx::make_op("convolution", {{"padding", {0, 0}},
364 {"stride", {1, 1}},
365 {"dilation", {1, 1}},
366 {"group", 1}});
367
368 const auto weights = (*weight_map)[layer_param.name().c_str()];
369 const Shape filter_shape{Shape::float_type, {K, C, R, S}};
370
371 CHECK_EQ(weights[0].bytes(), filter_shape.bytes());
372
373 const Tensor filter =
374 net->add_literal(migraphx::literal(filter_shape, weights[0].data()));
375
376 Tensor out = net->add_instruction(conv, input, filter);
377
378 if (weights.size() > 1) {
379 const Shape out_shape = out->get_shape();
380 const Shape bias_shape{Shape::float_type, {out_shape.lens()[1]}};
381
382 CHECK_EQ(weights[1].bytes(), bias_shape.bytes());
383
384 const Operation broadcast = migraphx::make_op(
385 "broadcast", {{"axis", 1}, {"out_lens", out_shape.lens()}});
386 const Tensor bias =
387 net->add_literal(migraphx::literal(bias_shape, weights[1].data()));
388 const Tensor broadcasted_bias = net->add_instruction(broadcast, bias);
389
390 out = net->add_instruction(migraphx::make_op("add"), out, broadcasted_bias);
391 }
392
393 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
394}
395
396void MINet::addScaleLayer(const LayerParameter &layer_param,
397 Tensor const *inputs, WeightMap *weight_map,
398 migraphx::module *net, TensorMap *tensor_map,
399 TensorModifyMap *tensor_modify_map) {
400 const auto input = inputs[0];
401 const auto input_shape = input->get_shape();
402 const auto C = input_shape.lens()[1];
403
404 std::vector<Weights> weights;
405
406 if (layer_param.type() == "Power") {
407 const auto power_param = layer_param.power_param();
408
409 weights.push_back(loadLayerWeights(power_param.scale(), C));
410 weights.push_back(loadLayerWeights(power_param.shift(), C));
411 weights.push_back(loadLayerWeights(power_param.power(), C));
412 } else {
413 const auto lw = (*weight_map)[layer_param.name().c_str()];
414
415 for (size_t i = 0; i < lw.size(); ++i) {
416 weights.push_back(lw[i]);
417 }
418 }
419
420 static const std::vector<std::string> scale_ops = {"mul", "add", "pow"};
421 CHECK_LE(weights.size(), scale_ops.size());
422
423 Tensor out = input;
424 const Shape param_shape{Shape::float_type, {C}};
425
426 for (size_t i = 0; i < weights.size(); ++i) {
427 CHECK_EQ(weights[i].bytes(), param_shape.bytes());
428
429 const Operation broadcast = migraphx::make_op(
430 "broadcast", {{"axis", 1}, {"out_lens", input_shape.lens()}});
431 const Tensor param =
432 net->add_literal(migraphx::literal(param_shape, weights[i].data()));
433 const Tensor broadcasted_param = net->add_instruction(broadcast, param);
434
435 out = net->add_instruction(migraphx::make_op(scale_ops[i]), out,
436 broadcasted_param);
437 }
438
439 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
440}
441
443 Tensor const *inputs, WeightMap *weight_map,
444 migraphx::module *net, TensorMap *tensor_map,
445 TensorModifyMap *tensor_modify_map) {
446 const auto input = inputs[0];
447 const auto input_shape = input->get_shape();
448 const Shape params_shape{input_shape.type(), {input_shape.lens()[1]}};
449
450 const auto weights = (*weight_map)[layer_param.name().c_str()];
451
452 CHECK_EQ(weights[0].bytes(), params_shape.bytes());
453 CHECK_EQ(weights[1].bytes(), params_shape.bytes());
454
455 const Tensor shift =
456 net->add_literal(migraphx::literal(params_shape, weights[0].data()));
457 const Tensor scale =
458 net->add_literal(migraphx::literal(params_shape, weights[1].data()));
459
460 const Operation broadcast = migraphx::make_op(
461 "broadcast", {{"axis", 1}, {"out_lens", input_shape.lens()}});
462
463 const Tensor scale_broadcast = net->add_instruction(broadcast, scale);
464 const Tensor mul_out =
465 net->add_instruction(migraphx::make_op("mul"), input, scale_broadcast);
466
467 const Tensor shift_broadcast = net->add_instruction(broadcast, shift);
468 const Tensor out =
469 net->add_instruction(migraphx::make_op("add"), mul_out, shift_broadcast);
470
471 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
472}
473
475 Tensor const *inputs, int nbInputs,
476 migraphx::module *net, TensorMap *tensor_map,
477 TensorModifyMap *tensor_modify_map) {
478 const SoftmaxParameter params = layer_param.softmax_param();
479 // default caffe softmax axis is 1
480 size_t axis = params.has_axis() ? params.axis() : 1;
481 // Workaround for baidu_iter_14000 model:
482 // Batch dimension is omitted in the DFMBPSROIAlign output; due to specifics
483 // of tensor definition in TensorRT it works correctly, but with MIGraphX,
484 // the tensor dimension needs to be reduced.
485 if (dfmb_psroi_align_plugins_.size() != 0) --axis;
486
487 const auto input = inputs[0];
488 const auto input_shape = input->get_shape();
489
490 CHECK_GT(input_shape.lens().size(), axis);
491
492 const Operation softmax = migraphx::make_op("softmax", {{"axis", axis}});
493 const Tensor out = net->add_instruction(softmax, input);
494
495 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
496}
497
499 Tensor const *inputs, migraphx::module *net,
500 TensorMap *tensor_map,
501 TensorModifyMap *tensor_modify_map) {
502 // default caffe elemwise operation type is SUM
503 std::string eltwise_op = "add";
504
505 const auto pair = eltwise_map.find(layer_param.eltwise_param().operation());
506 if (pair != eltwise_map.end()) {
507 eltwise_op = pair->second;
508 }
509
510 const Operation eltwise = migraphx::make_op(eltwise_op);
511 const Tensor out = net->add_instruction(eltwise, inputs[0], inputs[1]);
512
513 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
514}
515
516void MINet::addArgmaxLayer(const LayerParameter &layer_param,
517 Tensor const *inputs, int nbInputs,
518 migraphx::module *net, TensorMap *tensor_map,
519 TensorModifyMap *tensor_modify_map) {
520 const auto params = layer_param.argmax_param();
521 const size_t axis = params.axis();
522
523 // TODO(B1tway): Caffe also defines out_max_val and top_k argmax parameters,
524 // but they are not supported yet
525 ACHECK(!(params.has_out_max_val() || params.has_top_k()));
526
527 const Tensor input = inputs[0];
528 const Shape input_shape = input->get_shape();
529
530 CHECK_GT(input_shape.lens().size(), axis);
531
532 const Operation argmax = migraphx::make_op("argmax", {{"axis", axis}});
533 const Tensor out = net->add_instruction(argmax, input);
534
535 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
536}
537
539 Tensor const *inputs, int nbInputs,
540 migraphx::module *net, TensorMap *tensor_map,
541 TensorModifyMap *tensor_modify_map) {
542 const auto params = layer_param.permute_param();
543 const auto input = inputs[0];
544 const auto input_shape = input->get_shape();
545
546 CHECK_EQ(static_cast<size_t>(params.order_size()), input_shape.lens().size());
547
548 std::vector<uint32_t> order;
549 for (int i = 0; i < params.order_size(); ++i) {
550 const auto dim = params.order(i);
551 CHECK_LT(dim, input_shape.lens().size());
552
553 order.push_back(dim);
554 }
555
556 const Operation transpose =
557 migraphx::make_op("transpose", {{"permutation", order}});
558 const Tensor transposed_out = net->add_instruction(transpose, inputs[0]);
559
560 // keep standard NCHW layout
561 const Tensor out =
562 net->add_instruction(migraphx::make_op("contiguous"), transposed_out);
563
564 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
565}
566
568 Tensor const *inputs, migraphx::module *net,
569 TensorMap *tensor_map,
570 TensorModifyMap *tensor_modify_map) {
571 const auto params = layer_param.reshape_param();
572 const auto input_shape = inputs[0]->get_shape();
573 const auto input_lens = input_shape.lens();
574
575 // For compatibility with tensorrt inference
576 // skip batch size as it shouldn't be reshaped
577 std::vector<int64_t> new_shape{int64_t(input_lens[0])};
578
579 for (int i = 1; i < params.shape().dim_size(); ++i) {
580 auto dim_param = params.shape().dim(i);
581
582 // For compatibility with tensorrt inference reffer to:
583 // void IShuffleLayer::setReshapeDimensions()
584 // Ref: https://docs.nvidia.com/deeplearning/tensorrt/api/c_api
585
586 int64_t new_dim = -1;
587 if (dim_param == 0)
588 new_dim = input_lens[i];
589 else if (dim_param > 0)
590 new_dim = dim_param;
591
592 new_shape.push_back(new_dim);
593 }
594
595 const Operation reshape = migraphx::make_op("reshape", {{"dims", new_shape}});
596 const Tensor out = net->add_instruction(reshape, inputs[0]);
597
598 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
599}
600
602 Tensor const *inputs, migraphx::module *net,
603 TensorMap *tensor_map,
604 TensorModifyMap *tensor_modify_map) {
605 AWARN << "migraphx dont support Padding layer yet";
606}
607
609 Tensor const *inputs, migraphx::module *net,
610 TensorMap *tensor_map,
611 TensorModifyMap *tensor_modify_map) {
612 // default caffe elemwise operation type is SUM
613 std::string eltwise_op = "add";
614
615 for (int i = 0; i < layer_param.bottom_size(); ++i) {
616 const auto name = layer_param.bottom(i);
617 const Tensor tensor = tensor_map->at(tensor_modify_map_[name]);
618 net->remove_instruction(tensor);
619 }
620}
621
623 Tensor const *inputs, int nbInputs,
624 migraphx::module *net, TensorMap *tensor_map,
625 TensorModifyMap *tensor_modify_map) {
626 std::shared_ptr<DFMBPSROIAlignPlugin> plugin;
627 std::vector<Dims> input_dims;
628
629 CHECK_GE(nbInputs, 2);
630 CHECK_LE(nbInputs, 3);
631 CHECK_EQ(max_batch_size_, 1);
632
633 for (int i = 0; i < nbInputs; ++i) {
634 auto input_lens = inputs[i]->get_shape().lens();
635 input_dims.push_back(GetDims(input_lens));
636 }
637
638 plugin.reset(new DFMBPSROIAlignPlugin(layer_param.dfmb_psroi_pooling_param(),
639 input_dims.data(), nbInputs));
640 dfmb_psroi_align_plugins_.push_back(plugin);
641
642 // output dims without batchsize
643 Dims out_dims = plugin->getOutputDimensions(0, nullptr, 0);
644 Shape out_shape{Shape::float_type,
645 {std::size_t(out_dims.d[0]), std::size_t(out_dims.d[1]),
646 std::size_t(out_dims.d[2]), std::size_t(out_dims.d[3])}};
647
648 const Tensor allocated_out = net->add_instruction(migraphx::make_op(
649 "hip::allocate", {{"shape", migraphx::to_value(out_shape)}}));
650
651 Tensor out;
652 bool no_trans = nbInputs < 3;
653
654 if (no_trans) {
655 out =
656 net->add_instruction(dfmb_psroi_align_op{size_t(max_batch_size_),
657 [plugin]() { return plugin; }},
658 inputs[0], inputs[1], allocated_out);
659 } else {
660 out =
661 net->add_instruction(dfmb_psroi_align_op{size_t(max_batch_size_),
662 [plugin]() { return plugin; }},
663 inputs[0], inputs[1], inputs[2], allocated_out);
664 }
665
666 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
667}
668
670 Tensor const *inputs, int nbInputs,
671 migraphx::module *net, TensorMap *tensor_map,
672 TensorModifyMap *tensor_modify_map) {
673 std::shared_ptr<RCNNProposalPlugin> plugin;
674 std::vector<Dims> input_dims;
675
676 CHECK_EQ(nbInputs, 4);
677
678 for (int i = 0; i < nbInputs; ++i) {
679 auto input_lens = inputs[i]->get_shape().lens();
680 input_dims.push_back(GetDims(input_lens, i == 2 || i == 3));
681 }
682
683 plugin.reset(new RCNNProposalPlugin(layer_param.bbox_reg_param(),
684 layer_param.detection_output_ssd_param(),
685 input_dims.data()));
686 rcnn_proposal_plugins_.push_back(plugin);
687
688 // output dims without batchsize
689 Dims out_dims = plugin->getOutputDimensions(0, nullptr, 0);
690 Shape out_shape{Shape::float_type,
691 {std::size_t(max_batch_size_), std::size_t(out_dims.d[0]),
692 std::size_t(out_dims.d[1]), std::size_t(out_dims.d[2])}};
693
694 const Tensor allocated_out = net->add_instruction(migraphx::make_op(
695 "hip::allocate", {{"shape", migraphx::to_value(out_shape)}}));
696
697 const Tensor out = net->add_instruction(
698 rcnn_proposal_op{size_t(max_batch_size_), [plugin]() { return plugin; }},
699 inputs[0], inputs[1], inputs[2], inputs[3], allocated_out);
700
701 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
702}
703
705 Tensor const *inputs, int nbInputs,
706 migraphx::module *net, TensorMap *tensor_map,
707 TensorModifyMap *tensor_modify_map) {
708 std::shared_ptr<RPNProposalSSDPlugin> plugin;
709 std::vector<Dims> input_dims;
710
711 CHECK_EQ(nbInputs, 3);
712
713 for (int i = 0; i < nbInputs; ++i) {
714 auto input_lens = inputs[i]->get_shape().lens();
715 Dims dims;
716
717 // remove batch size for compatibility with Dims
718 if (i == 0 || i == 1 || i == 2) {
719 input_lens.erase(input_lens.begin());
720 }
721
722 for (size_t j = 0; j < input_lens.size(); ++j) {
723 dims.d[j] = input_lens[j];
724 }
725
726 dims.nbDims = input_lens.size();
727 input_dims.push_back(dims);
728 }
729
730 plugin.reset(new RPNProposalSSDPlugin(
731 layer_param.bbox_reg_param(), layer_param.detection_output_ssd_param(),
732 input_dims.data()));
733 rpn_proposal_ssd_plugins_.push_back(plugin);
734
735 // output dims without batchsize
736 Dims out_dims = plugin->getOutputDimensions(0, nullptr, 0);
737 Shape out_shape{
738 Shape::float_type,
739 {std::size_t(max_batch_size_ * out_dims.d[0]), std::size_t(out_dims.d[1]),
740 std::size_t(out_dims.d[2]), std::size_t(out_dims.d[3])}};
741
742 const Tensor allocated_out = net->add_instruction(migraphx::make_op(
743 "hip::allocate", {{"shape", migraphx::to_value(out_shape)}}));
744
745 const Tensor out =
746 net->add_instruction(rpn_proposal_ssd_op{size_t(max_batch_size_),
747 [plugin]() { return plugin; }},
748 inputs[0], inputs[1], inputs[2], allocated_out);
749
750 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
751}
752
753void MINet::addLayer(const LayerParameter &layer_param, Tensor const *inputs,
754 int nbInputs, WeightMap *weight_map, migraphx::module *net,
755 TensorMap *tensor_map,
756 TensorModifyMap *tensor_modify_map) {
757 DEBUG_LOG(layer_param.type());
758
759 if (layer_param.type() == "Convolution") {
760 addConvLayer(layer_param, inputs, weight_map, net, tensor_map,
761 tensor_modify_map);
762 } else if (layer_param.type() == "Deconvolution") {
763 addDeconvLayer(layer_param, inputs, weight_map, net, tensor_map,
764 tensor_modify_map);
765 } else if (layer_param.type() == "Sigmoid" || layer_param.type() == "TanH" ||
766 layer_param.type() == "ReLU") {
767 addActiveLayer(layer_param, inputs, nbInputs, net, tensor_map,
768 tensor_modify_map);
769 } else if (layer_param.type() == "Concat") {
770 addConcatLayer(layer_param, inputs, nbInputs, net, tensor_map,
771 tensor_modify_map);
772 } else if (layer_param.type() == "Slice") {
773 addSliceLayer(layer_param, inputs, nbInputs, net, tensor_map,
774 tensor_modify_map);
775 } else if (layer_param.type() == "Reshape") {
776 addReshapeLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
777 } else if (layer_param.type() == "Padding") {
778 addPaddingLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
779 } else if (layer_param.type() == "Pooling") {
780 addPoolingLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
781 } else if (layer_param.type() == "Permute") {
782 addPermuteLayer(layer_param, inputs, nbInputs, net, tensor_map,
783 tensor_modify_map);
784 } else if (layer_param.type() == "InnerProduct") {
785 addInnerproductLayer(layer_param, inputs, weight_map, net, tensor_map,
786 tensor_modify_map);
787 } else if (layer_param.type() == "BatchNorm") {
788 addBatchnormLayer(layer_param, inputs, weight_map, net, tensor_map,
789 tensor_modify_map);
790 } else if (layer_param.type() == "Scale") {
791 addScaleLayer(layer_param, inputs, weight_map, net, tensor_map,
792 tensor_modify_map);
793 } else if (layer_param.type() == "Softmax") {
794 addSoftmaxLayer(layer_param, inputs, nbInputs, net, tensor_map,
795 tensor_modify_map);
796 } else if (layer_param.type() == "Eltwise") {
797 addEltwiseLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
798 } else if (layer_param.type() == "ArgMax") {
799 addArgmaxLayer(layer_param, inputs, nbInputs, net, tensor_map,
800 tensor_modify_map);
801 } else if (layer_param.type() == "Dropout") {
802 AINFO << "skip dropout";
803 } else if (layer_param.type() == "Power") {
804 addScaleLayer(layer_param, inputs, weight_map, net, tensor_map,
805 tensor_modify_map);
806 } else if (layer_param.type() == "Silence") {
807 addSilenceLayer(layer_param, inputs, net, tensor_map, tensor_modify_map);
808 } else if (layer_param.type() == "DFMBPSROIAlign") {
809 addDFMBPSROIAlignLayer(layer_param, inputs, nbInputs, net, tensor_map,
810 tensor_modify_map);
811 } else if (layer_param.type() == "RCNNProposal") {
812 addRCNNProposalLayer(layer_param, inputs, nbInputs, net, tensor_map,
813 tensor_modify_map);
814 } else if (layer_param.type() == "RPNProposalSSD") {
815 addRPNProposalSSDLayer(layer_param, inputs, nbInputs, net, tensor_map,
816 tensor_modify_map);
817 } else {
818 AWARN << "unknown layer type:" << layer_param.type();
819 }
820}
821
822bool MINet::loadWeights(const std::string &model_file, WeightMap *weight_map) {
823 NetParameter net;
824 if (!ReadProtoFromBinaryFile(model_file.c_str(), &net)) {
825 AFATAL << "open file " << model_file << " failed";
826 return false;
827 }
828 for (int i = 0; i < net.layer_size(); ++i) {
829 std::vector<Weights> lw;
830 for (int j = 0; j < net.layer(i).blobs_size(); ++j) {
831 // val memory will be released when deconstructor is called
832 auto blob = &(net.layer(i).blobs(j));
833 CHECK_EQ(blob->double_data_size(), 0);
834 CHECK_EQ(blob->double_diff_size(), 0);
835 CHECK_EQ(blob->diff_size(), 0);
836 CHECK_NE(blob->data_size(), 0);
837 if (net.layer(i).type() == "BatchNorm") {
838 mergeBN(j, net.mutable_layer(i));
839 }
840
841 auto wt = loadLayerWeights(blob->data().data(), blob->data_size());
842 lw.push_back(wt);
843 }
844 (*weight_map)[net.layer(i).name().c_str()] = lw;
845 }
846 return true;
847}
848
849void MINet::mergeBN(int index, LayerParameter *layer_param) {
850 auto blob = (layer_param->mutable_blobs(index));
851 CHECK_EQ(blob->double_data_size(), 0);
852 CHECK_EQ(blob->double_diff_size(), 0);
853 CHECK_EQ(blob->diff_size(), 0);
854 CHECK_NE(blob->data_size(), 0);
855 int size = blob->data_size();
856
857 auto scale = (layer_param->blobs(2));
858 const float scale_factor = scale.data(0) == 0 ? 0 : 1 / scale.data(0);
859 auto epsilon = layer_param->batch_norm_param().eps();
860 if (index == 0) {
861 const BlobProto *var = (layer_param->mutable_blobs(index + 1));
862 for (int k = 0; k < size; ++k) {
863 auto data = blob->data(k);
864 blob->set_data(
865 k, static_cast<float>(-data * scale_factor /
866 sqrt(var->data(k) * scale_factor + epsilon)));
867 }
868 } else if (index == 1) {
869 for (int k = 0; k < size; ++k) {
870 blob->set_data(k, 1.0f / static_cast<float>(sqrt(
871 blob->data(k) * scale_factor + epsilon)));
872 }
873 }
874}
875
876Weights MINet::loadLayerWeights(const float *data, size_t size) {
877 std::shared_ptr<float> val;
878 val.reset(new float[size]);
879
880 for (size_t k = 0; k < size; ++k) {
881 val.get()[k] = data[k];
882 }
883
884 Weights wt{size, val};
885 return wt;
886}
887
888Weights MINet::loadLayerWeights(float data, size_t size) {
889 std::shared_ptr<float> val;
890 val.reset(new float[size]);
891
892 for (size_t k = 0; k < size; ++k) {
893 val.get()[k] = data;
894 }
895
896 Weights wt{size, val};
897 return wt;
898}
899
900MINet::MINet(const std::string &net_file, const std::string &model_file,
901 const std::vector<std::string> &outputs,
902 const std::vector<std::string> &inputs)
903 : output_names_(outputs), input_names_(inputs) {
904 loadWeights(model_file, &weight_map_);
905 net_param_.reset(new NetParameter);
906 loadNetParams(net_file, net_param_.get());
907}
908
909MINet::MINet(const std::string &net_file, const std::string &model_file,
910 const std::vector<std::string> &outputs,
911 const std::vector<std::string> &inputs,
912 const std::string &model_root)
913 : output_names_(outputs), input_names_(inputs), model_root_(model_root) {
914 loadWeights(model_file, &weight_map_);
915 net_param_.reset(new NetParameter);
916 loadNetParams(net_file, net_param_.get());
917}
918
919void MINet::init_blob(std::map<std::string, Tensor> *tensor_map) {
920 for (const auto &p : *tensor_map) {
921 auto name = p.first;
922 auto shape = p.second->get_shape();
923
924 cudaMalloc(&buffers_[name], shape.bytes());
925
926 std::vector<size_t> dims_sizes = shape.lens();
927 std::vector<int> dims(dims_sizes.begin(), dims_sizes.end());
928
929 std::shared_ptr<apollo::perception::base::Blob<float>> blob;
930
931 blob.reset(new apollo::perception::base::Blob<float>(dims));
932 blob->set_gpu_data(reinterpret_cast<float *>(buffers_[name]));
933 blobs_.insert(std::make_pair(name, blob));
934 }
935}
936
937bool MINet::Init(const std::map<std::string, std::vector<int>> &shapes) {
938 // TODO(B1tway): add cpu support
939 if (gpu_id_ < 0) {
940 AINFO << "must use gpu mode";
941 return false;
942 }
943
944 auto target = migraphx::target(migraphx::gpu::target{});
945 network_ = program_.get_main_module();
946
947 cudaDeviceProp prop;
948 cudaGetDeviceProperties(&prop, gpu_id_);
949 checkInt8(prop.name);
950
951 parse_with_api(shapes);
952
953 program_.compile(target);
954
955#if PRINT_DEBUG
956 {
957 const auto output_shapes = program_.get_output_shapes();
958 CHECK_EQ(outputs_.size(), output_shapes.size());
959
960 std::stringstream ss;
961 const auto shapes = program_.get_parameter_shapes();
962 ss << "Parameter shapes: ";
963 for (auto &p : shapes) {
964 ss << p.first << " " << p.second << ", ";
965 }
966 ss << "\nOutput shapes: ";
967 for (auto &o : output_shapes) {
968 ss << o << ", ";
969 }
970 DEBUG_LOG(ss.str());
971 }
972#endif
973
974 init_blob(&inputs_);
975 init_blob(&outputs_);
976 return true;
977}
978
979bool MINet::checkInt8(const std::string &gpu_name) {
980 AWARN << "MIGraphX Inference Not Supports Int8 Mode. Use FP32 Mode.";
981 return false;
982}
983
984bool MINet::addInput(TensorDimsMap *tensor_dims_map,
985 const std::map<std::string, std::vector<int>> &shapes,
986 TensorMap *tensor_map) {
987 CHECK_GT(net_param_->layer_size(), 0);
988
989 for (auto &dims_pair : *tensor_dims_map) {
990 if (shapes.find(dims_pair.first) != shapes.end()) {
991 auto shape = shapes.at(dims_pair.first);
992 if (shape.size() == dims_pair.second.size()) {
993 max_batch_size_ = std::max(max_batch_size_, shape[0]);
994 for (size_t i = 0; i < dims_pair.second.size(); ++i) {
995 dims_pair.second[i] = shape[i];
996 }
997 }
998 }
999 const Shape shape{Shape::float_type, dims_pair.second};
1000 const std::string name = dims_pair.first;
1001 const Tensor input = network_->add_parameter(name, shape);
1002
1003 tensor_map->insert(std::make_pair(name, input));
1004
1005 input_param_map_[name] = name;
1006 inputs_[name] = input;
1007 }
1008
1009 return true;
1010}
1011
1013 const std::map<std::string, std::vector<int>> &shapes) {
1014 CHECK_GT(net_param_->layer_size(), 0);
1015 std::vector<LayerParameter> order;
1016 TensorMap tensor_map;
1017 TensorDimsMap tensor_dims_map;
1018 ParseNetParam(*net_param_, &tensor_dims_map, &tensor_modify_map_, &order);
1019 addInput(&tensor_dims_map, shapes, &tensor_map);
1020
1021 for (auto layer_param : order) {
1022 std::vector<Tensor> inputs;
1023 for (int j = 0; j < layer_param.bottom_size(); ++j) {
1024 inputs.push_back(tensor_map[tensor_modify_map_[layer_param.bottom(j)]]);
1025 }
1026 addLayer(layer_param, inputs.data(), layer_param.bottom_size(),
1027 &weight_map_, network_, &tensor_map, &tensor_modify_map_);
1028 }
1029
1030 std::vector<Tensor> outputs;
1031 std::transform(outputs_.begin(), outputs_.end(), std::back_inserter(outputs),
1032 [](auto &p) { return p.second; });
1033
1034 network_->add_return(outputs);
1035}
1036
1038 if (gpu_id_ >= 0) {
1039 for (auto buf : buffers_) {
1040 cudaFree(buf.second);
1041 }
1042 }
1043}
1044
1046 migraphx::gpu::set_device(gpu_id_);
1047 migraphx::gpu::gpu_sync();
1048
1049 for (auto pair : input_param_map_) {
1050 const auto name = pair.first;
1051 const auto param_name = pair.second;
1052 const auto tensor = inputs_[name];
1053 auto blob = get_blob(name);
1054 if (blob != nullptr) {
1055 auto input_ptr = blob->mutable_gpu_data();
1056 auto input_shape = tensor->get_shape();
1057 parameter_map_[param_name] = migraphx::argument(input_shape, input_ptr);
1058 }
1059 }
1060
1061 for (auto pair : output_param_map_) {
1062 const auto name = pair.first;
1063 const auto param_name = pair.second;
1064 const auto tensor = outputs_[name];
1065 auto blob = get_blob(name);
1066 if (blob != nullptr) {
1067 auto out_ptr = blob->mutable_gpu_data();
1068 auto out_shape = tensor->get_shape();
1069 parameter_map_[param_name] = migraphx::argument(out_shape, out_ptr);
1070 }
1071 }
1072
1073 // Ensure input and output buffers are ready for inference
1074 migraphx::gpu::gpu_sync();
1075
1076 auto output = program_.eval(parameter_map_);
1077 CHECK_EQ(output.size(), outputs_.size());
1078}
1079
1080std::shared_ptr<apollo::perception::base::Blob<float>> MINet::get_blob(
1081 const std::string &name) {
1082 auto iter = blobs_.find(name);
1083 if (iter == blobs_.end()) {
1084 return nullptr;
1085 }
1086 return iter->second;
1087}
1088
1089} // namespace inference
1090} // namespace perception
1091} // namespace apollo
Definition plugin.h:24
int32_t d[MAX_DIMS]
Definition plugin.h:28
int32_t nbDims
Definition plugin.h:27
A wrapper around SyncedMemory holders serving as the basic computational unit for images,...
Definition blob.h:88
bool checkInt8(const std::string &gpu_name)
Definition mi_net.cc:979
void ConstructMap(const LayerParameter &layer_param, std::vector< Tensor > outputs, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:72
void addReshapeLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:567
void addInnerproductLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:346
void addConcatLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:240
void addScaleLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:396
void addLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:753
bool addInput(TensorDimsMap *tensor_dims_map, const std::map< std::string, std::vector< int > > &shapes, TensorMap *tensor_map)
Definition mi_net.cc:984
void addConvLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:110
void addSilenceLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:608
void addDeconvLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:160
bool loadWeights(const std::string &model_file, WeightMap *weight_map)
Definition mi_net.cc:822
MINet(const std::string &net_file, const std::string &model_file, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs)
Definition mi_net.cc:900
void addDFMBPSROIAlignLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:622
Weights loadLayerWeights(const float *data, size_t size)
Definition mi_net.cc:876
void init_blob(std::map< std::string, Tensor > *tensors)
Definition mi_net.cc:919
void addArgmaxLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:516
void addBatchnormLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:442
bool Init(const std::map< std::string, std::vector< int > > &shapes) override
Definition mi_net.cc:937
std::shared_ptr< apollo::perception::base::Blob< float > > get_blob(const std::string &name) override
Definition mi_net.cc:1080
void addEltwiseLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:498
void addSliceLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:296
void addRPNProposalSSDLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:704
void addSoftmaxLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:474
void addRCNNProposalLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:669
void addPaddingLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:601
void parse_with_api(const std::map< std::string, std::vector< int > > &shapes)
Definition mi_net.cc:1012
void addPoolingLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:271
void mergeBN(int index, LayerParameter *layer_param)
Definition mi_net.cc:849
void addActiveLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:211
void addPermuteLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Definition mi_net.cc:538
#define ACHECK(cond)
Definition log.h:80
#define AFATAL
Definition log.h:45
#define AINFO
Definition log.h:42
#define AWARN
Definition log.h:43
#define DEBUG_LOG(...)
Definition mi_net.cc:35
std::string LoggingParseFunction(const char *func, const char *pretty_func)
Expected to be invoked with func and PRETTY_FUNCTION.
Definition mi_net.cc:46
bool ParserConvParam(const ConvolutionParameter &conv, ConvParam *param)
Definition mi_common.cc:51
std::map< std::string, Tensor > TensorMap
Definition mi_net.h:64
const std::map< EltwiseParameter::EltwiseOp, std::string > eltwise_map
Definition mi_net.h:74
migraphx::shape Shape
Definition mi_net.h:61
void ParseNetParam(const NetParameter &net_param, TensorDimsMap *tensor_dims_map, std::map< std::string, std::string > *tensor_modify_map, std::vector< LayerParameter > *order)
Definition mi_common.cc:27
std::map< std::string, std::string > TensorModifyMap
Definition mi_net.h:66
const std::map< std::string, std::string > active_map
Definition mi_net.h:68
Dims GetDims(std::vector< size_t > lens, bool remove_batch=true)
Definition mi_net.cc:58
migraphx::operation Operation
Definition mi_net.h:62
bool loadNetParams(const std::string &param_file, NetParameter *param)
Definition mi_utils.cc:60
std::map< std::string, TensorDims > TensorDimsMap
Definition mi_common.h:33
migraphx::instruction_ref Tensor
Definition mi_net.h:60
bool ReadProtoFromBinaryFile(const std::string &filename, google::protobuf::Message *proto)
Definition mi_utils.cc:44
bool modify_pool_param(PoolingParameter *pool_param)
Definition mi_common.cc:101
std::map< std::string, std::vector< Weights > > WeightMap
Definition mi_net.h:63
class register implement
Definition arena_queue.h:37
optional ReshapeParameter reshape_param
Definition rt.proto:390
optional ConvolutionParameter convolution_param
Definition rt.proto:341
optional BatchNormParameter batch_norm_param
Definition rt.proto:336
optional ConcatParameter concat_param
Definition rt.proto:339
optional InnerProductParameter inner_product_param
Definition rt.proto:362
optional SoftmaxParameter softmax_param
Definition rt.proto:394
optional DetectionOutputSSDParameter detection_output_ssd_param
Definition rt.proto:346
optional DFMBPSROIAlignParameter dfmb_psroi_pooling_param
Definition rt.proto:347
optional PermuteParameter permute_param
Definition rt.proto:381
optional BBoxRegParameter bbox_reg_param
Definition rt.proto:337
optional EltwiseParameter eltwise_param
Definition rt.proto:350
optional PoolingParameter pooling_param
Definition rt.proto:382
optional ArgMaxParameter argmax_param
Definition rt.proto:335