Ray с Inception V3 на нескольких графических процессорах приводит к нехватке памяти - PullRequest
0 голосов
/ 15 января 2020

Я хочу распараллелить оценку модели 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(), но это не дало никакого эффекта.

Есть ли возможность, чтобы он работал таким образом? Хакерская версия будет состоять в том, чтобы использовать три актера, которые инициализируют модель один раз и вручную заполняют видео отдельным процессом.

...