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.
Powiązane dokumenty
Aby uzyskać więcej informacji, zobacz dokumentację tutaj: