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.
Typy danych. Sprawdź typy danych w usłudze Azure Machine Edukacja, aby dowiedzieć się więcej o typach danych.
uri_file
uri_folder
mltable
Typy modeli.
mlflow_model
custom_model
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 ma
uri_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życiumlflow.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-regression
moż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.
Po umieszczeniu wskaźnika myszy na porcie wejściowym/wyjściowym zostanie wyświetlony typ.
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.
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).
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_epocs
pipeline_job_training_max_epocs
na 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.
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.
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.
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