You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_common.h 7.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /**
  2. * \file test/test_common.h
  3. * MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
  4. *
  5. * Copyright (c) 2014-2021 Megvii Inc. All rights reserved.
  6. *
  7. * Unless required by applicable law or agreed to in writing,
  8. * software distributed under the License is distributed on an
  9. * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. */
  11. #pragma once
  12. #include "lite_build_config.h"
  13. #if LITE_BUILD_WITH_MGE
  14. #include "../src/mge/common.h"
  15. #include "../src/mge/network_impl.h"
  16. #include "../src/misc.h"
  17. #include "lite/network.h"
  18. #include "lite/tensor.h"
  19. #include "megbrain/graph/bases.h"
  20. #include "megbrain/plugin/opr_io_dump.h"
  21. #include "megbrain/plugin/profiler.h"
  22. #include "megbrain/serialization/extern_c_opr.h"
  23. #include "megbrain/serialization/file.h"
  24. #include "megbrain/serialization/load_dump_config.h"
  25. #include "megbrain/serialization/serializer.h"
  26. #include "megbrain/tensor.h"
  27. #include "megbrain/utils/thin/hash_table.h"
  28. #include "npy.h"
  29. #include <gtest/gtest.h>
  30. #include <string.h>
  31. #include <chrono>
  32. #include <memory>
  33. #include <random>
  34. namespace lite {
  35. template <typename T>
  36. static ::testing::AssertionResult compare_memory(
  37. const void* memory0, const void* memory1, size_t length, float maxerr = 1e-3) {
  38. const T* data_ptr0 = static_cast<const T*>(memory0);
  39. const T* data_ptr1 = static_cast<const T*>(memory1);
  40. for (size_t i = 0; i < length; i++) {
  41. auto diff = std::abs(data_ptr0[i] - data_ptr1[i]);
  42. if (diff > maxerr) {
  43. return ::testing::AssertionFailure() << "Unequal value:\n"
  44. << "value 0 = " << data_ptr0[i] << "\n"
  45. << "value 1 = " << data_ptr1[i] << "\n"
  46. << "At index: " << i << "\n";
  47. }
  48. }
  49. return ::testing::AssertionSuccess();
  50. }
  51. template <typename T>
  52. void compare_lite_tensor(
  53. std::shared_ptr<Tensor> tensor0, std::shared_ptr<Tensor> tensor1,
  54. float maxerr = 1e-3) {
  55. size_t elemsize = tensor0->get_layout().get_elem_size();
  56. T* data_ptr0 = static_cast<T*>(tensor0->get_memory_ptr());
  57. T* data_ptr1 = static_cast<T*>(tensor1->get_memory_ptr());
  58. size_t length = tensor0->get_tensor_total_size_in_byte() / elemsize;
  59. EXPECT_TRUE(compare_memory<T>(data_ptr0, data_ptr1, length, maxerr));
  60. }
  61. __attribute__((unused)) static std::shared_ptr<Tensor> get_input_data(
  62. std::string path) {
  63. std::string type_str;
  64. std::vector<npy::ndarray_len_t> stl_shape;
  65. std::vector<int8_t> raw;
  66. npy::LoadArrayFromNumpy(path, type_str, stl_shape, raw);
  67. auto lite_tensor = std::make_shared<Tensor>(LiteDeviceType::LITE_CPU);
  68. Layout layout;
  69. layout.ndim = stl_shape.size();
  70. const std::map<std::string, LiteDataType> type_map = {
  71. {"f4", LiteDataType::LITE_FLOAT}, {"f2", LiteDataType::LITE_HALF},
  72. {"i8", LiteDataType::LITE_INT64}, {"i4", LiteDataType::LITE_INT},
  73. {"u4", LiteDataType::LITE_UINT}, {"i2", LiteDataType::LITE_INT16},
  74. {"u2", LiteDataType::LITE_UINT16}, {"i1", LiteDataType::LITE_INT8},
  75. {"u1", LiteDataType::LITE_UINT8}};
  76. layout.shapes[0] = 1;
  77. for (size_t i = 0; i < stl_shape.size(); i++) {
  78. layout.shapes[i] = static_cast<size_t>(stl_shape[i]);
  79. }
  80. for (auto& item : type_map) {
  81. if (type_str.find(item.first) != std::string::npos) {
  82. layout.data_type = item.second;
  83. break;
  84. }
  85. }
  86. lite_tensor->set_layout(layout);
  87. size_t length = lite_tensor->get_tensor_total_size_in_byte();
  88. void* dest = lite_tensor->get_memory_ptr();
  89. memcpy(dest, raw.data(), length);
  90. return lite_tensor;
  91. }
  92. __attribute__((unused)) static std::shared_ptr<Tensor> mgelite_lar(
  93. std::string model_path, const Config& config, std::string,
  94. std::shared_ptr<Tensor> input) {
  95. std::unique_ptr<Network> network = std::make_unique<Network>(config);
  96. network->load_model(model_path);
  97. std::shared_ptr<Tensor> input_tensor = network->get_input_tensor(0);
  98. auto src_ptr = input->get_memory_ptr();
  99. auto src_layout = input->get_layout();
  100. input_tensor->reset(src_ptr, src_layout);
  101. network->forward();
  102. network->wait();
  103. std::shared_ptr<Tensor> output_tensor = network->get_output_tensor(0);
  104. Layout out_layout = output_tensor->get_layout();
  105. auto ret = std::make_shared<Tensor>(LiteDeviceType::LITE_CPU, out_layout);
  106. void* out_data = output_tensor->get_memory_ptr();
  107. void* dst_data = ret->get_memory_ptr();
  108. memcpy(dst_data, out_data, ret->get_tensor_total_size_in_byte());
  109. return ret;
  110. }
  111. __attribute__((unused)) static std::shared_ptr<Tensor> mgb_lar(
  112. std::string model_path, const Config& config, std::string input_name,
  113. std::shared_ptr<Tensor> input) {
  114. LITE_ASSERT(config.bare_model_cryption_name.size() == 0);
  115. using namespace mgb;
  116. serialization::GraphLoader::LoadConfig mgb_config;
  117. mgb_config.comp_node_mapper = [config](CompNode::Locator& loc) {
  118. loc = to_compnode_locator(config.device_type);
  119. };
  120. mgb_config.comp_graph = ComputingGraph::make();
  121. auto&& graph_opt = mgb_config.comp_graph->options();
  122. if (config.options.weight_preprocess) {
  123. graph_opt.graph_opt.enable_weight_preprocess();
  124. }
  125. graph_opt.comp_node_seq_record_level = config.options.comp_node_seq_record_level;
  126. auto inp_file = mgb::serialization::InputFile::make_fs(model_path.c_str());
  127. auto format = serialization::GraphLoader::identify_graph_dump_format(*inp_file);
  128. mgb_assert(
  129. format.valid(),
  130. "invalid model: unknown model format, please make sure input "
  131. "file is generated by GraphDumper");
  132. auto loader = serialization::GraphLoader::make(std::move(inp_file), format.val());
  133. auto load_ret = loader->load(mgb_config, false);
  134. ComputingGraph::OutputSpec out_spec;
  135. std::vector<HostTensorND> output_tensors(load_ret.output_var_list.size());
  136. for (size_t i = 0; i < load_ret.output_var_list.size(); i++) {
  137. auto cb = [&output_tensors, i](const DeviceTensorND& dv) mutable {
  138. output_tensors[i].copy_from(dv);
  139. };
  140. out_spec.emplace_back(load_ret.output_var_list[i], std::move(cb));
  141. }
  142. auto func = load_ret.graph_compile(out_spec);
  143. auto& in = load_ret.tensor_map.find(input_name)->second;
  144. in->copy_from(*TensorHelper::implement(input)
  145. ->cast_final_safe<TensorImplDft>()
  146. .host_tensor());
  147. func->execute();
  148. func->wait();
  149. std::shared_ptr<Tensor> ret = std::make_shared<Tensor>(
  150. LiteDeviceType::LITE_CPU, to_lite_layout(output_tensors[0].layout()));
  151. auto mge_tensor = TensorHelper::implement(ret)
  152. ->cast_final_safe<TensorImplDft>()
  153. .host_tensor();
  154. mge_tensor->copy_from(output_tensors[0]);
  155. return ret;
  156. }
  157. } // namespace lite
  158. #endif
  159. // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}

MegEngine 安装包中集成了使用 GPU 运行代码所需的 CUDA 环境,不用区分 CPU 和 GPU 版。 如果想要运行 GPU 程序,请确保机器本身配有 GPU 硬件设备并安装好驱动。 如果你想体验在云端 GPU 算力平台进行深度学习开发的感觉,欢迎访问 MegStudio 平台