| 36 | static std::once_flag g_proto_init_flag; |
| 37 | |
| 38 | int GeneralModelOp::inference() { |
| 39 | // request |
| 40 | const Request *req = dynamic_cast<const Request *>(get_request_message()); |
| 41 | |
| 42 | TensorVector *in = butil::get_object<TensorVector>(); |
| 43 | |
| 44 | int batch_size = req->insts_size(); |
| 45 | int input_var_num = 0; |
| 46 | |
| 47 | std::vector<int> elem_type; |
| 48 | std::vector<int> elem_size; |
| 49 | std::vector<int> capacity; |
| 50 | |
| 51 | // infer |
| 52 | if (batch_size > 0) { |
| 53 | int var_num = req->insts(0).tensor_array_size(); |
| 54 | VLOG(2) << "var num: " << var_num; |
| 55 | elem_type.resize(var_num); |
| 56 | elem_size.resize(var_num); |
| 57 | capacity.resize(var_num); |
| 58 | paddle::PaddleTensor lod_tensor; |
| 59 | for (int i = 0; i < var_num; ++i) { |
| 60 | elem_type[i] = req->insts(0).tensor_array(i).elem_type(); |
| 61 | VLOG(2) << "var[" << i << "] has elem type: " << elem_type[i]; |
| 62 | if (elem_type[i] == 0) { // int64 |
| 63 | elem_size[i] = sizeof(int64_t); |
| 64 | lod_tensor.dtype = paddle::PaddleDType::INT64; |
| 65 | } else { |
| 66 | elem_size[i] = sizeof(float); |
| 67 | lod_tensor.dtype = paddle::PaddleDType::FLOAT32; |
| 68 | } |
| 69 | |
| 70 | if (req->insts(0).tensor_array(i).shape(0) == -1) { |
| 71 | lod_tensor.lod.resize(1); |
| 72 | lod_tensor.lod[0].push_back(0); |
| 73 | VLOG(2) << "var[" << i << "] is lod_tensor"; |
| 74 | } else { |
| 75 | lod_tensor.shape.push_back(batch_size); |
| 76 | capacity[i] = 1; |
| 77 | for (int k = 0; k < req->insts(0).tensor_array(i).shape_size(); ++k) { |
| 78 | int dim = req->insts(0).tensor_array(i).shape(k); |
| 79 | VLOG(2) << "shape for var[" << i << "]: " << dim; |
| 80 | capacity[i] *= dim; |
| 81 | lod_tensor.shape.push_back(dim); |
| 82 | } |
| 83 | VLOG(2) << "var[" << i << "] is tensor, capacity: " << capacity[i]; |
| 84 | } |
| 85 | if (i == 0) { |
| 86 | lod_tensor.name = "words"; |
| 87 | } else { |
| 88 | lod_tensor.name = "label"; |
| 89 | } |
| 90 | in->push_back(lod_tensor); |
| 91 | } |
| 92 | |
| 93 | for (int i = 0; i < var_num; ++i) { |
| 94 | if (in->at(i).lod.size() == 1) { |
| 95 | for (int j = 0; j < batch_size; ++j) { |