24#include "absl/strings/str_cat.h"
31#define DEBUG_GET_FN_NAME() \
32 (LoggingParseFunction(__func__, __PRETTY_FUNCTION__))
35#define DEBUG_LOG(...) \
37 AINFO << "INFO [" << DEBUG_GET_FN_NAME() << "] " << __VA_ARGS__ \
41#define DEBUG_LOG(...) \
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(
':'));
58Dims GetDims(std::vector<size_t> lens,
bool remove_batch =
true) {
62 if (remove_batch) lens.erase(lens.begin());
65 for (
size_t j = 0; j < lens.size(); j++) {
73 std::vector<Tensor> outputs,
TensorMap *tensor_map,
75 CHECK_EQ(outputs.size(),
static_cast<size_t>(layer_param.top_size()));
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;
86 tensor_modify_map->insert(
87 std::pair<std::string, std::string>(top_name, top_name));
90 const Tensor layer_out = outputs[i];
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());
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);
101 output_param_map_[top_name] = out_param_name;
102 outputs_[top_name] = out;
105 DEBUG_LOG(top_name <<
", " << layer_out->get_shape());
106 tensor_map->insert(std::pair<std::string, Tensor>(top_name, layer_out));
112 migraphx::module *net,
TensorMap *tensor_map,
119 const auto input = inputs[0];
120 const auto data_shape = input->get_shape();
123 const size_t C = data_shape.lens()[1] / param.
group;
127 const auto weights = (*weight_map)[layer_param.
name().c_str()];
128 const Shape filter_shape{Shape::float_type, {K, C, R, S}};
130 CHECK_EQ(weights[0].bytes(), filter_shape.bytes());
133 net->add_literal(migraphx::literal(filter_shape, weights[0].data()));
135 const Operation conv = migraphx::make_op(
139 {
"group", param.
group}});
140 Tensor out = net->add_instruction(conv, input, filter);
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]}};
146 CHECK_EQ(weights[1].bytes(), bias_shape.bytes());
148 const Operation broadcast = migraphx::make_op(
149 "broadcast", {{
"axis", 1}, {
"out_lens", out_shape.lens()}});
151 net->add_literal(migraphx::literal(bias_shape, weights[1].data()));
152 const Tensor broadcasted_bias = net->add_instruction(broadcast, bias);
154 out = net->add_instruction(migraphx::make_op(
"add"), out, broadcasted_bias);
157 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
162 migraphx::module *net,
TensorMap *tensor_map,
169 const auto input = inputs[0];
170 const auto data_shape = input->get_shape();
172 const size_t K = data_shape.lens()[1] / param.
group;
177 const auto weights = (*weight_map)[layer_param.
name().c_str()];
179 const Shape filter_shape{Shape::float_type, {K, C, R, S}};
180 CHECK_EQ(weights[0].bytes(), filter_shape.bytes());
183 net->add_literal(migraphx::literal(filter_shape, weights[0].data()));
185 const Operation deconv = migraphx::make_op(
189 {
"group", param.
group}});
191 Tensor out = net->add_instruction(deconv, input, filter);
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]}};
197 CHECK_EQ(weights[1].bytes(), bias_shape.bytes());
199 const Operation broadcast = migraphx::make_op(
200 "broadcast", {{
"axis", 1}, {
"out_lens", out_shape.lens()}});
202 net->add_literal(migraphx::literal(bias_shape, weights[1].data()));
203 const Tensor broadcasted_bias = net->add_instruction(broadcast, bias);
205 out = net->add_instruction(migraphx::make_op(
"add"), out, broadcasted_bias);
208 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
212 Tensor const *inputs,
int nbInputs,
213 migraphx::module *net,
TensorMap *tensor_map,
215 const auto input = inputs[0];
217 if (layer_param.
type() ==
"ReLU" &&
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);
223 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
226 std::string activation_type =
"sigmoid";
230 activation_type = pair->second;
233 const Operation activation = migraphx::make_op(activation_type);
234 const Tensor out = net->add_instruction(activation, input);
236 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
241 Tensor const *inputs,
int nbInputs,
242 migraphx::module *net,
TensorMap *tensor_map,
246 const size_t axis = params.has_axis() ? params.
axis() : 1;
248 CHECK_EQ(nbInputs, layer_param.bottom_size());
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();
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]);
264 const Operation concat = migraphx::make_op(
"concat", {{
"axis", axis}});
265 out = net->add_instruction(concat, input_first, input_second);
268 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
272 Tensor const *inputs, migraphx::module *net,
278 CHECK_NE(params.
pool(), PoolingParameter_PoolMethod_STOCHASTIC);
281 const std::string pool_mode =
282 (params.
pool() == PoolingParameter_PoolMethod_AVE) ?
"average" :
"max";
286 const Operation pooling = migraphx::make_op(
287 "pooling", {{
"mode", pool_mode},
288 {
"padding", {params.
pad_h(), params.
pad_w()}},
291 const Tensor out = net->add_instruction(pooling, inputs[0]);
293 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
297 Tensor const *inputs,
int nbInputs,
298 migraphx::module *net,
TensorMap *tensor_map,
302 const size_t axis = param.has_axis() ? param.
axis() : 1;
304 const auto input = inputs[0];
305 const auto input_shape = input->get_shape();
307 CHECK_GT(param.slice_point_size(), 0);
308 CHECK_GT(input_shape.lens().size(), axis);
310 std::vector<Operation> ops;
312 for (
int i = 0; i < param.slice_point_size(); ++i) {
316 ops.push_back(migraphx::make_op(
318 {{
"axes", {axis}}, {
"starts", {0}}, {
"ends", {slice_point}}}));
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}}}));
327 const size_t last_slice_point =
329 const size_t axis_size = input_shape.lens()[axis];
331 ops.push_back(migraphx::make_op(
"slice", {{
"axes", {axis}},
332 {
"starts", {last_slice_point}},
333 {
"ends", {axis_size}}}));
335 std::vector<Tensor> outputs;
336 for (
auto &op : ops) {
337 Tensor out = net->add_instruction(op, input);
339 out = net->add_instruction(migraphx::make_op(
"contiguous"), out);
340 outputs.push_back(out);
343 ConstructMap(layer_param, outputs, tensor_map, tensor_modify_map);
348 migraphx::module *net,
TensorMap *tensor_map,
351 const size_t num_outputs = params.
num_output();
353 const auto input = inputs[0];
354 const auto input_shape = input->get_shape();
355 const auto input_lens = input_shape.lens();
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];
363 const Operation conv = migraphx::make_op(
"convolution", {{
"padding", {0, 0}},
365 {
"dilation", {1, 1}},
368 const auto weights = (*weight_map)[layer_param.
name().c_str()];
369 const Shape filter_shape{Shape::float_type, {K, C, R, S}};
371 CHECK_EQ(weights[0].bytes(), filter_shape.bytes());
374 net->add_literal(migraphx::literal(filter_shape, weights[0].data()));
376 Tensor out = net->add_instruction(conv, input, filter);
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]}};
382 CHECK_EQ(weights[1].bytes(), bias_shape.bytes());
384 const Operation broadcast = migraphx::make_op(
385 "broadcast", {{
"axis", 1}, {
"out_lens", out_shape.lens()}});
387 net->add_literal(migraphx::literal(bias_shape, weights[1].data()));
388 const Tensor broadcasted_bias = net->add_instruction(broadcast, bias);
390 out = net->add_instruction(migraphx::make_op(
"add"), out, broadcasted_bias);
393 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
398 migraphx::module *net,
TensorMap *tensor_map,
400 const auto input = inputs[0];
401 const auto input_shape = input->get_shape();
402 const auto C = input_shape.lens()[1];
404 std::vector<Weights> weights;
406 if (layer_param.
type() ==
"Power") {
407 const auto power_param = layer_param.
power_param();
413 const auto lw = (*weight_map)[layer_param.
name().c_str()];
415 for (
size_t i = 0; i < lw.size(); ++i) {
416 weights.push_back(lw[i]);
420 static const std::vector<std::string> scale_ops = {
"mul",
"add",
"pow"};
421 CHECK_LE(weights.size(), scale_ops.size());
424 const Shape param_shape{Shape::float_type, {C}};
426 for (
size_t i = 0; i < weights.size(); ++i) {
427 CHECK_EQ(weights[i].bytes(), param_shape.bytes());
429 const Operation broadcast = migraphx::make_op(
430 "broadcast", {{
"axis", 1}, {
"out_lens", input_shape.lens()}});
432 net->add_literal(migraphx::literal(param_shape, weights[i].data()));
433 const Tensor broadcasted_param = net->add_instruction(broadcast, param);
435 out = net->add_instruction(migraphx::make_op(scale_ops[i]), out,
439 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
444 migraphx::module *net,
TensorMap *tensor_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]}};
450 const auto weights = (*weight_map)[layer_param.
name().c_str()];
452 CHECK_EQ(weights[0].bytes(), params_shape.bytes());
453 CHECK_EQ(weights[1].bytes(), params_shape.bytes());
456 net->add_literal(migraphx::literal(params_shape, weights[0].data()));
458 net->add_literal(migraphx::literal(params_shape, weights[1].data()));
460 const Operation broadcast = migraphx::make_op(
461 "broadcast", {{
"axis", 1}, {
"out_lens", input_shape.lens()}});
463 const Tensor scale_broadcast = net->add_instruction(broadcast, scale);
465 net->add_instruction(migraphx::make_op(
"mul"), input, scale_broadcast);
467 const Tensor shift_broadcast = net->add_instruction(broadcast, shift);
469 net->add_instruction(migraphx::make_op(
"add"), mul_out, shift_broadcast);
471 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
475 Tensor const *inputs,
int nbInputs,
476 migraphx::module *net,
TensorMap *tensor_map,
480 size_t axis = params.has_axis() ? params.
axis() : 1;
485 if (dfmb_psroi_align_plugins_.size() != 0) --axis;
487 const auto input = inputs[0];
488 const auto input_shape = input->get_shape();
490 CHECK_GT(input_shape.lens().size(), axis);
492 const Operation softmax = migraphx::make_op(
"softmax", {{
"axis", axis}});
493 const Tensor out = net->add_instruction(softmax, input);
495 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
499 Tensor const *inputs, migraphx::module *net,
503 std::string eltwise_op =
"add";
507 eltwise_op = pair->second;
510 const Operation eltwise = migraphx::make_op(eltwise_op);
511 const Tensor out = net->add_instruction(eltwise, inputs[0], inputs[1]);
513 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
517 Tensor const *inputs,
int nbInputs,
518 migraphx::module *net,
TensorMap *tensor_map,
521 const size_t axis = params.
axis();
525 ACHECK(!(params.has_out_max_val() || params.has_top_k()));
527 const Tensor input = inputs[0];
528 const Shape input_shape = input->get_shape();
530 CHECK_GT(input_shape.lens().size(), axis);
532 const Operation argmax = migraphx::make_op(
"argmax", {{
"axis", axis}});
533 const Tensor out = net->add_instruction(argmax, input);
535 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
539 Tensor const *inputs,
int nbInputs,
540 migraphx::module *net,
TensorMap *tensor_map,
543 const auto input = inputs[0];
544 const auto input_shape = input->get_shape();
546 CHECK_EQ(
static_cast<size_t>(params.order_size()), input_shape.lens().size());
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());
553 order.push_back(dim);
557 migraphx::make_op(
"transpose", {{
"permutation", order}});
558 const Tensor transposed_out = net->add_instruction(transpose, inputs[0]);
562 net->add_instruction(migraphx::make_op(
"contiguous"), transposed_out);
564 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
568 Tensor const *inputs, migraphx::module *net,
572 const auto input_shape = inputs[0]->get_shape();
573 const auto input_lens = input_shape.lens();
577 std::vector<int64_t> new_shape{int64_t(input_lens[0])};
579 for (
int i = 1; i < params.shape().dim_size(); ++i) {
580 auto dim_param = params.
shape().
dim(i);
586 int64_t new_dim = -1;
588 new_dim = input_lens[i];
589 else if (dim_param > 0)
592 new_shape.push_back(new_dim);
595 const Operation reshape = migraphx::make_op(
"reshape", {{
"dims", new_shape}});
596 const Tensor out = net->add_instruction(reshape, inputs[0]);
598 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
602 Tensor const *inputs, migraphx::module *net,
605 AWARN <<
"migraphx dont support Padding layer yet";
609 Tensor const *inputs, migraphx::module *net,
613 std::string eltwise_op =
"add";
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);
623 Tensor const *inputs,
int nbInputs,
624 migraphx::module *net,
TensorMap *tensor_map,
626 std::shared_ptr<DFMBPSROIAlignPlugin> plugin;
627 std::vector<Dims> input_dims;
629 CHECK_GE(nbInputs, 2);
630 CHECK_LE(nbInputs, 3);
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));
639 input_dims.data(), nbInputs));
640 dfmb_psroi_align_plugins_.push_back(plugin);
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])}};
648 const Tensor allocated_out = net->add_instruction(migraphx::make_op(
649 "hip::allocate", {{
"shape", migraphx::to_value(out_shape)}}));
652 bool no_trans = nbInputs < 3;
657 [plugin]() {
return plugin; }},
658 inputs[0], inputs[1], allocated_out);
662 [plugin]() {
return plugin; }},
663 inputs[0], inputs[1], inputs[2], allocated_out);
666 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
670 Tensor const *inputs,
int nbInputs,
671 migraphx::module *net,
TensorMap *tensor_map,
673 std::shared_ptr<RCNNProposalPlugin> plugin;
674 std::vector<Dims> input_dims;
676 CHECK_EQ(nbInputs, 4);
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));
686 rcnn_proposal_plugins_.push_back(plugin);
689 Dims out_dims = plugin->getOutputDimensions(0,
nullptr, 0);
690 Shape out_shape{Shape::float_type,
692 std::size_t(out_dims.
d[1]), std::size_t(out_dims.
d[2])}};
694 const Tensor allocated_out = net->add_instruction(migraphx::make_op(
695 "hip::allocate", {{
"shape", migraphx::to_value(out_shape)}}));
697 const Tensor out = net->add_instruction(
699 inputs[0], inputs[1], inputs[2], inputs[3], allocated_out);
701 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
705 Tensor const *inputs,
int nbInputs,
706 migraphx::module *net,
TensorMap *tensor_map,
708 std::shared_ptr<RPNProposalSSDPlugin> plugin;
709 std::vector<Dims> input_dims;
711 CHECK_EQ(nbInputs, 3);
713 for (
int i = 0; i < nbInputs; ++i) {
714 auto input_lens = inputs[i]->get_shape().lens();
718 if (i == 0 || i == 1 || i == 2) {
719 input_lens.erase(input_lens.begin());
722 for (
size_t j = 0; j < input_lens.size(); ++j) {
723 dims.
d[j] = input_lens[j];
726 dims.
nbDims = input_lens.size();
727 input_dims.push_back(dims);
733 rpn_proposal_ssd_plugins_.push_back(plugin);
736 Dims out_dims = plugin->getOutputDimensions(0,
nullptr, 0);
740 std::size_t(out_dims.
d[2]), std::size_t(out_dims.
d[3])}};
742 const Tensor allocated_out = net->add_instruction(migraphx::make_op(
743 "hip::allocate", {{
"shape", migraphx::to_value(out_shape)}}));
747 [plugin]() {
return plugin; }},
748 inputs[0], inputs[1], inputs[2], allocated_out);
750 ConstructMap(layer_param, {out}, tensor_map, tensor_modify_map);
754 int nbInputs,
WeightMap *weight_map, migraphx::module *net,
759 if (layer_param.
type() ==
"Convolution") {
760 addConvLayer(layer_param, inputs, weight_map, net, tensor_map,
762 }
else if (layer_param.
type() ==
"Deconvolution") {
765 }
else if (layer_param.
type() ==
"Sigmoid" || layer_param.
type() ==
"TanH" ||
766 layer_param.
type() ==
"ReLU") {
769 }
else if (layer_param.
type() ==
"Concat") {
772 }
else if (layer_param.
type() ==
"Slice") {
773 addSliceLayer(layer_param, inputs, nbInputs, net, tensor_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") {
784 }
else if (layer_param.
type() ==
"InnerProduct") {
787 }
else if (layer_param.
type() ==
"BatchNorm") {
790 }
else if (layer_param.
type() ==
"Scale") {
791 addScaleLayer(layer_param, inputs, weight_map, net, tensor_map,
793 }
else if (layer_param.
type() ==
"Softmax") {
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") {
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,
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") {
811 }
else if (layer_param.
type() ==
"RCNNProposal") {
814 }
else if (layer_param.
type() ==
"RPNProposalSSD") {
818 AWARN <<
"unknown layer type:" << layer_param.
type();
825 AFATAL <<
"open file " << model_file <<
" failed";
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) {
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));
844 (*weight_map)[net.
layer(i).
name().c_str()] = lw;
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();
857 auto scale = (layer_param->
blobs(2));
858 const float scale_factor = scale.data(0) == 0 ? 0 : 1 / scale.data(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);
865 k,
static_cast<float>(-data * scale_factor /
866 sqrt(var->
data(k) * scale_factor + epsilon)));
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)));
877 std::shared_ptr<float> val;
878 val.reset(
new float[size]);
880 for (
size_t k = 0; k < size; ++k) {
881 val.get()[k] = data[k];
889 std::shared_ptr<float> val;
890 val.reset(
new float[size]);
892 for (
size_t k = 0; k < size; ++k) {
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) {
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) {
920 for (
const auto &p : *tensor_map) {
922 auto shape = p.second->get_shape();
924 cudaMalloc(&buffers_[name], shape.bytes());
926 std::vector<size_t> dims_sizes = shape.lens();
927 std::vector<int> dims(dims_sizes.begin(), dims_sizes.end());
929 std::shared_ptr<apollo::perception::base::Blob<float>> blob;
932 blob->set_gpu_data(
reinterpret_cast<float *
>(buffers_[name]));
933 blobs_.insert(std::make_pair(name, blob));
937bool MINet::Init(
const std::map<std::string, std::vector<int>> &shapes) {
940 AINFO <<
"must use gpu mode";
944 auto target = migraphx::target(migraphx::gpu::target{});
945 network_ = program_.get_main_module();
948 cudaGetDeviceProperties(&prop,
gpu_id_);
953 program_.compile(target);
957 const auto output_shapes = program_.get_output_shapes();
958 CHECK_EQ(outputs_.size(), output_shapes.size());
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 <<
", ";
966 ss <<
"\nOutput shapes: ";
967 for (
auto &o : output_shapes) {
980 AWARN <<
"MIGraphX Inference Not Supports Int8 Mode. Use FP32 Mode.";
985 const std::map<std::string, std::vector<int>> &shapes,
987 CHECK_GT(net_param_->layer_size(), 0);
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()) {
994 for (
size_t i = 0; i < dims_pair.second.size(); ++i) {
995 dims_pair.second[i] = shape[i];
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);
1003 tensor_map->insert(std::make_pair(name, input));
1005 input_param_map_[name] = name;
1006 inputs_[name] = input;
1013 const std::map<std::string, std::vector<int>> &shapes) {
1014 CHECK_GT(net_param_->layer_size(), 0);
1015 std::vector<LayerParameter> order;
1018 ParseNetParam(*net_param_, &tensor_dims_map, &tensor_modify_map_, &order);
1019 addInput(&tensor_dims_map, shapes, &tensor_map);
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)]]);
1026 addLayer(layer_param, inputs.data(), layer_param.bottom_size(),
1027 &weight_map_, network_, &tensor_map, &tensor_modify_map_);
1030 std::vector<Tensor> outputs;
1031 std::transform(outputs_.begin(), outputs_.end(), std::back_inserter(outputs),
1032 [](
auto &p) { return p.second; });
1034 network_->add_return(outputs);
1039 for (
auto buf : buffers_) {
1040 cudaFree(buf.second);
1046 migraphx::gpu::set_device(
gpu_id_);
1047 migraphx::gpu::gpu_sync();
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];
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);
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];
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);
1074 migraphx::gpu::gpu_sync();
1076 auto output = program_.eval(parameter_map_);
1077 CHECK_EQ(output.size(), outputs_.size());
1081 const std::string &name) {
1082 auto iter = blobs_.find(name);
1083 if (iter == blobs_.end()) {
1086 return iter->second;
A wrapper around SyncedMemory holders serving as the basic computational unit for images,...
bool checkInt8(const std::string &gpu_name)
void ConstructMap(const LayerParameter &layer_param, std::vector< Tensor > outputs, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addReshapeLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addInnerproductLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addConcatLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addScaleLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
bool addInput(TensorDimsMap *tensor_dims_map, const std::map< std::string, std::vector< int > > &shapes, TensorMap *tensor_map)
void addConvLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addSilenceLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addDeconvLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
bool loadWeights(const std::string &model_file, WeightMap *weight_map)
MINet(const std::string &net_file, const std::string &model_file, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs)
void addDFMBPSROIAlignLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
Weights loadLayerWeights(const float *data, size_t size)
void init_blob(std::map< std::string, Tensor > *tensors)
void addArgmaxLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addBatchnormLayer(const LayerParameter &layer_param, Tensor const *inputs, WeightMap *weight_map, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
bool Init(const std::map< std::string, std::vector< int > > &shapes) override
std::shared_ptr< apollo::perception::base::Blob< float > > get_blob(const std::string &name) override
void addEltwiseLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addSliceLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addRPNProposalSSDLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addSoftmaxLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addRCNNProposalLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addPaddingLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void parse_with_api(const std::map< std::string, std::vector< int > > &shapes)
void addPoolingLayer(const LayerParameter &layer_param, Tensor const *inputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void mergeBN(int index, LayerParameter *layer_param)
void addActiveLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
void addPermuteLayer(const LayerParameter &layer_param, Tensor const *inputs, int nbInputs, migraphx::module *net, TensorMap *tensor_map, TensorModifyMap *tensor_modify_map)
std::string LoggingParseFunction(const char *func, const char *pretty_func)
Expected to be invoked with func and PRETTY_FUNCTION.
bool ParserConvParam(const ConvolutionParameter &conv, ConvParam *param)
std::map< std::string, Tensor > TensorMap
const std::map< EltwiseParameter::EltwiseOp, std::string > eltwise_map
void ParseNetParam(const NetParameter &net_param, TensorDimsMap *tensor_dims_map, std::map< std::string, std::string > *tensor_modify_map, std::vector< LayerParameter > *order)
std::map< std::string, std::string > TensorModifyMap
const std::map< std::string, std::string > active_map
Dims GetDims(std::vector< size_t > lens, bool remove_batch=true)
migraphx::operation Operation
bool loadNetParams(const std::string ¶m_file, NetParameter *param)
std::map< std::string, TensorDims > TensorDimsMap
migraphx::instruction_ref Tensor
bool ReadProtoFromBinaryFile(const std::string &filename, google::protobuf::Message *proto)
bool modify_pool_param(PoolingParameter *pool_param)
std::map< std::string, std::vector< Weights > > WeightMap
optional uint32 num_output
optional EltwiseOp operation
optional uint32 num_output
optional ReLUParameter relu_param
optional ReshapeParameter reshape_param
optional PowerParameter power_param
optional ConvolutionParameter convolution_param
optional BatchNormParameter batch_norm_param
optional ConcatParameter concat_param
optional InnerProductParameter inner_product_param
optional SoftmaxParameter softmax_param
optional DetectionOutputSSDParameter detection_output_ssd_param
optional DFMBPSROIAlignParameter dfmb_psroi_pooling_param
optional PermuteParameter permute_param
optional BBoxRegParameter bbox_reg_param
optional EltwiseParameter eltwise_param
optional PoolingParameter pooling_param
optional ArgMaxParameter argmax_param
optional SliceParameter slice_param
repeated LayerParameter layer
optional float negative_slope
repeated uint32 slice_point