85 {
86 torch::Device
device(device_type_, device_id_);
87
88 std::vector<torch::jit::IValue> torch_inputs;
89 for (const auto &name : input_names_) {
91 if (blob != nullptr) {
92 std::vector<int64_t>
shape(blob->shape().begin(), blob->shape().end());
93 torch::Tensor torch_blob = torch::from_blob(
94 blob->data()->mutable_cpu_data(),
shape, torch::kFloat32);
95 torch_blob = torch_blob.to(
device);
96 torch_inputs.push_back(torch_blob);
97 }
98 }
99
100
101
102
103
104
105 for (const auto &name : output_names_) {
107 if (blob != nullptr) {
108 blob->gpu_data();
109 }
110 }
111
112
113 std::vector<torch::Tensor> output =
114 net_.forward(torch_inputs).toTensorVector();
115
116
117 for (size_t i = 0; i < output_names_.size(); ++i) {
118 auto blob =
get_blob(output_names_[i]);
119 if (blob != nullptr && i < output.size()) {
120 std::vector<int64_t> output_size = output[i].sizes().vec();
121 std::vector<int>
shape(output_size.begin(), output_size.end());
122 blob->Reshape(
shape);
123 blob->set_gpu_data(output[i].data_ptr<float>());
124 }
125 }
126 emptyCache();
127}
base::BlobPtr< float > get_blob(const std::string &name) override
bool shape(const std::string &name, std::vector< int > *res)
torch::jit::script::Module net_
first check imutoantoffset saved in device