Sdílet prostřednictvím


Trénování modelů na bezserverových výpočetních prostředcích

PLATÍ PRO:Rozšíření Azure CLI ml v2 (aktuální)Python SDK azure-ai-ml v2 (aktuální)

Pro trénování modelu škálovatelným způsobem nemusíte vytvářet a spravovat výpočetní prostředky . Místo toho můžete úlohu odeslat do cílového typu výpočetního objektu označovaného jako bezserverové výpočetní prostředky. Bezserverové výpočetní prostředí je nejjednodušší způsob spouštění trénovacích úloh ve službě Azure Machine Learning. Bezserverové výpočetní prostředky jsou plně spravované výpočetní prostředky na vyžádání. Azure Machine Learning vytváří, škáluje a spravuje výpočetní prostředky za vás. Když k trénování modelů používáte bezserverové výpočetní prostředky, můžete se zaměřit na vytváření modelů strojového učení a nemusíte se učit o výpočetní infrastruktuře ani jeho nastavení.

Můžete zadat prostředky, které úloha potřebuje. Azure Machine Learning spravuje výpočetní infrastrukturu a poskytuje spravovanou izolaci sítě, což snižuje zátěž za vás.

Podniky mohou také snížit náklady zadáním optimálních prostředků pro každou úlohu. Správci IT můžou dál používat řízení zadáním kvóty jader na úrovni předplatného a pracovního prostoru a použitím zásad Azure.

Bezserverové výpočetní prostředky můžete použít k vyladění modelů v katalogu modelů. Můžete ho použít ke spouštění všech typů úloh pomocí nástroje Azure Machine Learning Studio, sady Python SDK a Azure CLI. Bezserverové výpočetní prostředky můžete také použít k vytváření imagí prostředí a pro zodpovědné scénáře řídicího panelu AI. Bezserverové úlohy využívají stejnou kvótu jako výpočetní kvóta služby Azure Machine Learning. Můžete zvolit standardní (vyhrazenou) úroveň nebo spotové virtuální počítače (s nízkou prioritou). Spravovaná identita a identita uživatele se podporují pro úlohy bez serveru. Fakturační model je stejný jako model pro výpočetní prostředí Azure Machine Learning.

Požadavky


  • Požadavky na role: K odesílání úloh potřebujete alespoň roli přispěvatele nebo datového vědce Azure ML v pracovním prostoru.

Odeslání první úlohy bez serveru

Následující příklad ukazuje minimální úlohu příkazu, která běží na bezserverovém výpočetním prostředí. Když parametr vynecháte compute , úloha automaticky používá bezserverové výpočetní prostředky.

from azure.ai.ml import command, MLClient
from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential

# Initialize the ML client
try:
    credential = DefaultAzureCredential()
    credential.get_token("https://management.azure.com/.default")
except Exception:
    credential = InteractiveBrowserCredential()
ml_client = MLClient(
    credential=credential,
    subscription_id="<Azure-subscription-ID>",
    resource_group_name="<Azure-resource-group>",
    workspace_name="<Azure-Machine-Learning-workspace>",
)

# Create a simple command job - omitting 'compute' uses serverless
job = command(
    command="echo 'hello world'",
    environment="azureml://registries/azureml/environments/sklearn-1.5/labels/latest",
)

# Submit the job
returned_job = ml_client.create_or_update(job)
print(f"Job submitted: {returned_job.name}")

Očekávaný výstup: Úloha se vytvoří a vrátí objekt úlohy se stavem NotStarted nebo Starting. Monitorování průběhu v nástroji Azure ML Studio nebo voláním ml_client.jobs.get(returned_job.name).

Reference:command function | MLClient

