使用 OpenVINO™ 条件编译功能,压缩 Windows 应用体积

点击蓝字

关注我们,让开发变得更有趣

作者 | 杨亦诚 英特尔 AI 软件工程师

排版 | 吴紫琴

OpenVINO™

在 OpenVINO™ 编译过程中,我们可以根据应用对于硬件平台的需求,关闭或开指定推理后端的编译,以达到简化 OpenVINO™ 运行库的目的,例如 cmake -DENABLE_INTEL_GPU=OFF 便可以取消 GPU plugin 库的编译。除此以外 OpenVINO™ 还提供了条件编译功能,用于针对特定模型进行运行库压缩,接下来就让我们一起来看下如何在 Windows 操作系统上实现这一功能。

OpenVINO™

环境安装与配置

第一步,我们需要确保已经在 Windows 上安装了 Visual Studio 编译环境。如果是第一次安装 Visual Studio 可以通过以下链接下载。

https://visualstudio.microsoft.com/

在安装组件过程中,选择“使用C++的桌面开发”。

28179248ef3ed05e7264562197535b02.png

图:Visual Studio 安装示例

安装完毕后建议使用 Visual Studio 自带的命令行工具“x64 Native Tools Command Prompt”对编译环境进行初始化。

c975ee1485644c02c76b73a72a7bb6c7.png

图:搜索“x64 Native Tools Command Prompt”

OpenVINO™

预编译

在完成编译环境初始化后,会看到以下提醒。接下来我们就可以在该命令行终端上输入编译指令了。

e3ad7e7adc9a122a038c30bb57368dd5.png

图:编译环境初始化成功

在这一步中,我们需要先利用 Ninja 编译工具对 OpenVINO™ 运行库进行预编译,并使用 itt 组件来收集模型运行过程中的依赖数据。可以通过 cmake -DENABLE_PROFILING_ITT=ON -DSELECTIVE_BUILD=COLLECT ..  指令开启这一功能的编译。以下是完整命令参考:

git clone https://github.com/openvinotoolkit/openvino.git
set OPENVINO_HOME=D:\work_path\openvino
cd %OPENVINO_HOME%
git submodule update --init --recursive
md build_cc
cd build_cc
cmake -G Ninja -Wno-dev -DCMAKE_BUILD_TYPE=Debug -DENABLE_CPPLINT=OFF -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_COMPILE_WARNING_AS_ERROR=OFF -DENABLE_FASTER_BUILD=ON -DENABLE_SANITIZER=OFF -DTHREADING=TBB -DBUILD_SHARED_LIBS=OFF -DENABLE_PROFILING_ITT=ON -DSELECTIVE_BUILD=COLLECT -DENABLE_INTEL_GPU=OFF -DENABLE_MULTI=OFF -DENABLE_AUTO=OFF -DENABLE_AUTO_BATCH=OFF -DENABLE_HETERO=OFF -DENABLE_TEMPLATE=OFF -DENABLE_OV_ONNX_FRONTEND=OFF -DENABLE_OV_PADDLE_FRONTEND=OFF -DENABLE_OV_PYTORCH_FRONTEND=OFF -DENABLE_OV_JAX_FRONTEND=OFF -DENABLE_OV_TF_FRONTEND=OFF -DCMAKE_INSTALL_PREFIX=install -DENABLE_PYTHON=OFF ..
cmake --build . --config Debug

OpenVINO™

数据收集

完成预编译后,我们需要针对特定模型,利用 itt 工具收集 OpenVINO™ 运行库在运行指定模型所需的依赖模块。

cd %OPENVINO_HOME%\build_cc
cmake --build . --config Debug --target sea_itt_lib
cd %OPENVINO_HOME%
set PATH=%PATH%;%OPENVINO_HOME%\\temp\tbb\bin
mkdir cc_data
cd %OPENVINO_HOME%\cc_data
python3 ..\thirdparty\itt_collector\runtool\sea_runtool.py --bindir ..\bin\intel64\Debug -o %OPENVINO_HOME%\cc_data\data ! ..\bin\intel64\Debug\benchmark_app.exe -niter 1 -nireq 1 -m <your_model.xml> -d NPU

可以看到在以上命令中,我们将 benchmark app 所采集到的模型运行数据保存在 cc_data 目录下,接下来就需要基于该数据来压缩 OpenVINO™ 运行库的体积。

f419e544aaaf71914d90b0b69a3fa3a8.png

图:OpenVINO™ 运行依赖数据

OpenVINO™

运行库编译

使用 cmake -DSELECTIVE_BUILD=ON -DSELECTIVE_BUILD_STAT=%OPENVINO_HOME%\cc_data\*.cs 指令,我们可以利用上一步所采集的依赖数据,在正式编译过程中删除一些不必要的依赖组件或是函数,以达到针对指定模型优化运行库容量的目的。以下是完整的参考指令:

cd %OPENVINO_HOME%
md build
cd build
cmake -G "Visual Studio 16 2019" -A x64 -DENABLE_CPPLINT=OFF -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_COMPILE_WARNING_AS_ERROR=OFF -DCMAKE_BUILD_TYPE=Release -DENABLE_FASTER_BUILD=ON -DENABLE_PROFILING_ITT=OFF -DSELECTIVE_BUILD=ON -DENABLE_INTEL_GPU=OFF -DENABLE_MULTI=OFF -DENABLE_AUTO=OFF -DENABLE_AUTO_BATCH=OFF -DENABLE_HETERO=OFF -DENABLE_TEMPLATE=OFF -DENABLE_OV_ONNX_FRONTEND=OFF -DENABLE_OV_PADDLE_FRONTEND=OFF -DENABLE_OV_PYTORCH_FRONTEND=OFF -DENABLE_OV_JAX_FRONTEND=OFF -DENABLE_OV_TF_FRONTEND=OFF -DSELECTIVE_BUILD_STAT=%OPENVINO_HOME%\cc_data\*.csv -DBUILD_SHARED_LIBS=OFF -DENABLE_LTO=ON -DENABLE_ONEDNN_FOR_GPU=OFF -DENABLE_OV_TF_LITE_FRONTEND=OFF -DENABLE_PROFILING_FIRST_INFERENCE=OFF ..
cmake --build . --config Release

这里我们比较开启条件编译功能关闭条件编译功能后,OpenVINO™ 运行库的大小。

237ff12f6d8d4ef1277078f765a3b570.png

8cd2b54368236cbd1138941df1a8f33a.png

图:条件编译前后对比

可以看到在只编译 NPU plugin 以及 samples 示例的情况下,OpenVINO™ 被压缩了6MB左右的空间,其中 openvino.dll 动态库为主要压缩对象。当然针对不同模型的压缩效果也是不同的,以上数据仅为参考。

5b8fc5920424b30edfa74d653fb66db1.png

图:openvino.dll 压缩效果

OpenVINO™

小结

使用条件编译功能可以最大限度压缩 OpenVINO™ 运行库的体积,帮助应用瘦身,从而减少应用软件在发行时由容量问题带来的网络和磁盘压力。关于 OpenVINO™ 条件编译功能更详细的使用方法可以参考:

https://docs.openvino.ai/2024/openvino-workflow/deployment-locally/optimial-binary-size-conditional-compilation.html

OpenVINO™

---------------------------------------

*OpenVINO and the OpenVINO logo are trademarks of Intel Corporation or its subsidiaries.

-----------------------------

 OpenVINO 中文社区 

微信号 : openvinodev

B站:OpenVINO中文社区

“开放、开源、共创”

致力于通过定期举办线上与线下的沙龙、动手实践及开发者交流大会等活动,促进人工智能开发者之间的交流学习。

○ 点击 “ 在看 ”,让更多人看见

