C++在机器学习推理引擎ONNXRuntime中的高性能实现

简介: ONNX(开放神经网络交换格式)是一种跨框架的模型表示标准。ONNXRuntime(ORT)是微软开源的推理引擎,支持CPU、GPU、FPGA等多种后端,完全由C++实现。

1.ONNXRuntime简介
ONNX(开放神经网络交换格式)是一种跨框架的模型表示标准。ONNXRuntime(ORT)是微软开源的推理引擎,支持CPU、GPU、FPGA等多种后端,完全由C++实现。它的设计理念是高性能、低延迟、可扩展。许多公司(如微软、英伟达、AMD)都使用ORT部署模型。
参考;https://www.bgnno.cn/category/original.html

2.核心架构:执行提供者(ExecutionProvider)
ORT通过抽象ExecutionProvider(EP)接口,接入不同的硬件加速库。例如:
CPUEP:使用Eigen或MKL-DNN优化算子。
CUDAEP:调用cuDNN、TensorRT。
DirectMLEP:利用DirectX12在WindowsGPU推理。
OpenVINOEP:适配Intel的VPU、集成显卡。
开发者可以在C++代码中创建Ort::SessionOptions,添加Ort::ThrowOnError,并注册想要的EP。ORT会自动将模型中的算子分配给合适的EP,实现异构计算。

3.内存管理与零拷贝
ORT使用自定义内存分配器(OrtAllocator),支持arena预分配,减少频繁malloc。输入输出张量可以预分配内存,避免推理过程中的分配开销。对于GPU推理,ORT支持CUDA固定内存和异步拷贝,将数据从CPU传输到GPU与计算重叠。

4.自定义算子注册
当模型包含非标准算子时,可以用C++实现自定义算子并注册到ORT。需要继承OpKernel,实现Compute方法,并用ORT_API宏导出。注册后,ORT在加载模型时会识别该算子并调用你的C++实现。这允许集成特殊的硬核加速逻辑。
参考:https://www.bgnno.cn/category/anime.html

5.案例:实时人脸识别服务
某安防公司使用ONNXRuntime部署人脸识别模型(ResNet-50)。需求:每帧图像(1080p)需在30ms内完成推理。解决方案:
使用CUDAEP和TensorRT后端(通过TensorRTExecutionProvider)。
预处理(缩放、归一化)使用CUDA核函数,直接在GPU内存完成,避免CPU-GPU拷贝。
输入输出张量使用固定内存(cudaHostAlloc),并通过Ort::MemoryInfo指定设备位置。
多线程推理:使用线程池并行处理多个视频流。
实测单张图像推理时间从原始的CPU版本200ms降至12ms,满足实时要求。

6.与其他推理框架对比
TensorFlowServing:功能丰富但较重。
PyTorchJIT:灵活但部署不如ORT轻量。
ONNXRuntime:部署友好,性能接近硬件极限,C++接口简洁。

7.总结
C++是ONNXRuntime实现高性能推理的基础。无论是CPU还是GPU,ORT通过执行提供者抽象和内存优化,让模型部署变得高效且跨平台。对于需要低延迟、高吞吐的AI应用,C++开发者应该掌握ONNXRuntime的使用与扩展。
参考:https://www.bgnno.cn

目录
相关文章
|
20天前
|
人工智能 运维 JavaScript
阿里云Qoder CN(原通义灵码)全解析 产品形态、版本划分与技术适配说明
在AI辅助开发与智能办公工具持续普及的当下,阿里云旗下原通义灵码正式更名为Qoder CN,同时延伸出QoderWork CN、Qoder CN CLI、Qoder CN Mobile等多款配套产品,形成覆盖代码开发、日常办公、终端交互、移动端使用的完整工具矩阵。Qoder CN核心定位为AI智能编码助手,深度适配主流代码编辑器、集成开发环境以及终端场景;QoderWork CN则偏向桌面端综合办公辅助,二者面向不同使用场景,划分了多个版本档位,搭配差异化资源配额、功能权限与计费规则,同时兼容多款主流大模型。
1125 8
|
4月前
|
机器学习/深度学习 算法 数据可视化
Proteus仿真实现逆变器及闭环控制详解
Proteus仿真实现逆变器及闭环控制详解
532 7
|
6月前
|
机器学习/深度学习 物联网
什么是大模型微调?与预训练有什么区别?
大模型通过海量数据预训练获得通用能力,成本极高;微调则用少量数据调整模型,适应特定任务。轻量级方法如LoRA、PEFT等仅更新部分参数,降低资源消耗,实现高效定制。
985 5
|
7月前
|
数据采集 运维 安全
数据中台系统推荐,适配中小企业的轻量化部署方案
中小企业数字化转型亟需轻量化数据中台,解决数据孤岛、成本高、运维难等问题。本文对比瓴羊Dataphin、字节Dataleap等主流产品,从部署、易用性、成本、兼容性等维度分析,助力企业选型。
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
664 0
|
XML Java 数据格式
【SpringFramework】Spring初体验
Spring是一款由Rod Johnson创立的主流Java EE轻量级开源框架,它旨在简化Java企业级项目开发,提供一站式轻量级解决方案,取代复杂的EJB。Spring的核心功能包括IoC(控制反转)和AOP(面向切面编程),并支持非侵入式开发、组件化和容器管理。这篇文章简要描述相关知识点和初始springframework。
611 60
【SpringFramework】Spring初体验
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】30. 神经网络中批量归一化层(batch normalization)的作用及其Pytorch实现
【从零开始学习深度学习】30. 神经网络中批量归一化层(batch normalization)的作用及其Pytorch实现
|
机器学习/深度学习 计算机视觉 Python
cv2.dnn.
【9月更文挑战第13天】
518 12
|
机器学习/深度学习 缓存 PyTorch
Yolov5如何训练自定义的数据集,以及使用GPU训练,涵盖报错解决
Yolov5如何训练自定义的数据集,以及使用GPU训练,涵盖报错解决
2612 0
|
并行计算 API C++
Nvidia TensorRT系列01-TensorRT的功能1
NVIDIA TensorRT是一个高性能深度学习推理优化器和运行时,支持C++和Python API。其编程模型分为构建阶段和运行时阶段,前者优化模型,后者执行推理。TensorRT支持多种数据类型和精度,包括FP32、FP16、INT8等,并提供插件机制以扩展支持的操作。
757 0