Výhody bezserverového výpočetního prostředí

  • Azure Machine Learning spravuje vytváření, nastavování, škálování, odstraňování a opravy výpočetní infrastruktury za účelem snížení režie na správu.
  • Nemusíte se učit o výpočetních prostředcích, různých typech výpočetních prostředků ani souvisejících vlastnostech.
  • Nemusíte opakovaně vytvářet clustery pro každou velikost virtuálního počítače, kterou potřebujete, pomocí stejného nastavení a replikovat pro každý pracovní prostor.
  • Náklady můžete optimalizovat zadáním přesných prostředků, které každá úloha potřebuje za běhu pro typ instance (velikost virtuálního počítače) a počet instancí. Můžete také monitorovat metriky využití úlohy za účelem optimalizace prostředků, které úloha potřebuje.
  • Ke spuštění úlohy je potřeba méně kroků.
  • Pokud chcete zjednodušit odesílání úloh, můžete úplně vynechat prostředky. Azure Machine Learning nastaví výchozí počet instancí a zvolí typ instance tak, že vezme v úvahu faktory, jako je kvóta, náklady, výkon a velikost disku.
  • V některých scénářích se doba čekání před spuštěním úloh sníží.
  • Pro odesílání úloh se podporuje identita uživatele a spravovaná identita přiřazená uživatelem pracovního prostoru.
  • Díky spravované síťové izolaci můžete zjednodušit a automatizovat konfiguraci izolace sítě. Podporují se také virtuální sítě zákazníka.
  • Řízení správy je dostupné prostřednictvím kvót a zásad Azure.

Jak používat bezserverové výpočetní prostředky

  • Při vytváření vlastního výpočetního clusteru použijete jeho název v úloze příkazu. Například: compute="cpu-cluster". Se serverless technologií můžete přeskočit vytvoření výpočetního clusteru a vynechat compute parametr a místo toho použít serverless výpočetní prostředky. Pokud compute není pro úlohu zadána, úloha běží na bezserverových výpočetních prostředcích. Vynecháte název výpočetních prostředků v úlohách Azure CLI nebo Python SDK pro použití bezserverového výpočetního prostředí v následujících typech úloh a volitelně uveďte prostředky, které úloha potřebuje pro počet instancí a typ instance:

    • Úlohy příkazů, včetně interaktivních úloh a distribuovaného trénování
    • Úlohy AutoML
    • Uklidit úlohy
    • Paralelní úlohy
  • Pro úlohy kanálu přes Azure CLI použijte default_compute: azureml:serverless jako výchozí výpočetní prostředky na úrovni kanálu. Pro úlohy pipeline prostřednictvím Python SDK použijte default_compute="serverless". Viz úloha Pipeline pro příklad.

  • Když odešlete trénovací úlohu v sadě Studio, vyberte jako typ výpočetního prostředí bez serveru .

  • Při použití návrháře služby Azure Machine Learning vyberte jako výchozí výpočetní prostředí bez serveru .

Důležité informace o výkonu

Bezserverové výpočetní prostředky můžou zvýšit rychlost trénování následujícími způsoby:

Vyhněte se nedostatečným chybám kvóty. Při vytváření vlastního výpočetního clusteru zodpovídáte za určení velikosti virtuálního počítače a počtu uzlů. Pokud při spuštění úlohy nemáte dostatečnou kvótu pro cluster, úloha selže. Bezserverové výpočetní prostředky ve výchozím nastavení používají informace o vaší kvótě k výběru odpovídající velikosti virtuálního počítače.

Optimalizace vertikálního snížení kapacity Při vertikálním snížení kapacity výpočetního clusteru musí nová úloha počkat na vertikální snížení kapacity clusteru a pak vertikálně navýšit kapacitu před spuštěním úlohy. S bezserverovými výpočetními prostředky nemusíte čekat na vertikální snížení kapacity. Vaše úloha může začít běžet na jiném clusteru nebo uzlu (za předpokladu, že máte kvótu).

Optimalizace zaneprázdněného clusteru Pokud úloha běží ve výpočetním clusteru a je odeslána další úloha, vaše úloha se zařadí do fronty za právě běžící úlohou. S bezserverovým výpočetním prostředím může vaše úloha začít běžet na jiném uzlu nebo clusteru (za předpokladu, že máte kvótu).

