Detectron: Недостаточно памяти на карте 4 ГБ

Созданный на 24 янв. 2018  ·  24Комментарии  ·  Источник: facebookresearch/Detectron

Я пытаюсь запустить Faster-RCNN на Nvidia GTX 1050Ti, но у меня заканчивается память. Nvidia-smi сообщает, что около 170 МБ уже используется, но действительно ли Faster-RCNN использует 3,8 ГБ видеопамяти для обработки изображения?

Я тоже попробовал Mask-RCNN (модель в руководстве по началу работы) и получил около 4 изображений (5, если я закрыл браузер), прежде чем он разбился.

Это ошибка или действительно нужно больше 4 ГБ памяти?

INFO infer_simple.py: 111: Processing demo/18124840932_e42b3e377c_k.jpg -> /home/px046/prog/Detectron/output/18124840932_e42b3e377c_k.jpg.pdf
terminate called after throwing an instance of 'caffe2::EnforceNotMet'
  what():  [enforce fail at blob.h:94] IsType<T>(). wrong type for the Blob instance. Blob contains nullptr (uninitialized) while caller expects caffe2::Tensor<caffe2::CUDAContext> .
Offending Blob name: gpu_0/conv_rpn_w.
Error from operator: 
input: "gpu_0/res4_5_sum" input: "gpu_0/conv_rpn_w" input: "gpu_0/conv_rpn_b" output: "gpu_0/conv_rpn" name: "" type: "Conv" arg { name: "kernel" i: 3 } arg { name: "exhaustive_search" i: 0 } arg { name: "pad" i: 1 } arg { name: "order" s: "NCHW" } arg { name: "stride" i: 1 } device_option { device_type: 1 cuda_gpu_id: 0 } engine: "CUDNN"
*** Aborted at 1516787658 (unix time) try "date -d @1516787658" if you are using GNU date ***
PC: @     0x7f08de455428 gsignal
*** SIGABRT (@0x3e800000932) received by PID 2354 (TID 0x7f087cda9700) from PID 2354; stack trace: ***
    @     0x7f08de4554b0 (unknown)
    @     0x7f08de455428 gsignal
    @     0x7f08de45702a abort
    @     0x7f08d187db39 __gnu_cxx::__verbose_terminate_handler()
    @     0x7f08d187c1fb __cxxabiv1::__terminate()
    @     0x7f08d187c234 std::terminate()
    @     0x7f08d1897c8a execute_native_thread_routine_compat
    @     0x7f08def016ba start_thread
    @     0x7f08de52741d clone
    @                0x0 (unknown)
Aborted (core dumped)

enhancement

Самый полезный комментарий

Еще одно замечание: текущая реализация использует оптимизацию памяти во время обучения, но не во время вывода. В случае логического вывода можно существенно уменьшить использование памяти, поскольку промежуточные активации не нужны после того, как они израсходованы. В будущем мы рассмотрим возможность добавления оптимизации памяти только для вывода.

Все 24 Комментарий

Привет, @Omegastick , требования к памяти для алгоритма Faster R-CNN варьируются в зависимости от ряда факторов, включая архитектуру магистральной сети и используемые масштабы тестового изображения.

Например, вы можете запустить Faster R-CNN со стандартной конфигурацией ResNet-50, используя:

python2 tools/infer_simple.py \
  --cfg configs/12_2017_baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml \
  --output-dir /tmp/detectron-visualizations \ 
  --image-ext jpg \
  --wts https://s3-us-west-2.amazonaws.com/detectron/35857389/12_2017_baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml.01_37_22.KSeq0b5q/output/train/coco_2014_train%3Acoco_2014_valminusminival/generalized_rcnn/model_final.pkl \
  demo

для работы с демонстрационными образами не требуется более 3 ГБ.

Еще одно замечание: текущая реализация использует оптимизацию памяти во время обучения, но не во время вывода. В случае логического вывода можно существенно уменьшить использование памяти, поскольку промежуточные активации не нужны после того, как они израсходованы. В будущем мы рассмотрим возможность добавления оптимизации памяти только для вывода.

@Omegastick Протестировано на моей машине, и Faster RCNN-resnet 101, и Mask RCNN-resnet 101 используют около 4 ГБ памяти графического процессора.

@ ir413 Спасибо, модель, которую вы связали, отлично работает (при использовании 2,5 ГБ видеопамяти) на моей машине.

Было бы здорово, если бы для вывода вообще не понадобился графический процессор.

как я могу запустить mask-rcnn с графическим процессором с памятью 2G? Может кто-нибудь мне помочь ?

Эта проблема связана с внедрением Caffe 2 или Detectron? Какие файлы в Detectron мне следует посмотреть, чтобы решить эту проблему?

@rbgirshick

В случае логического вывода можно существенно уменьшить использование памяти, поскольку промежуточные активации не нужны после того, как они израсходованы. В будущем мы рассмотрим возможность добавления оптимизации памяти только для вывода.

