Upgrade kanálů na sadu SDK v2

V sadě SDK v2 se kanály konsolidují do úloh.

Úloha má typ. Většina úloh je příkazových úloh, které spouští například commandpython main.py. Co se spouští v úloze, je nezávislé na libovolném programovacím jazyce, takže můžete spouštět bash skripty, vyvolávat python interprety, spouštět spoustu curl příkazů nebo cokoli jiného.

A pipeline je dalším typem úlohy, která definuje podřízené úlohy, které můžou mít relace vstupu a výstupu, což tvoří směrovaný acyklický graf (DAG).

Pokud chcete upgradovat, budete muset změnit kód pro definování a odeslání kanálů do sady SDK v2. To, co spouštíte v rámci podřízené úlohy, není potřeba upgradovat na sadu SDK v2. Z trénovacích skriptů modelu se ale doporučuje odebrat veškerý kód specifický pro azure machine Učení. Toto oddělení umožňuje snadnější přechod mezi místním prostředím a cloudem a považuje se za osvědčený postup pro vyspělé MLOps. V praxi to znamená odebrání azureml.* řádků kódu. Protokolování modelu a kód pro sledování by se měl nahradit MLflow. Další informace najdete v tématu použití MLflow v2.

Tento článek poskytuje porovnání scénářů v sadě SDK v1 a SDK v2. V následujících příkladech vytvoříme tři kroky (trénování, skóre a vyhodnocení) do fiktivní úlohy kanálu. Ukazuje, jak sestavit úlohy kanálu pomocí sady SDK v1 a SDK v2 a jak využívat data a přenášet data mezi kroky.

Spuštění kanálu

  • Sada SDK v1

    # 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.")
    
    
  • SDK v2. Úplný ukázkový odkaz

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

Mapování klíčových funkcí v sadě SDK v1 a SDK v2

Funkce v sadě SDK v1 Přibližné mapování v sadě SDK v2
azureml.pipeline.core.Pipeline azure.ai.ml.dsl.pipeline
OutputDatasetConfig Výstup
as_mount datové sady Vstup

Krok a úloha / mapování typu komponenty

krok v sadě SDK v1 typ úlohy v sadě SDK v2 typ komponenty v sadě SDK v2
adla_step Nic Nic
automl_step automl Úlohy automl Komponenty
azurebatch_step Nic Nic
command_step command Úlohy command Komponenty
data_transfer_step Nic Žádné
databricks_step Žádné Nic
estimator_step command Úlohy command Komponenty
hyper_drive_step sweep Úlohy Nic
kusto_step Žádné Žádné
module_step Nic command Komponenty
mpi_step command Úlohy command Komponenty
parallel_run_step Parallel Úlohy Parallel Komponenty
python_script_step command Úlohy command Komponenty
r_script_step command Úlohy command Komponenty
synapse_spark_step spark Úlohy spark Komponenty

Publikované kanály

Jakmile máte kanál spuštěný a spuštěný, můžete kanál publikovat tak, aby běžel s různými vstupy. To se označuje jako publikované kanály. Koncový bod batch navrhuje podobný ještě výkonnější způsob, jak zpracovat více prostředků spuštěných v odolném rozhraní API, což je důvod, proč se funkce publikovaných kanálů přesunula do nasazení součástí kanálu v dávkových koncových bodech.

Koncové body služby Batch oddělují rozhraní (koncový bod) od skutečné implementace (nasazení) a umožňují uživateli rozhodnout, které nasazení bude sloužit jako výchozí implementace koncového bodu. Nasazení součástí kanálu v dávkových koncových bodech umožňují uživatelům nasazovat součásti kanálu místo kanálů, což umožňuje lepší využití opakovaně použitelných prostředků pro tyto organizace, které chtějí zjednodušit své postupy MLOps.

Následující tabulka ukazuje porovnání jednotlivých konceptů:

Koncepce Sada SDK v1 SDK v2
Koncový bod REST kanálu pro vyvolání Koncový bod kanálu Koncový bod služby Batch
Konkrétní verze kanálu v rámci koncového bodu Publikovaný kanál Nasazení součásti kanálu
Argumenty kanálu při vyvolání Parametr kanálu Vstupy úloh
Úloha vygenerovaná z publikovaného kanálu Úloha kanálu Dávková úloha

Konkrétní pokyny k migraci na dávkové koncové body najdete v tématu Upgrade koncových bodů kanálu na sadu SDK v2 .

Další informace najdete v této dokumentaci: