mirror of
https://github.com/open-mmlab/mmdeploy.git
synced 2025-01-14 08:09:43 +08:00
* make -install -> make install (#621) change `make -install` to `make install` https://github.com/open-mmlab/mmdeploy/issues/618 * [Fix] fix csharp api detector release result (#620) * fix csharp api detector release result * fix wrong count arg of xxx_release_result in c# api * [Enhancement] Support two-stage rotated detector TensorRT. (#530) * upload * add fake_multiclass_nms_rotated * delete unused code * align with pytorch * Update delta_midpointoffset_rbbox_coder.py * add trt rotated roi align * add index feature in nms * not good * fix index * add ut * add benchmark * move to csrc/mmdeploy * update unit test Co-authored-by: zytx121 <592267829@qq.com> * Reduce mmcls version dependency (#635) * fix shufflenetv2 with trt (#645) * fix shufflenetv2 and pspnet * fix ci * remove print * ' -> " (#654) If there is a variable in the string, single quotes will ignored it, while double quotes will bring the variable into the string after parsing * ' -> " (#655) same with https://github.com/open-mmlab/mmdeploy/pull/654 * Support deployment of Segmenter (#587) * support segmentor with ncnn * update regression yml * replace chunk with split to support ts * update regression yml * update docs * fix segmenter ncnn inference failure brought by #477 * add test * fix test for ncnn and trt * fix lint * export nn.linear to Gemm op in onnx for ncnn * fix ci * simplify `Expand` (#617) * Fix typo (#625) * Add make install in en docs * Add make install in zh docs * Fix typo * Merge and add windows build Co-authored-by: tripleMu <865626@163.com> * [Enhancement] Fix ncnn unittest (#626) * optmize-csp-darknet * replace floordiv to torch.div * update csp_darknet default implement * fix test * [Enhancement] TensorRT Anchor generator plugin (#646) * custom trt anchor generator * add ut * add docstring, update doc * Add partition doc and sample code (#599) * update torch2onnx tool to support onnx partition * add model partition of yolov3 * add cn doc * update torch2onnx tool to support onnx partition * add model partition of yolov3 * add cn doc * add to index.rst * resolve comment * resolve comments * fix lint * change caption level in docs * update docs (#624) * Add java apis and demos (#563) * add java classifier detector * add segmentor * fix lint * add ImageRestorer java apis and demo * remove useless count parameter for Segmentor and Restorer, add PoseDetector * add RotatedDetection java api and demo * add Ocr java demo and apis * remove mmrotate ncnn java api and demo * fix lint * sync java api folder after rebase to master * fix include * remove record * fix java apis dir path in cmake * add java demo readme * fix lint mdformat * add test javaapi ci * fix lint * fix flake8 * fix test javaapi ci * refactor readme.md * fix install opencv for ci * fix install opencv : add permission * add all codebases and mmcv install * add torch * install mmdeploy * fix image path * fix picture path * fix import ncnn * fix import ncnn * add submodule of pybind * fix pybind submodule * change download to git clone for submodule * fix ncnn dir * fix README error * simplify the github ci * fix ci * fix yapf * add JNI as required * fix Capitalize * fix Capitalize * fix copyright * ignore .class changed * add OpenJDK installation docs * install target of javaapi * simplify ci * add jar * fix ci * fix ci * fix test java command * debugging what failed * debugging what failed * debugging what failed * add java version info * install openjdk * add java env var * fix export * fix export * fix export * fix export * fix picture path * fix picture path * fix file name * fix file name * fix README * remove java_api strategy * fix python version * format task name * move args position * extract common utils code * show image class result * add detector result * segmentation result format * add ImageRestorer result * add PoseDetection java result format * fix ci * stage ocr * add visualize * move utils * fix lint * fix ocr bugs * fix ci demo * fix java classpath for ci * fix popd * fix ocr demo text garbled * fix ci * fix ci * fix ci * fix path of utils ci * update the circleci config file by adding workflows both for linux, windows and linux-gpu (#368) * update circleci by adding more workflows * fix test workflow failure on windows platform * fix docker exec command for SDK unittests * Fixed tensorrt plugin not found in Windows (#672) * update introduction.png (#674) * [Enhancement] Add fuse select assign pass (#589) * Add fuse select assign pass * move code to csrc * add config flag * remove bool cast * fix export sdk info of input shape (#667) * Update get_started.md (#675) Fix backend model assignment * Update get_started.md (#676) Fix backend model assignment * [Fix] fix clang build (#677) * fix clang build * fix ndk build * fix ndk build * switch to `std::filesystem` for clang-7 and later * Deploy the Swin Transformer on TensorRT. (#652) * resolve conflicts * update ut and docs * fix ut * refine docstring * add comments and refine UT * resolve comments * resolve comments * update doc * add roll export * check backend * update regression test * bump version to 0.6.0 (#680) * bump vertion to 0.6.0 * update version * pass img_metas while exporting to onnx (#681) * pass img_metas while exporting to onnx * remove try-catch in tools for beter debugging * use get * fix typo * [Fix] fix ssd ncnn ut (#692) * fix ssd ncnn ut * fix yapf * fix passing img_metas to pytorch2onnx for mmedit (#700) * fix passing img_metas for mmdet3d (#707) * [Fix] Fix android build (#698) * fix android build * fix cmake * fix url link * fix wrong exit code in pipeline_manager (#715) * fix exit * change to general exit errorcode=1 * fix passing wrong backend type (#719) * Rename onnx2ncnn to mmdeploy_onnx2ncnn (#694) * improvement(tools/onnx2ncnn.py): rename to mmdeploy_onnx2ncnn * format(tools/deploy.py): clean code * fix(init_plugins.py): improve if condition * fix(CI): update target * fix(test_onnx2ncnn.py): update desc * Update init_plugins.py * [Fix] Fix mmdet ort static shape bug (#687) * fix shape * add device * fix yapf * fix rewriter for transforms * reverse image shape * fix ut of distance2bbox * fix rewriter name * fix c4 for torchscript (#724) * [Enhancement] Standardize C API (#634) * unify C API naming * fix demo and move apis/c/* -> apis/c/mmdeploy/* * fix lint * fix C# project * fix Java API * [Enhancement] Support Slide Vertex TRT (#650) * reorgnize mmrotate * fix * add hbb2obb * add ut * fix rotated nms * update docs * update benchmark * update test * remove ort regression test, remove comment * Fix get-started rendering issues in readthedocs (#740) * fix mermaid markdown rendering issue in readthedocs * fix error in C++ example * fix error in c++ example in zh_cn get_started doc * [Fix] set default topk for dump info (#702) * set default topk for dump info * remove redundant docstrings * add ci densenet * fix classification warnings * fix mmcls version * fix logger.warnings * add version control (#754) * fix satrn for ORT (#753) * fix satrn for ORT * move rewrite into pytorch * Add inference latency test tool (#665) * add profile tool * remove print envs in profile tool * set cudnn_benchmark to True * add doc * update tests * fix typo * support test with images from a directory * update doc * resolve comments * [Enhancement] Add CSE ONNX pass (#647) * Add fuse select assign pass * move code to csrc * add config flag * Add fuse select assign pass * Add CSE for ONNX * remove useless code * Test robot Just test robot * Update README.md Revert * [Fix] fix yolox point_generator (#758) * fix yolox point_generator * add a UT * resolve comments * fix comment lines * limit markdown version (#773) * [Enhancement] Better index put ONNX export. (#704) * Add rewriter for tensor setitem * add version check * Upgrade Dockerfile to use TensorRT==8.2.4.2 (#706) * Upgrade TensorRT to 8.2.4.2 * upgrade pytorch&mmcv in CPU Dockerfile * Delete redundant port example in Docker * change 160x160-608x608 to 64x64-608x608 for yolov3 * [Fix] reduce log verbosity & improve error reporting (#755) * reduce log verbosity & improve error reporting * improve error reporting * [Enhancement] Support latest ppl.nn & ppl.cv (#564) * support latest ppl.nn * fix pplnn for model convertor * fix lint * update memory policy * import algo from buffer * update ppl.cv * use `ppl.cv==0.7.0` * document supported ppl.nn version * skip pplnn dependency when building shared libs * [Fix][P0] Fix for torch1.12 (#751) * fix for torch1.12 * add comment * fix check env (#785) * [Fix] fix cascade mask rcnn (#787) * fix cascade mask rcnn * fix lint * add regression * [Feature] Support RoITransRoIHead (#713) * [Feature] Support RoITransRoIHead * Add docs * Add mmrotate models regression test * Add a draft for test code * change the argument name * fix test code * fix minor change for not class agnostic case * fix sample for test code * fix sample for test code * Add mmrotate in requirements * Revert "Add mmrotate in requirements" This reverts commit 043490075e6dbe4a8fb98e94b2b583b91fc5038d. * [Fix] fix triu (#792) * fix triu * triu -> triu_default * [Enhancement] Install Optimizer by setuptools (#690) * Add fuse select assign pass * move code to csrc * add config flag * Add fuse select assign pass * Add CSE for ONNX * remove useless code * Install optimizer by setup tools * fix comment * [Feature] support MMRotate model with le135 (#788) * support MMRotate model with le135 * cse before fuse select assign * remove unused import * [Fix] Support macOS build (#762) * fix macOS build * fix missing * add option to build & install examples (#822) * [Fix] Fix setup on non-linux-x64 (#811) * fix setup * replace long to int64_t * [Feature] support build single sdk library (#806) * build single lib for c api * update csharp doc & project * update test build * fix test build * fix * update document for building android sdk (#817) Co-authored-by: dwSun <dwsunny@icloud.com> * [Enhancement] support kwargs in SDK python bindings (#794) * support-kwargs * make '__call__' as single image inference and add 'batch' API to deal with batch images inference * fix linting error and typo * fix lint * improvement(sdk): add sdk code coverage (#808) * feat(doc): add CI * CI(sdk): add sdk coverage * style(test): code format * fix(CI): update coverage.info path * improvement(CI): use internal image * improvement(CI): push coverage info once * [Feature] Add C++ API for SDK (#831) * add C++ API * unify result type & add examples * minor fix * install cxx API headers * fix Mat, add more examples * fix monolithic build & fix lint * install examples correctly * fix lint * feat(tools/deploy.py): support snpe (#789) * fix(tools/deploy.py): support snpe * improvement(backend/snpe): review advices * docs(backend/snpe): update build * docs(backend/snpe): server support specify port * docs(backend/snpe): update path * fix(backend/snpe): time counter missing argument * docs(backend/snpe): add missing argument * docs(backend/snpe): update download and using * improvement(snpe_net.cpp): load model with modeldata * Support setup on environment with no PyTorch (#843) * support test with multi batch (#829) * support test with multi batch * resolve comment * import algorithm from buffer (#793) * [Enhancement] build sdk python api in standard-alone manner (#810) * build sdk python api in standard-alone manner * enable MMDEPLOY_BUILD_SDK_MONOLITHIC and MMDEPLOY_BUILD_EXAMPLES in prebuild config * link mmdeploy to python target when monolithic option is on * checkin README to describe precompiled package build procedure * use packaging.version.parse(python_version) instead of list(python_version) * fix according to review results * rebase master * rollback cmake.in and apis/python/CMakeLists.txt * reorganize files in install/example * let cmake detect visual studio instead of specifying 2019 * rename whl name of precompiled package * fix according to review results * Fix SDK backend (#844) * fix mmpose python api (#852) * add prebuild package usage docs on windows (#816) * add prebuild package usage docs on windows * fix lint * update * try fix lint * add en docs * update * update * udpate faq * fix typo (#862) * [Enhancement] Improve get_started documents and bump version to 0.7.0 (#813) * simplify commands in get_started * add installation commands for Windows * fix typo * limit markdown and sphinx_markdown_tables version * adopt html <details open> tag * bump mmdeploy version * bump mmdeploy version * update get_started * update get_started * use python3.8 instead of python3.7 * remove duplicate section * resolve issue #856 * update according to review results * add reference to prebuilt_package_windows.md * fix error when build sdk demos * fix mmcls Co-authored-by: Ryan_Huang <44900829+DrRyanHuang@users.noreply.github.com> Co-authored-by: Chen Xin <xinchen.tju@gmail.com> Co-authored-by: q.yao <yaoqian@sensetime.com> Co-authored-by: zytx121 <592267829@qq.com> Co-authored-by: Li Zhang <lzhang329@gmail.com> Co-authored-by: tripleMu <gpu@163.com> Co-authored-by: tripleMu <865626@163.com> Co-authored-by: hanrui1sensetime <83800577+hanrui1sensetime@users.noreply.github.com> Co-authored-by: lvhan028 <lvhan_028@163.com> Co-authored-by: Bryan Glen Suello <11388006+bgsuello@users.noreply.github.com> Co-authored-by: zambranohally <63218980+zambranohally@users.noreply.github.com> Co-authored-by: AllentDan <41138331+AllentDan@users.noreply.github.com> Co-authored-by: tpoisonooo <khj.application@aliyun.com> Co-authored-by: Hakjin Lee <nijkah@gmail.com> Co-authored-by: 孙德伟 <5899962+dwSun@users.noreply.github.com> Co-authored-by: dwSun <dwsunny@icloud.com> Co-authored-by: Chen Xin <irexyc@gmail.com>
359 lines
12 KiB
C++
359 lines
12 KiB
C++
// Copyright (c) OpenMMLab. All rights reserved.
|
|
|
|
#include "service_impl.h"
|
|
|
|
#include <algorithm>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <iterator>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include "scope_timer.h"
|
|
#include "text_table.h"
|
|
|
|
zdl::DlSystem::Runtime_t InferenceServiceImpl::CheckRuntime(zdl::DlSystem::Runtime_t runtime,
|
|
bool& staticQuantization) {
|
|
static zdl::DlSystem::Version_t Version = zdl::SNPE::SNPEFactory::getLibraryVersion();
|
|
|
|
fprintf(stdout, "SNPE Version: %s\n", Version.asString().c_str());
|
|
|
|
if ((runtime != zdl::DlSystem::Runtime_t::DSP) && staticQuantization) {
|
|
fprintf(stderr,
|
|
"ERROR: Cannot use static quantization with CPU/GPU runtimes. "
|
|
"It is only designed for DSP/AIP runtimes.\n"
|
|
"ERROR: Proceeding without static quantization on selected "
|
|
"runtime.\n");
|
|
staticQuantization = false;
|
|
}
|
|
|
|
if (!zdl::SNPE::SNPEFactory::isRuntimeAvailable(runtime)) {
|
|
fprintf(stderr, "Selected runtime not present. Falling back to CPU.\n");
|
|
runtime = zdl::DlSystem::Runtime_t::CPU;
|
|
}
|
|
|
|
return runtime;
|
|
}
|
|
|
|
void InferenceServiceImpl::Build(std::unique_ptr<zdl::DlContainer::IDlContainer>& container,
|
|
zdl::DlSystem::Runtime_t runtime,
|
|
zdl::DlSystem::RuntimeList runtimeList,
|
|
bool useUserSuppliedBuffers,
|
|
zdl::DlSystem::PlatformConfig platformConfig) {
|
|
zdl::SNPE::SNPEBuilder snpeBuilder(container.get());
|
|
|
|
if (runtimeList.empty()) {
|
|
runtimeList.add(runtime);
|
|
}
|
|
|
|
snpe = snpeBuilder.setOutputLayers({})
|
|
.setRuntimeProcessorOrder(runtimeList)
|
|
.setUseUserSuppliedBuffers(useUserSuppliedBuffers)
|
|
.setPlatformConfig(platformConfig)
|
|
.setExecutionPriorityHint(zdl::DlSystem::ExecutionPriorityHint_t::HIGH)
|
|
.setPerformanceProfile(zdl::DlSystem::PerformanceProfile_t::SUSTAINED_HIGH_PERFORMANCE)
|
|
.build();
|
|
return;
|
|
}
|
|
|
|
void InferenceServiceImpl::SaveDLC(const ::mmdeploy::Model* request, const std::string& filename) {
|
|
auto model = request->weights();
|
|
fprintf(stdout, "saving file to %s\n", filename.c_str());
|
|
std::ofstream fout;
|
|
fout.open(filename, std::ios::binary | std::ios::out);
|
|
fout.write(model.data(), model.size());
|
|
fout.flush();
|
|
fout.close();
|
|
}
|
|
|
|
void InferenceServiceImpl::LoadFloatData(const std::string& data, std::vector<float>& vec) {
|
|
size_t len = data.size();
|
|
assert(len % sizeof(float) == 0);
|
|
const char* ptr = data.data();
|
|
for (int i = 0; i < len; i += sizeof(float)) {
|
|
vec.push_back(*(float*)(ptr + i));
|
|
}
|
|
}
|
|
|
|
::grpc::Status InferenceServiceImpl::Echo(::grpc::ServerContext* context,
|
|
const ::mmdeploy::Empty* request,
|
|
::mmdeploy::Reply* response) {
|
|
response->set_info("echo");
|
|
return Status::OK;
|
|
}
|
|
|
|
// Logic and data behind the server's behavior.
|
|
::grpc::Status InferenceServiceImpl::Init(::grpc::ServerContext* context,
|
|
const ::mmdeploy::Model* request,
|
|
::mmdeploy::Reply* response) {
|
|
zdl::SNPE::SNPEFactory::initializeLogging(zdl::DlSystem::LogLevel_t::LOG_ERROR);
|
|
zdl::SNPE::SNPEFactory::setLogLevel(zdl::DlSystem::LogLevel_t::LOG_ERROR);
|
|
|
|
if (snpe != nullptr) {
|
|
snpe.reset();
|
|
}
|
|
if (container != nullptr) {
|
|
container.reset();
|
|
}
|
|
|
|
auto model = request->weights();
|
|
container =
|
|
zdl::DlContainer::IDlContainer::open(reinterpret_cast<uint8_t*>(model.data()), model.size());
|
|
if (container == nullptr) {
|
|
fprintf(stdout, "Stage Init: load dlc failed.\n");
|
|
|
|
response->set_status(-1);
|
|
response->set_info(zdl::DlSystem::getLastErrorString());
|
|
return Status::OK;
|
|
}
|
|
fprintf(stdout, "Stage Init: load dlc success.\n");
|
|
|
|
zdl::DlSystem::Runtime_t runtime = zdl::DlSystem::Runtime_t::GPU;
|
|
if (request->has_device()) {
|
|
switch (request->device()) {
|
|
case mmdeploy::Model_Device_GPU:
|
|
runtime = zdl::DlSystem::Runtime_t::GPU;
|
|
break;
|
|
case mmdeploy::Model_Device_DSP:
|
|
runtime = zdl::DlSystem::Runtime_t::DSP;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (runtime != zdl::DlSystem::Runtime_t::CPU) {
|
|
bool static_quant = false;
|
|
runtime = CheckRuntime(runtime, static_quant);
|
|
}
|
|
|
|
zdl::DlSystem::RuntimeList runtimeList;
|
|
runtimeList.add(zdl::DlSystem::Runtime_t::CPU);
|
|
runtimeList.add(runtime);
|
|
zdl::DlSystem::PlatformConfig platformConfig;
|
|
|
|
{
|
|
ScopeTimer timer("build snpe");
|
|
Build(container, runtime, runtimeList, false, platformConfig);
|
|
}
|
|
|
|
if (snpe == nullptr) {
|
|
response->set_status(-1);
|
|
response->set_info(zdl::DlSystem::getLastErrorString());
|
|
}
|
|
|
|
// setup logger
|
|
auto logger_opt = snpe->getDiagLogInterface();
|
|
if (!logger_opt) throw std::runtime_error("SNPE failed to obtain logging interface");
|
|
auto logger = *logger_opt;
|
|
auto opts = logger->getOptions();
|
|
static std::string OutputDir = "./output/";
|
|
|
|
opts.LogFileDirectory = OutputDir;
|
|
if (!logger->setOptions(opts)) {
|
|
std::cerr << "Failed to set options" << std::endl;
|
|
return Status::OK;
|
|
}
|
|
if (!logger->start()) {
|
|
std::cerr << "Failed to start logger" << std::endl;
|
|
return Status::OK;
|
|
}
|
|
|
|
const auto& inputTensorNamesRef = snpe->getInputTensorNames();
|
|
const auto& inputTensorNames = *inputTensorNamesRef;
|
|
|
|
inputTensors.resize(inputTensorNames.size());
|
|
for (int i = 0; i < inputTensorNames.size(); ++i) {
|
|
const char* pname = inputTensorNames.at(i);
|
|
const auto& shape_opt = snpe->getInputDimensions(pname);
|
|
const auto& shape = *shape_opt;
|
|
|
|
fprintf(stdout, "Stage Init: input tensor info:\n");
|
|
switch (shape.rank()) {
|
|
case 1:
|
|
fprintf(stdout, "name: %s, shape: [%ld]\n", pname, shape[0]);
|
|
break;
|
|
case 2:
|
|
fprintf(stdout, "name: %s, shape: [%ld,%ld]\n", pname, shape[0], shape[1]);
|
|
break;
|
|
case 3:
|
|
fprintf(stdout, "name: %s, shape: [%ld,%ld,%ld]\n", pname, shape[0], shape[1], shape[2]);
|
|
break;
|
|
case 4:
|
|
fprintf(stdout, "name: %s, shape: [%ld,%ld,%ld,%ld]\n", pname, shape[0], shape[1], shape[2],
|
|
shape[3]);
|
|
break;
|
|
}
|
|
inputTensors[i] = zdl::SNPE::SNPEFactory::getTensorFactory().createTensor(shape);
|
|
inputTensorMap.add(pname, inputTensors[i].get());
|
|
}
|
|
|
|
response->set_status(0);
|
|
response->set_info("Stage Init: success");
|
|
return Status::OK;
|
|
}
|
|
|
|
std::string InferenceServiceImpl::ContentStr(zdl::DlSystem::ITensor* pTensor) {
|
|
std::string str;
|
|
|
|
const size_t N = std::min(5UL, pTensor->getSize());
|
|
auto it = pTensor->cbegin();
|
|
for (int i = 0; i < N; ++i) {
|
|
str += std::to_string(*(it + i));
|
|
str += " ";
|
|
}
|
|
str += "..";
|
|
str += std::to_string(*(it + pTensor->getSize() - 1));
|
|
return str;
|
|
}
|
|
|
|
std::string InferenceServiceImpl::ShapeStr(zdl::DlSystem::ITensor* pTensor) {
|
|
std::string str;
|
|
|
|
str += "[";
|
|
auto shape = pTensor->getShape();
|
|
for (int i = 0; i < shape.rank(); ++i) {
|
|
str += std::to_string(shape[i]);
|
|
str += ",";
|
|
}
|
|
str += ']';
|
|
return str;
|
|
}
|
|
|
|
::grpc::Status InferenceServiceImpl::OutputNames(::grpc::ServerContext* context,
|
|
const ::mmdeploy::Empty* request,
|
|
::mmdeploy::Names* response) {
|
|
const auto& outputTensorNamesRef = snpe->getOutputTensorNames();
|
|
const auto& outputTensorNames = *outputTensorNamesRef;
|
|
|
|
for (int i = 0; i < outputTensorNames.size(); ++i) {
|
|
response->add_names(outputTensorNames.at(i));
|
|
}
|
|
|
|
return Status::OK;
|
|
}
|
|
|
|
::grpc::Status InferenceServiceImpl::Inference(::grpc::ServerContext* context,
|
|
const ::mmdeploy::TensorList* request,
|
|
::mmdeploy::Reply* response) {
|
|
// Get input names and number
|
|
const auto& inputTensorNamesRef = snpe->getInputTensorNames();
|
|
|
|
if (!inputTensorNamesRef) {
|
|
response->set_status(-1);
|
|
response->set_info(zdl::DlSystem::getLastErrorString());
|
|
return Status::OK;
|
|
}
|
|
|
|
const auto& inputTensorNames = *inputTensorNamesRef;
|
|
if (inputTensorNames.size() != request->data_size()) {
|
|
response->set_status(-1);
|
|
response->set_info("Stage Inference: input names count not match !");
|
|
return Status::OK;
|
|
}
|
|
|
|
helper::TextTable table("Inference");
|
|
table.padding(1);
|
|
table.add("type").add("name").add("shape").add("content").eor();
|
|
|
|
// Load input/output buffers with TensorMap
|
|
{
|
|
// ScopeTimer timer("convert input");
|
|
|
|
for (int i = 0; i < request->data_size(); ++i) {
|
|
auto tensor = request->data(i);
|
|
std::vector<float> float_input;
|
|
LoadFloatData(tensor.data(), float_input);
|
|
|
|
zdl::DlSystem::ITensor* ptensor = inputTensorMap.getTensor(tensor.name().c_str());
|
|
if (ptensor == nullptr) {
|
|
fprintf(stderr, "Stage Inference: name: %s not existed in input tensor map\n",
|
|
tensor.name().c_str());
|
|
response->set_status(-1);
|
|
response->set_info("cannot find name in input tensor map.");
|
|
return Status::OK;
|
|
}
|
|
|
|
if (float_input.size() != ptensor->getSize()) {
|
|
fprintf(stderr, "Stage Inference: input size not match, get %ld, expect %ld.\n",
|
|
float_input.size(), ptensor->getSize());
|
|
response->set_status(-1);
|
|
response->set_info(zdl::DlSystem::getLastErrorString());
|
|
return Status::OK;
|
|
}
|
|
|
|
std::copy(float_input.begin(), float_input.end(), ptensor->begin());
|
|
|
|
table.add("IN").add(tensor.name()).add(ShapeStr(ptensor)).add(ContentStr(ptensor)).eor();
|
|
}
|
|
}
|
|
|
|
// A tensor map for SNPE execution outputs
|
|
zdl::DlSystem::TensorMap outputTensorMap;
|
|
// Execute the multiple input tensorMap on the model with SNPE
|
|
bool success = false;
|
|
{
|
|
ScopeTimer timer("execute", false);
|
|
success = snpe->execute(inputTensorMap, outputTensorMap);
|
|
|
|
if (!success) {
|
|
response->set_status(-1);
|
|
response->set_info(zdl::DlSystem::getLastErrorString());
|
|
return Status::OK;
|
|
}
|
|
|
|
table.add("EXECUTE").add(std::to_string(timer.cost()) + "ms").eor();
|
|
}
|
|
|
|
{
|
|
// ScopeTimer timer("convert output");
|
|
auto out_names = outputTensorMap.getTensorNames();
|
|
for (size_t i = 0; i < out_names.size(); ++i) {
|
|
const char* name = out_names.at(i);
|
|
zdl::DlSystem::ITensor* ptensor = outputTensorMap.getTensor(name);
|
|
|
|
table.add("OUT").add(std::string(name)).add(ShapeStr(ptensor)).add(ContentStr(ptensor)).eor();
|
|
|
|
const size_t data_length = ptensor->getSize();
|
|
|
|
std::string result;
|
|
result.resize(sizeof(float) * data_length);
|
|
int j = 0;
|
|
for (auto it = ptensor->cbegin(); it != ptensor->cend(); ++it, j += sizeof(float)) {
|
|
float f = *it;
|
|
memcpy(&result[0] + j, reinterpret_cast<char*>(&f), sizeof(float));
|
|
}
|
|
|
|
auto shape = ptensor->getShape();
|
|
|
|
::mmdeploy::Tensor* pData = response->add_data();
|
|
pData->set_dtype("float32");
|
|
pData->set_name(name);
|
|
pData->set_data(result);
|
|
for (int j = 0; j < shape.rank(); ++j) {
|
|
pData->add_shape(shape[j]);
|
|
}
|
|
}
|
|
}
|
|
|
|
std::cout << table << std::endl << std::endl;
|
|
|
|
// build output status
|
|
response->set_status(0);
|
|
response->set_info("Stage Inference: success");
|
|
return Status::OK;
|
|
}
|
|
|
|
::grpc::Status InferenceServiceImpl::Destroy(::grpc::ServerContext* context,
|
|
const ::mmdeploy::Empty* request,
|
|
::mmdeploy::Reply* response) {
|
|
snpe.reset();
|
|
container.reset();
|
|
inputTensors.clear();
|
|
response->set_status(0);
|
|
zdl::SNPE::SNPEFactory::terminateLogging();
|
|
return Status::OK;
|
|
}
|