Что-то уже реализовано в PyTorch / Caffe2? Если да, то где копать?

@gadcam Это было в моем списке caffe2.python.memonger.release_blobs_when_used (https://github.com/pytorch/pytorch/blob/master/caffe2/python/memonger.py#L229) должен реализовать большую часть того, что нам нужно. Однако есть некоторые нетривиальные проблемы, которые необходимо решить:

  • Для некоторых сетей (например, Mask R-CNN) несколько сетей используются во время вывода, и поэтому не все активации могут быть освобождены, рассуждая только по одному графу (потому что они могут быть необходимы другому графу, например, головной сети маски).
  • Эта функция требует использования диспетчера кэширующей памяти, который мы не тестировали, поэтому при простом включении могут возникнуть проблемы.

@rbgirshick Спасибо за подробное объяснение!

Насколько я понимаю, для нас release_blobs_when_used действует как преобразователь из обычного Proto в "оптимизированный для памяти".

Для некоторых сетей (например, Mask R-CNN) несколько сетей используются во время вывода, и поэтому не все активации могут быть освобождены, рассуждая только по одному графу (потому что они могут быть необходимы другому графу, например, головной сети маски).

Другими словами, мы должны заполнить dont_free_blobs каплями, используемыми на втором этапе?

Эта функция требует использования диспетчера кэширующей памяти, который мы не тестировали, поэтому при простом включении могут возникнуть проблемы.

Итак, если мы хотим проверить это, нам нужно установить FLAGS_caffe2_cuda_memory_pool в cub (или thc ), но можем ли мы сделать это в Python?
Одна из очень скудных ссылок на него, которую я смог найти, находится здесь https://github.com/pytorch/pytorch/blob/6223bfdb1d3273a57b58b2a04c25c6114eaf3911/caffe2/core/context_gpu.cu#L190

@gadcam

Насколько я понимаю, для нас release_blobs_when_used действует как преобразователь из обычного Proto в «оптимизированный для памяти».

Да, это правильно. Он анализирует граф вычислений, определяет, когда каждый большой двоичный объект больше не будет использоваться, а затем вставляет операцию освобождения памяти.

Другими словами, мы должны заполнить dont_free_blobs каплями, используемыми на втором этапе?

Да, с оговоркой, что я не уверен, насколько хорошо используется и / или тестировалась эта функция ... из кода grepping кажется, что она на самом деле не используется. Таким образом, я бы имел в виду, что это может работать не так, как ожидалось.

Итак, если мы хотим протестировать это, нам нужно будет установить для FLAGS_caffe2_cuda_memory_pool значение cub (или thc), но можем ли мы сделать это в Python?

да. Я думаю, что недавно добавленный диспетчер памяти thc более эффективен. Нам нужно было использовать его вместо cub для недавнего (хотя и другого) варианта использования.

@rbgirshick Вы правы, похоже, это рискованный путь!

да. Я думаю, что недавно добавленный диспетчер памяти thc более эффективен. Нам нужно было использовать его вместо детеныша для недавнего (хотя и другого) варианта использования.

Я имел в виду, знаете ли вы, где я могу найти документацию для этого, или у вас есть пример? (Мне очень жаль настаивать на этом, возможно, я что-то пропустил, но не смог найти по нему никакой документации)

@gadcam относительно документации, я не знаю. Извините!

@asaadaldien Мне очень жаль, что я вас раздражаю, но вы, кажется, один из немногих, кто посоветовал

УБЕДИТЕСЬ, что caffe2_cuda_memory_pool установлен

когда мы используем memonger или data_parallel_model (для справки это было здесь ).
У вас есть какие-нибудь подсказки, как убедиться, что у нас включен диспетчер кэширующей памяти? (Использование Caffe2 в Python)

@gadcam Вы можете включить

workspace.GlobalInit([
'--caffe2_cuda_memory_pool=cub',
])

Однако это требуется только при использовании модуля динамической памяти.

@asaadaldien
Мне бы потребовалось много времени, чтобы понять, как это сделать, поскольку документации о GlobalInit .
Большое спасибо за Вашу помощь! Итак, теперь я могу начать несколько экспериментов!

У меня есть простое решение этой проблемы.
Вы можете установить P2 ~ P5 и rois в качестве выходных BLOB-объектов, а не только среднего BLOB-объекта, тогда он не будет оптимизирован при использовании оптимизации памяти.

Похоже, у меня не работает.
Я тестировал модель e2e_keypoint_rcnn_R-50-FPN_s1x.yaml .
Я попытался проверить это на части model.net .

Для тестов я использовал infer_simple.py .

workspace.GlobalInit(['caffe2', '--caffe2_log_level=0', '--caffe2_cuda_memory_pool=thc']) 

а также

dont_free_blobs = set(model.net.Proto().external_output)
expect_frees = set(i for op in model.net.Proto().op for i in op.input)
expect_frees -= dont_free_blobs

opti_net = release_blobs_when_used(model.net.Proto(), dont_free_blobs, selector_fun=None)
model.net.Proto().op.extend(copy.deepcopy(opti_net.op))

test_release_blobs_when_used(model.net.Proto(), expect_frees) 

где test_release_blobs_when_used вдохновлен https://github.com/pytorch/pytorch/blob/bf58bb5e59fa64fb49d77467f3466c6bc0cc76c5/caffe2/python/memonger_test.py#L731

def test_release_blobs_when_used(with_frees, expect_frees):
    found_frees = set()
    for op in with_frees.op:
        if op.type == "Free":
            print("OP FREEE", op)
            assert(not op.input[0] in found_frees)  # no double frees
            found_frees.add(op.input[0])
        else:
            # Check a freed blob is not used anymore
            for inp in op.input:
                assert(not inp in found_frees)
            for outp in op.output:
                assert(not outp in found_frees)

    try:
        assert(expect_frees == found_frees)
    except:
        print("Found - Expect frees Nb=", len(found_frees - expect_frees), found_frees - expect_frees, "\n\n\n")
        print("Expect - Found frees Nb=", len(expect_frees - found_frees), expect_frees - found_frees, "\n\n\n")
       #assert(False)

Обратите внимание, что для dont_free_blobs задано неправильное значение!

Эта функция сообщает мне, что никакие неожиданные капли не будут освобождены и что некоторые из них отсутствуют.
(что нормально, потому что dont_free_blobs неверно)
Итак, я продолжаю запускать модель.

И ... ничего не происходит. Я проверил с помощью функции save_graph : бесплатные операции действительно находятся в нужном месте.

Использование памяти для моих выборочных входов этой строки составляет 1910 млн. Лет +/- 5 млн.
https://github.com/facebookresearch/Detectron/blob/6c5835862888e784e861824e0ad6ac93dd01d8f5/detectron/core/test.py#L158

Но что-то действительно удивительное происходит, если я устанавливаю диспетчер памяти на CUB.

workspace.GlobalInit(['caffe2', '--caffe2_log_level=0', '--caffe2_cuda_memory_pool=cub']) 

Использование ОЗУ в строке RunNet увеличивается примерно на 3 Go !! (с использованием обычного кода или пользовательского кода с бесплатными каплями)

Я не понимаю, что происходит ...

Как описано в # 507, я также сталкиваюсь с ошибкой нехватки памяти при запуске логического вывода на Jetson TX1.
Решение, описанное в этой ветке, например:
python2 tools/infer_simple.py \ --cfg configs/12_2017_baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml \ --output-dir /tmp/detectron-visualizations \ --image-ext jpg \ --wts https://s3-us-west-2.amazonaws.com/detectron/35857389/12_2017_baselines/e2e_faster_rcnn_R-50-FPN_2x.yaml.01_37_22.KSeq0b5q/output/train/coco_2014_train%3Acoco_2014_valminusminival/generalized_rcnn/model_final.pkl \ demo
Также не работает, у меня все еще заканчивается память, хотя у меня всего доступно 4 ГБ ОЗУ (хотя память ЦП и ГП совместно используется).
Есть ли еще модель меньшего размера, которую я мог бы попробовать?
Поскольку, как описано в @Omegastick , он должен занимать не более 2,5 ГБ памяти, но, похоже, он все еще не подходит для Jetson. Есть ли другие предложения, которые я мог бы попробовать?

@johannathiemich У меня такая же проблема. Ошибок нет, но процесс убит. Вы решили проблему? Я тоже использую Jetson TX1.

@ ll884856 Да, вообще-то. Я закончил тем, что заменил базовую сетку на сжатую и снова натренировал сетку. Но имейте в виду, что производительность намного хуже, чем с исходной магистралью ResNet.
Перед сменой базовой сети вы также можете попробовать отключить FPN, что тоже может помочь. Но это также снизит производительность, хотя я надеюсь, что снижение будет не таким уж плохим.
Если вы хотите, я могу предоставить вам свою реализацию и веса сжимания. В настоящее время я работаю над своей бакалаврской диссертацией по этой теме.

@johannathiemich Спасибо за ответ! Фактически, я только что был в этой области и не очень разбираюсь в архитектуре Mask R-CNN. Если вы дадите мне свою реализацию и веса, это очень поможет мне понять и реализовать Mask R-CNN. Моя электронная почта [email protected]
Спасибо !

Да, вы можете сделать Mask-RCNN на процессоре, но не с детектором:

видеть:
https://vimeo.com/277180815

У меня есть одна похожая проблема, поэтому, если есть кто-нибудь, кто может мне здесь помочь, я бы действительно ее воспринял https://github.com/facebookresearch/detectron2/issues/1539 Я действительно не понимаю, почему это происходит. Итак, мне нужно 9,3 ГБ ОЗУ для прогнозирования 25 изображений в пакете на процессоре после включения в него части torch.nograd ().

Была ли эта страница полезной?
0 / 5 - 0 рейтинги