#logging #tqdm #netflix-metaflow
Вопрос:
При запуске потоков tqdm
метапотока индикаторы выполнения не отображаются до последней итерации, что противоречит цели измерения прогресса. Есть ли способ заставить MetaFlow печатать обновления tqdm?
Ответ №1:
Проблема в том, что tqdm
запись выполняется в stderr, но метапоток скрывает вывод в stderr. Решение требует двух приемов: использования контекстного менеджера для перенаправления tqdm
выходных данных в регистратор и настройки этого регистратора для записи в stderr.
Пример:
import logging
import sys
from time import sleep
import tqdm
from metaflow import FlowSpec, step
from tqdm.contrib.logging import tqdm_logging_redirect
# stream to stdout needed because MetaFlow hides output to stderr :C
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
class TQDMFlow(FlowSpec):
@step
def start(self):
print("Training...")
with tqdm_logging_redirect(): # this context manager redirects tqdm output to logging
for _ in tqdm.tqdm(range(20)):
sleep(0.25)
self.next(self.end)
@step
def end(self):
pass
if __name__ == "__main__":
TQDMFlow()
Я также попытался перенаправить вывод непосредственно в stdout (без tqdm_logging_redirect
контекстного менеджера или logging
) tqdm(range(n), file=sys.stdout)
, но это не сработало.
Комментарии:
1. С
tqdm==4.61.1
иmetaflow==2.3.2
, мой призывbasicConfig
не нуждался в аргументахstream=sys.stdout
. Это делается с использованием Python 3.9.5 w/ bash в Ubuntu 20.04.