Я хочу распараллелить оценку модели Inception V3 из Keras в python 3 с библиотекой ray, и у меня возникает ошибка нехватки памяти на компьютере с несколькими графическими процессорами.
Цель - оценить группу видео с начальной моделью и распараллелить эту задачу, так как для ее выполнения требуется много времени.
Это прекрасно работает на одной машине с графическим процессором (GTX 1080TI), также прекрасно без луча, но на мой экземпляр с тремя GTX 2080TI падает, несмотря на то, что установлен max_calls=1
. Кажется, что первоначально количество рабочих появляется в соответствии с указанным количеством графических процессоров, и они работают нормально. После завершения первого рабочего и запуска следующего запуска сценарий завершается с ошибкой нехватки памяти.
Ниже приведен минимальный пример использования двух графических процессоров и трех рабочих. Для простоты генерируется случайное изображение.
import ray
import numpy as np
from tensorflow.keras.applications import InceptionV3
@ray.remote(num_cpus=1, num_gpus=1, max_calls=1)
def evaluate_inception(image):
input_shape = image[0].shape
model = InceptionV3(include_top=False, pooling='avg', input_shape=input_shape)
model.predict(image)
random_image = np.random.randint(0, 256, (1, 1920, 1080, 3)).astype(np.uint8)
physical_gpus = 2
ray.init(num_cpus=10, num_gpus=physical_gpus)
workers = []
for _ in range(physical_gpus + 1):
func = evaluate_inception.remote(random_image)
workers += [func]
for w in workers:
print(ray.get(w))
Мне кажется, что память GPU не освобождается во времени до того, как следующий работник загрузит модель в GPU. В документах рекомендуется использовать max_calls=1
, что в данном случае не помогает. Из 11 ГБ памяти осталось только 200 МБ, но она работает с одним графическим процессором и / или без луча без проблем.
Я также пробовал: - AWS p2.8xlarge с 8 Teslas K80, но также 11 ГБ ОЗУ: та же проблема - Интересно, что установка physical_gpus = 1
приводит к краже sh в системе с тремя графическими процессорами, но не в настройке с одним графическим процессором. - Я немного поиграл с tf.reset_default_graph()
, но это не дало никакого эффекта.
Есть ли возможность, чтобы он работал таким образом? Хакерская версия будет состоять в том, чтобы использовать три актера, которые инициализируют модель один раз и вручную заполняют видео отдельным процессом.