Kvóta

Při odesílání úlohy stále potřebujete dostatečnou kvótu výpočetních prostředků služby Azure Machine Learning pro pokračování (kvóta na úrovni pracovního prostoru i na úrovni předplatného). Na základě této kvóty se vybere výchozí velikost virtuálního počítače pro bezserverové úlohy. Pokud zadáte vlastní velikost nebo rodinu virtuálních počítačů:

  • Pokud máte určitou kvótu pro velikost nebo řadu virtuálních počítačů, ale nemáte dostatečnou kvótu pro počet instancí, zobrazí se chyba. Tato chyba doporučuje snížit počet instancí na platné číslo na základě limitu kvóty, požádat o navýšení kvóty pro řadu virtuálních počítačů nebo změnit velikost virtuálního počítače.
  • Pokud nemáte kvótu pro zadanou velikost virtuálního počítače, zobrazí se chyba. Tato chyba doporučuje vybrat jinou velikost virtuálního počítače, pro kterou máte kvótu nebo žádost o kvótu pro řadu virtuálních počítačů.
  • Pokud máte dostatečnou kvótu pro rodinu virtuálních počítačů ke spuštění bezserverové úlohy, ale jiné úlohy tuto kvótu využívají, zobrazí se zpráva s informací, že vaše úloha musí čekat ve frontě, dokud nebude kvóta k dispozici.

Když na webu Azure Portal zobrazíte využití a kvóty, zobrazí se bezserverová kvóta pro všechny kvóty spotřebované bezserverovými úlohami.

Podpora identit a předávání přihlašovacích údajů

Výpočetní prostředí bez serveru podporuje dvě možnosti identity pro přístup k úložišti a dalším prostředkům:

  • Předávání přihlašovacích údajů uživatele: Používá váš token ID Microsoft Entra. Nejvhodnější pro interaktivní vývoj a testování.
  • Spravovaná identita přiřazená uživatelem: Používá spravovanou identitu pracovního prostoru. Nejvhodnější pro produkční scénáře a automatizaci.
  • Předávání přihlašovacích údajů uživatele: Bezserverové výpočetní prostředky plně podporují předávání přihlašovacích údajů uživatele. Token uživatele, který odesílá úlohu, se používá pro přístup k úložišti. Tyto přihlašovací údaje pocházejí z ID Microsoft Entra.

    Bezserverové výpočetní prostředky nepodporují identitu přiřazenou systémem.

    from azure.ai.ml import command
    from azure.ai.ml import MLClient     # Handle to the workspace.
    from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential     # Authentication package.
    from azure.ai.ml.entities import UserIdentityConfiguration 
    
    try:
        credential = DefaultAzureCredential()
        credential.get_token("https://management.azure.com/.default")
    except Exception:
        credential = InteractiveBrowserCredential()
    # Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com.
    ml_client = MLClient(
        credential=credential,
        subscription_id="<Azure subscription ID>", 
        resource_group_name="<Azure resource group>",
        workspace_name="<Azure Machine Learning workspace>",
    )
    job = command(
        command="echo 'hello world'",
        environment="azureml://registries/azureml/environments/sklearn-1.5/labels/latest",
        identity=UserIdentityConfiguration(),
    )
    # Submit the command job.
    ml_client.create_or_update(job)
    

    Reference:UserIdentityConfiguration | funkce příkazu

  • Spravovaná identita přiřazená uživatelem: Pokud máte pracovní prostor nakonfigurovaný se spravovanou identitou přiřazenou uživatelem, můžete tuto identitu použít s bezserverovou úlohou pro přístup k úložišti. Informace o přístupu k tajným kódům najdete v tématu Použití tajných kódů přihlašovacích údajů ověřování v úlohách Azure Machine Learning.

  1. Ověřte konfiguraci identity pracovního prostoru.

    from azure.ai.ml import MLClient
    from azure.identity import DefaultAzureCredential
    
    subscription_id = "<your-subscription-id>"
    resource_group = "<your-resource-group>"
    workspace = "<your-workspace-name>"
    
    ml_client = MLClient(
        DefaultAzureCredential(),
        subscription_id,
        resource_group,
        workspace
    )
    
    # Get workspace details.
    ws = ml_client.workspaces.get(name=workspace)
    print(ws)
    
    

    Ve výstupu vyhledejte identitu přiřazenou uživatelem. Pokud chybí, vytvořte nový pracovní prostor se spravovanou identitou přiřazenou uživatelem podle pokynů v tématu Nastavení ověřování mezi Azure Machine Learning a dalšími službami.

  2. Ve své úloze použijte spravovanou identitu přiřazenou uživatelem.

    from azure.ai.ml import command
    from azure.ai.ml import MLClient     # Handle to the workspace.
    from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential    # Authentication package.
    from azure.ai.ml.entities import ManagedIdentityConfiguration
    
    try:
        credential = DefaultAzureCredential()
        credential.get_token("https://management.azure.com/.default")
    except Exception:
        credential = InteractiveBrowserCredential()
    # Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com.
    ml_client = MLClient(
        credential=credential,
        subscription_id="<Azure-subscription-ID>", 
        resource_group_name="<Azure-resource-group>",
        workspace_name="<Azure-Machine-Learning-workspace>",
    )
    job = command(
        command="echo 'hello world'",
        environment="azureml://registries/azureml/environments/sklearn-1.5/labels/latest",
        identity= ManagedIdentityConfiguration(client_id="<workspace-UAMI-client-ID>"),
    )
    # Submit the command job.
    ml_client.create_or_update(job)
    

