Конвейер VertexAI: как использовать вывод настраиваемого компонента kfp в качестве ввода для google_cloud_pipeline_components?

Я пытаюсь написать код Python для конвейера в VertexAI с использованием компонентов kfp. У меня есть шаг, на котором я создаю system.Dataset объект, который является следующим:

      @component(base_image="python:3.9", packages_to_install=["google-cloud-bigquery","pandas","pyarrow","fsspec","gcsfs"])
def create_dataframe(
    project: str,
    region: str,
    destination_dataset: str,
    destination_table_name: str,
    dataset: Output[Dataset],
):
    
    from google.cloud import bigquery
    
    client = bigquery.Client(project=project, location=region)
    dataset_ref = bigquery.DatasetReference(project, destination_dataset)
    table_ref = dataset_ref.table(destination_table_name)
    table = client.get_table(table_ref)

    train = client.list_rows(table).to_dataframe()
    train.drop("<list_of_columns>", axis=1, inplace=True)
    train['class'] = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1]
    
    train.to_csv(dataset.uri)

Затем я использую набор данных в качестве входных для AutoMLTabularTrainingJobRunOp:

      df = create_dataframe(project=project,
                      region=region,
                      destination_dataset=destination_dataset,
                      destination_table_name=destination_table_name,
)
    
# Training with AutoML
training_op = gcc_aip.AutoMLTabularTrainingJobRunOp(
            project=project,
            display_name="train-automl-task",
            optimization_prediction_type="classification",
            column_transformations=[
                "<nested_dict>",
            ],
            dataset=df.outputs["dataset"],
            target_column="class",
            budget_milli_node_hours=1000,
)

Посмотрев логи, я обнаружил такую ​​ошибку:

      "Traceback (most recent call last): "

" File "/opt/python3.7/lib/python3.7/runpy.py", line 193, in _run_module_as_main "

" "__main__", mod_spec) "

" File "/opt/python3.7/lib/python3.7/runpy.py", line 85, in _run_code "

" exec(code, run_globals) "

" File "/opt/python3.7/lib/python3.7/site-packages/google_cloud_pipeline_components/remote/aiplatform/remote_runner.py", line 284, in <module> "

" main() "

" File "/opt/python3.7/lib/python3.7/site-packages/google_cloud_pipeline_components/remote/aiplatform/remote_runner.py", line 280, in main "

" print(runner(args.cls_name, args.method_name, executor_input, kwargs)) "

" File "/opt/python3.7/lib/python3.7/site-packages/google_cloud_pipeline_components/remote/aiplatform/remote_runner.py", line 236, in runner "

" prepare_parameters(serialized_args[METHOD_KEY], method, is_init=False) "

" File "/opt/python3.7/lib/python3.7/site-packages/google_cloud_pipeline_components/remote/aiplatform/remote_runner.py", line 205, in prepare_parameters "

" value = cast(value, param_type) "

" File "/opt/python3.7/lib/python3.7/site-packages/google_cloud_pipeline_components/remote/aiplatform/remote_runner.py", line 176, in cast "

" return annotation_type(value) "

" File "/opt/python3.7/lib/python3.7/site-packages/google/cloud/aiplatform/datasets/dataset.py", line 81, in __init__ "

" self._gca_resource = self._get_gca_resource(resource_name=dataset_name) "

" File "/opt/python3.7/lib/python3.7/site-packages/google/cloud/aiplatform/base.py", line 532, in _get_gca_resource "

" location=self.location, "

" File "/opt/python3.7/lib/python3.7/site-packages/google/cloud/aiplatform/utils/__init__.py", line 192, in full_resource_name "

" raise ValueError(f"Please provide a valid {resource_noun[:-1]} name or ID") "

"ValueError: Please provide a valid dataset name or ID "

Итак, я посмотрел исходный код в google/cloud/aiplatform/utils/__init__.py в строке 192, и я обнаружил, что имя ресурса должно быть таким: "projects/.../locations/.../datasets/12345" или "projects/.../locations/.../metadataStores/.../contexts/12345" .

Открытие executor_output.json файл, который создается в моем ведре после запуска create_dataframe Я обнаружил, что имя файла имеет правильный формат:

{"artifacts": {"dataset": {"artifacts": [{"name": "projects/my_project/locations/my_region/metadataStores/default/artifacts/1299...", "uri": "my_bucket/object_folder", "metadata": {"name": "reshaped-training-dataset"}}]}}}

Я также попытался установить удобочитаемое имя для набора данных в метаданных, но у меня не получилось. Любое предложение было бы действительно полезным.

2 ответа

The AutoMLTabularTrainingJobRunOpожидает управляемый набор данных, который не совпадает с типом артефакта локального набора данных. Вы можете преобразовать свои локальные данные из компонента в управляемый набор данных, а затем передать их в AutoMLTabularTrainingJobRunOp. см. Табличные конвейеры AutoML с использованием google-cloud-pipeline-components для примера того, как это сделать.

Что касается того, почему вы получаете ошибку, json, на который вы ссылались выше, является артефактом, который указывает на ваш набор данных. Артефакт сам по себе является управляемым ресурсом и, следовательно, имеет Vertex имя_ресурса, котороеprojects/my_project/locations/my_region/metadataStores/default/artifacts/1299...обратите внимание на имяartifactв имени ресурса. Здесь служба ожидает, что URI будет именем ресурса управляемого набора данных, для которого в настоящее время установлено значениеmy_bucket/object_folder. После того, как вы создадите/используете управляемый набор данных, URI будет выглядеть примерно так:projects/my_project/locations/my_region/metadataStores/default/datasets/74225...обратите внимание на имяdatasetв имени ресурса.

Еще одно замечание: облегченные компоненты Python, используемые только для поддержки артефактов системного типа, т.е.system.Dataset, однакоgoogle_cloud_pipeline_componentsиспользует артефакты типа Google, т.е.google.Dataset. PR # 8279 позволяет использовать типы Google с облегченными компонентами Python.

Вы можете добавить параметр «dataset: Input[Dataset]», как в этом примере:

      df = create_dataframe(project=project,
                      region=region,
                      destination_dataset=destination_dataset,
                      destination_table_name=destination_table_name,
                      dataset: Input[Dataset],
)

Вы также можете увидеть больше конвейеров документации и конвейеров с kfp.

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