使用 onnxruntime-gpu 进行推理,运行时间久显存逐渐递增无法减少

背景

        将 pytorch / tensorflow 模型转换为onnx后,推理速度相对变快。但是问题在于当请求量增加,onnx模型会无限制申请GPU资源。如果将onnx模型部署为一个接口,则这个接口会一直存在,申请的GPU资源也不会得到释放(详细可以搜索pytorch模型显存管理机制与显存占用机制)。

缓解方法

# 手动构建provider

# CUDAExecutionProvider :使用GPU进行推理,默认使用CUDAExecutionProvider

provider = [
    ("CUDAExecutionProvider", {
         "device_id": torch.cuda.current_device(),                # 使用哪张显卡
         "arena_extend_strategy": "kNextPowerOfTwo",      
         "gpu_mem_limit": 5 * 1024 * 1024 * 1024,              # 显存上限
         "cudnn_conv_algo_search": "EXHAUSTIVE",
         "do_copy_in_default_stream": True,
    }),
    'CPUExecutionProvider',
]
onnx_model = onnxruntime.InferenceSession("your_onnx_model_path.onnx", providers=provider)

缺陷 

这个方法能够限制推理申请的资源上限,但是

1. 没有从根源上实现资源动态申请和释放

2. 需要对不同的任务制定不同的配置,例如显存上限,设定不好影响推理速度和吞吐速度

理想的方案

将onnx模型进一步转换为trt格式,使用tensorRT进行部署,方案可以由python或

c++实现,c++性能更佳。

### Flutter 中的三棵树架构 #### 1. **Widget Tree** Widget 是 Flutter 应用程序的核心组件,负责描述应用程序的 UI。Widget Tree 表示的是应用界面的状态和配置信息。每个 Widget 都是一个不可变的对象,当状态发生变化时,Flutter 会重新构建整个 Widget Tree 来反映新的状态。 - 在 Widget Tree 中的一个重要特性是:一个 Widget 并不一定只对应一个 Element[^1]。这是因为同一个 Widget 如果被多次实例化或者嵌套在不同的位置,则会在 Element Tree 中生成多个对应的 Element。 ```dart class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Container( child: Text('Hello'), ); } } ``` 上述代码片段展示了如何定义一个简单的 Widget,并将其作为树的一部分加入到 Widget Tree 中[^2]。 --- #### 2. **Element Tree** Element 是 Widget 的具体实现部分,表示已经挂载并准备渲染的实际对象。Element Tree 负责管理生命周期事件(如 `init`, `update` 和 `deactivate`),以及将 Widget 映射到实际的渲染逻辑中。 - 每个 Widget 都有一个唯一的 Element 实例与其关联,但并非所有的 Element 都会有对应的 RenderObject。例如 StatelessWidgets 创建的 ComponentElements 不会产生任何视觉效果[^3]。 - 当 StatefulWidgets 或 StatefulWidget 存在时,它们会触发更新机制来重建相应的 Elements,从而保持视图的一致性和动态性。 --- #### 3. **RenderObject Tree** RenderObject Tree 主要关注于布局、绘制和命中测试等底层图形操作。它是最终呈现给用户的可视化表现形式的基础数据结构。 - 只有那些继承自 `RenderObjectWidget` 的 Widgets 才能创建具体的 RenderObjects[^4]。这些 Objects 定义了尺寸大小、位置以及其他样式属性。 - 渲染流程通常遵循以下顺序:测量 (Measure),布局 (Layout),绘画 (Painting)。此过程中 ParentDataWidget 进一步调整子项的位置参数并通过调用父级标记重绘需求完成整体协调工作。 --- #### 关系总结 这三个层次紧密相连又各自独立运作: - **Widget Tree** 提供声明式的用户界面设计; - **Element Tree** 将抽象的设计转化为可执行的具体单元; - **RenderObject Tree** 则专注于高效地处理屏幕上的像素显示问题。 这种分层设计理念使得开发者可以更加灵活便捷地控制复杂的交互行为而无需关心太多关于硬件层面的技术细节。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值