Как показать прогресс tqdm в MetaFlow?

#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.