Referenční informace:ManagedIdentityConfiguration

Konfigurace vlastností pro úlohy příkazů

Pokud není pro úlohy příkazů, prohledávání a AutoML zadané žádné cílové výpočetní prostředí, standardně se používají bezserverové výpočetní prostředky. Tady je příklad:

from azure.ai.ml import command 
from azure.ai.ml import MLClient # Handle to the workspace.
from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential # Authentication package.

try:
    credential = DefaultAzureCredential()
    credential.get_token("https://management.azure.com/.default")
except Exception:
    credential = InteractiveBrowserCredential()
# Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com.
ml_client = MLClient(
    credential=credential,
    subscription_id="<Azure-subscription-ID>", 
    resource_group_name="<Azure-resource-group>",
    workspace_name="<Azure-Machine-Learning-workspace>",
)
job = command(
    command="echo 'hello world'",
    environment="azureml://registries/azureml/environments/sklearn-1.5/labels/latest",
)
# Submit the command job.
ml_client.create_or_update(job)

Výchozí výpočetní prostředí je bezserverové výpočetní prostředí s následujícími funkcemi:

  • Jeden uzel pro tuto úlohu. Výchozí počet uzlů je založený na typu úlohy. Další typy úloh najdete v následujících částech.
  • Virtuální počítač s procesorem. Virtuální počítač se určuje na základě kvóty, výkonu, nákladů a velikosti disku.
  • Vyhrazené virtuální počítače.
  • Umístění pracovního prostoru

