Udostępnij za pośrednictwem


Uaktualnianie potoków do zestawu SDK w wersji 2

W zestawie SDK w wersji 2 "potoki" są konsolidowane w zadaniach.

Zadanie ma typ. Większość zadań to zadania poleceń, które uruchamiają element command, na przykład python main.py. To, co działa w zadaniu, jest niezależne od dowolnego języka programowania, więc można uruchamiać bash skrypty, wywoływać python interpretery, uruchamiać kilka curl poleceń lub cokolwiek innego.

A pipeline to inny typ zadania, który definiuje zadania podrzędne, które mogą mieć relacje wejściowe/wyjściowe, tworząc skierowany graf acykliczny (DAG).

Aby przeprowadzić uaktualnienie, musisz zmienić kod na potrzeby definiowania i przesyłania potoków do zestawu SDK w wersji 2. To, co jest uruchamiane w zadaniu podrzędnym, nie musi być uaktualnione do zestawu SDK w wersji 2. Zaleca się jednak usunięcie dowolnego kodu specyficznego dla usługi Azure Machine Learning ze skryptów trenowania modelu. Ta separacja umożliwia łatwiejsze przejście między środowiskiem lokalnym a chmurą i jest uważane za najlepsze rozwiązanie dla dojrzałych metodyki MLOps. W praktyce oznacza to usunięcie azureml.* wierszy kodu. Kod rejestrowania i śledzenia modelu należy zastąpić biblioteką MLflow. Aby uzyskać więcej informacji, zobacz jak używać biblioteki MLflow w wersji 2.

W tym artykule przedstawiono porównanie scenariuszy w zestawie SDK w wersji 1 i zestawu SDK w wersji 2. W poniższych przykładach utworzymy trzy kroki (trenowanie, ocenianie i ocenianie) w fikcyjnym zadaniu potoku. Pokazuje to, jak tworzyć zadania potoku przy użyciu zestawu SDK w wersji 1 i zestawu SDK w wersji 2 oraz jak korzystać z danych i przesyłać dane między krokami.

Uruchamianie potoku

  • Zestaw SDK w wersji 1

    # import required libraries
    import os
    import azureml.core
    from azureml.core import (
        Workspace,
        Dataset,
        Datastore,
        ComputeTarget,
        Experiment,
        ScriptRunConfig,
    )
    from azureml.pipeline.steps import PythonScriptStep
    from azureml.pipeline.core import Pipeline
    
    # check core SDK version number
    print("Azure Machine Learning SDK Version: ", azureml.core.VERSION)
    
    # load workspace
    workspace = Workspace.from_config()
    print(
        "Workspace name: " + workspace.name,
        "Azure region: " + workspace.location,
        "Subscription id: " + workspace.subscription_id,
        "Resource group: " + workspace.resource_group,
        sep="\n",
    )
    
    # create an ML experiment
    experiment = Experiment(workspace=workspace, name="train_score_eval_pipeline")
    
    # create a directory
    script_folder = "./src"
    
    # create compute
    from azureml.core.compute import ComputeTarget, AmlCompute
    from azureml.core.compute_target import ComputeTargetException
    
    # Choose a name for your CPU cluster
    amlcompute_cluster_name = "cpu-cluster"
    
    # Verify that cluster does not exist already
    try:
        aml_compute = ComputeTarget(workspace=workspace, name=amlcompute_cluster_name)
        print('Found existing cluster, use it.')
    except ComputeTargetException:
        compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_DS12_V2',
                                                               max_nodes=4)
        aml_compute = ComputeTarget.create(ws, amlcompute_cluster_name, compute_config)
    
    aml_compute.wait_for_completion(show_output=True)
    
    # define data set
    data_urls = ["wasbs://demo@dprepdata.blob.core.windows.net/Titanic.csv"]
    input_ds = Dataset.File.from_files(data_urls)
    
    # define steps in pipeline
    from azureml.data import OutputFileDatasetConfig
    model_output = OutputFileDatasetConfig('model_output')
    train_step = PythonScriptStep(
        name="train step",
        script_name="train.py",
        arguments=['--training_data', input_ds.as_named_input('training_data').as_mount() ,'--max_epocs', 5, '--learning_rate', 0.1,'--model_output', model_output],
        source_directory=script_folder,
        compute_target=aml_compute,
        allow_reuse=True,
    )
    
    score_output = OutputFileDatasetConfig('score_output')
    score_step = PythonScriptStep(
        name="score step",
        script_name="score.py",
        arguments=['--model_input',model_output.as_input('model_input'), '--test_data', input_ds.as_named_input('test_data').as_mount(), '--score_output', score_output],
        source_directory=script_folder,
        compute_target=aml_compute,
        allow_reuse=True,
    )
    
    eval_output = OutputFileDatasetConfig('eval_output')
    eval_step = PythonScriptStep(
        name="eval step",
        script_name="eval.py",
        arguments=['--scoring_result',score_output.as_input('scoring_result'), '--eval_output', eval_output],
        source_directory=script_folder,
        compute_target=aml_compute,
        allow_reuse=True,
    )
    
    # built pipeline
    from azureml.pipeline.core import Pipeline
    
    pipeline_steps = [train_step, score_step, eval_step]
    
    pipeline = Pipeline(workspace = workspace, steps=pipeline_steps)
    print("Pipeline is built.")
    
    pipeline_run = experiment.submit(pipeline, regenerate_outputs=False)
    
    print("Pipeline submitted for execution.")
    
    
  • Zestaw SDK w wersji 2. Pełny link przykładowy

    # import required libraries
    from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential
    
    from azure.ai.ml import MLClient, Input
    from azure.ai.ml.dsl import pipeline
    
    try:
        credential = DefaultAzureCredential()
        # Check if given credential can get token successfully.
        credential.get_token("https://management.azure.com/.default")
    except Exception as ex:
        # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work
        credential = InteractiveBrowserCredential()
    
    # Get a handle to workspace
    ml_client = MLClient.from_config(credential=credential)
    
    # Retrieve an already attached Azure Machine Learning Compute.
    cluster_name = "cpu-cluster"
    print(ml_client.compute.get(cluster_name))
    
    # Import components that are defined with Python function
    with open("src/components.py") as fin:
        print(fin.read())
    
    # You need to install mldesigner package to use command_component decorator.
    # Option 1: install directly
    # !pip install mldesigner
    
    # Option 2: install as an extra dependency of azure-ai-ml
    # !pip install azure-ai-ml[designer]
    
    # import the components as functions
    from src.components import train_model, score_data, eval_model
    
    cluster_name = "cpu-cluster"
    # define a pipeline with component
    @pipeline(default_compute=cluster_name)
    def pipeline_with_python_function_components(input_data, test_data, learning_rate):
        """E2E dummy train-score-eval pipeline with components defined via Python function components"""
    
        # Call component obj as function: apply given inputs & parameters to create a node in pipeline
        train_with_sample_data = train_model(
            training_data=input_data, max_epochs=5, learning_rate=learning_rate
        )
    
        score_with_sample_data = score_data(
            model_input=train_with_sample_data.outputs.model_output, test_data=test_data
        )
    
        eval_with_sample_data = eval_model(
            scoring_result=score_with_sample_data.outputs.score_output
        )
    
        # Return: pipeline outputs
        return {
            "eval_output": eval_with_sample_data.outputs.eval_output,
            "model_output": train_with_sample_data.outputs.model_output,
        }
    
    
    pipeline_job = pipeline_with_python_function_components(
        input_data=Input(
            path="wasbs://demo@dprepdata.blob.core.windows.net/Titanic.csv", type="uri_file"
        ),
        test_data=Input(
            path="wasbs://demo@dprepdata.blob.core.windows.net/Titanic.csv", type="uri_file"
        ),
        learning_rate=0.1,
    )
    
    # submit job to workspace
    pipeline_job = ml_client.jobs.create_or_update(
        pipeline_job, experiment_name="train_score_eval_pipeline"
    )
    

Mapowanie kluczowych funkcji zestawu SDK w wersji 1 i zestawu SDK w wersji 2

Funkcje w zestawie SDK w wersji 1 Przybliżone mapowanie w zestawie SDK w wersji 2
azureml.pipeline.core.Pipeline azure.ai.ml.dsl.pipeline
OutputDatasetConfig Wyjście
as_mount zestawu danych Dane wejściowe
StepSequence Zależność danych

Mapowanie typu kroku i zadania/składnika

krok w zestawie SDK w wersji 1 typ zadania w zestawie SDK w wersji 2 typ składnika w zestawie SDK w wersji 2
adla_step Brak Brak
automl_step automl zadanie automl cm6long
azurebatch_step Brak Brak
command_step command zadanie command składnik
data_transfer_step Brak None
databricks_step None Brak
estimator_step command zadanie command składnik
hyper_drive_step sweep zadanie Brak
kusto_step None None
module_step Brak command składnik
mpi_step command zadanie command składnik
parallel_run_step Parallel zadanie Parallel cm6long
python_script_step command zadanie command składnik
r_script_step command zadanie command składnik
synapse_spark_step spark zadanie spark składnik

Opublikowane potoki

Po uruchomieniu potoku możesz opublikować potok, aby był uruchamiany z różnymi danymi wejściowymi. To było nazywane opublikowanymi potokami. Punkt końcowy usługi Batch proponuje podobny jeszcze bardziej zaawansowany sposób obsługi wielu zasobów działających w ramach trwałego interfejsu API, dlatego funkcja opublikowanych potoków została przeniesiona do wdrożeń składników potoku w punktach końcowych wsadowych.

Punkty końcowe usługi Batch rozdziela interfejs (punkt końcowy) z rzeczywistej implementacji (wdrożenia) i umożliwiają użytkownikowi podjęcie decyzji, które wdrożenie obsługuje domyślną implementację punktu końcowego. Wdrożenia składników potoku w punktach końcowych wsadowych umożliwiają użytkownikom wdrażanie składników potoku zamiast potoków, co ułatwia korzystanie z zasobów wielokrotnego użytku dla tych organizacji, które chcą usprawnić praktykę uczenia maszynowego.

W poniższej tabeli przedstawiono porównanie poszczególnych pojęć:

Pojęcie Zestaw SDK w wersji 1 Zestaw SDK w wersji 2
Punkt końcowy REST potoku na potrzeby wywołania Punkt końcowy potoku Punkt końcowy usługi Batch
Określona wersja potoku w punkcie końcowym Opublikowany potok Wdrożenie składnika potoku
Argumenty potoku dotyczące wywołania Parametr potoku Dane wejściowe zadania
Zadanie wygenerowane na podstawie opublikowanego potoku Zadanie potoku Zadanie przetwarzania wsadowego

Zobacz Uaktualnianie punktów końcowych potoku do zestawu SDK w wersji 2 , aby uzyskać szczegółowe wskazówki dotyczące sposobu migracji do punktów końcowych wsadowych.

Aby uzyskać więcej informacji, zobacz dokumentację tutaj: