mirror of
https://github.com/PaddlePaddle/FastDeploy.git
synced 2025-10-08 10:00:29 +08:00
[Backend] Add RKNPU2 backend support (#456)
* 10-29/14:05 * 新增cmake * 新增rknpu2 backend * 10-29/14:43 * Runtime fd_type新增RKNPU代码 * 10-29/15:02 * 新增ppseg RKNPU2推理代码 * 10-29/15:46 * 新增ppseg RKNPU2 cpp example代码 * 10-29/15:51 * 新增README文档 * 10-29/15:51 * 按照要求修改部分注释以及变量名称 * 10-29/15:51 * 修复重命名之后,cc文件中的部分代码还用旧函数名的bug * 10-29/22:32 * str(Device::NPU)将输出NPU而不是UNKOWN * 修改runtime文件中的注释格式 * 新增Building Summary ENABLE_RKNPU2_BACKEND输出 * pybind新增支持rknpu2 * 新增python编译选项 * 新增PPSeg Python代码 * 新增以及更新各种文档 * 10-30/14:11 * 尝试修复编译cuda时产生的错误 * 10-30/19:27 * 修改CpuName和CoreMask层级 * 修改ppseg rknn推理层级 * 图片将移动到网络进行下载 * 10-30/19:39 * 更新文档 * 10-30/19:39 * 更新文档 * 更新ppseg rknpu2 example中的函数命名方式 * 更新ppseg rknpu2 example为一个cc文件 * 修复disable_normalize_and_permute部分的逻辑错误 * 移除rknpu2初始化时的无用参数 * 10-30/19:39 * 尝试重置python代码 * 10-30/10:16 * rknpu2_config.h文件不再包含rknn_api头文件防止出现导入错误的问题 * 10-31/14:31 * 修改pybind,支持最新的rknpu2 backends * 再次支持ppseg python推理 * 移动cpuname 和 coremask的层级 * 10-31/15:35 * 尝试修复rknpu2导入错误 * 10-31/19:00 * 新增RKNPU2模型导出代码以及其对应的文档 * 更新大量文档错误 * 10-31/19:00 * 现在编译完fastdeploy仓库后无需重新设置RKNN2_TARGET_SOC * 10-31/19:26 * 修改部分错误文档 * 10-31/19:26 * 修复错误删除的部分 * 修复各种错误文档 * 修复FastDeploy.cmake在设置RKNN2_TARGET_SOC错误时,提示错误的信息 * 修复rknpu2_backend.cc中存在的中文注释 * 10-31/20:45 * 删除无用的注释 * 10-31/20:45 * 按照要求修改Device::NPU为Device::RKNPU,硬件将共用valid_hardware_backends * 删除无用注释以及debug代码 * 11-01/09:45 * 更新变量命名方式 * 11-01/10:16 * 修改部分文档,修改函数命名方式 Co-authored-by: Jason <jiangjiajun@baidu.com>
This commit is contained in:
96
fastdeploy/backends/rknpu/rknpu2/rknpu2_backend.h
Normal file
96
fastdeploy/backends/rknpu/rknpu2/rknpu2_backend.h
Normal file
@@ -0,0 +1,96 @@
|
||||
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
|
||||
//
|
||||
// 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.
|
||||
#pragma once
|
||||
|
||||
#include "fastdeploy/backends/backend.h"
|
||||
#include "fastdeploy/core/fd_tensor.h"
|
||||
#include "rknn_api.h" // NOLINT
|
||||
#include "rknpu2_config.h"
|
||||
#include <cstring> // for memset
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace fastdeploy {
|
||||
struct RKNPU2BackendOption {
|
||||
rknpu2::CpuName cpu_name = rknpu2::CpuName::RK3588;
|
||||
|
||||
//The specification of NPU core setting.It has the following choices :
|
||||
// RKNN_NPU_CORE_AUTO : Referring to automatic mode, meaning that it will
|
||||
// select the idle core inside the NPU.
|
||||
// RKNN_NPU_CORE_0 : Running on the NPU0 core
|
||||
// RKNN_NPU_CORE_1: Runing on the NPU1 core
|
||||
// RKNN_NPU_CORE_2: Runing on the NPU2 core
|
||||
// RKNN_NPU_CORE_0_1: Running on both NPU0 and NPU1 core simultaneously.
|
||||
// RKNN_NPU_CORE_0_1_2: Running on both NPU0, NPU1 and NPU2 simultaneously.
|
||||
rknpu2::CoreMask core_mask = rknpu2::CoreMask::RKNN_NPU_CORE_AUTO;
|
||||
};
|
||||
|
||||
class RKNPU2Backend : public BaseBackend {
|
||||
public:
|
||||
RKNPU2Backend() = default;
|
||||
|
||||
virtual ~RKNPU2Backend();
|
||||
|
||||
// RKNN API
|
||||
bool LoadModel(void* model);
|
||||
|
||||
bool GetSDKAndDeviceVersion();
|
||||
|
||||
bool SetCoreMask(rknpu2::CoreMask& core_mask) const;
|
||||
|
||||
bool GetModelInputOutputInfos();
|
||||
|
||||
// BaseBackend API
|
||||
void BuildOption(const RKNPU2BackendOption& option);
|
||||
|
||||
bool InitFromRKNN(const std::string& model_file,
|
||||
const RKNPU2BackendOption& option = RKNPU2BackendOption());
|
||||
|
||||
int NumInputs() const override {
|
||||
return static_cast<int>(inputs_desc_.size());
|
||||
}
|
||||
|
||||
int NumOutputs() const override {
|
||||
return static_cast<int>(outputs_desc_.size());
|
||||
}
|
||||
|
||||
TensorInfo GetInputInfo(int index) override;
|
||||
TensorInfo GetOutputInfo(int index) override;
|
||||
std::vector<TensorInfo> GetInputInfos() override;
|
||||
std::vector<TensorInfo> GetOutputInfos() override;
|
||||
bool Infer(std::vector<FDTensor>& inputs,
|
||||
std::vector<FDTensor>* outputs) override;
|
||||
|
||||
private:
|
||||
// The object of rknn context.
|
||||
rknn_context ctx{};
|
||||
// The structure rknn_sdk_version is used to indicate the version information of the RKNN SDK.
|
||||
rknn_sdk_version sdk_ver{};
|
||||
// The structure rknn_input_output_num represents the number of input and output Tensor
|
||||
rknn_input_output_num io_num{};
|
||||
std::vector<TensorInfo> inputs_desc_;
|
||||
std::vector<TensorInfo> outputs_desc_;
|
||||
|
||||
rknn_tensor_attr* input_attrs = nullptr;
|
||||
rknn_tensor_attr* output_attrs = nullptr;
|
||||
|
||||
RKNPU2BackendOption option_;
|
||||
|
||||
static void DumpTensorAttr(rknn_tensor_attr& attr);
|
||||
static FDDataType RknnTensorTypeToFDDataType(rknn_tensor_type type);
|
||||
static rknn_tensor_type FDDataTypeToRknnTensorType(FDDataType type);
|
||||
};
|
||||
} // namespace fastdeploy
|
Reference in New Issue
Block a user