Zarządzanie danymi wejściowymi i wyjściowymi składnika i potoku

Z tego artykułu dowiesz się:

  • Omówienie danych wejściowych i wyjściowych w składniku i potoku
  • Jak podwyższyć poziom danych wejściowych/wyjściowych składników do danych wejściowych/wyjściowych potoku
  • Jak zdefiniować opcjonalne dane wejściowe
  • Jak dostosować ścieżkę danych wyjściowych
  • Jak pobrać dane wyjściowe
  • Jak zarejestrować dane wyjściowe jako nazwany zasób

Omówienie danych wejściowych i wyjściowych

Potoki usługi Azure Machine Edukacja obsługują dane wejściowe i wyjściowe zarówno na poziomie składnika, jak i potoku.

Na poziomie składnika dane wejściowe i wyjściowe definiują interfejs składnika. Dane wyjściowe z jednego składnika mogą być używane jako dane wejściowe dla innego składnika w tym samym potoku nadrzędnym, co umożliwia przekazywanie danych lub modeli między składnikami. To połączenie stanowi wykres ilustrujący przepływ danych w potoku.

Na poziomie potoku dane wejściowe i wyjściowe są przydatne do przesyłania zadań potoku przy użyciu różnych danych wejściowych lub parametrów sterujących logiką trenowania (na przykład learning_rate). Są one szczególnie przydatne podczas wywoływania potoku za pośrednictwem punktu końcowego REST. Te dane wejściowe i wyjściowe umożliwiają przypisywanie różnych wartości do danych wejściowych potoku lub uzyskiwanie dostępu do danych wyjściowych zadań potoku za pośrednictwem punktu końcowego REST. Aby dowiedzieć się więcej, zobacz Tworzenie zadań i danych wejściowych dla punktu końcowego usługi Batch.

Typy danych wejściowych i wyjściowych

Następujące typy są obsługiwane jako dane wyjściowe składnika lub potoku.

Korzystanie z danych lub danych wyjściowych modelu zasadniczo serializowanie danych wyjściowych i zapisywanie ich jako plików w lokalizacji przechowywania. W kolejnych krokach tę lokalizację magazynu można instalować, pobierać lub przekazywać do docelowego systemu plików obliczeniowych, umożliwiając następny krok uzyskiwania dostępu do plików podczas wykonywania zadania.

Ten proces wymaga serializowania żądanego obiektu wyjściowego przez składnik — zwykle przechowywanego w pamięci — do plików. Można na przykład serializować ramkę danych biblioteki pandas jako plik CSV. Należy pamiętać, że usługa Azure Machine Edukacja nie definiuje żadnych standardowych metod serializacji obiektów. Jako użytkownik masz możliwość wyboru preferowanej metody serializacji obiektów w plikach. Następnie w składniku podrzędnym można niezależnie deserializować i odczytywać te pliki. Oto kilka przykładów dokumentacji:

  • W przykładzie nyc_taxi_data_regression składnik przygotowywania mauri_folder dane wyjściowe typu. W kodzie źródłowym składnika odczytuje pliki CSV z folderu wejściowego, przetwarza pliki i zapisuje przetworzone pliki CSV do folderu wyjściowego.
  • W nyc_taxi_data_regression przykładzie składnik train ma mlflow_model dane wyjściowe typu. W kodzie źródłowym składnika zapisuje wytrenowany model przy użyciu mlflow.sklearn.save_model metody .

Oprócz powyższych typów danych lub modeli dane wejściowe potoku lub składnika mogą być również następujące typy pierwotne.

  • string
  • number
  • integer
  • boolean

W przykładzie nyc_taxi_data_regression składnik train ma number dane wejściowe o nazwie test_split_ratio.

Uwaga

Dane wyjściowe typów pierwotnych nie są obsługiwane.

Ścieżka i tryb dla danych wejściowych/wyjściowych

W przypadku danych wejściowych/wyjściowych zasobu należy określić path parametr wskazujący lokalizację danych. W tej tabeli przedstawiono różne lokalizacje danych obsługiwane przez potok usługi Azure Machine Edukacja oraz przykłady parametrów ścieżki:

Lokalizacja Przykłady Dane wejściowe Dane wyjściowe
Ścieżka na komputerze lokalnym ./home/username/data/my_data
Ścieżka na publicznym serwerze HTTP https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Ścieżka w usłudze Azure Storage wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Nie sugerowane, ponieważ może być potrzebna dodatkowa konfiguracja tożsamości w celu odczytania danych.
Ścieżka w magazynie danych usługi Azure Machine Edukacja azureml://datastores/<data_store_name>/paths/<path>
Ścieżka do zasobu danych azureml:<my_data>:<version>

Uwaga

