Skip to content

Commit ac9a7dd

Browse files
committed
loading backend at runtime
1 parent 39936f9 commit ac9a7dd

File tree

3 files changed

+63
-54
lines changed

3 files changed

+63
-54
lines changed

deep_yolo_inference/CMakeLists.txt

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ find_package(message_filters REQUIRED)
3434
find_package(vision_msgs REQUIRED)
3535
find_package(deep_core REQUIRED)
3636
find_package(deep_msgs REQUIRED)
37-
find_package(deep_ort_backend_plugin REQUIRED)
38-
find_package(deep_ort_gpu_backend_plugin REQUIRED)
39-
find_package(onnxruntime_vendor REQUIRED)
40-
find_package(onnxruntime_gpu_vendor REQUIRED)
37+
find_package(pluginlib REQUIRED)
4138
find_package(rcl_interfaces REQUIRED)
4239
find_package(yaml-cpp REQUIRED)
4340
find_package(OpenCV REQUIRED COMPONENTS core imgproc)
@@ -68,19 +65,14 @@ ament_target_dependencies(yolo_inference_lib
6865
vision_msgs
6966
deep_core
7067
deep_msgs
71-
deep_ort_backend_plugin
72-
deep_ort_gpu_backend_plugin
73-
onnxruntime_vendor
74-
onnxruntime_gpu_vendor
68+
pluginlib
7569
rcl_interfaces
7670
)
7771

7872
target_link_libraries(yolo_inference_lib
73+
pluginlib::pluginlib
74+
rclcpp::rclcpp
7975
deep_core::deep_core_lib
80-
deep_ort_backend_plugin::deep_ort_backend_plugin_lib
81-
deep_ort_gpu_backend_plugin::deep_ort_gpu_backend_plugin_lib
82-
onnxruntime_vendor::onnxruntime_lib
83-
onnxruntime_gpu_vendor::onnxruntime_gpu_lib
8476
${OpenCV_LIBRARIES}
8577
yaml-cpp
8678
)
@@ -123,8 +115,6 @@ if(BUILD_TESTING)
123115
target_link_libraries(test_parameters
124116
yolo_inference_lib
125117
deep_core::deep_core_lib
126-
deep_ort_backend_plugin::deep_ort_backend_plugin_lib
127-
deep_ort_gpu_backend_plugin::deep_ort_gpu_backend_plugin_lib
128118
${OpenCV_LIBRARIES}
129119
)
130120
target_include_directories(test_parameters PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
@@ -138,10 +128,7 @@ if(BUILD_TESTING)
138128
vision_msgs
139129
deep_core
140130
deep_msgs
141-
deep_ort_backend_plugin
142-
deep_ort_gpu_backend_plugin
143-
onnxruntime_vendor
144-
onnxruntime_gpu_vendor
131+
pluginlib
145132
rcl_interfaces
146133
)
147134
else()
@@ -153,8 +140,6 @@ if(BUILD_TESTING)
153140
target_link_libraries(test_fallback_selection
154141
yolo_inference_lib
155142
deep_core::deep_core_lib
156-
deep_ort_backend_plugin::deep_ort_backend_plugin_lib
157-
deep_ort_gpu_backend_plugin::deep_ort_gpu_backend_plugin_lib
158143
${OpenCV_LIBRARIES}
159144
yaml-cpp
160145
)
@@ -169,10 +154,7 @@ if(BUILD_TESTING)
169154
vision_msgs
170155
deep_core
171156
deep_msgs
172-
deep_ort_backend_plugin
173-
deep_ort_gpu_backend_plugin
174-
onnxruntime_vendor
175-
onnxruntime_gpu_vendor
157+
pluginlib
176158
rcl_interfaces
177159
)
178160
else()

deep_yolo_inference/include/deep_yolo_inference/backend_manager.hpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
#include <string>
1919
#include <vector>
2020

21+
#include <deep_core/plugin_interfaces/deep_backend_plugin.hpp>
2122
#include <deep_core/types/tensor.hpp>
23+
#include <pluginlib/class_loader.hpp>
2224
#include <rclcpp/rclcpp.hpp>
2325
#include <rclcpp_lifecycle/lifecycle_node.hpp>
2426

@@ -28,7 +30,6 @@ namespace deep_ros
2830
{
2931
class BackendInferenceExecutor;
3032
class BackendMemoryAllocator;
31-
class DeepBackendPlugin;
3233
} // namespace deep_ros
3334

3435
namespace deep_yolo_inference
@@ -38,6 +39,7 @@ class BackendManager
3839
{
3940
public:
4041
BackendManager(rclcpp_lifecycle::LifecycleNode & node, const YoloParams & params);
42+
~BackendManager();
4143

4244
void buildProviderOrder();
4345
bool initialize(size_t start_index = 0);
@@ -76,7 +78,12 @@ class BackendManager
7678
std::string active_provider_{"unknown"};
7779
std::shared_ptr<deep_ros::BackendInferenceExecutor> executor_;
7880
std::shared_ptr<deep_ros::BackendMemoryAllocator> allocator_;
79-
std::shared_ptr<deep_ros::DeepBackendPlugin> plugin_holder_;
81+
// plugin_loader_ must be declared before plugin_holder_ so it's destroyed after
82+
// (members are destroyed in reverse declaration order)
83+
std::unique_ptr<pluginlib::ClassLoader<deep_ros::DeepBackendPlugin>> plugin_loader_;
84+
pluginlib::UniquePtr<deep_ros::DeepBackendPlugin> plugin_holder_;
85+
86+
std::string providerToPluginName(Provider provider) const;
8087
};
8188

