Ошибка при использовании MultiWorkerMirroredStrategy для обучения модели исследования обнаружения объектов ssd_mobilenet_v1_fpn_640x640_coco17_tpu-8

Я пытаюсь обучить исследовательскую модель ssd_mobilenet_v1_fpn_640x640_coco17_tpu-8, используя MultiWorkerMirroredStrategy (путем установки --num_workers=2 при вызове model_main_tf2.py). Я пытаюсь обучить двух рабочих (0 и 1), каждый с одним графическим процессором. Однако, когда я пытаюсь это сделать, я получаю следующую ошибку, всегда на рабочем 1:

Traceback (most recent call last):
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\distribute\input_lib.py", line 553, in __next__
    return self.get_next()
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\distribute\input_lib.py", line 610, in get_next
    return self._get_next_no_partial_batch_handling(name)
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\distribute\input_lib.py", line 642, in _get_next_no_partial_batch_handling
    replicas.extend(self._iterators[i].get_next_as_list(new_name))
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\distribute\input_lib.py", line 1594, in get_next_as_list
    return self._format_data_list_with_options(self._iterator.get_next())
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\data\ops\multi_device_iterator_ops.py", line 580, in get_next
    result.append(self._device_iterators[i].get_next())
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\data\ops\iterator_ops.py", line 889, in get_next
    return self._next_internal()
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\data\ops\iterator_ops.py", line 819, in _next_internal
    ret = gen_dataset_ops.iterator_get_next(
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\ops\gen_dataset_ops.py", line 2922, in iterator_get_next
    _ops.raise_from_not_ok_status(e, name)
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\framework\ops.py", line 7186, in raise_from_not_ok_status
    raise core._status_to_exception(e) from None  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.OutOfRangeError: End of sequence [Op:IteratorGetNext]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\JS\Desktop\Tensorflow\models\research\object_detection\model_main_tf2.py", line 114, in <module>
    tf.compat.v1.app.run()
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\platform\app.py", line 36, in run
    _run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef)
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\absl\app.py", line 312, in run
    _run_main(main, args)
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\absl\app.py", line 258, in _run_main
    sys.exit(main(argv))
  File "C:\Users\JS\Desktop\Tensorflow\models\research\object_detection\model_main_tf2.py", line 105, in main
    model_lib_v2.train_loop(
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\object_detection\model_lib_v2.py", line 605, in train_loop
    load_fine_tune_checkpoint(
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\object_detection\model_lib_v2.py", line 401, in load_fine_tune_checkpoint
    _ensure_model_is_built(model, input_dataset, unpad_groundtruth_tensors)
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\object_detection\model_lib_v2.py", line 161, in _ensure_model_is_built
    features, labels = iter(input_dataset).next()
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\distribute\input_lib.py", line 549, in next
    return self.__next__()
  File "C:\Users\JS\.conda\envs\tensor2\lib\site-packages\tensorflow\python\distribute\input_lib.py", line 555, in __next__
    raise StopIteration
StopIteration

Рабочий 0 в конечном итоге выходит из строя после обнаружения того, что рабочий 1 вышел из строя.

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

Судя по трассировке в сообщениях об ошибках, ошибка возникает всякий раз, когда цикл обучения пытается выполнить итерацию по обучающим данным, сгенерированным Strategy.experimental_distribute_datasets_from_function. Обратите внимание, что если я изменю стратегию на MirroredStrategy, она будет нормально работать на одной машине (других изменений не будет). Я не уверен, что я делаю что-то не так или есть ошибка в API обнаружения объектов.

Моя настройка на обеих машинах идентична (в основном я следовал инструкциям по настройке на веб-сайте обнаружения объектов):

  1. Windows 10
  2. Тензорный поток 2.8.0
  3. Инструментарий Cuda 11.2
  4. 8.1

Кто-нибудь когда-нибудь видел эту ошибку раньше? Если да, то есть ли способ обойти это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я думаю, что понял проблему. В библиотеке обнаружения объектов есть файл с именем dataset_builder.py, который создает обучающий набор данных из TFRecord, хранящегося в файле, указанном в файле pipe.config (в элементе input_path tf_record_input_reader). Функция, которая фактически читает файл TFRecord, называется _read_dataset_internal. Эта функция обрабатывает input_path конфигурации конвейера как СПИСОК ФАЙЛОВ, а затем применяет функцию сегментирования (переданную в качестве аргумента) для разделения файлов между репликами, выполняющими обучение (одна реплика на каждого рабочего). Поскольку мой input_path указывал только один файл TFRecord, он был назначен первой реплике, а другим репликам были даны пустые имена файлов!! Таким образом, только первая реплика фактически имела входной набор данных для работы, отсюда и сбой.

Решение состояло в том, чтобы разделить обучающие данные на два файла (два TFRecords), а затем установить input_path в файле pipe.config как список путей, а не один путь. Как только я это сделал, оказалось, что модель успешно обучена (по крайней мере, она не разбилась).

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

В любом случае, я помогу всем, кто может бороться с той же проблемой.

Другие вопросы по теме