W przypadku danych wejściowych/wyjściowych w magazynie zdecydowanie zalecamy użycie ścieżki magazynu danych usługi Azure Machine Edukacja zamiast bezpośredniej ścieżki usługi Azure Storage. Ścieżka magazynu danych jest obsługiwana w różnych typach zadań w potoku.

W przypadku danych wejściowych/wyjściowych można wybrać spośród różnych trybów (pobieranie, instalowanie lub przekazywanie), aby zdefiniować sposób uzyskiwania dostępu do danych w docelowym obiekcie obliczeniowym. W tej tabeli przedstawiono możliwe tryby dla różnych kombinacji typów/trybu/danych wejściowych/wyjściowych.

Typ Dane wejściowe/wyjściowe upload download ro_mount rw_mount direct eval_download eval_mount
uri_folder Dane wejściowe
uri_file Dane wejściowe
mltable Dane wejściowe
uri_folder Dane wyjściowe
uri_file Dane wyjściowe
mltable Dane wyjściowe

Uwaga

W większości przypadków sugerujemy użycie ro_mount lub rw_mount tryb. Aby dowiedzieć się więcej na temat trybu, zobacz Tryby zasobów danych.

Reprezentacja wizualna w usłudze Azure Machine Edukacja Studio

Poniższe zrzuty ekranu przedstawiają przykład wyświetlania danych wejściowych i wyjściowych w zadaniu potoku w usłudze Azure Machine Edukacja Studio. To konkretne zadanie o nazwie nyc-taxi-data-regressionmożna znaleźć w pliku azureml-example.

Na stronie zadania potoku programu Studio dane/typ modelu wejściowe/wyjściowe składnika są wyświetlane jako mały okrąg w odpowiednim składniku, nazywany portem wejściowym/wyjściowym. Te porty reprezentują przepływ danych w potoku.

Dane wyjściowe na poziomie potoku są wyświetlane jako fioletowe pole do łatwej identyfikacji.

Screenshot highlighting the pipeline input and output port.

Po umieszczeniu wskaźnika myszy na porcie wejściowym/wyjściowym zostanie wyświetlony typ.

Screenshot highlighting the port type when hovering the mouse.

Dane wejściowe typu pierwotnego nie będą wyświetlane na grafie. Można go znaleźć na karcie Ustawienia panelu przeglądu zadania potoku (w przypadku danych wejściowych na poziomie potoku) lub panelu składników (dla danych wejściowych na poziomie składnika). Poniższy zrzut ekranu przedstawia kartę Ustawienia zadania potoku, którą można otworzyć, wybierając link Przegląd zadania.

Jeśli chcesz sprawdzić dane wejściowe składnika, kliknij dwukrotnie składnik, aby otworzyć panel składników.

Screenshot highlighting the job overview setting panel.

Podobnie podczas edytowania potoku w projektancie można znaleźć dane wejściowe i wyjściowe potoku w panelu interfejsu potoku oraz dane wejściowe i wyjściowe składników w panelu składnika (wyzwalacz, klikając dwukrotnie składnik).

Screenshot highlighting the pipeline interface in designer.

Jak podwyższyć poziom danych wejściowych i wyjściowych składników do poziomu potoku

Podwyższenie poziomu danych wejściowych/wyjściowych składnika do poziomu potoku umożliwia zastąpienie danych wejściowych/wyjściowych składnika podczas przesyłania zadania potoku. Jest to również przydatne, jeśli chcesz wyzwolić potok przy użyciu punktu końcowego REST.

Poniżej przedstawiono przykłady podwyższania poziomu danych wejściowych/wyjściowych składników do danych wejściowych/wyjściowych na poziomie potoku.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: 1b_e2e_registered_components
description: E2E dummy train-score-eval pipeline with registered components

inputs:
  pipeline_job_training_max_epocs: 20
  pipeline_job_training_learning_rate: 1.8
  pipeline_job_learning_rate_schedule: 'time-based'

outputs: 
  pipeline_job_trained_model:
    mode: upload
  pipeline_job_scored_data:
    mode: upload
  pipeline_job_evaluation_report:
    mode: upload

settings:
 default_compute: azureml:cpu-cluster

