| @@ -0,0 +1,115 @@ | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #include "coder/generator/component/const_blocks/benchmark.h" | |||
| namespace mindspore::lite::micro { | |||
| const char *benchmark_source = R"RAW( | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #include <iostream> | |||
| #include <string> | |||
| #include <cstring> | |||
| #include "include/lite_session.h" | |||
| #include "include/ms_tensor.h" | |||
| #include "include/errorcode.h" | |||
| #include "read_file.h" | |||
| using namespace mindspore; | |||
| void usage() { | |||
| printf( | |||
| "-- mindspore benchmark params usage:\n" | |||
| "args[0]: executable file\n" | |||
| "args[1]: inputs binary file\n" | |||
| "args[2]: model weight binary file\n" | |||
| "args[3]: loop count for performance test\n" | |||
| "args[4]: runtime thread num\n" | |||
| "args[5]: runtime thread bind mode\n\n"); | |||
| } | |||
| int main(int argc, const char **argv) { | |||
| if (argc < 2) { | |||
| std::cout << "input command is invalid\n" << std::endl; | |||
| usage(); | |||
| return lite::RET_ERROR; | |||
| } | |||
| std::cout << "start run benchmark" << std::endl; | |||
| const char *model_buffer = nullptr; | |||
| int model_size = 0; | |||
| // read .net file by ReadBinaryFile; | |||
| if (argc >= 3) { | |||
| model_buffer = static_cast<const char *>(ReadInputData(argv[2], &model_size)); | |||
| } | |||
| session::LiteSession *session = mindspore::session::LiteSession::CreateSession(model_buffer, model_size, nullptr); | |||
| if (session == nullptr) { | |||
| std::cerr << "create lite session failed" << std::endl; | |||
| return lite::RET_ERROR; | |||
| } | |||
| // set model inputs tensor data | |||
| std::vector<tensor::MSTensor *> inputs = session->GetInputs(); | |||
| size_t inputs_num = inputs.size(); | |||
| void *inputs_binbuf[inputs_num]; | |||
| int inputs_size[inputs_num]; | |||
| for (size_t i = 0; i < inputs_num; ++i) { | |||
| inputs_size[i] = inputs[i]->Size(); | |||
| } | |||
| int ret = ReadInputsFile(argv[1], inputs_binbuf, inputs_size, inputs_num); | |||
| if (ret != lite::RET_OK) { | |||
| return lite::RET_ERROR; | |||
| } | |||
| for (size_t i = 0; i < inputs_num; ++i) { | |||
| inputs[i]->set_data(inputs_binbuf[i]); | |||
| } | |||
| ret = session->RunGraph(); | |||
| if (ret != lite::RET_OK) { | |||
| return lite::RET_ERROR; | |||
| } | |||
| auto outputs = session->GetOutputs(); | |||
| std::cout << outputs.size() << std::endl; | |||
| std::cout << "run benchmark success" << std::endl; | |||
| delete session; | |||
| for (size_t i = 0; i < inputs_num; ++i) { | |||
| free(inputs_binbuf[i]); | |||
| } | |||
| return lite::RET_OK; | |||
| } | |||
| )RAW"; | |||
| } // namespace mindspore::lite::micro | |||
| @@ -0,0 +1,26 @@ | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_LITE_MICRO_GENERATOR_CONST_BLOCK_BENCHMARK_H_ | |||
| #define MINDSPORE_LITE_MICRO_GENERATOR_CONST_BLOCK_BENCHMARK_H_ | |||
| namespace mindspore::lite::micro { | |||
| extern const char *benchmark_source; | |||
| } // namespace mindspore::lite::micro | |||
| #endif // MINDSPORE_LITE_MICRO_GENERATOR_CONST_BLOCK_BENCHMARK_H_ | |||
| @@ -0,0 +1,172 @@ | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #include "coder/generator/component/const_blocks/mtensor.h" | |||
| namespace mindspore::lite::micro { | |||
| const char *tensor_header = R"RAW( | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_LITE_MICRO_LIBRARY_SOURCE_TENSOR_H_ | |||
| #define MINDSPORE_LITE_MICRO_LIBRARY_SOURCE_TENSOR_H_ | |||
| #include "include/ms_tensor.h" | |||
| #include <utility> | |||
| #include <vector> | |||
| namespace mindspore { | |||
| namespace lite { | |||
| struct QuantArg { | |||
| double scale; | |||
| int32_t zeroPoint; | |||
| float var_corr{1}; | |||
| float mean_corr{0}; | |||
| bool inited; | |||
| std::vector<float> clusters{}; | |||
| int bitNum; | |||
| int roundType; | |||
| int multiplier; | |||
| int dstDtype; | |||
| }; | |||
| class MTensor : public mindspore::tensor::MSTensor { | |||
| public: | |||
| MTensor() = default; | |||
| MTensor(std::string name, enum TypeId type, std::vector<int32_t> shape, void *data) | |||
| : tensor_name_(std::move(name)), data_type_(type), shape_(std::move(shape)), data_(data) {} | |||
| ~MTensor() override = default; | |||
| TypeId data_type() const override { return data_type_; } | |||
| std::vector<int> shape() const override { return shape_; } | |||
| int DimensionSize(size_t index) const override; | |||
| int ElementsNum() const override; | |||
| size_t Size() const override; | |||
| void *MutableData() override { return data_; }; | |||
| std::string tensor_name() const override { return tensor_name_; } | |||
| void set_tensor_name(const std::string name) override { tensor_name_ = name; } | |||
| void set_data(void *data) override { data_ = data; } | |||
| private: | |||
| std::string tensor_name_; | |||
| TypeId data_type_; | |||
| std::vector<int> shape_; | |||
| void *data_ = nullptr; | |||
| std::vector<QuantArg> quant_params_; | |||
| }; | |||
| } // namespace lite | |||
| } // namespace mindspore | |||
| #endif // MINDSPORE_LITE_MICRO_LIBRARY_SOURCE_TENSOR_H_ | |||
| )RAW"; | |||
| const char *tensor_source = R"RAW( | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #include "tensor.h" | |||
| namespace mindspore { | |||
| namespace lite { | |||
| size_t DataTypeSize(const TypeId type) { | |||
| switch (type) { | |||
| case kNumberTypeFloat64: | |||
| return sizeof(double); | |||
| case kNumberTypeFloat: | |||
| case kNumberTypeFloat32: | |||
| return sizeof(float); | |||
| case kNumberTypeInt8: | |||
| return sizeof(int8_t); | |||
| case kNumberTypeUInt8: | |||
| return sizeof(uint8_t); | |||
| case kNumberTypeFloat16: | |||
| case kNumberTypeInt16: | |||
| return sizeof(int16_t); | |||
| case kNumberTypeInt32: | |||
| return sizeof(int32_t); | |||
| case kNumberTypeInt64: | |||
| return sizeof(int64_t); | |||
| case kNumberTypeUInt16: | |||
| return sizeof(uint16_t); | |||
| case kNumberTypeUInt32: | |||
| return sizeof(uint32_t); | |||
| case kNumberTypeUInt64: | |||
| return sizeof(uint64_t); | |||
| case kNumberTypeBool: | |||
| return sizeof(bool); | |||
| case kObjectTypeString: | |||
| return sizeof(char); | |||
| case kObjectTypeTensorType: | |||
| default: | |||
| return 0; | |||
| } | |||
| } | |||
| int MTensor::DimensionSize(const size_t index) const { | |||
| int dim_size = -1; | |||
| if (index < shape_.size()) { | |||
| dim_size = shape_[index]; | |||
| } | |||
| return dim_size; | |||
| } | |||
| int MTensor::ElementsNum() const { | |||
| int elements = 1; | |||
| for (int i : shape_) { | |||
| elements *= i; | |||
| } | |||
| return elements; | |||
| } | |||
| size_t MTensor::Size() const { | |||
| size_t element_size = DataTypeSize(data_type_); | |||
| return element_size * ElementsNum(); | |||
| } | |||
| } // namespace lite | |||
| } // namespace mindspore | |||
| )RAW"; | |||
| } // namespace mindspore::lite::micro | |||
| @@ -0,0 +1,27 @@ | |||
| /** | |||
| * Copyright 2021 Huawei Technologies Co., Ltd | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| */ | |||
| #ifndef MINDSPORE_LITE_MICRO_GENERATOR_CONST_BLOCK_MTENSOR_H_ | |||
| #define MINDSPORE_LITE_MICRO_GENERATOR_CONST_BLOCK_MTENSOR_H_ | |||
| namespace mindspore::lite::micro { | |||
| extern const char *tensor_header; | |||
| extern const char *tensor_source; | |||
| } // namespace mindspore::lite::micro | |||
| #endif // MINDSPORE_LITE_MICRO_GENERATOR_CONST_BLOCK_MTENSOR_H_ | |||