Delen via


Invoer en uitvoer voor onderdelen en pijplijnen beheren

Azure Machine Learning-pijplijnen ondersteunen invoer en uitvoer op zowel het onderdeel- als de pijplijnniveaus. In dit artikel worden de invoer en uitvoer van pijplijnen en onderdelen beschreven en hoe u deze beheert.

Op onderdeelniveau definiëren de invoer en uitvoer de onderdeelinterface. U kunt de uitvoer van het ene onderdeel gebruiken als invoer voor een ander onderdeel in dezelfde bovenliggende pijplijn, zodat gegevens of modellen tussen onderdelen kunnen worden doorgegeven. Deze interconnectiviteit vertegenwoordigt de gegevensstroom in de pijplijn.

Op pijplijnniveau kunt u invoer en uitvoer gebruiken om pijplijntaken te verzenden met verschillende gegevensinvoer of parameters, zoals learning_rate. Invoer en uitvoer zijn vooral handig wanneer u een pijplijn aanroept via een REST-eindpunt. U kunt verschillende waarden toewijzen aan de pijplijninvoer of toegang krijgen tot de uitvoer van verschillende pijplijntaken. Zie Taken en invoergegevens maken voor batcheindpunten voor meer informatie.

Invoer- en uitvoertypen

De volgende typen worden ondersteund als invoer en uitvoer van onderdelen of pijplijnen:

  • Gegevenstypen voor meer informatie over IntDate. Zie Gegevenstypen voor meer informatie.

    • uri_file
    • uri_folder
    • mltable
  • Modeltypen.

    • mlflow_model
    • custom_model

De volgende primitieve typen worden ook alleen ondersteund voor invoer:

  • Primitieve typen
    • string
    • number
    • integer
    • boolean

Uitvoer van primitieve typen wordt niet ondersteund.

Voorbeeldinvoer en uitvoer

Deze voorbeelden zijn afkomstig van de NYC Taxi Data Regression-pijplijn in de GitHub-opslagplaats met Azure Machine Learning-voorbeelden .

  • Het trainonderdeel heeft een invoer met de number naam test_split_ratio.
  • Het voorbereidingsonderdeel heeft een uri_folder type-uitvoer. De broncode van het onderdeel leest de CSV-bestanden uit de invoermap, verwerkt de bestanden en schrijft de verwerkte CSV-bestanden naar de uitvoermap.
  • Het trainonderdeel heeft een mlflow_model type-uitvoer. De broncode van het onderdeel slaat het getrainde model op met behulp van de mlflow.sklearn.save_model methode.

Uitvoerserialisatie

Als u gegevens of modeluitvoer gebruikt, worden de uitvoer geserialiseerd en opgeslagen als bestanden op een opslaglocatie. Latere stappen hebben toegang tot de bestanden tijdens het uitvoeren van de taak door deze opslaglocatie te koppelen of door de bestanden te downloaden of te uploaden naar het rekenbestandssysteem.

De broncode van het onderdeel moet het uitvoerobject, dat meestal in het geheugen wordt opgeslagen, serialiseren in bestanden. U kunt bijvoorbeeld een pandas-dataframe serialiseren in een CSV-bestand. Azure Machine Learning definieert geen gestandaardiseerde methoden voor objectserialisatie. U hebt de flexibiliteit om uw voorkeursmethoden te kiezen om objecten in bestanden te serialiseren. In het downstreamonderdeel kunt u kiezen hoe u deze bestanden deserialiseert en leest.

Invoer- en uitvoerpaden van gegevenstype

Voor invoer en uitvoer van gegevensassets moet u een padparameter opgeven die verwijst naar de gegevenslocatie. In de volgende tabel ziet u de ondersteunde gegevenslocaties voor azure Machine Learning-pijplijninvoer en -uitvoer, met path parametervoorbeelden.