jobs:
  train_job:
    type: command
    component: azureml:my_train@latest
    inputs:
      training_data: 
        type: uri_folder 
        path: ./data      
      max_epocs: ${{parent.inputs.pipeline_job_training_max_epocs}}
      learning_rate: ${{parent.inputs.pipeline_job_training_learning_rate}}
      learning_rate_schedule: ${{parent.inputs.pipeline_job_learning_rate_schedule}}
    outputs:
      model_output: ${{parent.outputs.pipeline_job_trained_model}}
    services:
      my_vscode:
        type: vs_code
      my_jupyter_lab:
        type: jupyter_lab
      my_tensorboard:
        type: tensor_board
        log_dir: "outputs/tblogs"
    #  my_ssh:
    #    type: tensor_board
    #    ssh_public_keys: <paste the entire pub key content>
    #    nodes: all # Use the `nodes` property to pick which node you want to enable interactive services on. If `nodes` are not selected, by default, interactive applications are only enabled on the head node.

  score_job:
    type: command
    component: azureml:my_score@latest
    inputs:
      model_input: ${{parent.jobs.train_job.outputs.model_output}}
      test_data: 
        type: uri_folder 
        path: ./data
    outputs:
      score_output: ${{parent.outputs.pipeline_job_scored_data}}

  evaluate_job:
    type: command
    component: azureml:my_eval@latest
    inputs:
      scoring_result: ${{parent.jobs.score_job.outputs.score_output}}
    outputs:
      eval_output: ${{parent.outputs.pipeline_job_evaluation_report}}

Pełny przykład można znaleźć w potoku train-score-eval z zarejestrowanymi składnikami. Ten potok promuje trzy dane wejściowe i trzy dane wyjściowe na poziomie potoku. Przyjrzyjmy pipeline_job_training_max_epocs się przykładowi. Jest zadeklarowana w inputs sekcji na poziomie głównym, co oznacza, że jego dane wejściowe na poziomie potoku. W jobs -> train_job sekcji dane wejściowe o nazwie max_epocs są przywołyne jako ${{parent.inputs.pipeline_job_training_max_epocs}}, co oznacza train_job, że dane wejściowe na poziomie potoku odwołują się do danych wejściowych max_epocspipeline_job_training_max_epocsna poziomie potoku. Podobnie można podwyższyć poziom danych wyjściowych potoku przy użyciu tego samego schematu.

Studio

Możesz podwyższyć poziom danych wejściowych składnika do danych wejściowych na poziomie potoku na stronie tworzenia projektanta. Przejdź do panelu ustawień składnika, klikając dwukrotnie składnik —> znajdź dane wejściowe, które chcesz podwyższyć poziom —> wybierz trzy kropki po prawej stronie —> wybierz pozycję Dodaj do danych wejściowych potoku.

Screenshot highlighting how to promote to pipeline input in designer.

Opcjonalne dane wejściowe

Domyślnie wszystkie dane wejściowe są wymagane i muszą mieć przypisaną wartość (lub wartość domyślną) za każdym razem, gdy przesyłasz zadanie potoku. Mogą jednak istnieć wystąpienia, w których potrzebne są opcjonalne dane wejściowe. W takich przypadkach masz elastyczność, aby nie przypisywać wartości do danych wejściowych podczas przesyłania zadania potoku.

Opcjonalne dane wejściowe mogą być przydatne w dwóch poniższych scenariuszach:

  • Jeśli masz opcjonalne dane wejściowe/typ modelu i nie przypisz do niego wartości podczas przesyłania zadania potoku, w potoku będzie znajdować się składnik, który nie ma wcześniejszej zależności danych. Innymi słowy, port wejściowy nie jest połączony z żadnym składnikiem ani węzłem danych/modelu. Powoduje to bezpośrednie wywołanie tego składnika przez usługę potoku, a nie oczekiwanie na gotowość poprzedniej zależności.

  • Poniższy zrzut ekranu przedstawia jasny przykład drugiego scenariusza. Jeśli dla potoku ustawiono continue_on_step_failure = True drugi węzeł (node2), który używa danych wyjściowych z pierwszego węzła (node1) jako opcjonalne dane wejściowe, węzeł Node2 będzie nadal wykonywany nawet wtedy, gdy węzeł1 zakończy się niepowodzeniem. Jeśli jednak węzeł Node2 używa wymaganych danych wejściowych z węzła Node1, nie zostanie on wykonany, jeśli węzeł1 zakończy się niepowodzeniem.

    Screenshot to show the orchestration logic of optional input and continue on failure.

Poniżej przedstawiono przykłady sposobu definiowania opcjonalnych danych wejściowych.

$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
name: train_data_component_cli
display_name: train_data
description: A example train component
tags:
  author: azureml-sdk-team
version: 9
type: command
inputs:
  training_data: 
    type: uri_folder
  max_epocs:
    type: integer
    optional: true
  learning_rate: 
    type: number
    default: 0.01
    optional: true
  learning_rate_schedule: 
    type: string
    default: time-based
    optional: true
outputs:
  model_output:
    type: uri_folder
