forked from mindspore-Ecosystem/mindspore
!13490 fix bugs, and add dump tensor in benchmark
From: @yangjie159 Reviewed-by: @wangchengyuan,@zhanghaibo5 Signed-off-by: @wangchengyuan
This commit is contained in:
commit
a45f03eebf
|
@ -99,8 +99,12 @@ class String {
|
|||
char *buffer_;
|
||||
};
|
||||
|
||||
String operator+(const String &str1, const char *str2);
|
||||
String operator+(const char *str1, const String &str2);
|
||||
String operator+(const String &lhs, const char *rhs);
|
||||
String operator+(const char *lhs, const String &rhs);
|
||||
|
||||
bool operator==(const String &lhs, const String &rhs);
|
||||
bool operator==(const String &lhs, const char *rhs);
|
||||
bool operator==(const char *lhs, const String &rhs);
|
||||
|
||||
String to_string(int32_t value);
|
||||
String to_string(float value);
|
||||
|
|
|
@ -28,6 +28,7 @@ set(CODER_GENERATOR_SRC
|
|||
${MICRO_DIR}/coder/generator/component/const_blocks/debug_utils.cc
|
||||
${MICRO_DIR}/coder/generator/component/const_blocks/msession.cc
|
||||
${MICRO_DIR}/coder/generator/component/const_blocks/mtensor.cc
|
||||
${MICRO_DIR}/coder/generator/component/const_blocks/mstring.cc
|
||||
${MICRO_DIR}/coder/generator/component/const_blocks/license.cc
|
||||
${MICRO_DIR}/coder/generator/component/const_blocks/load_input.cc
|
||||
${MICRO_DIR}/coder/generator/component/const_blocks/benchmark.cc
|
||||
|
|
|
@ -22,7 +22,6 @@ set(WRAPPER_SRC
|
|||
${WRAPPER_DIR}/int8/resize_int8_wrapper.c
|
||||
${WRAPPER_DIR}/int8/slice_int8_wrapper.c
|
||||
${WRAPPER_DIR}/int8/batchnorm_int8_wrapper.c
|
||||
${LITE_DIR}/src/common/string.cc
|
||||
)
|
||||
|
||||
list(APPEND FILE_SET ${WRAPPER_SRC} ${RUNTIME_SRC})
|
||||
|
|
|
@ -28,7 +28,7 @@ namespace mindspore::lite::micro {
|
|||
void CodeSessionCompileGraph(std::ofstream &ofs, const std::unique_ptr<CoderContext> &ctx) {
|
||||
auto array_tostring = [&ofs](const std::vector<int> &array, const std::string &name) {
|
||||
size_t num = array.size();
|
||||
ofs << " Vector<int> " << name << ";\n";
|
||||
ofs << " Vector<int32_t> " << name << ";\n";
|
||||
ofs << " " << name << ".resize(" << num << ");\n";
|
||||
for (size_t i = 0; i < num; ++i) {
|
||||
ofs << " " << name << "[" << i << "] = " << array[i] << ";\n";
|
||||
|
@ -63,6 +63,25 @@ void CodeSessionCompileGraph(std::ofstream &ofs, const std::unique_ptr<CoderCont
|
|||
ofs << "}\n\n";
|
||||
}
|
||||
|
||||
void CodeCreateSessionImplement(std::ofstream &ofs, Target target) {
|
||||
ofs << "session::LiteSession *session::LiteSession::CreateSession(const char *net_buf, size_t size,\n"
|
||||
" const lite::Context *context) {\n"
|
||||
" session::LiteSession *session = CreateSession(context);\n"
|
||||
" if (session == nullptr) {\n"
|
||||
" return nullptr;\n"
|
||||
" }\n"
|
||||
" int ret = session->CompileGraph(nullptr);\n"
|
||||
" if (ret != lite::RET_OK) {\n"
|
||||
" return nullptr;\n"
|
||||
" }\n";
|
||||
if (target != kARM32M) {
|
||||
ofs << " Init(const_cast<char *>(net_buf), size);\n";
|
||||
}
|
||||
ofs << " return session;\n"
|
||||
"}\n"
|
||||
"} // namespace mindspore\n\n";
|
||||
}
|
||||
|
||||
void CodeCopyOutputsState(std::ofstream &ofs) { ofs << "int CopyOutputsData(void **outputs, int num);\n\n"; }
|
||||
|
||||
void CodeCopyOutputsImplement(std::ofstream &ofs, const std::unique_ptr<CoderContext> &ctx) {
|
||||
|
|
|
@ -24,9 +24,11 @@
|
|||
#include <fstream>
|
||||
#include "src/tensor.h"
|
||||
#include "coder/context.h"
|
||||
#include "coder/config.h"
|
||||
|
||||
namespace mindspore::lite::micro {
|
||||
void CodeSessionCompileGraph(std::ofstream &ofs, const std::unique_ptr<CoderContext> &ctx);
|
||||
void CodeCreateSessionImplement(std::ofstream &ofs, Target target);
|
||||
|
||||
void CodeCopyOutputsState(std::ofstream &ofs);
|
||||
void CodeCopyOutputsImplement(std::ofstream &ofs, const std::unique_ptr<CoderContext> &ctx);
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
namespace mindspore::lite::micro {
|
||||
|
||||
const char *benchmark_source = R"RAW(
|
||||
|
||||
/**
|
||||
* Copyright 2021 Huawei Technologies Co., Ltd
|
||||
*
|
||||
|
@ -66,19 +65,20 @@ void PrintData(void *data, size_t data_number) {
|
|||
}
|
||||
auto casted_data = static_cast<T *>(data);
|
||||
for (size_t i = 0; i < 10 && i < data_number; i++) {
|
||||
std::cout << std::to_string(casted_data[i]) << ", ";
|
||||
printf("%s,", std::to_string(casted_data[i]).c_str());
|
||||
}
|
||||
std::cout << std::endl;
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void TensorToString(tensor::MSTensor *tensor) {
|
||||
std::cout << ", DataType: " << tensor->data_type();
|
||||
std::cout << ", Size: " << tensor->Size();
|
||||
std::cout << ", Shape:";
|
||||
printf("name: %s, ", tensor->tensor_name().c_str());
|
||||
printf(", DataType: %d", tensor->data_type());
|
||||
printf(", Size: %lu", tensor->Size());
|
||||
printf(", Shape: ");
|
||||
for (auto &dim : tensor->shape()) {
|
||||
std::cout << " " << dim;
|
||||
printf("%d ", dim);
|
||||
}
|
||||
std::cout << ", Data:" << std::endl;
|
||||
printf(", Data: \n");
|
||||
switch (tensor->data_type()) {
|
||||
case kNumberTypeFloat32: {
|
||||
PrintData<float>(tensor->MutableData(), tensor->ElementsNum());
|
||||
|
@ -106,11 +106,11 @@ void TensorToString(tensor::MSTensor *tensor) {
|
|||
|
||||
int main(int argc, const char **argv) {
|
||||
if (argc < 2) {
|
||||
std::cout << "input command is invalid\n" << std::endl;
|
||||
printf("input command is invalid\n");
|
||||
usage();
|
||||
return lite::RET_ERROR;
|
||||
}
|
||||
std::cout << "start run benchmark" << std::endl;
|
||||
printf("=======run benchmark======\n");
|
||||
|
||||
const char *model_buffer = nullptr;
|
||||
int model_size = 0;
|
||||
|
@ -146,14 +146,18 @@ int main(int argc, const char **argv) {
|
|||
return lite::RET_ERROR;
|
||||
}
|
||||
|
||||
std::cout << "run benchmark success" << std::endl;
|
||||
Vector<String> outputs_name = session->GetOutputTensorNames();
|
||||
for (const auto &name : outputs_name) {
|
||||
auto output = session->GetOutputByTensorName(name);
|
||||
TensorToString(output);
|
||||
}
|
||||
printf("========run success=======\n");
|
||||
delete session;
|
||||
for (size_t i = 0; i < inputs_num; ++i) {
|
||||
free(inputs_binbuf[i]);
|
||||
}
|
||||
return lite::RET_OK;
|
||||
}
|
||||
|
||||
)RAW";
|
||||
|
||||
} // namespace mindspore::lite::micro
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
namespace mindspore::lite::micro {
|
||||
|
||||
const char *bench_cmake_lists_txt = R"RAW(
|
||||
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
project(benchmark)
|
||||
|
||||
|
@ -76,11 +75,9 @@ set(SRC_FILES
|
|||
)
|
||||
add_executable(benchmark ${SRC_FILES})
|
||||
target_link_libraries(benchmark net -lm -pthread)
|
||||
|
||||
)RAW";
|
||||
|
||||
const char *src_cmake_lists_txt = R"RAW(
|
||||
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
project(net)
|
||||
|
||||
|
@ -163,7 +160,6 @@ function(create_library)
|
|||
endfunction(create_library)
|
||||
string(CONCAT library_name "lib" net ".a")
|
||||
create_library()
|
||||
|
||||
)RAW";
|
||||
|
||||
} // namespace mindspore::lite::micro
|
||||
|
|
|
@ -166,7 +166,14 @@ Vector<String> LiteSession::GetOutputTensorNames() const {
|
|||
return output_names;
|
||||
}
|
||||
|
||||
mindspore::tensor::MSTensor *LiteSession::GetOutputByTensorName(const String &tensor_name) const { return nullptr; }
|
||||
mindspore::tensor::MSTensor *LiteSession::GetOutputByTensorName(const String &tensor_name) const {
|
||||
for (const auto &output : outputs_) {
|
||||
if (output->tensor_name() == tensor_name) {
|
||||
return output;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace lite
|
||||
|
||||
|
@ -178,21 +185,6 @@ session::LiteSession *session::LiteSession::CreateSession(const lite::Context *c
|
|||
session->InitRuntimeBuffer();
|
||||
return session;
|
||||
}
|
||||
|
||||
session::LiteSession *session::LiteSession::CreateSession(const char *net_buf, size_t size,
|
||||
const lite::Context *context) {
|
||||
session::LiteSession *session = CreateSession(context);
|
||||
if (session == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
int ret = session->CompileGraph(nullptr);
|
||||
if (ret != lite::RET_OK) {
|
||||
return nullptr;
|
||||
}
|
||||
Init(const_cast<char *>(net_buf), size);
|
||||
return session;
|
||||
}
|
||||
} // namespace mindspore
|
||||
)RAW";
|
||||
|
||||
} // namespace mindspore::lite::micro
|
||||
|
|
|
@ -1,3 +1,25 @@
|
|||
/**
|
||||
* 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/mstring.h"
|
||||
|
||||
namespace mindspore::lite::micro {
|
||||
|
||||
const char *string_source = R"RAW(
|
||||
|
||||
/**
|
||||
* Copyright 2021 Huawei Technologies Co., Ltd
|
||||
*
|
||||
|
@ -273,18 +295,22 @@ int String::compare(const char *str) const { return strcmp(buffer_, str); }
|
|||
|
||||
String String::substr(size_t pos, size_t count) const { return String(*this, pos, count); }
|
||||
|
||||
String operator+(const String &str1, const char *str2) {
|
||||
String str = str1;
|
||||
str += str2;
|
||||
String operator+(const String &lhs, const char *rhs) {
|
||||
String str = lhs;
|
||||
str += rhs;
|
||||
return str;
|
||||
}
|
||||
|
||||
String operator+(const char *str1, const String &str2) {
|
||||
String str = str2;
|
||||
str += str1;
|
||||
String operator+(const char *lhs, const String &rhs) {
|
||||
String str = rhs;
|
||||
str += lhs;
|
||||
return str;
|
||||
}
|
||||
|
||||
bool operator==(const String &lhs, const String &rhs) { return lhs.compare(rhs) == 0; }
|
||||
bool operator==(const String &lhs, const char *rhs) { return lhs.compare(rhs) == 0; }
|
||||
bool operator==(const char *lhs, const String &rhs) { return rhs.compare(lhs) == 0; }
|
||||
|
||||
String to_String(int32_t value) {
|
||||
char tmp[sizeof(int32_t) * 4];
|
||||
snprintf(tmp, sizeof(int32_t) * 4, "%d", value);
|
||||
|
@ -298,3 +324,6 @@ String to_String(float value) {
|
|||
}
|
||||
} // namespace mindspore
|
||||
#endif // NOT_USE_STL
|
||||
)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_MSTRING_H_
|
||||
#define MINDSPORE_LITE_MICRO_GENERATOR_CONST_BLOCK_MSTRING_H_
|
||||
|
||||
namespace mindspore::lite::micro {
|
||||
|
||||
extern const char *string_source;
|
||||
|
||||
} // namespace mindspore::lite::micro
|
||||
|
||||
#endif // MINDSPORE_LITE_MICRO_GENERATOR_CONST_BLOCK_MSTRING_H_
|
|
@ -26,6 +26,7 @@
|
|||
#include "coder/generator/component/const_blocks/load_input.h"
|
||||
#include "coder/generator/component/const_blocks/msession.h"
|
||||
#include "coder/generator/component/const_blocks/mtensor.h"
|
||||
#include "coder/generator/component/const_blocks/mstring.h"
|
||||
#include "coder/generator/component/const_blocks/benchmark.h"
|
||||
#include "coder/generator/component/const_blocks/license.h"
|
||||
#include "coder/log.h"
|
||||
|
@ -89,7 +90,8 @@ int Generator::CodeStaticContent() {
|
|||
{net_src_file_path_ + "CMakeLists.txt", src_cmake_lists_txt},
|
||||
{net_src_file_path_ + "session.h", session_header},
|
||||
{net_src_file_path_ + "tensor.h", tensor_header},
|
||||
{net_src_file_path_ + "tensor.cc", tensor_source}};
|
||||
{net_src_file_path_ + "tensor.cc", tensor_source},
|
||||
{net_src_file_path_ + "string.cc", string_source}};
|
||||
if (config_->debug_mode()) {
|
||||
const_blocks.emplace_back(std::make_pair(net_src_file_path_ + "debug_utils.h", debug_utils_h));
|
||||
const_blocks.emplace_back(std::make_pair(net_src_file_path_ + "debug_utils.c", debug_utils_c));
|
||||
|
@ -113,6 +115,7 @@ int Generator::CodeSessionImplement() {
|
|||
ofs << "#include <new>\n\n";
|
||||
CodeSessionCompileGraph(ofs, ctx_);
|
||||
ofs << session_source;
|
||||
CodeCreateSessionImplement(ofs, config_->target());
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -60,5 +60,4 @@ endif()
|
|||
|
||||
# generate static library
|
||||
add_library(ops STATIC ${OP_FILES})
|
||||
target_compile_definitions(ops PRIVATE NOT_USE_STL)
|
||||
install(TARGETS ops ARCHIVE DESTINATION ${LIB_PATH})
|
||||
|
|
0
mindspore/lite/micro/example/mnist_stm32f746/mnist/benchmark/load_input.c
Executable file → Normal file
0
mindspore/lite/micro/example/mnist_stm32f746/mnist/benchmark/load_input.c
Executable file → Normal file
0
mindspore/lite/micro/example/mnist_stm32f746/mnist/benchmark/load_input.h
Executable file → Normal file
0
mindspore/lite/micro/example/mnist_stm32f746/mnist/benchmark/load_input.h
Executable file → Normal file
Loading…
Reference in New Issue