开发者社区 > ModelScope模型即服务 > 计算机视觉 > 正文

服务器上onnxruntime-gpu 调用结束,如何释放显存

我将torch模型部署到服务器上,每次请求调用完模型,可以通过torch.cuda.empty_cache()来释放显存,我现在转成了onnx模型,使用onnxruntime-gpu 调用时候,发现显存没方法释放,会导致占用很多额外的显存情况,我想请问一下,有没有类似的方法

展开
收起
圣者ay 2023-05-19 15:05:45 3152 0
16 条回答
写回答
取消 提交回答
  • 在 ONNX Runtime 中释放显存,可以通过以下几种方法实现:

    使用 ONNX Runtime 提供的 Session API 中的 run() 方法的 options 参数,设置 gpu_device_id 为 -1,这将使得 ONNX Runtime 在运行模型时不会使用 GPU 设备,从而不会占用额外的显存。示例代码如下:

    import onnxruntime as ort  
      
    # 创建 ONNX Runtime Session  
    session = ort.Session(model_path, provider=ort.Provider())  
      
    # 创建 options 对象,设置 gpu_device_id 为 -1  
    options = ort.SessionOptions()  
    options.gpu_device_id = -1  
      
    # 运行模型  
    session.run(None, inputs, options=options)
    
    

    在运行模型之后,手动调用 ort.Session().close() 方法来释放 ONNX Runtime 占用的资源,包括显存。示例代码如下:

    import onnxruntime as ort  
      
    # 创建 ONNX Runtime Session  
    session = ort.Session(model_path, provider=ort.Provider())  
      
    # 运行模型  
    outputs = session.run(None, inputs)  
      
    # 关闭 Session,释放资源  
    session.close()
    
    

    需要注意的是,在使用 ONNX Runtime 时,如果模型中使用了 GPU 加速,那么在运行模型之前,需要保证服务器上已经正确安装了 CUDA 和 cuDNN,并且 ONNX Runtime 可以正确地加载它们。否则,即使设置了 gpu_device_id,ONNX Runtime 仍然无法使用 GPU 运行模型,而会使用 CPU 运行,这样就不会释放显存了。

    2023-06-21 14:46:58
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    对于使用ONNX模型和onnxruntime-gpu进行推理的情况,显存释放可能需要结合使用CUDA运行时的相关函数来实现。以下是一种可能的方式:

    1. 导入必要的库:

      import torch
      import onnxruntime
      
    2. 加载ONNX模型并创建ONNX运行时会话对象:

      onnx_model_path = "path_to_your_onnx_model.onnx"
      ort_session = onnxruntime.InferenceSession(onnx_model_path)
      
    3. 创建一个辅助函数,用于释放显存:

      def release_cuda_memory():
         if torch.cuda.is_available():
             torch.cuda.empty_cache()
             device = torch.device("cuda")
             torch.cuda.reset_peak_memory_stats(device)
             del device
         # 关闭onnxruntime的缓存,释放显存
         onnxruntime.set_cuda_device(0)
         onnxruntime.capi._raw_shutdown_all_kernels()
      
    4. 在每次模型推理结束后调用该函数以释放显存:

      input_data = ...
      output = ort_session.run(None, {"input": input_data})
      # 在完成推理后调用释放显存的函数
      release_cuda_memory()
      

    这样可以通过组合使用torch.cuda.empty_cache()和ONNX Runtime的相关函数来释放显存,减少额外的显存占用情况。请注意,具体实现可能因系统环境的不同而有所差异,建议根据自身情况进行调整。

    2023-06-20 10:57:12
    赞同 展开评论 打赏
  • 不断追求着最新的技术和趋势,在云技术的世界里,我不断寻找着新的机会和挑战,不断挑战自己的认知和能力。

    在使用 ONNX Runtime GPU 运行时,释放显存是非常重要的,因为 ONNX Runtime GPU 运行时会占用大量的显存。以下是一些释放显存的方法:

    在使用 ONNX Runtime GPU 运行时,可以通过调用 onnxruntime.gpu.empty_cache() 方法来释放显存。该方法会在 ONNX Runtime GPU 运行时清除所有缓存,从而释放显存。

    在使用 ONNX Runtime GPU 运行时,可以通过调用 onnxruntime.gpu.clear_memory() 方法来释放显存。该方法会在 ONNX Runtime GPU 运行时清除指定的内存区域,从而释放显存。

    在使用 ONNX Runtime GPU 运行时,可以通过调用 onnxruntime.gpu.release_memory() 方法来释放显存。该方法会在 ONNX Runtime GPU 运行时释放指定的内存区域,从而释放显存。

    需要注意的是,在释放显存之前,一定要确保模型已经被正确卸载,否则可能会出现内存泄漏等问题。您可以使用 ONNX Runtime GPU 运行时提供的 onnxruntime.gpu.unload_model() 方法来卸载模型。

    希望这些方法可以帮助您释放显存,并避免出现内存泄漏等问题。

    2023-06-15 14:35:39
    赞同 展开评论 打赏
  • 在使用完onnxruntime-gpu后,需要手动释放显存。可以使用以下命令释放显存: import torch.cuda torch.cuda.empty_cache() 这个命令可以清空CUDA缓存,释放已经使用的显存。

    2023-06-14 10:57:58
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    如果您想要在使用 ONNX 模型的同时释放显存,可以尝试使用以下方法:

    在本地测试模型时,在每次调用模型之后,可以通过调用 torch.cuda.empty_cache() 来释放显存。 在将模型部署到服务器上时,可以尝试使用 GPU 并行加速模型,并通过在请求中设置 worker_id 来保证每个请求都只占用一个 GPU 线程。这样可以最大程度地释放 GPU 显存,并避免占用额外的显存。 另外,如果模型过于庞大,导致 GPU 显存不足,您可以尝试使用更大的 GPU 显存来解决问题。在使用 ONNX 模型时,您可以根据需要自行调整模型的参数,以达到最佳性能。

    2023-06-14 09:15:05
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    在使用ONNX模型时,可以使用onnxruntime.capi.release函数来释放显存。该函数可以释放由ONNX Runtime分配的所有CUDA显存。

    以下是一个示例代码,展示如何使用onnxruntime.capi.release函数释放显存:

    python import onnxruntime as ort

    加载ONNX模型

    model_path = "model.onnx" session = ort.InferenceSession(model_path)

    进行推理

    input_data = ... output = session.run(None, {"input": input_data})

    释放显存

    ort.capi.release()

    在这个示例代码中,我们首先加载了一个ONNX模型,并使用session.run函数进行推理。然后,我们使用ort.capi.release函数释放显存。注意,调用ort.capi.release函数后,所有由ONNX Runtime分配的CUDA显存都将被释放,所以你应该在所有推理完成后再调用该函数。

    2023-06-13 19:27:49
    赞同 展开评论 打赏
  • 在使用onnxruntime-gpu调用onnx模型时,显存的管理是由onnxruntime-gpu库来进行的。与PyTorch不同,onnxruntime-gpu不支持手动释放显存,但它会在需要时自动释放显存。因此,如果你的显存占用过高,可能是由于onnxruntime-gpu没有及时释放显存导致的。

    可以尝试以下方法来减少显存占用:

    1. 使用SessionOptions类来设置onnxruntime-gpu的参数,例如max_num_threadsexecution_mode等,以优化模型的性能和显存占用。可以参考官方文档来设置这些参数。

    2. 对于大型模型,可以尝试使用分批次输入的方式,将输入分成多个小批次进行推理,以减少显存占用。

    3. 如果你使用的是GPU版本的onnxruntime-gpu,可以尝试使用多GPU并行推理,以提高模型的性能和显存利用率。可以参考官方文档来设置多GPU并行推理。

    4. 如果你的模型在推理过程中需要使用大量的中间变量,可以考虑使用OrtMemoryInfo类来管理显存,手动释放不需要的中间变量。

    如果你仍然遇到显存过高的问题,可以考虑使用其他的深度学习框架或者其他的推理引擎来进行模型推理。

    2023-06-13 17:51:05
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,在使用ONNX模型时,您可以通过使用ONNX Runtime的InferenceSession对象和run方法来运行模型推理。如果您想在每次推理之后释放显存,可以在每次调用run方法之后调用InferenceSession对象的__del__方法来释放显存。

    以下是一个示例代码:

    python

    import onnxruntime as ort

    加载ONNX模型

    sess = ort.InferenceSession('model.onnx')

    运行推理

    input_data = ... output = sess.run(None, {'input': input_data})

    释放显存

    del sess 在上面的代码中,sess是InferenceSession对象,用于加载和运行ONNX模型。在每次推理之后,我们可以使用del语句删除sess对象,这将调用其__del__方法并释放与该对象相关联的资源,包括显存。

    请注意,如果您在运行推理的过程中多次创建InferenceSession对象,则需要在每个对象的使用结束后显式地调用其__del__方法以释放显存。如果您正在使用多个线程或进程运行模型推理,则需要确保在每个线程或进程中正确地释放显存。

    另外,您还可以尝试使用PyTorch的torch.cuda.empty_cache()方法来释放显存。虽然这个方法是针对PyTorch模型的,但在使用ONNX Runtime时,您仍然可以在调用完run方法后调用该方法来释放显存。例如:

    python

    import onnxruntime as ort import torch

    加载ONNX模型

    sess = ort.InferenceSession('model.onnx')

    运行推理

    input_data = ... output = sess.run(None, {'input': input_data})

    释放显存

    torch.cuda.empty_cache() 这将释放由torch分配的显存,但不会释放由ONNX Runtime分配的显存

    2023-06-13 08:16:52
    赞同 展开评论 打赏
  • 在使用 ONNX Runtime GPU 运行推理时,可以通过调用 onnxruntime.capi._pybind_state.reset_default_logger_severity() 函数来释放 GPU 显存。这个函数将重置 ONNX Runtime 的默认日志记录器并释放由 ONNX Runtime 使用的 GPU 内存。

    以下是一个示例代码片段,展示了如何在使用 ONNX Runtime GPU 运行推理后释放显存: import onnxruntime

    创建 ONNX Runtime 的会话

    session = onnxruntime.InferenceSession("your_model.onnx")

    执行推理

    input_data = ... # 输入数据 output = session.run(None, {"input": input_data})

    释放 GPU 显存

    onnxruntime.capi._pybind_state.reset_default_logger_severity()

    请注意,在调用 reset_default_logger_severity() 函数之后,ONNX Runtime 的日志记录级别将被重置为默认值。

    通过调用该函数,ONNX Runtime 将释放在推理过程中分配的 GPU 内存。这将有助于减少占用的额外显存。但请注意,具体的显存释放行为可能因 ONNX Runtime 的版本和配置而有所不同。因此,建议参考 ONNX Runtime 的官方文档或社区支持资源,以获取更准确的显存管理指导。

    此外,如果您使用的是 PyTorch 将模型转换为 ONNX 的过程,您也可以尝试调用 torch.cuda.empty_cache() 函数来清空 PyTorch 使用的 GPU 缓存。这样可以进一步释放 GPU 显存。

    import torch

    转换模型为 ONNX

    torch.onnx.export(model, input_data, "your_model.onnx")

    清空 PyTorch 使用的 GPU 缓存

    torch.cuda.empty_cache()

    综上所述,通过调用 onnxruntime.capi._pybind_state.reset_default_logger_severity()torch.cuda.empty_cache() 函数,您可以尝试释放显存并减少额外的显存占用。请根据您的具体情况选择合适的显存管理策略。

    2023-06-12 12:14:23
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    在使用 ONNX Runtime 运行 ONNX 模型时,可以使用 SessionOptions 来设置显存使用策略,以控制显存的使用。

    具体来说,您可以通过设置 SessionOptions 的 execution_mode 和 optimized_model_filepath 属性来控制显存的使用。例如,您可以将 execution_mode 设置为 ORTExecutionMode.ORT_SEQUENTIAL,以使用更少的显存来运行模型。您也可以将 optimized_model_filepath 设置为一个路径,以将优化后的模型保存到磁盘中,以减少显存的使用。

    另外,您也可以在运行模型的过程中,使用 session.end_profiling() 方法来释放显存。这个方法可以停止模型的性能分析,同时释放使用的显存。但是请注意,这个方法只有在启用了性能分析功能时才有效。

    下面是一个示例代码,展示了如何使用 SessionOptions 控制显存的使用:

    python Copy import onnxruntime as ort

    创建 SessionOptions 对象

    options = ort.SessionOptions()

    设置执行模式

    options.execution_mode = ort.ORTExecutionMode.ORT_SEQUENTIAL

    设置优化后的模型保存路径,可以减少显存使用

    options.optimized_model_filepath = "optimized_model.onnx"

    创建 ONNX Runtime Session 对象

    session = ort.InferenceSession("model.onnx", options=options)

    运行模型

    input_data = ... # 构造模型输入 output_data = session.run(output_names=None, input_feed=input_data)

    停止性能分析,并释放显存

    session.end_profiling() 在这个示例中,我们创建了一个 SessionOptions 对象,并设置了执行模式和优化后的模型保存路径。然后,我们创建了一个 ONNX Runtime Session 对象,并使用 run() 方法运行模型。最后,我们使用 end_profiling() 方法停止性能分析,并释放显存。

    2023-06-11 21:46:16
    赞同 展开评论 打赏
  • 热爱开发

    在使用ONNX模型和onnxruntime-gpu时,您可以尝试使用以下方法来释放显存:

    使用session.run()函数的release_all()参数:在使用onnxruntime-gpu的session.run()函数进行推理时,可以将release_all参数设置为True,以释放所有临时分配的显存。例如: import onnxruntime as ort

    加载ONNX模型

    ort_session = ort.InferenceSession('model.onnx')

    运行推理并释放显存

    result = ort_session.run(output_names=[], input_feed={}, release_all=True) 使用onnxruntime-gpu提供的MemoryInfo对象:在使用onnxruntime-gpu时,可以通过MemoryInfo对象来获取和管理显存信息。例如,您可以使用MemoryInfo.get_memory_info()和MemoryInfo.free_memory()函数分别获取和释放显存。例如: import onnxruntime as ort

    获取当前设备的MemoryInfo对象

    memory_info = ort.get_device_mem_info('cuda')

    释放一部分显存

    memory_info.free_memory(102410241024)

    获取剩余显存大小

    remaining_memory = memory_info.get_memory_info().free 请注意,这些方法可能会对性能和推理速度产生一定的影响。因此,在使用时需要根据具体情况进行权衡和调整。

    希望这些信息对您有所帮助!

    2023-06-10 09:25:37
    赞同 展开评论 打赏
  • 在使用onnxruntime-gpu调用模型时,可以通过onnxruntime的SessionOptions设置execution mode为ORTExecutionMode.ORT_SEQUENTIAL,这样每次推理完毕后会自动释放显存。示例代码如下:

    import onnxruntime
    
    # 加载onnx模型
    session = onnxruntime.InferenceSession("model.onnx")
    
    # 设置SessionOptions
    options = onnxruntime.SessionOptions()
    options.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL
    
    # 运行推理
    input_data = ...
    output = session.run(None, {"input": input_data})
    
    # 释放显存
    onnxruntime.capi._pybind_state.get_device().release_memory()
    

    其中,input_data为输入数据,"input"为模型输入节点名,output为模型输出结果。释放显存的代码为onnxruntime.capi._pybind_state.get_device().release_memory()。注意,该方法只在使用GPU时有效。

    2023-06-10 07:54:54
    赞同 1 展开评论 打赏
  • 在使用 ONNX Runtime GPU 运行时,可以通过以下方法来释放显存:

    1. 在每次运行完计算之后手动释放显存,可以使用以下代码:

      import onnxruntime
      
      session = onnxruntime.InferenceSession(model_path)
      input_name = session.get_inputs()[0].name
      output_name = session.get_outputs()[0].name
      input_data = np.zeros(input_shape, dtype=np.float32)
      
      # 预测计算
      output_data = session.run([output_name], {input_name: input_data})
      
      # 释放显存
      del session
      
    2. 使用 with 语句自动释放显存。可以使用以下代码:

      import onnxruntime
      
      model = onnxruntime.InferenceSession(model_path)
      input_name = model.get_inputs()[0].name
      output_name = model.get_outputs()[0].name
      input_data = np.zeros(input_shape, dtype=np.float32)
      
      # 预测计算
      with model:
         output = model.run([output_name], {input_name: input_data})
      
      # 模型自动释放显存
      

    上述代码可以保证在每次预测结束后及时释放显存并避免过度占用显存空间。

    使用 ONNX Runtime GPU 运行时时,由于其内部会自动管理显存空间,因此可能需要适当增加 batch_size 来减少显存占用。另外,如果您的模型包含较大的权重或特征图,也可能会导致显存占用过高的问题。建议您根据实际情况对模型进行优化或压缩,以减小显存占用并提高预测效率。

    2023-06-09 22:26:48
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在使用 ONNX Runtime GPU 调用模型时,可以通过以下方法释放显存:

    1. 完成模型推理后,调用 onnxruntime.capi.session.InferenceSession 对象的 end_profiling() 方法。这个方法会释放 ONNX Runtime 内部使用的一些资源,包括一部分显存。

    2. 在每次完成模型推理后,手动释放 TensorFlow 或 PyTorch 等后端库所占用的显存。具体的操作方式因后端库而异,请参考相关文档进行操作。

    3. 在每次完成模型推理后,手动释放 ONNX Runtime 所占用的显存。您可以尝试使用 torch.cuda.empty_cache()tf.compat.v1.keras.backend.clear_session() 等方法来释放显存。

    需要注意的是,如果您的模型比较大或者输入数据较大,可能需要更多的显存来完成推理。如果显存不足,可能会导致程序抛出异常或崩溃。因此,在使用 ONNX Runtime 进行模型推理时,建议您仔细分析模型和输入数据的规模,并合理规划显存的使用方式。

    为了释放显存,请根据具体情况选择合适的方法,并在程序中适当地调用相关函数或方法。如果您仍然遇到显存问题,请尝试优化模型结构、调整输入数据规模等方法,以减小显存的占用。

    2023-06-09 22:25:07
    赞同 展开评论 打赏
  • 全栈JAVA领域创作者

    在使用ONNX Runtime时,一旦模型加载完成,模型和相关数据就会被存储在设备上的内存中,因此无需显存释放。您可以使用onnxruntime::IRuntime::AsyncSession的allocate_tensor()和free_tensor()方法来为模型和数据分配和释放内存,这些方法会自动管理内存。另外,请注意,使用ONNX Runtime时需要将模型保存为ONNX格式,以便在设备上使用。

    2023-06-09 18:07:24
    赞同 展开评论 打赏
  • 在使用ONNX模型时,可以通过在每次模型推理完成后显式调用onnxruntime.InferenceSession对象的run_with_iobinding()方法,并传递一个device参数来实现显存的释放。

    具体地,可以将以下代码片段嵌入到你的代码中:

    python import onnxruntime as rt import numpy as np

    sess = rt.InferenceSession("your_onnx_model_path") input_name = sess.get_inputs()[0].name # 获取输入节点名称 output_name = sess.get_outputs()[0].name # 获取输出节点名称

    构造输入数据

    input_data = np.random.rand(batch_size, input_dim).astype(np.float32)

    构造IO绑定字典

    io_binding = sess.io_binding() io_binding.bind_cpu_input(input_name, input_data.shape) io_binding.bind_output(output_name, device_type='cuda', device_id=0) io_binding.bind_input(input_name, rt._get_device_mem_bufer(input_data)) # 绑定输入数据 sess.run_with_iobinding(io_binding) # 执行预测 del input_data # 删除不再需要的变量 在调用完sess.run_with_iobinding(io_binding)方法后,可以删除不再需要的变量以释放显存。

    需要注意的是,这种方法仅对GPU进行了显存的释放,CPU端的内存并不会被回收。因此,如果需要释放CPU内存,可以考虑在模型执行前加上以下代码:

    python from onnxruntime import get_all_providers

    ort_session = rt.InferenceSession("your_onnx_model_path", providers=get_all_providers()) ort_session.disable_fallback() 这样可以禁用ONNXRuntime的回退机制,从而确保使用最新的GPU内存。另外,如果使用的是CUDA 11.x版本,还需要在代码中添加以下配置:

    python import onnxruntime.capi.onnxruntime_pybind11_state as rtps rtps.CudaDevice.SetCurrentGpuDevice(0) 这个配置可以让ONNXRuntime正确地使用CUDA 11.x的API来管理GPU显存。

    2023-06-09 16:43:00
    赞同 展开评论 打赏
滑动查看更多

包含图像分类、图像生成、人体人脸识别、动作识别、目标分割、视频生成、卡通画、视觉评价、三维视觉等多个领域

相关电子书

更多
DeepStream: GPU加速海量视频数据智能处理 立即下载
阿里巴巴高性能GPU架构与应用 立即下载
GPU在超大规模深度学习中的发展和应用 立即下载