Treinamento de modelo na computação sem servidor
APLICA-SE A:Extensão de ML da CLI do Azure v2 (atual)SDK do Python azure-ai-ml v2 (atual)
Você não precisa mais criar e gerenciar a computação para treinar seu modelo de forma escalonável. Em vez disso, seu trabalho pode ser enviado para um novo tipo de destino de computação, chamado computação sem servidor. A computação sem servidor é a maneira mais fácil de executar trabalhos de treinamento no Azure Machine Learning. A computação sem servidor é uma computação sob demanda totalmente gerenciada. O Azure Machine Learning cria, dimensiona e gerencia a computação para você. Por meio do treinamento de modelo com a computação sem servidor, os profissionais de aprendizado de máquina podem se concentrar em sua experiência na criação de modelos de aprendizado de máquina e não precisam aprender sobre a infraestrutura de computação nem configurá-la.
Os profissionais de aprendizado de máquina podem especificar os recursos de que o trabalho precisa. O Azure Machine Learning gerencia a infraestrutura de computação e fornece isolamento de rede gerenciada, reduzindo a carga sobre você.
As empresas também podem reduzir os custos ao especificar os recursos ideais para cada trabalho. Os administradores de TI ainda podem aplicar o controle especificando a cota de núcleos no nível da assinatura e do espaço de trabalho e aplicar as políticas do Azure.
A computação sem servidor pode ser usada para ajustar modelos no catálogo de modelos, como o LLAMA 2. A computação sem servidor pode ser usada para executar todos os tipos de trabalhos do Estúdio do Azure Machine Learning, SDK e CLI. A computação sem servidor também pode ser usada para criar imagens de ambiente e para cenários de painel de IA responsável. Os trabalhos sem servidor consomem a mesma cota que a cota de computação do Azure Machine Learning. Você pode escolher a camada padrão (dedicada) ou VMs spot (de baixa prioridade). A identidade gerenciada e a identidade do usuário têm suporte para trabalhos sem servidor. O modelo de cobrança é igual ao da computação do Azure Machine Learning.
Vantagens da computação sem servidor
- O Azure Machine Learning gerencia a criação, a configuração, o dimensionamento, a exclusão, a aplicação de patch, a infraestrutura de computação reduzindo a sobrecarga de gerenciamento
- Você não precisa aprender sobre computação, vários tipos de computação e propriedades relacionadas.
- Não é necessário criar clusters repetidamente para cada tamanho de VM necessário, usando as mesmas configurações e replicando para cada workspace.
- Você pode otimizar os custos especificando os recursos exatos que cada trabalho precisa em runtime em termos de tipo de instância (tamanho da VM) e contagem de instâncias. Você pode monitorar as métricas de utilização do trabalho para otimizar os recursos necessários para um trabalho.
- Redução nas etapas envolvidas para executar um trabalho
- Para simplificar ainda mais o envio de trabalho, você pode ignorar completamente os recursos. O Azure Machine Learning usa a contagem de instâncias como padrão e escolhe um tipo de instância (tamanho da VM) com base em fatores como cota, custo, desempenho e tamanho do disco.
- Tempos de espera menores antes de os trabalhos começarem a ser executados em alguns casos.
- A identidade do usuário e a identidade gerenciada atribuída pelo usuário do workspace têm suporte para envio de trabalhos.
- Com o isolamento de rede gerenciado, você pode simplificar e automatizar a configuração do isolamento de rede. Também há suporte para a rede virtual do cliente
- Controle administrativo por meio de cota e políticas do Azure
Como usar a computação sem servidor
Você pode ajustar modelos de base, como LLAMA 2, usando notebooks, como mostrado abaixo:
Ao criar seu próprio cluster de cálculo, você usa seu nome no trabalho de comando, como
compute="cpu-cluster"
. Usando o sem servidor, você pode ignorar a criação de um cluster de computação e omitir o parâmetrocompute
para usar a computação sem servidor. Quandocompute
não for especificado para um trabalho, este será executado na computação sem servidor. Omita o nome da computação em seus trabalhos de CLI ou SDK para usar a computação sem servidor nos seguintes tipos de trabalho e, como opção, forneça recursos necessários para um trabalho em termos de contagem de instâncias e tipo de instância:- Trabalhos de comando, incluindo trabalhos interativos e treinamento distribuído
- Trabalhos do AutoML
- Trabalhos de varredura
- Trabalhos paralelos
Para trabalhos de pipeline por meio da CLI, use
default_compute: azureml:serverless
para a computação padrão no nível do pipeline. Para trabalhos de pipelines por meio do SDK, usedefault_compute="serverless"
. Confira Trabalho de pipeline para obter um exemplo.Ao enviar um trabalho de treinamento no estúdio (versão prévia), selecione Sem servidor como o tipo de computação.
Ao usar o designer do Azure Machine Learning, selecione Sem servidor como a computação padrão.
Você pode usar a computação sem servidor para o painel de IA responsável
Considerações sobre o desempenho
A computação sem servidor pode ajudar a acelerar seu treinamento das seguintes formas:
Cota insuficiente: ao criar seu próprio cluster de cálculo, você será responsável por descobrir qual tamanho de VM e contagem de nós criar. Se você não tiver cota suficiente para o cluster quando o trabalho for executado, ele falhará. A computação sem servidor usa informações sobre a sua cota para selecionar um tamanho de VM apropriado por padrão.
Otimização de redução vertical: quando um cluster de computação estiver sendo reduzido verticalmente, um novo trabalho precisará esperar que a redução vertical ocorra e, depois, escalar verticalmente antes que o trabalho possa ser executado. Com a computação sem servidor, você não precisa esperar a redução vertical, e o trabalho pode começar a ser executado em outro cluster/nó (supondo que você tenha cota).
Otimização de cluster ocupado: quando um trabalho estiver em execução em um cluster de cálculo e outro trabalho for enviado, seu trabalho ficará na fila atrás do trabalho em execução no momento. Com a computação sem servidor, você obtém outro nó/cluster para começar a executar o trabalho (supondo que você tenha cota).
Quota
Ao enviar o trabalho, você ainda precisa ter cota de computação suficiente do Azure Machine Learning para continuar (cota de nível de assinatura e workspace). O tamanho padrão da VM para trabalhos sem servidor é selecionado com base nessa cota. Se você especificar seu próprio tamanho/família de VMs:
- Se você tiver alguma cota para o tamanho/família da VM, mas não tiver cota suficiente para o número de instâncias, ocorre um erro. O erro recomenda diminuir o número de instâncias para um número válido com base no limite de cota, solicitar um aumento de cota para essa família de VMs ou alterar o tamanho da VM
- Se você não tiver cota para o tamanho da VM especificado, ocorre um erro. O erro recomenda selecionar um tamanho de VM diferente para o qual você tenha cota ou solicitar cota para essa família de VMs
- Se você tiver cota suficiente para que a família de VMs execute o trabalho sem servidor, mas outros trabalhos estiverem usando a cota, você receberá uma mensagem informando que seu trabalho deve aguardar em uma fila até que a cota esteja disponível
Ao exibir seu uso e cota no portal do Azure, você vê o nome "Sem servidor" para exibir toda a cota consumida por trabalhos sem servidor.
Suporte de identidade e passagem de credenciais
Passagem de credencial do usuário: a computação sem servidor dá suporte total à passagem de credenciais do usuário. O token de usuário do usuário que estiver enviando o trabalho será usado para o acesso de armazenamento. Essas credenciais são do Microsoft Entra ID.
from azure.ai.ml import command from azure.ai.ml import MLClient # Handle to the workspace from azure.identity import DefaultAzureCredential # Authentication package from azure.ai.ml.entities import ResourceConfiguration from azure.ai.ml.entities import UserIdentityConfiguration credential = DefaultAzureCredential() # 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)
Identidade gerenciada atribuída pelo usuário: quando você tiver um workspace configurado com a identidade gerenciada atribuída pelo usuário, você poderá usar essa identidade com o trabalho sem servidor para o acesso ao armazenamento. Para acessar os segredos, confira Usar segredos da credencial de autenticação em trabalhos do Azure Machine Learning.
from azure.ai.ml import command from azure.ai.ml import MLClient # Handle to the workspace from azure.identity import DefaultAzureCredential # Authentication package from azure.ai.ml.entities import ResourceConfiguration from azure.ai.ml.entities import ManagedIdentityConfiguration credential = DefaultAzureCredential() # 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(), ) # submit the command job ml_client.create_or_update(job)
Para obter informações sobre como anexar a identidade gerenciada atribuída pelo usuário, confira Anexar identidade gerenciada atribuída pelo usuário.
Configurar propriedades para trabalhos de comando
Se nenhum destino de computação for especificado para trabalhos de comando, varredura e AutoML, a computação usará a computação sem servidor como padrão. Por exemplo, para esse trabalho de comando:
from azure.ai.ml import command
from azure.ai.ml import command
from azure.ai.ml import MLClient # Handle to the workspace
from azure.identity import DefaultAzureCredential # Authentication package
credential = DefaultAzureCredential()
# 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)
A computação usa a computação sem servidor como padrão com:
- Nó único para esse trabalho. O número padrão de nós é baseado no tipo de trabalho. Confira as seções a seguir para informações sobre outros tipos de trabalho.
- Máquina virtual de CPU, que é determinada com base em cota, desempenho, custo e tamanho do disco.
- Máquinas virtuais dedicadas
- Localização do workspace
Você pode substituir esses padrões. Se você quiser especificar o tipo de VM ou o número de nós para computação sem servidor, adicione resources
ao seu trabalho:
instance_type
para escolher uma VM específica. Use esse parâmetro se quiser um tamanho específico de VM de CPU/GPUinstance_count
para especificar o número de nós.from azure.ai.ml import command from azure.ai.ml import MLClient # Handle to the workspace from azure.identity import DefaultAzureCredential # Authentication package from azure.ai.ml.entities import JobResourceConfiguration credential = DefaultAzureCredential() # 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)
Para alterar a camada de trabalho, use
queue_settings
para escolher entre VMs dedicadas (job_tier: Standard
) e Baixa prioridade(jobtier: Spot
).from azure.ai.ml import command from azure.ai.ml import MLClient # Handle to the workspace from azure.identity import DefaultAzureCredential # Authentication package credential = DefaultAzureCredential() # 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)
Exemplo para todos os campos com trabalhos de comando
Aqui está um exemplo de todos os campos especificados, incluindo a identidade que o trabalho deve utilizar. Não é preciso especificar as configurações de rede virtual, porque o isolamento de rede gerenciada no nível do workspace é usado automaticamente.
from azure.ai.ml import command
from azure.ai.ml import MLClient # Handle to the workspace
from azure.identity import DefaultAzureCredential # Authentication package
from azure.ai.ml.entities import ResourceConfiguration
from azure.ai.ml.entities import UserIdentityConfiguration
credential = DefaultAzureCredential()
# 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 = ResourceConfiguration(instance_type="Standard_E4s_v3", instance_count=1)
# submit the command job
ml_client.create_or_update(job)
Veja mais exemplos de treinamento com computação sem servidor em
Trabalho do AutoML
Não é preciso especificar a computação para trabalhos AutoML. Como opção, os recursos podem ser especificados. Se a contagem de instâncias não for especificada, ela será padronizada com base nos parâmetros max_concurrent_trials e max_nodes. Se você enviar uma classificação de imagem AutoML ou tarefa NLP sem nenhum tipo de instância, o tamanho da VM da GPU será selecionado automaticamente. É possível enviar o trabalho do AutoML por meio de CLIs, SDK ou Estúdio. Para enviar trabalhos AutoML com computação sem servidor no estúdio, primeiro habilite o recurso enviar um trabalho de treinamento no estúdio (versão prévia) no painel de visualização.
Caso queira especificar o tipo ou a contagem de instâncias, use a classe ResourceConfiguration
.
# 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)
Trabalho de pipeline
Para um trabalho de pipeline, especifique "serverless"
como o tipo de computação padrão para usar a computação sem servidor.
# 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"
Você também pode definir a computação sem servidor como a computação padrão no Designer.
Próximas etapas
Veja mais exemplos de treinamento com computação sem servidor em