Dela via


Hantera indata och utdata för komponent och pipeline

I den här artikeln lär du dig:

  • Översikt över indata och utdata i komponent och pipeline
  • Så här höjer du upp komponentindata/utdata till pipelineindata/utdata
  • Definiera valfria indata
  • Så här anpassar du sökvägen för utdata
  • Så här laddar du ned utdata
  • Så här registrerar du utdata som namngiven tillgång

Översikt över indata och utdata

Azure Mašinsko učenje-pipelines stöder indata och utdata på både komponent- och pipelinenivå.

På komponentnivå definierar indata och utdata gränssnittet för en komponent. Utdata från en komponent kan användas som indata för en annan komponent i samma överordnade pipeline, vilket gör att data eller modeller kan skickas mellan komponenter. Den här sammanlänkningen utgör ett diagram som illustrerar dataflödet i pipelinen.

På pipelinenivå är indata och utdata användbara för att skicka pipelinejobb med varierande dataindata eller parametrar som styr träningslogik (till exempel learning_rate). De är särskilt användbara när du anropar pipelinen via en REST-slutpunkt. Med dessa indata och utdata kan du tilldela olika värden till pipelineindata eller komma åt utdata från pipelinejobb via REST-slutpunkten. Mer information finns i Skapa jobb och indata för Batch-slutpunkt.

Typer av indata och utdata

Följande typer stöds som utdata från en komponent eller en pipeline.

Användning av data- eller modellutdata serialiserar utdata och sparar dem som filer på en lagringsplats. I efterföljande steg kan den här lagringsplatsen monteras, laddas ned eller laddas upp till filsystemet för beräkningsmål, vilket gör att nästa steg kan komma åt filerna under jobbkörningen.

Den här processen kräver att komponentens källkod serialiserar det önskade utdataobjektet , vanligtvis lagrat i minnet, till filer. Du kan till exempel serialisera en Pandas-dataram som en CSV-fil. Observera att Azure Mašinsko učenje inte definierar några standardiserade metoder för objektserialisering. Som användare har du flexibiliteten att välja önskad metod för att serialisera objekt till filer. Därefter kan du i den underordnade komponenten deserialisera och läsa dessa filer separat. Här är några exempel på din referens:

  • I det nyc_taxi_data_regression exemplet har förberedelsekomponenten enuri_folder typutdata. I komponentens källkod läser den csv-filerna från indatamappen, bearbetar filerna och skriver bearbetade CSV-filer till utdatamappen.
  • I det nyc_taxi_data_regression exemplet har träningskomponenten en mlflow_model typutdata. I komponentens källkod sparar den tränade modellen med hjälp av mlflow.sklearn.save_model metoden.

Förutom ovanstående data- eller modelltyper kan pipeline- eller komponentindata också följa primitiva typer.

  • string
  • number
  • integer
  • boolean

I det nyc_taxi_data_regression exemplet har träningskomponenten en number indata med namnet test_split_ratio.

Kommentar

Primitiva typer av utdata stöds inte.

Sökväg och läge för dataindata/utdata

För indata/utdata för datatillgången måste du ange en path parameter som pekar på dataplatsen. Den här tabellen visar de olika dataplatser som Azure Mašinsko učenje pipeline stöder och visar även sökvägsparameterexempel:

Plats Exempel Indata Utdata
En sökväg på den lokala datorn ./home/username/data/my_data
En sökväg på en offentlig http-server https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
En sökväg i Azure Storage wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Inte föreslaget eftersom det kan behöva extra identitetskonfiguration för att läsa data.
En sökväg på en Azure Mašinsko učenje Datastore azureml://datastores/<data_store_name>/paths/<path>
En sökväg till en datatillgång azureml:<my_data>:<version>

Kommentar

För indata/utdata på lagring rekommenderar vi starkt att du använder Azure Mašinsko učenje datalagersökväg i stället för direkt Azure Storage-sökväg. Datalagersökvägen stöds för olika jobbtyper i pipeline.

För indata/utdata kan du välja mellan olika lägen (ladda ned, montera eller ladda upp) för att definiera hur data ska nås i beräkningsmålet. Den här tabellen visar möjliga lägen för olika kombinationer av typ/läge/indata/utdata.

Typ Indata/utdata upload download ro_mount rw_mount direct eval_download eval_mount
uri_folder Indata
uri_file Indata
mltable Indata
uri_folder Utdata
uri_file Utdata
mltable Utdata

Kommentar

I de flesta fall rekommenderar vi att du använder ro_mount eller rw_mount läge. Mer information om läget finns i datatillgångslägen.

Visuell representation i Azure Mašinsko učenje Studio

Följande skärmbilder ger ett exempel på hur indata och utdata visas i ett pipelinejobb i Azure Mašinsko učenje studio. Det här jobbet med namnet nyc-taxi-data-regression, finns i azureml-example.

På pipelinejobbsidan i studio visas data/modelltypen indata/utdata för en komponent som en liten cirkel i motsvarande komponent, som kallas indata-/utdataporten. Dessa portar representerar dataflödet i en pipeline.

Utdata på pipelinenivå visas som en lila ruta för enkel identifiering.

Skärmbild som markerar pipelinens indata- och utdataport.

När du håller muspekaren på en in-/utdataport visas typen.

Skärmbild som markerar porttypen när du hovrar musen.

Indata av primitiv typ visas inte i diagrammet. Den finns på fliken Inställningar i översiktspanelen för pipelinejobb (för indata på pipelinenivå) eller komponentpanelen (för indata på komponentnivå). Följande skärmbild visar fliken Inställningar för ett pipelinejobb. Den kan öppnas genom att välja länken Jobböversikt .