<think>好的,我现在需要回答用户关于如何使用OpenVINO的convert_model功能进行模型转换的问题。首先,我得确认用户的具体需求。他们提到了convert_model的使用方法、示例教程和文档,所以需要涵盖这些方面。 首先,我应该回忆一下OpenVINO的convert_model工具的基本功能。convert_model主要用于将PyTorch、TensorFlow等框架的模型转换为OpenVINO的中间表示(IR)格式,即.xml和.bin文件。这个步骤是模型部署前的关键步骤,确保模型可以在OpenVINO支持的硬件上高效运行。 接下来,我需要整理使用convert_model的具体步骤。可能包括安装OpenVINO开发工具、准备源模型、运行转换命令等。需要注意的是,不同框架的模型转换可能有不同的参数和注意事项,比如PyTorch模型可能需要导出为ONNX格式,然后再转换为IR,或者直接使用convert_model处理。需要查证最新的文档,确保步骤正确。 然后,示例部分很重要。用户可能需要看到实际的代码示例,比如如何转换TensorFlow模型或PyTorch模型。需要提供具体的代码片段,并解释每个参数的作用。例如,TensorFlow模型转换可能需要指定输入形状,而PyTorch模型可能需要先转换为ONNX。 关于文档部分,应该提供官方文档的链接,并简要说明文档中的关键部分,比如参数说明、支持的框架、常见问题等。同时,提醒用户注意版本兼容性,不同版本的OpenVINO可能有不同的要求。 可能还需要提到转换后的模型如何加载和推理,引用用户提供的参考内容中的compile_model例子,这样用户可以看到完整的流程:转换后的模型用compile_model编译,然后进行推理。例如,引用中的[^1]和[^2]提到了编译模型和加载模型的步骤,可以结合起来说明整个流程。 此外,常见问题也需要涵盖,比如模型不支持时的解决方法,或者如何自定义输入形状。这些能帮助用户避免常见的陷阱,提升使用体验。 最后,生成的相关问题需要与convert_model相关,比如优化转换后的模型性能、处理转换中的错误、比较不同转换工具等。这些问题应该能够引导用户进一步探索OpenVINO的其他功能。 现在需要检查所有步骤是否准确,特别是转换命令的参数和示例是否正确。比如,确保使用最新的OpenVINO版本中的方法,因为工具可能会有更新。例如,在较新的版本中,convert_model可能直接支持某些框架,而不需要先转换到ONNX。需要确认这一点,避免提供过时的信息。 总结回答的结构:首先介绍convert_model的作用,然后分步骤说明安装、转换命令、示例(TensorFlow和PyTorch),接着提到文档和常见问题,最后相关问题和引用。确保使用正确的中文术语,并且所有数学表达式或代码格式符合要求,比如行内代码用$...$,独立代码块用```python等。</think>### 如何使用OpenVINO的`convert_model`进行模型转换? OpenVINO的`convert_model`工具用于将训练好的模型从原生框架格式(如TensorFlow、PyTorch)转换为OpenVINO的中间表示(Intermediate Representation, IR)格式(`.xml`和`.bin`),以便在OpenVINO支持的硬件上高效推理[^1]。 --- #### **步骤详解** 1. **安装OpenVINO开发工具** 确保已安装`openvino-dev`包,包含模型转换工具: ```bash pip install openvino-dev ``` 2. **准备源模型** - **TensorFlow模型**:需保存为SavedModel或冻结图格式(`.pb`)。 - **PyTorch模型**:需导出为ONNX格式(推荐)或使用`torch.jit.trace`脚本化。 3. **运行`convert_model`命令** 通过命令行或Python API调用工具: ```bash # 示例:将TensorFlow模型转换为IR ovc path/to/saved_model --output_dir ./ir_model --input_shape [1,224,224,3] ``` ```python # Python API示例(需安装openvino-dev) from openvino.tools import mo mo.convert_model( input_model="path/to/model.onnx", output_dir="./ir_model", input_shape=[1,3,224,224] ) ``` --- #### **示例教程** 1. **转换TensorFlow模型** ```python # 转换SavedModel格式的TensorFlow模型 from openvino.tools import mo ov_model = mo.convert_model( input_model="model/saved_model", input_shape=[1, 256, 256, 3], # 输入形状 compress_to_fp16=True # 启用FP16量化 ) ``` 2. **转换PyTorch模型(通过ONNX)** ```python import torch from openvino.tools import mo # 导出PyTorch模型为ONNX dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, "model.onnx") # 转换ONNX为IR ov_model = mo.convert_model("model.onnx") ``` --- #### **关键参数说明** | 参数 | 说明 | |------|------| | `--input_model` | 源模型路径(支持TensorFlow、PyTorch、ONNX等) | | `--output_dir` | IR模型输出目录 | | `--input_shape` | 定义输入张量形状(如`[1,3,224,224]`) | | `--compress_to_fp16` | 将模型权重压缩为FP16格式以减小体积 | --- #### **文档与常见问题** - **官方文档**:[Model Conversion Guide](https://docs.openvino.ai/latest/openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html) - **常见问题**: - **Q**: 模型转换失败如何解决? **A**: 检查框架版本是否兼容,或尝试通过ONNX中转。 - **Q**: 如何自定义输入名称? **A**: 使用`--input`参数指定(如`--input "input_1[1,3,224,224]"`)。 --- #### **转换后模型的使用** 转换后的IR模型可通过`core.compile_model`加载并推理: ```python from openvino.runtime import Core core = Core() compiled_model = core.compile_model("ir_model/model.xml", "CPU") output = compiled_model.infer_new_request({input_tensor: data}) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值