删除模型后,如何在 Python 中释放 TF/Keras 内存,而其他模型仍在内存中并正在使用?

Mat*_*ias 3 python memory-management keras tensorflow

我有一个Python服务器应用程序,它提供TensorFlow/Keras模型推理服务。可以为多个不同的客户端同时加载和使用多个不同的此类模型。客户端可以请求加载另一个模型,但这对其他客户端没有影响(即它们的模型保留在内存中并按原样使用,因此每个客户端都可以请求加载另一个模型,无论任何其他客户端的状态如何)。

逻辑和实现有效,但是,我不确定如何在此设置中正确释放内存。当客户端请求加载新模型时,先前加载的模型将简单地从内存中删除(通过 Pythondel命令),然后通过tensorflow.keras.models.load_model().

根据我在Keras 文档中读到的内容,人们可能希望清除 Keras 会话,以便通过调用 释放内存tf.keras.backend.clear_session()。然而,这似乎释放了所有 TF 内存,这对我来说是一个问题,因为其他客户端的其他 Keras 模型仍在同时使用,如上所述。

此外,我似乎无法将每个模型放入自己的进程中,因为我无法从不同的运行进程并行(或根本)访问单个 GPU。

换句话说:当加载新的 TensorFlow / Keras 模型而其他模型也在内存中并正在使用时,如何从先前加载的模型中释放 TF 内存,而不干扰当前加载的其他模型?

Nit*_*hah 5

当 Tensorflow 会话启动时,它将尝试分配所有可用的 GPU 内存。这就是阻止多个进程运行会话的原因。阻止这种情况的理想方法是确保 tf 会话仅分配一部分内存。从文档中,有两种方法可以做到这一点(取决于您的 tf 版本)

  1. 简单的方法是(tf 2.2+)
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
  tf.config.experimental.set_memory_growth(gpu, True)
Run Code Online (Sandbox Code Playgroud)

适用于 tf 2.0/2.1

import tensorflow as tf
tf.config.gpu.set_per_process_memory_growth(True)
Run Code Online (Sandbox Code Playgroud)

for tf 1.* (为每个进程分配 30% 的内存百分比)

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
Run Code Online (Sandbox Code Playgroud)
  1. 另一种方法更受控,恕我直言,并且扩展性更好。它要求您创建逻辑设备并手动控制每个逻辑设备的放置。
import tensorflow as tf
tf.config.gpu.set_per_process_memory_growth(True)
Run Code Online (Sandbox Code Playgroud)

现在您必须使用 with 手动控制放置

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
Run Code Online (Sandbox Code Playgroud)

使用此功能,您不会耗尽内存,并且可以同时运行多个进程。