Om du vill kontrollera indata för en komponent dubbelklickar du på komponenten för att öppna komponentpanelen.

Skärmbild som markerar inställningspanelen för jobböversikten.

När du redigerar en pipeline i designern hittar du på samma sätt pipelineindata och utdata i panelen Pipeline-gränssnitt och komponentens indata och utdata i komponentens panel (utlösare genom att dubbelklicka på komponenten).

Skärmbild som markerar pipelinegränssnittet i designern.

Så här höjer du upp komponentindata och utdata till pipelinenivå

När du befordrar en komponents indata/utdata till pipelinenivå kan du skriva över komponentens indata/utdata när du skickar ett pipelinejobb. Det är också användbart om du vill utlösa pipelinen med hjälp av REST-slutpunkten.

Här följer exempel för att höja upp komponentindata/utdata till indata/utdata på pipelinenivå.

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

Det fullständiga exemplet finns i pipelinen train-score-eval med registrerade komponenter. Den här pipelinen höjer upp tre indata och tre utdata till pipelinenivå. Låt oss ta pipeline_job_training_max_epocs som exempel. Det deklareras under inputs avsnittet på rotnivån, vilket innebär att det är indata på pipelinenivå. Under jobs -> train_job avsnittet refereras indata med namnet max_epocs som ${{parent.inputs.pipeline_job_training_max_epocs}}, vilket anger train_job"s-indata max_epocs refererar till pipelinenivåindata pipeline_job_training_max_epocs. På samma sätt kan du höja upp pipelineutdata med samma schema.

Studio

Du kan höja upp en komponents indata till pipelinenivåindata på designredigeringssidan. Gå till komponentens inställningspanel genom att dubbelklicka på komponenten –> leta upp de indata som du vill höja upp –> Välj de tre punkterna till höger –> Välj Lägg till i pipelineindata.

Skärmbild som visar hur du höjer upp till pipelineindata i designern.

Valfria indata

Som standard krävs alla indata och måste tilldelas ett värde (eller ett standardvärde) varje gång du skickar ett pipelinejobb. Det kan dock finnas instanser där du behöver valfria indata. I sådana fall har du flexibiliteten att inte tilldela ett värde till indata när du skickar ett pipelinejobb.

Valfria indata kan vara användbara i följande två scenarier:

  • Om du har en valfri inmatning av data/modelltyp och inte tilldelar ett värde till den när du skickar pipelinejobbet, kommer det att finnas en komponent i pipelinen som saknar ett tidigare databeroende. Med andra ord är indataporten inte länkad till någon komponent eller data/modellnod. Detta gör att pipelinetjänsten anropar den här komponenten direkt i stället för att vänta på att det föregående beroendet ska vara klart.

  • Nedan visas ett tydligt exempel på det andra scenariot. Om du anger continue_on_step_failure = True för pipelinen och har en andra nod (node2) som använder utdata från den första noden (nod1) som valfri indata, körs node2 fortfarande även om node1 misslyckas. Men om node2 använder nödvändiga indata från node1 körs den inte om node1 misslyckas.

    Skärmbild för att visa orkestreringslogik för valfria indata och fortsätta vid fel.

Här följer exempel på hur du definierar valfria indata.

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

När indata anges som optional = truemåste du använda $[[]] för att omfamna kommandoraden med indata. Se markerad rad i exemplet ovan.

Kommentar

Valfria utdata stöds inte.

I pipelinediagrammet representeras valfria indata av data-/modelltypen av en prickad cirkel. Valfria indata för primitiva typer kan finnas under fliken Inställningar . Till skillnad från obligatoriska indata har valfria indata inte någon asterisk bredvid sig, vilket betyder att de inte är obligatoriska.

Skärmbild som markerar de valfria indata.

Så här anpassar du utdatasökvägen

Som standard lagras utdata för en komponent i azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}. {default_datastore} är standardkunduppsättningen för datalager för pipelinen. Om den inte har angetts är det bloblagring för arbetsytor. {name} är jobbnamnet, som kommer att matchas vid jobbkörningen. {output_name} är det utdatanamn som kunden har definierat i komponenten YAML.

Men du kan också anpassa var utdata ska lagras genom att definiera sökvägen för utdata. Följande är exempel:

pipeline.yaml Definierar en pipeline som har tre utdata på pipelinenivå. Fullständig YAML finns i pipelinen train-score-eval med exempel på registrerade komponenter. Du kan använda följande kommando för att ange en anpassad utdatasökväg för pipeline_job_trained_modelutdata.

# 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  

Så här laddar du ned utdata

Du kan ladda ned en komponents utdata eller pipelineutdata enligt exemplet nedan.

Ladda ned utdata på pipelinenivå

# 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>

Ladda ned underordnat jobbs utdata

När du behöver ladda ned utdata från ett underordnat jobb (ett komponentutdata som inte höjs upp till pipelinenivå) bör du först lista alla underordnade jobbentiteter för ett pipelinejobb och sedan använda liknande kod för att ladda ned utdata.

# 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>

Registrera utdata som namngiven tillgång

Du kan registrera utdata för en komponent eller pipeline som namngiven tillgång genom att name tilldela och version till utdata. Den registrerade tillgången kan vara en lista på din arbetsyta via Studio UI/CLI/SDK och även refereras till i dina framtida jobb.

Registrera pipelineutdata

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

Registrera ett underordnat jobbs utdata

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

Nästa steg