8289
} // namespace deep_yolo_inference

deep_yolo_inference/src/backend_manager.cpp

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
#include <utility>
2424

2525
#include <deep_core/plugin_interfaces/deep_backend_plugin.hpp>
26-
#include <deep_ort_backend_plugin/ort_backend_plugin.hpp>
27-
#include <deep_ort_gpu_backend_plugin/ort_gpu_backend_plugin.hpp>
26+
#include <pluginlib/class_loader.hpp>
2827
#include <rcl_interfaces/msg/parameter_descriptor.hpp>
2928

3029
namespace deep_yolo_inference
@@ -33,8 +32,18 @@ namespace deep_yolo_inference
3332
BackendManager::BackendManager(rclcpp_lifecycle::LifecycleNode & node, const YoloParams & params)
3433
: node_(node)
3534
, params_(params)
35+
, plugin_loader_(std::make_unique<pluginlib::ClassLoader<deep_ros::DeepBackendPlugin>>("deep_core", "deep_ros::DeepBackendPlugin"))
3636
{}
3737

38+
BackendManager::~BackendManager()
39+
{
40+
// Reset plugin holder before plugin loader is destroyed
41+
// This ensures proper cleanup order to avoid class_loader warnings
42+
plugin_holder_.reset();
43+
executor_.reset();
44+
allocator_.reset();
45+
}
46+
3847
void BackendManager::buildProviderOrder()
3948
{
4049
auto normalize_pref = params_.preferred_provider;
@@ -121,34 +130,32 @@ bool BackendManager::initializeBackend(size_t start_index)
121130
}
122131

123132
try {
124-
switch (provider) {
125-
case Provider::TENSORRT:
126-
case Provider::CUDA: {
127-
const auto provider_name = providerToString(provider);
128-
auto overrides = std::vector<rclcpp::Parameter>{
129-
rclcpp::Parameter("Backend.device_id", params_.device_id),
130-
rclcpp::Parameter("Backend.execution_provider", provider_name),
131-
rclcpp::Parameter("Backend.trt_engine_cache_enable", params_.enable_trt_engine_cache),
132-
rclcpp::Parameter("Backend.trt_engine_cache_path", params_.trt_engine_cache_path)};
133-
auto backend_node = createBackendConfigNode(provider_name, std::move(overrides));
134-
auto plugin = std::make_shared<deep_ort_gpu_backend::OrtGpuBackendPlugin>();
135-
plugin->initialize(backend_node);
136-
allocator_ = plugin->get_allocator();
137-
executor_ = plugin->get_inference_executor();
138-
plugin_holder_ = plugin;
139-
break;
140-
}
141-
case Provider::CPU: {
142-
auto backend_node = createBackendConfigNode("cpu");
143-
auto plugin = std::make_shared<deep_ort_backend::OrtBackendPlugin>();
144-
plugin->initialize(backend_node);
145-
allocator_ = plugin->get_allocator();
146-
executor_ = plugin->get_inference_executor();
147-
plugin_holder_ = plugin;
148-
break;
149-
}
133+
const std::string plugin_name = providerToPluginName(provider);
134+
if (plugin_name.empty()) {
135+
RCLCPP_WARN(node_.get_logger(), "No plugin name for provider: %s", providerToString(provider).c_str());
136+
continue;
137+
}
138+
139+
// Create backend config node with provider-specific parameters
140+
rclcpp_lifecycle::LifecycleNode::SharedPtr backend_node;
141+
if (provider == Provider::TENSORRT || provider == Provider::CUDA) {
142+
const auto provider_name = providerToString(provider);
143+
auto overrides = std::vector<rclcpp::Parameter>{
144+
rclcpp::Parameter("Backend.device_id", params_.device_id),
145+
rclcpp::Parameter("Backend.execution_provider", provider_name),
146+
rclcpp::Parameter("Backend.trt_engine_cache_enable", params_.enable_trt_engine_cache),
147+
rclcpp::Parameter("Backend.trt_engine_cache_path", params_.trt_engine_cache_path)};
148+
backend_node = createBackendConfigNode(provider_name, std::move(overrides));
149+
} else {
150+
backend_node = createBackendConfigNode("cpu");
150151
}
151152

153+
// Load plugin using pluginlib
154+
plugin_holder_ = plugin_loader_->createUniqueInstance(plugin_name);
155+
plugin_holder_->initialize(backend_node);
156+
allocator_ = plugin_holder_->get_allocator();
157+
executor_ = plugin_holder_->get_inference_executor();
158+
152159
if (!executor_ || !allocator_) {
153160
throw std::runtime_error("Executor or allocator is null");
154161
}
@@ -281,4 +288,17 @@ deep_ros::Tensor BackendManager::buildInputTensor(const PackedInput & packed) co
281288
return tensor;
282289
}
283290

291+
std::string BackendManager::providerToPluginName(Provider provider) const
292+
{
293+
switch (provider) {
294+
case Provider::TENSORRT:
295+
case Provider::CUDA:
296+
return "onnxruntime_gpu";
297+
case Provider::CPU:
298+
return "onnxruntime_cpu";
299+
default:
300+
return "";
301+
}
302+
}
303+
284304
} // namespace deep_yolo_inference

0 commit comments

Comments
 (0)