Компонент TFX CsvExampleGen всегда дает Примеры с пустыми выходами (и входами)

Я могу запустить CsvExampleGen без сообщения об ошибке, но выходы (и входы) результирующих примеров всегда пусты.

Я использую tfx == 0.24.0.

Чтобы использовать CsvExampleGen для чтения файлов CSV, согласно документации и руководствам (включая https://www.tensorflow.org/tfx/guide/examplegen) + примечания к выпуску tfx 0.23.0 / 0.24.0 (https://github.com/tensorflow/tfx/releases), следующих строк кода должно хватить для чтения файла CVS:

from tfx.components import CsvExampleGen
example_gen = CsvExampleGen(input_base=data_path)

где data_path определяет каталог с файлами CVS. (Обратите внимание, что код отличается от официального документа тем, что не использует external_input; вместо этого он следует новому интерфейсу, описанному в примечаниях к выпуску для 0.23.0.)

Из руководств я понял, что для тестирования должно хватить одного простого файла CVS (хотя я пробовал использовать до 7 файлов).

Я не получаю никаких сообщений об ошибках (кроме одного, которое я должен игнорировать, если у меня нет доступного графического процессора); однако выходы (и входы) результирующей структуры пусты (пустой список и пустой set / dict соответственно). Однако я считаю, что они не должны быть пустыми.

Рассматриваемые файлы CSV ОБЯЗАТЕЛЬНЫ и затронуты, потому что, если я введу там ошибку (например, дополнительный столбец в одной строке), я получу сообщение об ошибке.

Я пробовал это как с автономной функцией, так и внутри конвейера (для простоты запустите с BeamDagRunner). Конвейер действительно создает файл metadata.db, но я не могу найти там никаких следов данных CSV (например, имен столбцов). Добавление StatisticsGen в конвейер больше не помогло.

Я пробовал это с набором данных iris, с заголовками столбцов и без них. Я также пробовал использовать до 7 небольших искусственных файлов CVS в data_path, альтернативно с чисто числовыми и смешанными числовыми / категориальными данными или с запятыми и точками с запятой в качестве разделителей. Результат всегда один и тот же.

Есть ли у меня проблемы с кодом или, может быть, с какой-то конфигурацией или библиотеками?

Вот полный код (насколько это возможно):

PIPELINE_NAME = "X-pipeline-iris2"
BASE_PATH = r"C:\***\FX_Experiments"
BASE_PATH_PIPELINE = os.path.join(BASE_PATH, "pipeline")
BASE_PATH_TESTS = os.path.join(BASE_PATH, "tests")
PIPELINE_ROOT = os.path.join(BASE_PATH_PIPELINE, "output")
METADATA_PATH = os.path.join(BASE_PATH_PIPELINE, "tfx_metadata", PIPELINE_NAME, "metadata.db")
DATA_PATH = os.path.join(BASE_PATH_TESTS, "iris2")
ENABLE_CACHE = True


def create_pipeline(
        pipeline_name: Text, pipeline_root: Text, data_path: Text,
        enable_cache: bool,
        metadata_connection_config: Optional[metadata_store_pb2.ConnectionConfig] = None,
        beam_pipeline_args: Optional[List[Text]] = None
):
    components = []

    example_gen = CsvExampleGen(input_base=data_path)
    components.append(example_gen)

    stat_gen = StatisticsGen(examples=example_gen.outputs['examples'])
    components.append(stat_gen)

    return pipeline.Pipeline(
        pipeline_name = pipeline_name,
        pipeline_root = pipeline_root,
        components = components,
        enable_cache = enable_cache,
        metadata_connection_config = metadata_connection_config,
        beam_pipeline_args = beam_pipeline_args
    )

def run_pipeline():
    this_pipeline = create_pipeline(
        pipeline_name=PIPELINE_NAME,
        pipeline_root=PIPELINE_ROOT,
        data_path=DATA_PATH,
        enable_cache=ENABLE_CACHE,
        metadata_connection_config=metadata.sqlite_metadata_connection_config(METADATA_PATH)
    )
    BeamDagRunner().run(this_pipeline)

Также потенциально полезно: информация регистратора:

INFO:absl:Excluding no splits because exclude_splits is not set.
INFO:absl:Component CsvExampleGen depends on [].
INFO:absl:Component CsvExampleGen is scheduled.
INFO:absl:Component StatisticsGen depends on ['Run[CsvExampleGen]'].
INFO:absl:Component StatisticsGen is scheduled.
INFO:absl:Component CsvExampleGen is running.
INFO:absl:Running driver for CsvExampleGen
INFO:absl:MetadataStore with DB connection initialized
INFO:absl:select span and version = (0, None)
INFO:absl:latest span and version = (0, None)
INFO:absl:Running publisher for CsvExampleGen
INFO:absl:MetadataStore with DB connection initialized
INFO:absl:Component CsvExampleGen is finished.
INFO:absl:Component StatisticsGen is running.
...


person Felix    schedule 15.10.2020    source источник
comment
Не могли бы вы предоставить свой код, чтобы мы могли его изучить. Спасибо!   -  person Tensorflow Support    schedule 22.10.2020
comment
Я добавил код, насколько я могу представить, что он актуален (за исключением импорта). Спасибо за любую помощь!   -  person Felix    schedule 27.10.2020
comment
Я также добавил информацию о журнале прогона.   -  person Felix    schedule 27.10.2020


Ответы (1)


Феликс, если вы следуете руководствам, вы, вероятно, запускаете свой код в записной книжке. Если вы хотите видеть результаты напрямую, вам необходимо включить интерактивный TFX с помощью InteractiveContext.

https://www.tensorflow.org/tfx/api_docs/python/tfx/orchestration/experimental/interactive/interactive_context/InteractiveContext

context = InteractiveContext()
example_gen = CsvExampleGen(input_base='/content/data')
context.run(example_gen)
person Sascha Heyer    schedule 26.01.2021
comment
Большое спасибо за вклад, Саша! Мне кажется, что документация по TFX за последнее время значительно улучшилась. Я возьму это снова, но может пройти некоторое время, прежде чем я смогу дать отзыв на ваш ответ. - person Felix; 28.01.2021
comment
Промежуточный результат: у меня работает учебник на основе записной книжки (также с данными диафрагмы). Теперь мне все еще нужно запустить его вне ноутбука. - person Felix; 05.02.2021
comment
Чтобы запустить его вне записной книжки, вам понадобится оркестратор, например Apache Beam, Apache Airflow, AI Platform Pipelines или Kubeflow. Вы должны скомпилировать конвейер, чтобы использовать его в качестве оркестратора. - person Sascha Heyer; 17.02.2021
comment
Да, я знаю, но это точно не сработало, когда я пробовал это в прошлом году с Beam. К сожалению, мне все еще нужно найти достаточно времени и покоя, чтобы сделать еще одну попытку; может быть, новые версии исправили это, или новая документация поможет, но я пока не могу сказать. - person Felix; 19.02.2021
comment
Я обновил библиотеки tfx и ml-metadata (и т. Д.) И теперь получаю результаты (с помощью Beam). Статистика выглядит немного странно, но это другая проблема (вероятно, форматирование или кодирование CSV). Итак, для меня этот вопрос наконец-то решен. Не совсем уверен, в чем была настоящая проблема - действительно, только версии библиотеки или некоторые недоразумения сами по себе? - person Felix; 02.03.2021