From d92373302a2d5c9c0e955e1051fb19982260871a Mon Sep 17 00:00:00 2001 From: Alexander Yee Date: Sat, 15 Aug 2026 12:57:15 -0700 Subject: [PATCH] Use a global Ort::Env. --- .../DataLabeling/ML_SegmentAnythingModel.cpp | 6 +-- .../ML/DataLabeling/ML_SegmentAnythingModel.h | 4 +- .../ML/Inference/ML_PaddleOCRPipeline.cpp | 4 +- .../ML/Inference/ML_PaddleOCRPipeline.h | 2 +- .../ML/Models/ML_ONNXRuntimeHelpers.cpp | 16 +++----- .../Source/ML/Models/ML_ONNXRuntimeHelpers.h | 4 +- SerialPrograms/Source/ML/Models/ML_OrtEnv.cpp | 37 +++++++++++++++++++ SerialPrograms/Source/ML/Models/ML_OrtEnv.h | 21 +++++++++++ .../Source/ML/Models/ML_YOLOv5Model.cpp | 11 +++--- .../Source/ML/Models/ML_YOLOv5Model.h | 1 - SerialPrograms/cmake/SourceFiles.cmake | 2 + 11 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 SerialPrograms/Source/ML/Models/ML_OrtEnv.cpp create mode 100644 SerialPrograms/Source/ML/Models/ML_OrtEnv.h diff --git a/SerialPrograms/Source/ML/DataLabeling/ML_SegmentAnythingModel.cpp b/SerialPrograms/Source/ML/DataLabeling/ML_SegmentAnythingModel.cpp index adf48ef508..ede56a84fe 100644 --- a/SerialPrograms/Source/ML/DataLabeling/ML_SegmentAnythingModel.cpp +++ b/SerialPrograms/Source/ML/DataLabeling/ML_SegmentAnythingModel.cpp @@ -27,8 +27,7 @@ namespace ML{ SAMEmbedderSession::SAMEmbedderSession(const std::string& model_path, bool use_gpu) - : m_env{create_ORT_env()} - , session{create_session(m_env, model_path, ML_MODEL_CACHE_PATH() + "SAMEmbedder/", use_gpu)} + : session{create_session(model_path, ML_MODEL_CACHE_PATH() + "SAMEmbedder/", use_gpu)} , memory_info{Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU)} , input_names{session.GetInputNames()} , output_names{session.GetOutputNames()} @@ -67,8 +66,7 @@ void SAMEmbedderSession::run(cv::Mat& input_image, std::vector& model_out SAMSession::SAMSession(const std::string& model_path, bool use_gpu) - : m_env{create_ORT_env()} - , session{create_session(m_env, model_path, ML_MODEL_CACHE_PATH() + "SAM/", use_gpu)} + : session{create_session(model_path, ML_MODEL_CACHE_PATH() + "SAM/", use_gpu)} , memory_info{Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU)} , input_names{session.GetInputNames()} , output_names{session.GetOutputNames()} diff --git a/SerialPrograms/Source/ML/DataLabeling/ML_SegmentAnythingModel.h b/SerialPrograms/Source/ML/DataLabeling/ML_SegmentAnythingModel.h index dccdac3e29..2aff14887c 100644 --- a/SerialPrograms/Source/ML/DataLabeling/ML_SegmentAnythingModel.h +++ b/SerialPrograms/Source/ML/DataLabeling/ML_SegmentAnythingModel.h @@ -38,7 +38,6 @@ class SAMEmbedderSession{ void run(cv::Mat& input_image, std::vector& output_image_embedding); private: - Ort::Env m_env; Ort::Session session; Ort::MemoryInfo memory_info; Ort::RunOptions run_options; @@ -72,7 +71,6 @@ class SAMSession{ const std::vector& input_box, std::vector& output_boolean_mask); private: - Ort::Env m_env; Ort::Session session; Ort::MemoryInfo memory_info; Ort::RunOptions run_options; @@ -102,4 +100,4 @@ class SAMSession{ } } -#endif \ No newline at end of file +#endif diff --git a/SerialPrograms/Source/ML/Inference/ML_PaddleOCRPipeline.cpp b/SerialPrograms/Source/ML/Inference/ML_PaddleOCRPipeline.cpp index 16f83b84bb..f5ed4f9ba8 100644 --- a/SerialPrograms/Source/ML/Inference/ML_PaddleOCRPipeline.cpp +++ b/SerialPrograms/Source/ML/Inference/ML_PaddleOCRPipeline.cpp @@ -58,11 +58,9 @@ PaddleOCRPipeline::PaddleOCRPipeline(Language language) {} PaddleOCRPipeline::PaddleOCRPipeline(Language language, std::string rec_path, std::string dict_path) - : m_env{create_ORT_env()} // , det_session(env, std::wstring(det_path.begin(), det_path.end()).c_str(), Ort::SessionOptions{}) - , m_rec_session( + : m_rec_session( create_session( - m_env, rec_path, ML_MODEL_CACHE_PATH() + "PaddleOCRPipeline/", GlobalSettings::instance().USE_GPU_FOR_ML_INFERENCE0 diff --git a/SerialPrograms/Source/ML/Inference/ML_PaddleOCRPipeline.h b/SerialPrograms/Source/ML/Inference/ML_PaddleOCRPipeline.h index 022408fc8a..f867e561d5 100644 --- a/SerialPrograms/Source/ML/Inference/ML_PaddleOCRPipeline.h +++ b/SerialPrograms/Source/ML/Inference/ML_PaddleOCRPipeline.h @@ -13,6 +13,7 @@ #include #include #include "Common/Cpp/Logging/TaggedLogger.h" +#include "Common/Cpp/Filesystem/FilePath.h" #include "CommonFramework/Language.h" #include "CommonFramework/ImageTypes/ImageViewRGB32.h" #include "CommonFramework/ImageTools/ImageBoxes.h" @@ -37,7 +38,6 @@ class PaddleOCRPipeline{ private: void load_dictionary(const Filesystem::Path& path); - Ort::Env m_env; // Ort::Session det_session; Ort::Session m_rec_session; // Ort::MemoryInfo memory_info; diff --git a/SerialPrograms/Source/ML/Models/ML_ONNXRuntimeHelpers.cpp b/SerialPrograms/Source/ML/Models/ML_ONNXRuntimeHelpers.cpp index 312838cfdc..ab4a85bb38 100644 --- a/SerialPrograms/Source/ML/Models/ML_ONNXRuntimeHelpers.cpp +++ b/SerialPrograms/Source/ML/Models/ML_ONNXRuntimeHelpers.cpp @@ -19,6 +19,7 @@ #include "Common/Cpp/Exceptions.h" #include "Common/Cpp/Filesystem/Filesystem.h" #include "CommonFramework/Logging/Logger.h" +#include "ML_OrtEnv.h" #include "ML_ONNXRuntimeHelpers.h" namespace PokemonAutomation{ @@ -181,7 +182,6 @@ void write_cache_flag_file(const std::string& model_cache_path, const std::strin Ort::Session create_session( - const Ort::Env& env, const std::string& model_path, const std::string& model_cache_path, bool try_gpu @@ -200,7 +200,7 @@ Ort::Session create_session( try{ logger.log("Attempting to create Ort::Session with GPU acceleration..."); Ort::SessionOptions gpu_options = create_session_options(model_cache_path, true); - Ort::Session session{env, onnx_path.c_str(), gpu_options}; + Ort::Session session{global_ort_env(), onnx_path.c_str(), gpu_options}; logger.log("Ort::Session created"); // when Ort::Ssssion is created, if possible, it will create a model cache if (write_flag_file){ @@ -222,7 +222,7 @@ Ort::Session create_session( Ort::SessionOptions cpu_options = create_session_options(model_cache_path, false); - Ort::Session session{env, onnx_path.c_str(), cpu_options}; + Ort::Session session{global_ort_env(), onnx_path.c_str(), cpu_options}; logger.log("Ort::Session created"); return session; } @@ -272,14 +272,8 @@ void print_model_input_output_info(const Ort::Session& session){ } } -Ort::Env create_ORT_env(){ -#if ORT_API_VERSION < 24 // Removed in ONNX Runtime 1.24.0 - if (Ort::Global::api_ == nullptr){ - throw InternalProgramError(nullptr, PA_CURRENT_FUNCTION, "Onnx API returned a null pointer."); - } -#endif - return Ort::Env(); -} + + } } diff --git a/SerialPrograms/Source/ML/Models/ML_ONNXRuntimeHelpers.h b/SerialPrograms/Source/ML/Models/ML_ONNXRuntimeHelpers.h index 31fcab833c..98767eda83 100644 --- a/SerialPrograms/Source/ML/Models/ML_ONNXRuntimeHelpers.h +++ b/SerialPrograms/Source/ML/Models/ML_ONNXRuntimeHelpers.h @@ -31,7 +31,6 @@ Ort::SessionOptions create_session_options(const std::string& model_cache_path, // used in `create_session_options()` to construct the passed-in session options so. // NOTE: it may throw `MLModelSessionCreationError` if failed to create session. Ort::Session create_session( - const Ort::Env& env, const std::string& model_path, const std::string& model_cache_path, bool try_gpu @@ -59,9 +58,8 @@ std::string to_string(std::vector& vec){ // Print model input and output types and shapes to cout. Useful for debugging. void print_model_input_output_info(const Ort::Session& session); -Ort::Env create_ORT_env(); } } -#endif \ No newline at end of file +#endif diff --git a/SerialPrograms/Source/ML/Models/ML_OrtEnv.cpp b/SerialPrograms/Source/ML/Models/ML_OrtEnv.cpp new file mode 100644 index 0000000000..c5474025ed --- /dev/null +++ b/SerialPrograms/Source/ML/Models/ML_OrtEnv.cpp @@ -0,0 +1,37 @@ +/* Global Ort::Env + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#include "Common/Cpp/Exceptions.h" +#include "CommonFramework/Options/Environment/PerformanceOptions.h" +#include "ML_OrtEnv.h" + +namespace PokemonAutomation{ + + + +Ort::ThreadingOptions make_ort_threading_options(){ + Ort::ThreadingOptions ret; + ret.SetGlobalIntraOpNumThreads((int)PerformanceOptions::instance().NORMAL_THREAD_POOL.MAX_THREADS); + return ret; +} + +Ort::Env& global_ort_env(){ +#if ORT_API_VERSION < 24 // Removed in ONNX Runtime 1.24.0 + if (Ort::Global::api_ == nullptr){ + throw InternalProgramError(nullptr, PA_CURRENT_FUNCTION, "Onnx API returned a null pointer."); + } +#endif + static Ort::Env env( + make_ort_threading_options(), + ORT_LOGGING_LEVEL_WARNING, + "Global_ThreadPool_Env" + ); + return env; +} + + + +} diff --git a/SerialPrograms/Source/ML/Models/ML_OrtEnv.h b/SerialPrograms/Source/ML/Models/ML_OrtEnv.h new file mode 100644 index 0000000000..a6e847ee21 --- /dev/null +++ b/SerialPrograms/Source/ML/Models/ML_OrtEnv.h @@ -0,0 +1,21 @@ +/* Global Ort::Env + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#ifndef PokemonAutomation_ML_OrtEnv_H +#define PokemonAutomation_ML_OrtEnv_H + +#include + +namespace PokemonAutomation{ + + +Ort::Env& global_ort_env(); + + + + +} +#endif diff --git a/SerialPrograms/Source/ML/Models/ML_YOLOv5Model.cpp b/SerialPrograms/Source/ML/Models/ML_YOLOv5Model.cpp index 696272b9cb..e40f4b3ce3 100644 --- a/SerialPrograms/Source/ML/Models/ML_YOLOv5Model.cpp +++ b/SerialPrograms/Source/ML/Models/ML_YOLOv5Model.cpp @@ -133,12 +133,11 @@ std::tuple resize_image_with_border( YOLOv5Session::YOLOv5Session(const std::string& model_path, bool use_gpu) -: m_env{create_ORT_env()} -, m_session{create_session(m_env, model_path, ML_MODEL_CACHE_PATH() + "YOLOv5", use_gpu)} -, m_memory_info{Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU)} -, m_input_names{m_session.GetInputNames()} -, m_output_names{m_session.GetOutputNames()} -, m_model_input(3*YOLO5_INPUT_IMAGE_SIZE*YOLO5_INPUT_IMAGE_SIZE) + : m_session{create_session(model_path, ML_MODEL_CACHE_PATH() + "YOLOv5", use_gpu)} + , m_memory_info{Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU)} + , m_input_names{m_session.GetInputNames()} + , m_output_names{m_session.GetOutputNames()} + , m_model_input(3*YOLO5_INPUT_IMAGE_SIZE*YOLO5_INPUT_IMAGE_SIZE) { // Extract YOLO labels from model metadata try{ diff --git a/SerialPrograms/Source/ML/Models/ML_YOLOv5Model.h b/SerialPrograms/Source/ML/Models/ML_YOLOv5Model.h index 165dae04a5..cfa7a065c4 100644 --- a/SerialPrograms/Source/ML/Models/ML_YOLOv5Model.h +++ b/SerialPrograms/Source/ML/Models/ML_YOLOv5Model.h @@ -44,7 +44,6 @@ class YOLOv5Session{ std::vector m_label_names; - Ort::Env m_env; Ort::Session m_session; Ort::MemoryInfo m_memory_info; Ort::RunOptions m_run_options; diff --git a/SerialPrograms/cmake/SourceFiles.cmake b/SerialPrograms/cmake/SourceFiles.cmake index 08fd55abfe..62925d0a7a 100644 --- a/SerialPrograms/cmake/SourceFiles.cmake +++ b/SerialPrograms/cmake/SourceFiles.cmake @@ -1096,6 +1096,8 @@ file(GLOB LIBRARY_SOURCES Source/ML/ML_Panels.h Source/ML/Models/ML_ONNXRuntimeHelpers.cpp Source/ML/Models/ML_ONNXRuntimeHelpers.h + Source/ML/Models/ML_OrtEnv.cpp + Source/ML/Models/ML_OrtEnv.h Source/ML/Models/ML_YOLOv5Model.cpp Source/ML/Models/ML_YOLOv5Model.h Source/ML/Programs/ML_LabelImages.cpp