Enable MapAllocator in IR Frontend (#12673)
* Enable MapAllocator in IR Frontend * Fix `ov_infer_request_ppp` test With `mmap()`ing of IR, .bin can't be deleted until unmapping. And it shows that there was a leak in test * Add comment to Win `CreateFile()` regarding FILE_SHARE_DELETE * Unmap .bin file before IR files deletion Wait ov::Model deletion to trigger .bin file unmapping before IR files deletion * ClangFormat * Add `use_map_allocator` switch in FE In case of direct use of FE (e.g. via MO), `mmap()` is OFF. But in case of use FE via Core, `mmap()` is ON.
This commit is contained in:
1 parent
796bd98913
commit
40cc006bae
10 files changed
+115
-67
No files matched your search
@@ -61,10 +61,12 @@ size_t get_ir_version(std::istream& model) {
|
||||
} // namespace
|
||||
|
||||
bool FrontEnd::supported_impl(const std::vector<ov::Any>& variants) const {
|
||||
// Last boolean flag in `variants` (if presented) is reserved for FE configuration
|
||||
size_t extra_variants_num = variants.size() > 0 && variants[variants.size() - 1].is<bool>() ? 1 : 0;
|
||||
std::ifstream local_model_stream;
|
||||
std::istream* provided_model_stream = nullptr;
|
||||
|
||||
if (variants.empty() || variants.size() > 3) {
|
||||
if (variants.empty() || variants.size() > 3 + extra_variants_num) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -181,6 +183,8 @@ InputModel::Ptr FrontEnd::load_impl(const std::vector<ov::Any>& variants) const
|
||||
weights = variant.as<std::shared_ptr<ngraph::runtime::AlignedBuffer>>();
|
||||
}
|
||||
}
|
||||
bool use_map_allocator =
|
||||
variants[variants.size() - 1].is<bool>() ? variants[variants.size() - 1].as<bool>() : false;
|
||||
|
||||
// Find weights if only path to xml was provided
|
||||
if (weights_path.empty()) {
|
||||
@@ -198,27 +202,31 @@ InputModel::Ptr FrontEnd::load_impl(const std::vector<ov::Any>& variants) const
|
||||
}
|
||||
}
|
||||
if (!weights_path.empty()) {
|
||||
std::ifstream bin_stream;
|
||||
bin_stream.open(weights_path, std::ios::binary);
|
||||
if (!bin_stream.is_open())
|
||||
if (use_map_allocator)
|
||||
weights = ov::load_mmap_object(weights_path);
|
||||
else {
|
||||
std::ifstream bin_stream;
|
||||
bin_stream.open(weights_path, std::ios::binary);
|
||||
if (!bin_stream.is_open())
|
||||
#if defined(OPENVINO_ENABLE_UNICODE_PATH_SUPPORT) && defined(_WIN32)
|
||||
IE_THROW() << "Weights file " + ov::util::wstring_to_string(weights_path) + " cannot be opened!";
|
||||
IE_THROW() << "Weights file " + ov::util::wstring_to_string(weights_path) + " cannot be opened!";
|
||||
#else
|
||||
IE_THROW() << "Weights file " + weights_path + " cannot be opened!";
|
||||
IE_THROW() << "Weights file " + weights_path + " cannot be opened!";
|
||||
#endif
|
||||
|
||||
bin_stream.seekg(0, std::ios::end);
|
||||
size_t file_size = bin_stream.tellg();
|
||||
bin_stream.seekg(0, std::ios::beg);
|
||||
bin_stream.seekg(0, std::ios::end);
|
||||
size_t file_size = bin_stream.tellg();
|
||||
bin_stream.seekg(0, std::ios::beg);
|
||||
|
||||
auto aligned_weights_buffer = std::make_shared<ngraph::runtime::AlignedBuffer>(file_size);
|
||||
bin_stream.read(aligned_weights_buffer->get_ptr<char>(), aligned_weights_buffer->size());
|
||||
bin_stream.close();
|
||||
auto aligned_weights_buffer = std::make_shared<ngraph::runtime::AlignedBuffer>(file_size);
|
||||
bin_stream.read(aligned_weights_buffer->get_ptr<char>(), aligned_weights_buffer->size());
|
||||
bin_stream.close();
|
||||
|
||||
weights = std::make_shared<ngraph::runtime::SharedBuffer<std::shared_ptr<ngraph::runtime::AlignedBuffer>>>(
|
||||
aligned_weights_buffer->get_ptr<char>(),
|
||||
aligned_weights_buffer->size(),
|
||||
aligned_weights_buffer);
|
||||
weights = std::make_shared<ngraph::runtime::SharedBuffer<std::shared_ptr<ngraph::runtime::AlignedBuffer>>>(
|
||||
aligned_weights_buffer->get_ptr<char>(),
|
||||
aligned_weights_buffer->size(),
|
||||
aligned_weights_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
return create_input_model();
|
||||
|
||||
@@ -58,12 +58,16 @@ public:
|
||||
}
|
||||
|
||||
void set(const std::string& path) {
|
||||
// Note that file can't be changed (renamed/deleted) until it's unmapped. FILE_SHARE_DELETE flag allow
|
||||
// rename/deletion, but it doesn't work with FAT32 filesystem (works on NTFS)
|
||||
auto h = ::CreateFileA(path.c_str(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
map(path, h);
|
||||
}
|
||||
|
||||
#ifdef OPENVINO_ENABLE_UNICODE_PATH_SUPPORT
|
||||
void set(const std::wstring& path) {
|
||||
// Note that file can't be changed (renamed/deleted) until it's unmapped. FILE_SHARE_DELETE flag allow
|
||||
// rename/deletion, but it doesn't work with FAT32 filesystem (works on NTFS)
|
||||
auto h = ::CreateFileW(path.c_str(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
map(ov::util::wstring_to_string(path), h);
|
||||
}
|
||||
|
||||
@@ -350,8 +350,10 @@ void FrontEnd::fuse_fakequantize_ops(const std::vector<std::shared_ptr<Model>>&
|
||||
}
|
||||
|
||||
bool FrontEnd::supported_impl(const std::vector<ov::Any>& variants) const {
|
||||
// Last boolean flag in `variants` (if presented) is reserved for FE configuration
|
||||
size_t extra_variants_num = variants.size() > 0 && variants[variants.size() - 1].is<bool>() ? 1 : 0;
|
||||
// FrontEnd can only load model specified by one path, one file or two files.
|
||||
if (variants.empty() || variants.size() > 2)
|
||||
if (variants.empty() || variants.size() > 2 + extra_variants_num)
|
||||
return false;
|
||||
|
||||
// Validating first path, it must contain a model
|
||||
@@ -389,7 +391,9 @@ bool FrontEnd::supported_impl(const std::vector<ov::Any>& variants) const {
|
||||
}
|
||||
|
||||
InputModel::Ptr FrontEnd::load_impl(const std::vector<ov::Any>& variants) const {
|
||||
if (variants.size() == 1) {
|
||||
// Last boolean flag in `variants` (if presented) is reserved for FE configuration
|
||||
size_t extra_variants_num = variants.size() > 0 && variants[variants.size() - 1].is<bool>() ? 1 : 0;
|
||||
if (variants.size() == 1 + extra_variants_num) {
|
||||
// The case when folder with __model__ and weight files is provided or .pdmodel file
|
||||
if (variants[0].is<std::string>()) {
|
||||
std::string m_path = variants[0].as<std::string>();
|
||||
@@ -407,7 +411,7 @@ InputModel::Ptr FrontEnd::load_impl(const std::vector<ov::Any>& variants) const
|
||||
auto p_model_stream = variants[0].as<std::istream*>();
|
||||
return std::make_shared<InputModel>(std::vector<std::istream*>{p_model_stream}, m_telemetry);
|
||||
}
|
||||
} else if (variants.size() == 2) {
|
||||
} else if (variants.size() == 2 + extra_variants_num) {
|
||||
// The case when .pdmodel and .pdparams files are provided
|
||||
std::ifstream model_stream;
|
||||
std::ifstream weights_stream;
|
||||
|
||||
@@ -141,15 +141,19 @@ void FrontEnd::add_extension(const std::shared_ptr<ov::Extension>& extension) {
|
||||
}
|
||||
|
||||
bool FrontEnd::supported_impl(const std::vector<ov::Any>& variants) const {
|
||||
// Last boolean flag in `variants` (if presented) is reserved for FE configuration
|
||||
size_t extra_variants_num = variants.size() > 0 && variants[variants.size() - 1].is<bool>() ? 1 : 0;
|
||||
// Currently PyTorch FrontEnd only support TorchDecoder as input
|
||||
if (variants.size() != 1 || !variants[0].is<std::shared_ptr<IDecoder>>())
|
||||
if (variants.size() != 1 + extra_variants_num || !variants[0].is<std::shared_ptr<IDecoder>>())
|
||||
return false;
|
||||
auto decoder = variants[0].as<std::shared_ptr<IDecoder>>();
|
||||
return decoder && std::dynamic_pointer_cast<TorchDecoder>(decoder);
|
||||
}
|
||||
|
||||
ov::frontend::InputModel::Ptr FrontEnd::load_impl(const std::vector<ov::Any>& variants) const {
|
||||
FRONT_END_GENERAL_CHECK(variants.size() == 1,
|
||||
// Last boolean flag in `variants` (if presented) is reserved for FE configuration
|
||||
size_t extra_variants_num = variants.size() > 0 && variants[variants.size() - 1].is<bool>() ? 1 : 0;
|
||||
FRONT_END_GENERAL_CHECK(variants.size() == 1 + extra_variants_num,
|
||||
"PyTorch Frontend supports exactly one parameter in model representation, got ",
|
||||
std::to_string(variants.size()),
|
||||
" instead.");
|
||||
|
||||
@@ -77,8 +77,10 @@ FrontEnd::FrontEnd() : m_op_translators(tensorflow::op::get_supported_ops()) {}
|
||||
|
||||
/// \brief Check if FrontEndTensorflow can recognize model from given parts
|
||||
bool FrontEnd::supported_impl(const std::vector<ov::Any>& variants) const {
|
||||
// Last boolean flag in `variants` (if presented) is reserved for FE configuration
|
||||
size_t extra_variants_num = variants.size() > 0 && variants[variants.size() - 1].is<bool>() ? 1 : 0;
|
||||
// TODO: Support other TensorFlow formats: SavedModel, .meta, checkpoint, pbtxt
|
||||
if (variants.size() != 1)
|
||||
if (variants.size() != 1 + extra_variants_num)
|
||||
return false;
|
||||
|
||||
if (variants[0].is<std::string>()) {
|
||||
@@ -115,7 +117,10 @@ bool FrontEnd::supported_impl(const std::vector<ov::Any>& variants) const {
|
||||
|
||||
ov::frontend::InputModel::Ptr FrontEnd::load_impl(const std::vector<ov::Any>& variants) const {
|
||||
// TODO: Support other TensorFlow formats: SavedModel, .meta, checkpoint, pbtxt
|
||||
FRONT_END_GENERAL_CHECK(variants.size() == 1,
|
||||
|
||||
// Last boolean flag in `variants` (if presented) is reserved for FE configuration
|
||||
size_t extra_variants_num = variants.size() > 0 && variants[variants.size() - 1].is<bool>() ? 1 : 0;
|
||||
FRONT_END_GENERAL_CHECK(variants.size() == 1 + extra_variants_num,
|
||||
"[TensorFlow Frontend] Internal error or inconsistent input model: the frontend supports "
|
||||
"only frozen binary protobuf format.");
|
||||
|
||||
|
||||
@@ -48,7 +48,9 @@ FrontEnd::FrontEnd() {
|
||||
|
||||
/// \brief Check if FrontEndTensorflowLite can recognize model from given parts
|
||||
bool FrontEnd::supported_impl(const std::vector<ov::Any>& variants) const {
|
||||
if (variants.size() != 1)
|
||||
// Last boolean flag in `variants` (if presented) is reserved for FE configuration
|
||||
size_t extra_variants_num = variants.size() > 0 && variants[variants.size() - 1].is<bool>() ? 1 : 0;
|
||||
if (variants.size() != 1 + extra_variants_num)
|
||||
return false;
|
||||
|
||||
if (variants[0].is<std::string>()) {
|
||||
@@ -71,7 +73,9 @@ bool FrontEnd::supported_impl(const std::vector<ov::Any>& variants) const {
|
||||
}
|
||||
|
||||
ov::frontend::InputModel::Ptr FrontEnd::load_impl(const std::vector<ov::Any>& variants) const {
|
||||
if (variants.size() == 1) {
|
||||
// Last boolean flag in `variants` (if presented) is reserved for FE configuration
|
||||
size_t extra_variants_num = variants.size() > 0 && variants[variants.size() - 1].is<bool>() ? 1 : 0;
|
||||
if (variants.size() == 1 + extra_variants_num) {
|
||||
if (variants[0].is<std::string>()) {
|
||||
std::string suffix = ".tflite";
|
||||
std::string model_path = variants[0].as<std::string>();
|
||||
|
||||
Reference in new issue
Block a user