!13490 fix bugs, and add dump tensor in benchmark

From: @yangjie159
Reviewed-by: @wangchengyuan,@zhanghaibo5
Signed-off-by: @wangchengyuan
This commit is contained in:
mindspore-ci-bot 2021-03-23 15:59:34 +08:00 committed by Gitee
commit a45f03eebf
14 changed files with 118 additions and 44 deletions

View File

@ -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);

View File

@ -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

View File

@ -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})

View File

@ -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) {

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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_

View File

@ -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;
}

View File

@ -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})