Tyto výchozí hodnoty můžete přepsat. Pokud chcete zadat typ virtuálního počítače nebo počet uzlů pro serverless computing, přidejte resources do konfigurace úlohy:

  • Slouží instance_type k výběru konkrétního virtuálního počítače. Tento parametr použijte, pokud chcete konkrétní velikost virtuálního počítače s procesorem nebo GPU.

  • Slouží instance_count k určení počtu uzlů.

    from azure.ai.ml import command 
    from azure.ai.ml import MLClient # Handle to the workspace.
    from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential # Authentication package.
    from azure.ai.ml.entities import JobResourceConfiguration 
    
    try:
        credential = DefaultAzureCredential()
        credential.get_token("https://management.azure.com/.default")
    except Exception:
        credential = InteractiveBrowserCredential()
    # Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com.
    ml_client = MLClient(
        credential=credential,
        subscription_id="<Azure-subscription-ID>", 
        resource_group_name="<Azure-resource-group>",
        workspace_name="<Azure-Machine-Learning-workspace>",
    )
    job = command(
        command="echo 'hello world'",
        environment="azureml://registries/azureml/environments/sklearn-1.5/labels/latest",
        resources = JobResourceConfiguration(instance_type="Standard_NC24", instance_count=4)
    )
    # Submit the command job.
    ml_client.create_or_update(job)
    

    Referenční informace:JobResourceConfiguration

  • Pokud chcete změnit úroveň úlohy, použijte queue_settings k výběru mezi vyhrazenými virtuálními počítači (job_tier: Standard) a virtuálními počítači s nízkou prioritou (job_tier: Spot).

    from azure.ai.ml import command
    from azure.ai.ml import MLClient    # Handle to the workspace.
    from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential    # Authentication package.
    try:
        credential = DefaultAzureCredential()
        credential.get_token("https://management.azure.com/.default")
    except Exception:
        credential = InteractiveBrowserCredential()
    # Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com.
    ml_client = MLClient(
        credential=credential,
        subscription_id="<Azure-subscription-ID>", 
        resource_group_name="<Azure-resource-group>",
        workspace_name="<Azure-Machine-Learning-workspace>",
    )
    job = command(
        command="echo 'hello world'",
        environment="azureml://registries/azureml/environments/sklearn-1.5/labels/latest",
        queue_settings={
          "job_tier": "Spot"  
        }
    )
    # Submit the command job.
    ml_client.create_or_update(job)
    

Příklad pro všechna pole s úlohami příkazů

Tady je příklad, který zobrazuje všechna zadaná pole, včetně identity, kterou má úloha použít. Nemusíte zadávat nastavení virtuální sítě, protože se automaticky používá izolace spravované sítě na úrovni pracovního prostoru.

from azure.ai.ml import command
from azure.ai.ml import MLClient      # Handle to the workspace.
from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential     # Authentication package.
from azure.ai.ml.entities import JobResourceConfiguration
from azure.ai.ml.entities import UserIdentityConfiguration 

try:
    credential = DefaultAzureCredential()
    credential.get_token("https://management.azure.com/.default")
except Exception:
    credential = InteractiveBrowserCredential()
# Get a handle to the workspace. You can find the info on the workspace tab on ml.azure.com.
ml_client = MLClient(
    credential=credential,
    subscription_id="<Azure-subscription-ID>", 
    resource_group_name="<Azure-resource-group>",
    workspace_name="<Azure-Machine-Learning-workspace>",
)
job = command(
    command="echo 'hello world'",
    environment="azureml://registries/azureml/environments/sklearn-1.5/labels/latest",
    identity=UserIdentityConfiguration(),
    queue_settings={
        "job_tier": "Standard"
    }
)
job.resources = JobResourceConfiguration(instance_type="Standard_E4s_v3", instance_count=1)
# Submit the command job.
ml_client.create_or_update(job)

Reference:JobResourceConfiguration | UserIdentityConfiguration | příkazová funkce

Tady jsou dva další příklady použití bezserverového výpočetního prostředí pro trénování:

Úloha AutoML

Pro úlohy AutoML nemusíte zadávat výpočetní prostředky. Volitelně je možné zadat prostředky. Pokud není zadaný počet instancí, použije se výchozí hodnota založená na parametrech max_concurrent_trials a max_nodes. Pokud odešlete klasifikaci obrázků AutoML nebo úlohu NLP bez zadání typu instance, automaticky se vybere velikost virtuálního počítače GPU. Úlohy AutoML můžete odesílat pomocí rozhraní CLI, sady Python SDK nebo studia.

Pokud chcete zadat typ nebo počet instancí, použijte ResourceConfiguration třídu.

# Create the AutoML classification job with the related factory-function.
from azure.ai.ml.entities import ResourceConfiguration 