Locatie Invoer Uitvoer Opmerking
Een pad op uw lokale computer ./home/<username>/data/my_data
Een pad op een openbare HTTP/s-server https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Een pad in Azure Storage * wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
or
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Een pad in een Azure Machine Learning-gegevensarchief azureml://datastores/<data_store_name>/paths/<path>
Een pad naar een gegevensasset azureml:my_data:<version>

* Het rechtstreeks gebruiken van Azure Storage wordt niet aanbevolen voor invoer, omdat er mogelijk extra identiteitsconfiguratie nodig is om de gegevens te lezen. Het is beter om Azure Machine Learning-gegevensopslagpaden te gebruiken, die worden ondersteund in verschillende typen pijplijntaken.

Invoer- en uitvoermodi voor gegevenstypen

Voor invoer en uitvoer van gegevenstypen kunt u kiezen uit verschillende download-, upload- en koppelmodi om te bepalen hoe het rekendoel toegang heeft tot gegevens. In de volgende tabel ziet u de ondersteunde modi voor verschillende typen invoer en uitvoer.

Type upload download ro_mount rw_mount direct eval_download eval_mount
uri_folder invoer
uri_file invoer
mltable invoer
uri_folder uitvoer
uri_file uitvoer
mltable uitvoer

De ro_mount of rw_mount modi worden aanbevolen voor de meeste gevallen. Zie Modi voor meer informatie.

Invoer en uitvoer in pijplijngrafieken

Op de pagina pijplijntaak in Azure Machine Learning-studio worden onderdeelinvoer en -uitvoer weergegeven als kleine cirkels met de naam invoer-/uitvoerpoorten. Deze poorten vertegenwoordigen de gegevensstroom in de pijplijn. Uitvoer op pijplijnniveau wordt weergegeven in paarse vakken voor eenvoudige identificatie.

In de volgende schermopname van de pijplijngrafiek nyc taxigegevens worden veel onderdelen en pijplijninvoer en -uitvoer weergegeven.

Schermopname met de pijplijninvoer- en uitvoerpoorten gemarkeerd.

Wanneer u de muisaanwijzer boven een invoer-/uitvoerpoort houdt, wordt het type weergegeven.

Schermopname waarin het poorttype wordt gemarkeerd wanneer u de muisaanwijzer over de poort beweegt.

In de pijplijngrafiek worden geen primitieve invoertypen weergegeven. Deze invoer wordt weergegeven op het tabblad Instellingen van het overzichtsvenster van de pijplijntaak voor invoer op pijplijnniveau of het onderdeelpaneel voor invoer op onderdeelniveau. Als u het onderdeelpaneel wilt openen, dubbelklikt u op het onderdeel in de grafiek.

Schermopname waarin het deelvenster met taakoverzichtsinstellingen wordt gemarkeerd.

Wanneer u een pijplijn bewerkt in studio Designer, bevinden pijplijninvoer en -uitvoer zich in het deelvenster Pijplijninterface en bevinden de invoer en uitvoer van onderdelen zich in het onderdeelpaneel.

Schermopname van de pijplijninterface in Designer.

Niveau van onderdeelinvoer/uitvoer verhogen naar pijplijnniveau

Door de invoer/uitvoer van een onderdeel te promoveren naar het pijplijnniveau, kunt u de invoer/uitvoer van het onderdeel overschrijven wanneer u een pijplijntaak verzendt. Deze mogelijkheid is vooral handig voor het activeren van pijplijnen met behulp van REST-eindpunten.

In de volgende voorbeelden ziet u hoe u invoer/uitvoer op onderdeelniveau promoveert naar invoer/uitvoer op pijplijnniveau.

De volgende pijplijn bevordert drie invoer en drie uitvoerwaarden naar het pijplijnniveau. Is bijvoorbeeld pipeline_job_training_max_epocs invoer op pijplijnniveau, omdat deze wordt gedeclareerd onder de inputs sectie op het hoofdniveau.