code: ./train_src
environment: azureml://registries/azureml/environments/sklearn-1.0/labels/latest
command: >-
  python train.py 
  --training_data ${{inputs.training_data}} 
  $[[--max_epocs ${{inputs.max_epocs}}]]
  $[[--learning_rate ${{inputs.learning_rate}}]]
  $[[--learning_rate_schedule ${{inputs.learning_rate_schedule}}]]
  --model_output ${{outputs.model_output}}

Gdy dane wejściowe są ustawione jako optional = true, należy użyć $[[]] polecenia , aby objąć wiersz polecenia danymi wejściowymi. Zobacz wyróżniony wiersz w powyższym przykładzie.

Uwaga

Opcjonalne dane wyjściowe nie są obsługiwane.

Na wykresie potoku opcjonalne dane wejściowe typu Data/Model są reprezentowane przez kropkowany okrąg. Opcjonalne dane wejściowe typów pierwotnych można znaleźć na karcie Ustawienia. W przeciwieństwie do wymaganych danych wejściowych, opcjonalne dane wejściowe nie mają obok nich gwiazdki, co oznacza, że nie są one obowiązkowe.

Screenshot highlighting the optional input.

Jak dostosować ścieżkę wyjściową

Domyślnie dane wyjściowe składnika będą przechowywane w elemencie azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}. Jest to {default_datastore} domyślny zestaw klienta magazynu danych dla potoku. Jeśli nie zostanie ustawiona, jest to magazyn obiektów blob obszaru roboczego. To {name} nazwa zadania, która zostanie rozpoznana w czasie wykonywania zadania. Jest {output_name} to nazwa danych wyjściowych zdefiniowana przez klienta w składniku YAML.

Można jednak również dostosować miejsce przechowywania danych wyjściowych, definiując ścieżkę danych wyjściowych. Poniżej przedstawiono przykład:

Definiuje pipeline.yaml potok, który ma trzy dane wyjściowe na poziomie potoku. Pełny kod YAML można znaleźć w potoku train-score-eval z zarejestrowanymi składnikami. Możesz użyć następującego polecenia, aby ustawić niestandardową ścieżkę wyjściową dla danych wyjściowych pipeline_job_trained_model.

# define the custom output path using datastore uri
# add relative path to your blob container after "azureml://datastores/<datastore_name>/paths"
output_path="azureml://datastores/{datastore_name}/paths/{relative_path_of_container}"  

# create job and define path using --outputs.<outputname>
az ml job create -f ./pipeline.yml --set outputs.pipeline_job_trained_model.path=$output_path  

Jak pobrać dane wyjściowe

Dane wyjściowe lub dane wyjściowe potoku składnika można pobrać poniżej przykładu.

Pobieranie danych wyjściowych na poziomie potoku

# Download all the outputs of the job
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

# Download specific output
az ml job download --output-name <OUTPUT_PORT_NAME> -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

Pobieranie danych wyjściowych zadania podrzędnego

Gdy musisz pobrać dane wyjściowe zadania podrzędnego (dane wyjściowe składnika, które nie są podwyższane do poziomu potoku), należy najpierw wyświetlić listę wszystkich podrzędnych jednostek zadań zadania zadania potoku, a następnie użyć podobnego kodu, aby pobrać dane wyjściowe.

# List all child jobs in the job and print job details in table format
az ml job list --parent-job-name <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID> -o table

# Select needed child job name to download output
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

Jak zarejestrować dane wyjściowe jako nazwany zasób

Dane wyjściowe składnika lub potoku można zarejestrować jako nazwany zasób, przypisując name i version do danych wyjściowych. Zarejestrowany zasób można wyświetlić w obszarze roboczym za pośrednictwem interfejsu użytkownika programu Studio/interfejsu wiersza polecenia/zestawu SDK, a także odwołać się do niego w przyszłych zadaniach.

Rejestrowanie danych wyjściowych potoku

display_name: register_pipeline_output
type: pipeline
jobs:
  node:
    type: command
    inputs:
      component_in_path:
        type: uri_file
        path: https://dprepdata.blob.core.windows.net/demo/Titanic.csv
    component: ../components/helloworld_component.yml
    outputs:
      component_out_path: ${{parent.outputs.component_out_path}}
outputs:
  component_out_path:
    type: mltable
    name: pipeline_output  # Define name and version to register pipeline output
    version: '1'
settings:
  default_compute: azureml:cpu-cluster

Rejestrowanie danych wyjściowych zadania podrzędnego

display_name: register_node_output
type: pipeline
jobs:
  node:
    type: command
    component: ../components/helloworld_component.yml
    inputs:
      component_in_path:
        type: uri_file
        path: 'https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
    outputs:
      component_out_path:
        type: uri_folder
        name: 'node_output'  # Define name and version to register a child job's output
        version: '1'
settings:
  default_compute: azureml:cpu-cluster

Następne kroki