2025, Nov 14 15:02
CANCELLED в логах TensorFlow при распределённом обучении — это нормально
Почему в TensorFlow при распределённом обучении появляется CANCELLED: объясняем лог Local rendezvous и prefetch tf.data; это нормальная отмена на границе эпохи.
Во время распределённого обучения внезапный поток логов TensorFlow может насторожить — особенно когда в них фигурируют отмены. Часто встречается сообщение о Local rendezvous aborting with status CANCELLED, которое появляется примерно на первой эпохе при запуске конвейера Vertex AI с распределёнными стратегиями. Модель при этом продолжает обучаться, поэтому закономерный вопрос — не указывает ли это на настоящую проблему?
Что вы можете увидеть
Local rendezvous is aborting with status: CANCELLED: GetNextFromShard was cancelled [[{{node MultiDeviceIteratorGetNextFromShard}}]] [[RemoteCall]]
Минимальный пример воспроизведения
Обычно схема включает стратегию tf.distribute, tf.data.Dataset, собранный из генератора, и model.fit с явным указанием количества шагов на эпоху.
if cli_args.dist_mode == 'single':
if tf.test.is_gpu_available():
dist_plan = tf.distribute.OneDeviceStrategy(device="/gpu:0")
else:
dist_plan = tf.distribute.OneDeviceStrategy(device="/cpu:0")
elif cli_args.dist_mode == 'mirror':
dist_plan = tf.distribute.MirroredStrategy()
elif cli_args.dist_mode == 'multi':
dist_plan = tf.distribute.experimental.MultiWorkerMirroredStrategy()def build_dataset(make_iterable) -> tuple[tf.data.Dataset, int]:
tmp_stream = make_iterable()
for x_probe, y_probe in tmp_stream:
break
n_items = sum(1 for _ in tmp_stream) + 1
pipe = tf.data.Dataset.from_generator(
make_iterable,
output_signature=(
tf.TensorSpec(shape=(x_probe.shape), dtype=tf.float16),
tf.TensorSpec(shape=(y_probe.shape), dtype=tf.float16)
)
)
pipe = pipe.batch(BATCH_SZ).repeat()
return pipe, n_itemswith dist_plan.scope():
train_feed, n_train = build_dataset(lambda: win_bundle.train)
val_feed, n_val = build_dataset(lambda: win_bundle.val)
print(n_train, n_val)
steps_train = n_train // BATCH_SZ
steps_val = n_val // BATCH_SZ
model.fit(
train_feed,
validation_data=val_feed,
epochs=n_epochs,
validation_steps=steps_val,
steps_per_epoch=steps_train,
)Что на самом деле происходит и почему
Это сообщение — побочный информационный эффект того, как предзагрузка tf.data (prefetch) взаимодействует с циклом обучения Keras в распределённой среде. В течение эпохи каждый воркер запрашивает и обрабатывает батчи, а конвейер ввода в фоновом режиме заранее подготавливает данные, чтобы устройства не простаивали. Когда model.fit завершает train_steps и закрывает эпоху, итератор этой эпохи прекращает работу. Если у какого‑то воркера остаётся незавершённый запрос следующего батча в рамках предзагрузки, он отменяется, потому что эпоха уже закончилась. После этого TensorFlow фиксирует отмену: Local rendezvous is aborting with status: CANCELLED: GetNextFromShard was cancelled. Это ожидаемая «уборка» на границе эпохи и не является признаком сбоя.
Что нужно менять
Ничего менять не требуется. Сообщение об отмене лишь отражает завершение эпохи и остановку незавершённых предзагруженных запросов. Обёртка датасета через strategy.experimental_distribute_dataset не решает эту конкретную ситуацию, потому что это не ошибка.
Почему это важно
Понимание механики позволяет отделять шумные, но безвредные лог‑сообщения от настоящих проблем. В распределённых конфигурациях — например, с MirroredStrategy или MultiWorkerMirroredStrategy на Vertex AI — tf.data и model.fit намеренно перекрывают работу; возникающие на границах эпох отмены — нормальная часть эффективного выполнения.
Главное
Если обучение идёт, а метрики обновляются как задумано, считайте эту строку лога информационной. Задавайте явные значения шагов лишь тогда, когда это предусмотрено вашим планом обучения; изменять входной конвейер или стратегию распределения только ради подавления сообщения нет смысла.