Onder train_job in de jobs sectie wordt naar de benoemde max_epocs invoer verwezen als ${{parent.inputs.pipeline_job_training_max_epocs}}, wat betekent dat de invoer van het train_jobmax_epocs pijplijnniveau verwijst naar de invoer op pijplijnniveaupipeline_job_training_max_epocs. Pijplijnuitvoer wordt gepromoveerd met hetzelfde schema.

$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}}

U vindt het volledige voorbeeld in de pijplijn train-score-eval met geregistreerde onderdelen in de opslagplaats met Voorbeelden van Azure Machine Learning .

Optionele invoer definiëren

Standaard zijn alle invoer vereist en moeten ze een standaardwaarde hebben of elke keer dat u een pijplijntaak verzendt, een waarde toewijzen. U kunt echter een optionele invoer definiëren.

Notitie

Optionele uitvoer wordt niet ondersteund.

Het instellen van optionele invoer kan nuttig zijn in twee scenario's:

  • Als u een optionele invoer voor gegevens/modeltypen definieert en er geen waarde aan toewijst wanneer u de pijplijntaak verzendt, ontbreekt het pijplijnonderdeel aan die gegevensafhankelijkheid. Als de invoerpoort van het onderdeel niet is gekoppeld aan een onderdeel- of gegevens-/modelknooppunt, roept de pijplijn het onderdeel rechtstreeks aan in plaats van te wachten op een voorgaande afhankelijkheid.

  • Als u voor de pijplijn instelt continue_on_step_failure = True , maar node2 de vereiste invoer van node1de pijplijn gebruikt, node2 wordt deze niet uitgevoerd als node1 dit mislukt. Als node1 invoer optioneel is, wordt deze uitgevoerd, node2 zelfs als node1 dit mislukt. In de volgende grafiek ziet u dit scenario.

    Schermopname van de indelingslogica van optionele invoer en doorgaan met mislukken.

In het volgende codevoorbeeld ziet u hoe u optionele invoer definieert. Wanneer de invoer is ingesteld als optional = true, moet u de $[[]] opdrachtregelinvoer omhelzen, zoals in de gemarkeerde regels van het voorbeeld.

$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
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.5/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}}

Uitvoerpaden aanpassen

Standaard wordt onderdeeluitvoer opgeslagen in de {default_datastore} uitvoer die u voor de pijplijn hebt ingesteld. azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}} Als dit niet is ingesteld, is de standaardwaarde de blobopslag van de werkruimte.

De taak {name} wordt opgelost tijdens de uitvoering van de taak en {output_name} is de naam die u hebt gedefinieerd in de YAML van het onderdeel. U kunt aanpassen waar de uitvoer moet worden opgeslagen door een uitvoerpad te definiëren.

Het pipeline.yml-bestand bij de pijplijn train-score-eval met geregistreerde onderdelen definieert een pijplijn met drie uitvoer op pijplijnniveau. U kunt de volgende opdracht gebruiken om aangepaste uitvoerpaden in te stellen voor de pipeline_job_trained_model uitvoer.

# 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  

Uitvoer downloaden

U kunt uitvoer downloaden op pijplijn- of onderdeelniveau.

Uitvoer op pijplijnniveau downloaden

U kunt alle uitvoer van een taak downloaden of een specifieke uitvoer downloaden.

# 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 a specific output
az ml job download --output-name <OUTPUT_PORT_NAME> -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

Uitvoer van onderdelen downloaden

Als u de uitvoer van een onderliggend onderdeel wilt downloaden, moet u eerst alle onderliggende taken van een pijplijntaak weergeven en vervolgens vergelijkbare code gebruiken om de uitvoer te downloaden.

# 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 the desired child job name to download output
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

Uitvoer registreren als een benoemde asset

U kunt de uitvoer van een onderdeel of pijplijn registreren als een benoemde asset door een name en version aan de uitvoer toe te wijzen. De geregistreerde asset kan worden vermeld in uw werkruimte via de gebruikersinterface van studio, CLI of SDK en kan worden verwezen in toekomstige werkruimtetaken.

Uitvoer op pijplijnniveau registreren

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

Uitvoer van onderdeel registreren

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