From 54baee9b300fb9708fed385a05c3e179a77fe759 Mon Sep 17 00:00:00 2001 From: Youxin Chen Date: Tue, 8 Apr 2025 10:45:47 +0800 Subject: [PATCH 1/2] [tools/onnx-subgraph] add config file parser for target device add config file parser for target device with json ONE-DCO-1.0-Signed-off-by: Youxin Chen --- tools/onnx_subgraph/include/device.h | 96 ++++++++++++++++++++++++++ tools/onnx_subgraph/src/lib/device.cpp | 25 +++++++ tools/onnx_subgraph/src/main.cpp | 6 ++ 3 files changed, 127 insertions(+) create mode 100644 tools/onnx_subgraph/include/device.h create mode 100644 tools/onnx_subgraph/src/lib/device.cpp diff --git a/tools/onnx_subgraph/include/device.h b/tools/onnx_subgraph/include/device.h new file mode 100644 index 00000000000..761a67c608a --- /dev/null +++ b/tools/onnx_subgraph/include/device.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd. 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. + */ + +#ifndef DEVICE_H +#define DEVICE_H + +#include +#include +#include +#include +#include +#include "onnx.pb.h" +#include "graph.h" +enum class DeviceType +{ + Target_NPU +}; + +class Device +{ +private: + std::string onnxFile; + +public: + Device(/* args */) + { + NPUPreferOp = {}; + CPUSupportOp = {}; + NPUSupportOp = {}; + max_subgraph_size = 0; + } + + std::vector NPUPreferOp; + std::vector CPUSupportOp; + std::vector NPUSupportOp; + float max_subgraph_size; + + DeviceType getType() { return DeviceType::Target_NPU; } + std::vector getNPUSupportOp() { return NPUSupportOp; } + std::vector getCPUSupportOp() { return CPUSupportOp; } + std::vector getNPUPreferOp() { return NPUPreferOp; } + + /** + * @brief Generate cut instructions for subgraphs based on the given device type. + * + * @param [in] Subgraphs A reference to a vector of ONNX GraphProto objects representing + * subgraphs. + * @param [in] device A string indicating the device type (e.g., "npu" or "c920"). + * @param [in] subgraphs_inputs A reference to a vector of unordered sets containing input + * information for subgraphs. + * @param [in] subgraphs_outputs A reference to a vector of unordered sets containing output + * information for subgraphs. + * + * @pre The function assumes that the `Subgraphs`, `subgraphs_inputs`, and + * `subgraphs_outputs` vectors are properly initialized and have the same size. + * @post A file named ` CutInstruction.txt` is created or overwritten with the + * generated cut instructions. + * @exception If the output file cannot be opened, an error message is printed, and the program + * exits. + * + * @return None + */ + void GenerateCutInstruction(std::vector &Subgraphs, std::string device, + std::vector> &subgraphs_inputs, + std::vector> &subgraphs_outputs); + + /** + * @brief Reads and parses a JSON file containing device information. + * + * This function reads a JSON file from the specified path, parses it, and extracts relevant + * device information. It updates global variables with hardware limits, preferred NPU operations, + * and supported operations for both NPU and CPU. + * + * @param json_path The file path to the JSON file containing device information. + */ + void GetDeviceJson(std::string json_path); + + void updateOnnxFile(std::string &path) { onnxFile = path; } + + std::string getOnnxFile() { return onnxFile; } +}; + +#endif diff --git a/tools/onnx_subgraph/src/lib/device.cpp b/tools/onnx_subgraph/src/lib/device.cpp new file mode 100644 index 00000000000..718bc146097 --- /dev/null +++ b/tools/onnx_subgraph/src/lib/device.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd. 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. + */ +#include "device.h" + +void Device::GetDeviceJson(std::string json_path) { return; } + +void Device::GenerateCutInstruction(std::vector &Subgraphs, std::string device, + std::vector> &subgraphs_inputs, + std::vector> &subgraphs_outputs) +{ + return; +} diff --git a/tools/onnx_subgraph/src/main.cpp b/tools/onnx_subgraph/src/main.cpp index eada2341716..1d41d9d72b7 100644 --- a/tools/onnx_subgraph/src/main.cpp +++ b/tools/onnx_subgraph/src/main.cpp @@ -15,6 +15,7 @@ */ #include "graph.h" +#include "device.h" namespace fs = std::filesystem; @@ -74,5 +75,10 @@ int main(int argc, char *argv[]) } auto g = GetGraphFromOnnx(onnxFile); + + Device target; + target.updateOnnxFile(onnxFile); + target.GetDeviceJson(confFile); + return 0; } From 1637d2d50b5b365ce0c17ffdd256f423b441a9bd Mon Sep 17 00:00:00 2001 From: Youxin Chen Date: Wed, 9 Apr 2025 17:21:42 +0800 Subject: [PATCH 2/2] update as code review comment --- tools/onnx_subgraph/include/device.h | 33 +++++++++++++------------- tools/onnx_subgraph/src/lib/device.cpp | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/tools/onnx_subgraph/include/device.h b/tools/onnx_subgraph/include/device.h index 761a67c608a..0e94855e303 100644 --- a/tools/onnx_subgraph/include/device.h +++ b/tools/onnx_subgraph/include/device.h @@ -24,6 +24,7 @@ #include #include "onnx.pb.h" #include "graph.h" + enum class DeviceType { Target_NPU @@ -32,26 +33,26 @@ enum class DeviceType class Device { private: - std::string onnxFile; + std::string _onnxFile; public: Device(/* args */) { - NPUPreferOp = {}; - CPUSupportOp = {}; - NPUSupportOp = {}; - max_subgraph_size = 0; + _NPUPreferOp = {}; + _CPUSupportOp = {}; + _NPUSupportOp = {}; + _max_subgraph_size = 0; } - std::vector NPUPreferOp; - std::vector CPUSupportOp; - std::vector NPUSupportOp; - float max_subgraph_size; + std::vector _NPUPreferOp; + std::vector _CPUSupportOp; + std::vector _NPUSupportOp; + float _max_subgraph_size; DeviceType getType() { return DeviceType::Target_NPU; } - std::vector getNPUSupportOp() { return NPUSupportOp; } - std::vector getCPUSupportOp() { return CPUSupportOp; } - std::vector getNPUPreferOp() { return NPUPreferOp; } + std::vector getNPUSupportOp() { return _NPUSupportOp; } + std::vector getCPUSupportOp() { return _CPUSupportOp; } + std::vector getNPUPreferOp() { return _NPUPreferOp; } /** * @brief Generate cut instructions for subgraphs based on the given device type. @@ -86,11 +87,11 @@ class Device * * @param json_path The file path to the JSON file containing device information. */ - void GetDeviceJson(std::string json_path); + void GetDeviceJson(const std::string &json_path); - void updateOnnxFile(std::string &path) { onnxFile = path; } + void updateOnnxFile(std::string &path) { _onnxFile = path; } - std::string getOnnxFile() { return onnxFile; } + std::string getOnnxFile() { return _onnxFile; } }; -#endif +#endif // DEVICE_H diff --git a/tools/onnx_subgraph/src/lib/device.cpp b/tools/onnx_subgraph/src/lib/device.cpp index 718bc146097..d0f6b5da1a8 100644 --- a/tools/onnx_subgraph/src/lib/device.cpp +++ b/tools/onnx_subgraph/src/lib/device.cpp @@ -15,7 +15,7 @@ */ #include "device.h" -void Device::GetDeviceJson(std::string json_path) { return; } +void Device::GetDeviceJson(const std::string &json_path) { return; } void Device::GenerateCutInstruction(std::vector &Subgraphs, std::string device, std::vector> &subgraphs_inputs,