classification_job = automl.classification(
    experiment_name=exp_name,
    training_data=my_training_data_input,
    target_column_name="y",
    primary_metric="accuracy",
    n_cross_validations=5,
    enable_model_explainability=True,
    tags={"my_custom_tag": "My custom value"},
)

# Limits are all optional
classification_job.set_limits(
    timeout_minutes=600,
    trial_timeout_minutes=20,
    max_trials=max_trials,
    # max_concurrent_trials = 4,
    # max_cores_per_trial: -1,
    enable_early_termination=True,
)

# Training properties are optional
classification_job.set_training(
    blocked_training_algorithms=[ClassificationModels.LOGISTIC_REGRESSION],
    enable_onnx_compatible_models=True,
)

# Serverless compute resources used to run the job
classification_job.resources = 
ResourceConfiguration(instance_type="Standard_E4s_v3", instance_count=6)

Úloha kanálu

Pro úlohu pipeline zadejte "serverless" jako výchozí typ výpočtů pro použití bezserverových výpočetních prostředků.

# Construct pipeline
@pipeline()
def pipeline_with_components_from_yaml(
    training_input,
    test_input,
    training_max_epochs=20,
    training_learning_rate=1.8,
    learning_rate_schedule="time-based",
):
    """E2E dummy train-score-eval pipeline with components defined via yaml."""
    # Call component obj as function: apply given inputs & parameters to create a node in pipeline
    train_with_sample_data = train_model(
        training_data=training_input,
        max_epochs=training_max_epochs,
        learning_rate=training_learning_rate,
        learning_rate_schedule=learning_rate_schedule,
    )

    score_with_sample_data = score_data(
        model_input=train_with_sample_data.outputs.model_output, test_data=test_input
    )
    score_with_sample_data.outputs.score_output.mode = "upload"

    eval_with_sample_data = eval_model(
        scoring_result=score_with_sample_data.outputs.score_output
    )

    # Return: pipeline outputs
    return {
        "trained_model": train_with_sample_data.outputs.model_output,
        "scored_data": score_with_sample_data.outputs.score_output,
        "evaluation_report": eval_with_sample_data.outputs.eval_output,
    }


pipeline_job = pipeline_with_components_from_yaml(
    training_input=Input(type="uri_folder", path=parent_dir + "/data/"),
    test_input=Input(type="uri_folder", path=parent_dir + "/data/"),
    training_max_epochs=20,
    training_learning_rate=1.8,
    learning_rate_schedule="time-based",
)

# set pipeline to use serverless compute
pipeline_job.settings.default_compute = "serverless"

Výpočetní prostředky bez serveru můžete také nastavit jako výchozí výpočetní prostředky v Designeru.

Konfigurace úloh bezserverového kanálu s využitím spravované identity přiřazené uživatelem

Pokud v úlohách kanálu používáte bezserverové výpočetní prostředky, doporučujeme nastavit identitu uživatele na úrovni jednotlivých kroků, které budou spuštěny na výpočetních prostředcích, a nikoliv na úrovni kořenového kanálu. (I když se nastavení identity podporuje na úrovni kořenového kanálu i kroku, nastavení na úrovni kroku má přednost, pokud jsou obě nastavené. U kanálů obsahujících součásti kanálu je však potřeba nastavit identitu u jednotlivých kroků, které se spustí. Identita nastavená na úrovni kořenového kanálu nebo součásti kanálu nebude fungovat. Proto doporučujeme nastavit identitu na úrovni jednotlivých kroků kvůli jednoduchosti.)

def my_pipeline():
    train_job = train_component(
        training_data=Input(type="uri_folder", path="./data")
    )
    # Set managed identity for the job
    train_job.identity = {"type": "managed"}
    return {"train_output": train_job.outputs}

pipeline_job = my_pipeline()
# Configure the pipeline to use serverless compute.
pipeline_job.settings.default_compute = "serverless"

Podívejte se na další příklady trénování s bezserverovými výpočetními prostředky: