Como usar componentes de chat-completion do registro do sistema Azure ML para ajuste fino de um modelo
Neste exemplo, realizaremos o ajuste fino do modelo Phi-3-mini-4k-instruct para completar uma conversa entre 2 pessoas usando o conjunto de dados ultrachat_200k.
O exemplo mostrará como realizar o ajuste fino usando o Azure ML SDK e Python e, em seguida, implantar o modelo ajustado em um endpoint online para inferência em tempo real.
Usaremos o conjunto de dados ultrachat_200k. Esta é uma versão fortemente filtrada do conjunto UltraChat e foi usada para treinar o Zephyr-7B-β, um modelo de chat 7b de última geração.
Usaremos o modelo Phi-3-mini-4k-instruct para mostrar como o usuário pode ajustar um modelo para a tarefa de chat-completion. Se você abriu este notebook a partir de um cartão de modelo específico, lembre-se de substituir o nome do modelo específico.
- Escolher um modelo para ajuste fino.
- Escolher e explorar os dados de treinamento.
- Configurar o trabalho de ajuste fino.
- Executar o trabalho de ajuste fino.
- Revisar métricas de treinamento e avaliação.
- Registrar o modelo ajustado.
- Implantar o modelo ajustado para inferência em tempo real.
- Limpar recursos.
- Instalar dependências
- Conectar ao AzureML Workspace. Saiba mais em configurar autenticação do SDK. Substitua <WORKSPACE_NAME>, <RESOURCE_GROUP> e <SUBSCRIPTION_ID> abaixo.
- Conectar ao registro do sistema azureml
- Definir um nome opcional para o experimento
- Verificar ou criar compute.
Note
Requisitos: um único nó GPU pode ter várias placas GPU. Por exemplo, em um nó Standard_NC24rs_v3 há 4 GPUs NVIDIA V100 enquanto no Standard_NC12s_v3, há 2 GPUs NVIDIA V100. Consulte a documentação para essa informação. O número de placas GPU por nó é definido no parâmetro gpus_per_node abaixo. Definir esse valor corretamente garantirá a utilização de todas as GPUs no nó. Os SKUs de GPU recomendados podem ser encontrados aqui e aqui.
Instale as dependências executando a célula abaixo. Esta não é uma etapa opcional se estiver executando em um ambiente novo.
pip install azure-ai-ml
pip install azure-identity
pip install datasets==2.9.0
pip install mlflow
pip install azureml-mlflow-
Este script Python é usado para interagir com o serviço Azure Machine Learning (Azure ML). Aqui está um resumo do que ele faz:
-
Importa módulos necessários dos pacotes azure.ai.ml, azure.identity e azure.ai.ml.entities. Também importa o módulo time.
-
Tenta autenticar usando DefaultAzureCredential(), que fornece uma experiência de autenticação simplificada para iniciar rapidamente o desenvolvimento de aplicações executadas na nuvem Azure. Se isso falhar, recorre ao InteractiveBrowserCredential(), que fornece um prompt de login interativo.
-
Em seguida, tenta criar uma instância MLClient usando o método from_config, que lê a configuração do arquivo padrão (config.json). Se isso falhar, cria uma instância MLClient fornecendo manualmente subscription_id, resource_group_name e workspace_name.
-
Cria outra instância MLClient, desta vez para o registro Azure ML chamado "azureml". Este registro é onde modelos, pipelines de ajuste fino e ambientes são armazenados.
-
Define o experiment_name como "chat_completion_Phi-3-mini-4k-instruct".
-
Gera um timestamp único convertendo o tempo atual (em segundos desde a época, como número flutuante) para inteiro e depois para string. Esse timestamp pode ser usado para criar nomes e versões únicos.
# Importe os módulos necessários do Azure ML e Azure Identity from azure.ai.ml import MLClient from azure.identity import ( DefaultAzureCredential, InteractiveBrowserCredential, ) from azure.ai.ml.entities import AmlCompute import time # Importe o módulo time # Tente autenticar usando DefaultAzureCredential try: credential = DefaultAzureCredential() credential.get_token("https://management.azure.com/.default") except Exception as ex: # Se DefaultAzureCredential falhar, use InteractiveBrowserCredential credential = InteractiveBrowserCredential() # Tente criar uma instância MLClient usando o arquivo de configuração padrão try: workspace_ml_client = MLClient.from_config(credential=credential) except: # Se isso falhar, crie uma instância MLClient fornecendo os detalhes manualmente workspace_ml_client = MLClient( credential, subscription_id="<SUBSCRIPTION_ID>", resource_group_name="<RESOURCE_GROUP>", workspace_name="<WORKSPACE_NAME>", ) # Crie outra instância MLClient para o registro Azure ML chamado "azureml" # Este registro é onde modelos, pipelines de ajuste fino e ambientes são armazenados registry_ml_client = MLClient(credential, registry_name="azureml") # Defina o nome do experimento experiment_name = "chat_completion_Phi-3-mini-4k-instruct" # Gere um timestamp único que pode ser usado para nomes e versões que precisam ser únicos timestamp = str(int(time.time()))
-
- Phi-3-mini-4k-instruct é um modelo leve de 3,8 bilhões de parâmetros, de última geração, construído com os conjuntos de dados usados para Phi-2. O modelo pertence à família Phi-3, e a versão Mini vem em duas variantes, 4K e 128K, que correspondem ao comprimento de contexto (em tokens) que pode suportar. Precisamos ajustar o modelo para nosso propósito específico para usá-lo. Você pode navegar por esses modelos no Catálogo de Modelos do AzureML Studio, filtrando pela tarefa de chat-completion. Neste exemplo, usamos o modelo Phi-3-mini-4k-instruct. Se você abriu este notebook para um modelo diferente, substitua o nome e a versão do modelo conforme necessário.
Note
a propriedade id do modelo. Esta será passada como entrada para o trabalho de ajuste fino. Também está disponível como o campo Asset ID na página de detalhes do modelo no Catálogo de Modelos do AzureML Studio.
-
Este script Python está interagindo com o serviço Azure Machine Learning (Azure ML). Aqui está um resumo do que faz:
-
Define model_name como "Phi-3-mini-4k-instruct".
-
Usa o método get da propriedade models do objeto registry_ml_client para recuperar a versão mais recente do modelo com o nome especificado do registro Azure ML. O método get é chamado com dois argumentos: o nome do modelo e um label especificando que a última versão do modelo deve ser recuperada.
-
Imprime uma mensagem no console indicando o nome, versão e id do modelo que será usado para ajuste fino. O método format da string é usado para inserir o nome, versão e id do modelo na mensagem. O nome, versão e id do modelo são acessados como propriedades do objeto foundation_model.
# Defina o nome do modelo model_name = "Phi-3-mini-4k-instruct" # Obtenha a versão mais recente do modelo no registro Azure ML foundation_model = registry_ml_client.models.get(model_name, label="latest") # Imprima o nome do modelo, versão e id # Essas informações são úteis para rastreamento e depuração print( "\n\nUsing model name: {0}, version: {1}, id: {2} for fine tuning".format( foundation_model.name, foundation_model.version, foundation_model.id ) )
-
O trabalho de ajuste fino funciona SOMENTE com compute GPU. O tamanho do compute depende do tamanho do modelo e, na maioria dos casos, fica difícil identificar o compute certo para o trabalho. Nesta célula, orientamos o usuário a selecionar o compute adequado para o trabalho.
Note
Os computes listados abaixo trabalham com a configuração mais otimizada. Quaisquer alterações na configuração podem causar erro Cuda Out Of Memory. Nesses casos, tente atualizar o compute para um compute de tamanho maior.
Note
Ao selecionar o compute_cluster_size abaixo, certifique-se de que o compute está disponível no seu grupo de recursos. Se algum compute específico não estiver disponível, você pode fazer uma solicitação para obter acesso aos recursos do compute.
-
Este script Python está interagindo com um modelo Azure Machine Learning (Azure ML). Aqui está um resumo do que faz:
-
Importa o módulo ast, que fornece funções para processar árvores da gramática abstrata do Python.
-
Verifica se o objeto foundation_model (que representa um modelo no Azure ML) possui uma tag chamada finetune_compute_allow_list. Tags no Azure ML são pares chave-valor que você pode criar e usar para filtrar e ordenar modelos.
-
Se a tag finetune_compute_allow_list estiver presente, usa ast.literal_eval para analisar com segurança o valor da tag (uma string) em uma lista Python. Essa lista é então atribuída à variável computes_allow_list. Em seguida, imprime uma mensagem indicando que um compute deve ser criado a partir da lista.
-
Se a tag finetune_compute_allow_list não estiver presente, define computes_allow_list como None e imprime uma mensagem indicando que essa tag não faz parte das tags do modelo.
-
Em resumo, este script verifica uma tag específica nos metadados do modelo, converte o valor da tag para uma lista se ela existir e fornece um feedback ao usuário.
# Importe o módulo ast, que fornece funções para processar árvores da gramática abstrata da sintaxe Python import ast # Verifique se a tag 'finetune_compute_allow_list' está presente nas tags do modelo if "finetune_compute_allow_list" in foundation_model.tags: # Se a tag estiver presente, use ast.literal_eval para analisar com segurança o valor da tag (uma string) em uma lista Python computes_allow_list = ast.literal_eval( foundation_model.tags["finetune_compute_allow_list"] ) # converta string para lista Python # Imprima uma mensagem indicando que um compute deve ser criado a partir da lista print(f"Please create a compute from the above list - {computes_allow_list}") else: # Se a tag não estiver presente, defina computes_allow_list como None computes_allow_list = None # Imprima uma mensagem indicando que a tag 'finetune_compute_allow_list' não faz parte das tags do modelo print("`finetune_compute_allow_list` is not part of model tags")
-
-
Este script Python está interagindo com o serviço Azure Machine Learning (Azure ML) e realizando várias verificações em uma instância de compute. Aqui está um resumo do que faz:
-
Tenta recuperar a instância de compute com o nome armazenado em compute_cluster no workspace Azure ML. Se o estado de provisionamento da instância for "failed", lança um ValueError.
-
Verifica se computes_allow_list não é None. Se não for, converte todos os tamanhos de compute na lista para minúsculas e verifica se o tamanho da instância atual está na lista. Se não estiver, lança um ValueError.
-
Se computes_allow_list for None, verifica se o tamanho da instância está em uma lista de tamanhos GPU VM não suportados. Se estiver, lança um ValueError.
-
Recupera uma lista de todos os tamanhos de compute disponíveis no workspace. Itera sobre essa lista e, para cada tamanho, verifica se o nome coincide com o tamanho da instância atual. Se sim, obtém o número de GPUs para aquele tamanho e define gpu_count_found como True.
-
Se gpu_count_found for True, imprime o número de GPUs na instância de compute. Se for False, lança um ValueError.
-
Em resumo, o script faz várias verificações numa instância de compute no workspace Azure ML, incluindo estado de provisionamento, tamanho comparado a uma lista de permissão ou negação, e a quantidade de GPUs que possui.
# Imprimir a mensagem de exceção print(e) # Levantar um ValueError se o tamanho de computação não estiver disponível no workspace raise ValueError( f"WARNING! Compute size {compute_cluster_size} not available in workspace" ) # Recuperar a instância de computação do workspace Azure ML compute = workspace_ml_client.compute.get(compute_cluster) # Verificar se o estado de provisionamento da instância de computação é "falhou" if compute.provisioning_state.lower() == "failed": # Levantar um ValueError se o estado de provisionamento for "falhou" raise ValueError( f"Provisioning failed, Compute '{compute_cluster}' is in failed state. " f"please try creating a different compute" ) # Verificar se computes_allow_list não é None if computes_allow_list is not None: # Converter todos os tamanhos de computação em computes_allow_list para letras minúsculas computes_allow_list_lower_case = [x.lower() for x in computes_allow_list] # Verificar se o tamanho da instância de computação está em computes_allow_list_lower_case if compute.size.lower() not in computes_allow_list_lower_case: # Levantar um ValueError se o tamanho da instância de computação não estiver em computes_allow_list_lower_case raise ValueError( f"VM size {compute.size} is not in the allow-listed computes for finetuning" ) else: # Definir uma lista de tamanhos de VM GPU não suportados unsupported_gpu_vm_list = [ "standard_nc6", "standard_nc12", "standard_nc24", "standard_nc24r", ] # Verificar se o tamanho da instância de computação está em unsupported_gpu_vm_list if compute.size.lower() in unsupported_gpu_vm_list: # Levantar um ValueError se o tamanho da instância de computação estiver em unsupported_gpu_vm_list raise ValueError( f"VM size {compute.size} is currently not supported for finetuning" ) # Inicializar uma flag para verificar se o número de GPUs na instância de computação foi encontrado gpu_count_found = False # Recuperar uma lista de todos os tamanhos de computação disponíveis no workspace workspace_compute_sku_list = workspace_ml_client.compute.list_sizes() available_sku_sizes = [] # Iterar sobre a lista de tamanhos de computação disponíveis for compute_sku in workspace_compute_sku_list: available_sku_sizes.append(compute_sku.name) # Verificar se o nome do tamanho de computação corresponde ao tamanho da instância de computação if compute_sku.name.lower() == compute.size.lower(): # Se sim, recuperar o número de GPUs para esse tamanho de computação e definir gpu_count_found como True gpus_per_node = compute_sku.gpus gpu_count_found = True # Se gpu_count_found for True, imprimir o número de GPUs na instância de computação if gpu_count_found: print(f"Number of GPU's in compute {compute.size}: {gpus_per_node}") else: # Se gpu_count_found for False, levantar um ValueError raise ValueError( f"Number of GPU's in compute {compute.size} not found. Available skus are: {available_sku_sizes}." f"This should not happen. Please check the selected compute cluster: {compute_cluster} and try again." )
-
-
Usamos o conjunto de dados ultrachat_200k. O conjunto tem quatro divisões, adequadas para ajuste fino supervisionado (sft). Classificação de geração (gen). O número de exemplos por divisão é mostrado a seguir:
train_sft test_sft train_gen test_gen 207865 23110 256032 28304
-
As próximas células mostram a preparação básica dos dados para ajuste fino:
Queremos que esta amostra execute rapidamente, então salve os arquivos train_sft, test_sft contendo 5% das linhas já reduzidas. Isso significa que o modelo ajustado terá menor precisão, portanto não deve ser usado em aplicações reais. O download-dataset.py é usado para baixar o conjunto ultrachat_200k e transformar o conjunto em formato consumível pelo pipeline de ajuste fino. Como o conjunto é grande, aqui temos apenas parte dele.
- Executar o script abaixo baixa apenas 5% dos dados. Isso pode ser aumentado alterando o parâmetro dataset_split_pc para a porcentagem desejada.
Note
Alguns modelos de linguagem têm códigos de idioma diferentes e, portanto, os nomes das colunas no conjunto de dados devem refletir isso.
-
Aqui está um exemplo de como os dados devem aparecer O conjunto chat-completion é armazenado em formato parquet, com cada entrada seguindo o esquema:
-
Este é um documento JSON (JavaScript Object Notation), um formato popular de intercâmbio de dados. Não é código executável, mas uma forma de armazenar e transportar dados. Aqui está um resumo da estrutura:
-
"prompt": Esta chave contém uma string que representa uma tarefa ou pergunta feita a um assistente de IA.
-
"messages": Esta chave contém um array de objetos. Cada objeto representa uma mensagem numa conversa entre um usuário e um assistente de IA. Cada objeto mensagem tem duas chaves:
-
"content": Esta chave contém uma string que representa o conteúdo da mensagem.
-
"role": Esta chave contém uma string que representa o papel da entidade que enviou a mensagem. Pode ser "user" ou "assistant".
-
"prompt_id": Esta chave contém uma string que representa um identificador único para a tarefa (prompt).
-
-
Neste documento JSON específico, uma conversa é representada onde um usuário pede a um assistente de IA para criar um protagonista para uma história distópica. O assistente responde e o usuário então pede mais detalhes. O assistente concorda em fornecer mais detalhes. Toda a conversa está associada a um id de prompt específico.
{ // The task or question posed to an AI assistant "prompt": "Create a fully-developed protagonist who is challenged to survive within a dystopian society under the rule of a tyrant. ...", // An array of objects, each representing a message in a conversation between a user and an AI assistant "messages":[ { // The content of the user's message "content": "Create a fully-developed protagonist who is challenged to survive within a dystopian society under the rule of a tyrant. ...", // The role of the entity that sent the message "role": "user" }, { // The content of the assistant's message "content": "Name: Ava\n\n Ava was just 16 years old when the world as she knew it came crashing down. The government had collapsed, leaving behind a chaotic and lawless society. ...", // The role of the entity that sent the message "role": "assistant" }, { // The content of the user's message "content": "Wow, Ava's story is so intense and inspiring! Can you provide me with more details. ...", // The role of the entity that sent the message "role": "user" }, { // The content of the assistant's message "content": "Certainly! ....", // The role of the entity that sent the message "role": "assistant" } ], // A unique identifier for the prompt "prompt_id": "d938b65dfe31f05f80eb8572964c6673eddbd68eff3db6bd234d7f1e3b86c2af" }
-
Este script Python é usado para baixar um conjunto de dados usando um script auxiliar chamado download-dataset.py. Aqui está um resumo do que faz:
-
Importa o módulo os, que fornece uma maneira portátil de usar funcionalidades dependentes do sistema operacional.
-
Usa a função os.system para executar o script download-dataset.py no shell com argumentos específicos pela linha de comando. Os argumentos especificam o conjunto de dados a baixar (HuggingFaceH4/ultrachat_200k), o diretório para onde baixar (ultrachat_200k_dataset), e a porcentagem de divisão do conjunto (5). A função os.system retorna o status de saída do comando executado; esse status é armazenado na variável exit_status.
-
Verifica se exit_status é diferente de 0. Em sistemas Unix-like, status 0 geralmente indica sucesso, e qualquer outro número indica erro. Se exit_status não for 0, lança uma exceção com uma mensagem indicando que houve um erro ao baixar o conjunto de dados.
-
Em resumo, este script executa um comando para baixar um conjunto de dados usando um script auxiliar e lança exceção se o comando falhar.
# Importe o módulo os, que fornece uma maneira de usar funcionalidades dependentes do sistema operacional import os # Use a função os.system para executar o script download-dataset.py no shell com argumentos específicos de linha de comando # Os argumentos especificam o conjunto de dados para baixar (HuggingFaceH4/ultrachat_200k), o diretório para baixá-lo (ultrachat_200k_dataset) e a porcentagem do conjunto de dados para dividir (5) # A função os.system retorna o status de saída do comando que executou; esse status é armazenado na variável exit_status exit_status = os.system( "python ./download-dataset.py --dataset HuggingFaceH4/ultrachat_200k --download_dir ultrachat_200k_dataset --dataset_split_pc 5" ) # Verifique se exit_status não é 0 # Em sistemas operacionais do tipo Unix, um status de saída 0 geralmente indica que um comando foi bem-sucedido, enquanto qualquer outro número indica um erro # Se exit_status não for 0, lance uma Exception com uma mensagem indicando que houve um erro ao baixar o conjunto de dados if exit_status != 0: raise Exception("Error downloading dataset")
-
-
Este script Python está carregando um arquivo JSON Lines em um DataFrame do pandas e exibindo as primeiras 5 linhas. Aqui está uma análise do que ele faz:
-
Ele importa a biblioteca pandas, que é uma poderosa biblioteca de manipulação e análise de dados.
-
Ele define a largura máxima da coluna para as opções de exibição do pandas como 0. Isso significa que o texto completo de cada coluna será exibido sem truncamento quando o DataFrame for impresso.
-
Ele utiliza a função pd.read_json para carregar o arquivo train_sft.jsonl do diretório ultrachat_200k_dataset em um DataFrame. O argumento lines=True indica que o arquivo está no formato JSON Lines, onde cada linha é um objeto JSON separado.
-
Ele utiliza o método head para exibir as primeiras 5 linhas do DataFrame. Se o DataFrame tiver menos de 5 linhas, exibirá todas elas.
-
Em resumo, este script está carregando um arquivo JSON Lines em um DataFrame e exibindo as primeiras 5 linhas com o texto completo das colunas.
# Importe a biblioteca pandas, que é uma biblioteca poderosa para manipulação e análise de dados import pandas as pd # Defina a largura máxima da coluna para as opções de exibição do pandas como 0 # Isso significa que o texto completo de cada coluna será exibido sem truncamento quando o DataFrame for impresso pd.set_option("display.max_colwidth", 0) # Use a função pd.read_json para carregar o arquivo train_sft.jsonl do diretório ultrachat_200k_dataset em um DataFrame # O argumento lines=True indica que o arquivo está no formato JSON Lines, onde cada linha é um objeto JSON separado df = pd.read_json("./ultrachat_200k_dataset/train_sft.jsonl", lines=True) # Use o método head para exibir as primeiras 5 linhas do DataFrame # Se o DataFrame tiver menos de 5 linhas, ele exibirá todas elas df.head()
-
Crie o trabalho que usa o componente pipeline de chat-completion. Saiba mais sobre todos os parâmetros suportados para fine tuning.
-
Os parâmetros de fine tuning podem ser agrupados em 2 categorias - parâmetros de treinamento, parâmetros de otimização
-
Parâmetros de treinamento definem os aspectos do treinamento, tais como -
- O otimizador, scheduler a usar
- A métrica a ser otimizada no fine tuning
- Número de passos de treinamento e tamanho do lote e assim por diante
- Parâmetros de otimização ajudam a otimizar a memória da GPU e usar os recursos computacionais de forma eficaz.
-
Abaixo estão alguns dos parâmetros que pertencem a essa categoria. Os parâmetros de otimização diferem para cada modelo e são embalados com o modelo para lidar com essas variações.
- Ativar deepspeed e LoRA
- Ativar treinamento de precisão mista
- Ativar treinamento multi-nó
Note
O fine tuning supervisionado pode resultar em perda de alinhamento ou esquecimento catastrófico. Recomendamos verificar esse problema e executar uma etapa de alinhamento após o fine tuning.
-
Este script Python está configurando parâmetros para fine tuning de um modelo de aprendizado de máquina. Aqui está uma análise do que ele faz:
-
Ele configura parâmetros padrão de treinamento, como o número de epochs, tamanhos de lote para treinamento e avaliação, taxa de aprendizado e tipo de scheduler da taxa de aprendizado.
-
Ele configura parâmetros padrão de otimização, como se deve aplicar Layer-wise Relevance Propagation (LoRa) e DeepSpeed, e o estágio do DeepSpeed.
-
Ele combina os parâmetros de treinamento e otimização em um único dicionário chamado finetune_parameters.
-
Ele verifica se o foundation_model tem algum parâmetro padrão específico do modelo. Se tiver, imprime uma mensagem de aviso e atualiza o dicionário finetune_parameters com esses padrões específicos do modelo. A função ast.literal_eval é usada para converter os padrões específicos do modelo de string para um dicionário Python.
-
Ele imprime o conjunto final de parâmetros de fine tuning que serão usados na execução.
-
Em resumo, este script está configurando e exibindo os parâmetros para fine tuning de um modelo de aprendizado de máquina, com a capacidade de sobrescrever os parâmetros padrão por padrões específicos do modelo.
# Configurar parâmetros padrão de treinamento, como número de épocas de treinamento, tamanhos de lote para treinamento e avaliação, taxa de aprendizado e tipo de agendador de taxa de aprendizado training_parameters = dict( num_train_epochs=3, per_device_train_batch_size=1, per_device_eval_batch_size=1, learning_rate=5e-6, lr_scheduler_type="cosine", ) # Configurar parâmetros padrão de otimização, como se deve aplicar Layer-wise Relevance Propagation (LoRa) e DeepSpeed, e o estágio do DeepSpeed optimization_parameters = dict( apply_lora="true", apply_deepspeed="true", deepspeed_stage=2, ) # Combinar os parâmetros de treinamento e otimização em um único dicionário chamado finetune_parameters finetune_parameters = {**training_parameters, **optimization_parameters} # Verificar se o foundation_model possui parâmetros padrão específicos do modelo # Se possuir, imprimir uma mensagem de aviso e atualizar o dicionário finetune_parameters com esses padrões específicos do modelo # A função ast.literal_eval é usada para converter os padrões específicos do modelo de uma string para um dicionário Python if "model_specific_defaults" in foundation_model.tags: print("Warning! Model specific defaults exist. The defaults could be overridden.") finetune_parameters.update( ast.literal_eval( # converter string para dicionário Python foundation_model.tags["model_specific_defaults"] ) ) # Imprimir o conjunto final de parâmetros de fine-tuning que será usado na execução print( f"The following finetune parameters are going to be set for the run: {finetune_parameters}" )
-
-
Este script Python está definindo uma função para gerar um nome de exibição para um pipeline de treinamento de aprendizado de máquina, e depois chamando essa função para gerar e imprimir o nome de exibição. Aqui está uma análise do que ele faz:
-
A função get_pipeline_display_name é definida. Essa função gera um nome de exibição baseado em vários parâmetros relacionados ao pipeline de treinamento.
-
Dentro da função, ela calcula o tamanho total do lote multiplicando o tamanho do lote por dispositivo, o número de passos de acumulação de gradiente, o número de GPUs por nó e o número de nós usados para fine tuning.
-
Ela recupera vários outros parâmetros, como o tipo de scheduler de taxa de aprendizado, se DeepSpeed está aplicado, o estágio do DeepSpeed, se o Layer-wise Relevance Propagation (LoRa) está aplicado, o limite no número de checkpoints do modelo a serem mantidos e o comprimento máximo da sequência.
-
Ela constrói uma string que inclui todos esses parâmetros, separados por hífens. Se DeepSpeed ou LoRa estão aplicados, a string inclui "ds" seguido do estágio do DeepSpeed, ou "lora", respectivamente. Se não, inclui "nods" ou "nolora", respectivamente.
-
A função retorna essa string, que serve como nome de exibição para o pipeline de treinamento.
-
Após a definição da função, ela é chamada para gerar o nome de exibição, que é então impresso.
-
Em resumo, este script está gerando um nome de exibição para um pipeline de treinamento de aprendizado de máquina baseado em vários parâmetros, e então imprimindo esse nome de exibição.
# Defina uma função para gerar um nome de exibição para o pipeline de treinamento def get_pipeline_display_name(): # Calcule o tamanho total do lote multiplicando o tamanho do lote por dispositivo, o número de etapas de acumulação de gradiente, o número de GPUs por nó e o número de nós usados para fine-tuning batch_size = ( int(finetune_parameters.get("per_device_train_batch_size", 1)) * int(finetune_parameters.get("gradient_accumulation_steps", 1)) * int(gpus_per_node) * int(finetune_parameters.get("num_nodes_finetune", 1)) ) # Recupere o tipo do agendador de taxa de aprendizado scheduler = finetune_parameters.get("lr_scheduler_type", "linear") # Recupere se o DeepSpeed está aplicado deepspeed = finetune_parameters.get("apply_deepspeed", "false") # Recupere o estágio do DeepSpeed ds_stage = finetune_parameters.get("deepspeed_stage", "2") # Se o DeepSpeed estiver aplicado, inclua "ds" seguido do estágio do DeepSpeed no nome de exibição; caso contrário, inclua "nods" if deepspeed == "true": ds_string = f"ds{ds_stage}" else: ds_string = "nods" # Recupere se a Propagação de Relevância em Camadas (LoRa) está aplicada lora = finetune_parameters.get("apply_lora", "false") # Se o LoRa estiver aplicado, inclua "lora" no nome de exibição; caso contrário, inclua "nolora" if lora == "true": lora_string = "lora" else: lora_string = "nolora" # Recupere o limite no número de pontos de verificação do modelo a serem mantidos save_limit = finetune_parameters.get("save_total_limit", -1) # Recupere o comprimento máximo da sequência seq_len = finetune_parameters.get("max_seq_length", -1) # Construa o nome de exibição concatenando todos esses parâmetros, separados por hífens return ( model_name + "-" + "ultrachat" + "-" + f"bs{batch_size}" + "-" + f"{scheduler}" + "-" + ds_string + "-" + lora_string + f"-save_limit{save_limit}" + f"-seqlen{seq_len}" ) # Chame a função para gerar o nome de exibição pipeline_display_name = get_pipeline_display_name() # Imprima o nome de exibição print(f"Display name used for the run: {pipeline_display_name}")
Este script Python está definindo e configurando um pipeline de aprendizado de máquina usando o Azure Machine Learning SDK. Aqui está uma análise do que ele faz:
-
Ele importa os módulos necessários do Azure AI ML SDK.
-
Ele busca um componente de pipeline chamado "chat_completion_pipeline" do registro.
-
Ele define um trabalho de pipeline usando o decorador
@pipelinee a funçãocreate_pipeline. O nome do pipeline é definido comopipeline_display_name. -
Dentro da função
create_pipeline, ele inicializa o componente do pipeline buscado com vários parâmetros, incluindo caminho do modelo, clusters de computação para diferentes estágios, divisões de conjuntos de dados para treinamento e teste, o número de GPUs para usar no fine tuning e outros parâmetros de fine tuning. -
Ele mapeia a saída do trabalho de fine tuning para a saída do trabalho do pipeline. Isso é feito para que o modelo fine tuned possa ser facilmente registrado, o que é necessário para implantar o modelo em um endpoint online ou batch.
-
Ele cria uma instância do pipeline chamando a função
create_pipeline. -
Ele define a configuração
force_rerundo pipeline comoTrue, significando que resultados em cache de trabalhos anteriores não serão usados. -
Ele define a configuração
continue_on_step_failuredo pipeline comoFalse, significando que o pipeline será interrompido se algum passo falhar. -
Em resumo, este script está definindo e configurando um pipeline de aprendizado de máquina para uma tarefa de chat completion usando o Azure Machine Learning SDK.
# Importe os módulos necessários do SDK Azure AI ML from azure.ai.ml.dsl import pipeline from azure.ai.ml import Input # Busque o componente do pipeline chamado "chat_completion_pipeline" do registro pipeline_component_func = registry_ml_client.components.get( name="chat_completion_pipeline", label="latest" ) # Defina o trabalho do pipeline usando o decorador @pipeline e a função create_pipeline # O nome do pipeline é definido como pipeline_display_name @pipeline(name=pipeline_display_name) def create_pipeline(): # Inicialize o componente do pipeline buscado com vários parâmetros # Estes incluem o caminho do modelo, clusters de computação para diferentes etapas, divisões do conjunto de dados para treinamento e teste, o número de GPUs para usar no fine-tuning e outros parâmetros de fine-tuning chat_completion_pipeline = pipeline_component_func( mlflow_model_path=foundation_model.id, compute_model_import=compute_cluster, compute_preprocess=compute_cluster, compute_finetune=compute_cluster, compute_model_evaluation=compute_cluster, # Mapeie as divisões do conjunto de dados para parâmetros train_file_path=Input( type="uri_file", path="./ultrachat_200k_dataset/train_sft.jsonl" ), test_file_path=Input( type="uri_file", path="./ultrachat_200k_dataset/test_sft.jsonl" ), # Configurações de treinamento number_of_gpu_to_use_finetuning=gpus_per_node, # Define para o número de GPUs disponíveis na computação **finetune_parameters ) return { # Mapeie a saída do trabalho de fine tuning para a saída do trabalho do pipeline # Isso é feito para que possamos registrar facilmente o modelo fine tuned # Registrar o modelo é necessário para implantar o modelo em um endpoint online ou batch "trained_model": chat_completion_pipeline.outputs.mlflow_model_folder } # Crie uma instância do pipeline chamando a função create_pipeline pipeline_object = create_pipeline() # Não use resultados em cache de trabalhos anteriores pipeline_object.settings.force_rerun = True # Defina continuar em falha da etapa como False # Isso significa que o pipeline irá parar se qualquer etapa falhar pipeline_object.settings.continue_on_step_failure = False
-
Este script Python está submetendo um trabalho de pipeline de aprendizado de máquina para um workspace do Azure Machine Learning e depois aguardando a conclusão do trabalho. Aqui está uma análise do que ele faz:
-
Ele chama o método create_or_update do objeto jobs no workspace_ml_client para submeter o trabalho de pipeline. O pipeline a ser executado é especificado por pipeline_object, e o experimento sob o qual o trabalho será executado é especificado por experiment_name.
-
Ele então chama o método stream do objeto jobs no workspace_ml_client para aguardar a conclusão do trabalho de pipeline. O trabalho a ser aguardado é especificado pelo atributo name do objeto pipeline_job.
-
Em resumo, este script está submetendo um trabalho de pipeline de aprendizado de máquina para um workspace do Azure Machine Learning, e depois aguardando a conclusão do trabalho.
# Enviar o trabalho do pipeline para o espaço de trabalho do Azure Machine Learning # O pipeline a ser executado é especificado por pipeline_object # O experimento sob o qual o trabalho é executado é especificado por experiment_name pipeline_job = workspace_ml_client.jobs.create_or_update( pipeline_object, experiment_name=experiment_name ) # Aguarde a conclusão do trabalho do pipeline # O trabalho a ser aguardado é especificado pelo atributo name do objeto pipeline_job workspace_ml_client.jobs.stream(pipeline_job.name)
-
Iremos registrar o modelo a partir da saída do trabalho de fine tuning. Isso irá rastrear a linhagem entre o modelo fine tuned e o trabalho de fine tuning. O trabalho de fine tuning, por sua vez, rastreia a linhagem para o modelo foundation, dados e código de treinamento.
-
Este script Python está registrando um modelo de aprendizado de máquina que foi treinado em um pipeline do Azure Machine Learning. Aqui está uma análise do que ele faz:
-
Ele importa os módulos necessários do Azure AI ML SDK.
-
Ele verifica se a saída trained_model está disponível a partir do trabalho do pipeline, chamando o método get do objeto jobs no workspace_ml_client e acessando seu atributo outputs.
-
Ele constrói um caminho para o modelo treinado formatando uma string com o nome do trabalho do pipeline e o nome da saída ("trained_model").
-
Ele define um nome para o modelo fine tuned adicionando "-ultrachat-200k" ao nome original do modelo e substituindo quaisquer barras por hífens.
-
Ele prepara o registro do modelo criando um objeto Model com vários parâmetros, incluindo o caminho para o modelo, o tipo do modelo (modelo MLflow), o nome e a versão do modelo, e uma descrição do modelo.
-
Ele registra o modelo chamando o método create_or_update do objeto models no workspace_ml_client com o objeto Model como argumento.
-
Ele imprime o modelo registrado.
-
-
Em resumo, este script está registrando um modelo de aprendizado de máquina que foi treinado em um pipeline do Azure Machine Learning.
# Importar módulos necessários do SDK Azure AI ML from azure.ai.ml.entities import Model from azure.ai.ml.constants import AssetTypes # Verificar se a saída `trained_model` está disponível no job do pipeline print("pipeline job outputs: ", workspace_ml_client.jobs.get(pipeline_job.name).outputs) # Construir um caminho para o modelo treinado formatando uma string com o nome do job do pipeline e o nome da saída ("trained_model") model_path_from_job = "azureml://jobs/{0}/outputs/{1}".format( pipeline_job.name, "trained_model" ) # Definir um nome para o modelo ajustado adicionando "-ultrachat-200k" ao nome original do modelo e substituindo quaisquer barras por hífens finetuned_model_name = model_name + "-ultrachat-200k" finetuned_model_name = finetuned_model_name.replace("/", "-") print("path to register model: ", model_path_from_job) # Preparar para registrar o modelo criando um objeto Model com vários parâmetros # Estes incluem o caminho para o modelo, o tipo do modelo (modelo MLflow), o nome e a versão do modelo, e uma descrição do modelo prepare_to_register_model = Model( path=model_path_from_job, type=AssetTypes.MLFLOW_MODEL, name=finetuned_model_name, version=timestamp, # Usar timestamp como versão para evitar conflito de versões description=model_name + " fine tuned model for ultrachat 200k chat-completion", ) print("prepare to register model: \n", prepare_to_register_model) # Registrar o modelo chamando o método create_or_update do objeto models no workspace_ml_client com o objeto Model como argumento registered_model = workspace_ml_client.models.create_or_update( prepare_to_register_model ) # Imprimir o modelo registrado print("registered model: \n", registered_model)
Endpoints online fornecem uma API REST durável que pode ser usada para integrar-se com aplicações que precisam usar o modelo.
-
Este script Python está criando um endpoint online gerenciado no Azure Machine Learning para um modelo registrado. Aqui está uma análise do que ele faz:
-
Ele importa os módulos necessários do Azure AI ML SDK.
-
Ele define um nome único para o endpoint online adicionando um timestamp à string "ultrachat-completion-".
-
Ele prepara a criação do endpoint online criando um objeto ManagedOnlineEndpoint com vários parâmetros, incluindo o nome do endpoint, uma descrição do endpoint e o modo de autenticação ("key").
-
Ele cria o endpoint online chamando o método begin_create_or_update do workspace_ml_client com o objeto ManagedOnlineEndpoint como argumento. Depois aguarda a conclusão da operação de criação chamando o método wait.
-
-
Em resumo, este script está criando um endpoint online gerenciado no Azure Machine Learning para um modelo registrado.
# Importe os módulos necessários do SDK Azure AI ML from azure.ai.ml.entities import ( ManagedOnlineEndpoint, ManagedOnlineDeployment, ProbeSettings, OnlineRequestSettings, ) # Defina um nome único para o endpoint online adicionando um timestamp à string "ultrachat-completion-" online_endpoint_name = "ultrachat-completion-" + timestamp # Prepare-se para criar o endpoint online criando um objeto ManagedOnlineEndpoint com vários parâmetros # Estes incluem o nome do endpoint, uma descrição do endpoint e o modo de autenticação ("key") endpoint = ManagedOnlineEndpoint( name=online_endpoint_name, description="Online endpoint for " + registered_model.name + ", fine tuned model for ultrachat-200k-chat-completion", auth_mode="key", ) # Crie o endpoint online chamando o método begin_create_or_update do workspace_ml_client com o objeto ManagedOnlineEndpoint como argumento # Em seguida, aguarde a conclusão da operação de criação chamando o método wait workspace_ml_client.begin_create_or_update(endpoint).wait()
Note
Você pode encontrar aqui a lista de SKUs suportados para implantação - Managed online endpoints SKU list
-
Este script Python está implantando um modelo de aprendizado de máquina registrado em um endpoint online gerenciado no Azure Machine Learning. Aqui está uma análise do que ele faz:
-
Ele importa o módulo ast, que fornece funções para processar árvores da gramática abstrata da sintaxe do Python.
-
Ele define o tipo de instância para a implantação como "Standard_NC6s_v3".
-
Ele verifica se a tag inference_compute_allow_list está presente no modelo foundation. Se estiver, ele converte o valor da tag de string para uma lista Python e a atribui a inference_computes_allow_list. Caso contrário, define inference_computes_allow_list como None.
-
Ele verifica se o tipo de instância especificado está na lista permitida. Se não estiver, imprime uma mensagem pedindo para o usuário selecionar um tipo de instância da lista permitida.
-
Ele prepara a criação da implantação criando um objeto ManagedOnlineDeployment com vários parâmetros, incluindo o nome da implantação, o nome do endpoint, o ID do modelo, o tipo e a quantidade da instância, as configurações de probe de vivacidade e as configurações de requisição.
-
Ele cria a implantação chamando o método begin_create_or_update do workspace_ml_client com o objeto ManagedOnlineDeployment como argumento. Depois aguarda a conclusão da operação de criação chamando o método wait.
-
Ele define o tráfego do endpoint para direcionar 100% do tráfego para a implantação "demo".
-
Ele atualiza o endpoint chamando o método begin_create_or_update do workspace_ml_client com o objeto endpoint como argumento. Depois aguarda a conclusão da operação de atualização chamando o método result.
-
-
Em resumo, este script está implantando um modelo de aprendizado de máquina registrado em um endpoint online gerenciado no Azure Machine Learning.
# Importe o módulo ast, que fornece funções para processar árvores da gramática sintática abstrata do Python import ast # Defina o tipo de instância para a implantação instance_type = "Standard_NC6s_v3" # Verifique se a tag `inference_compute_allow_list` está presente no modelo base if "inference_compute_allow_list" in foundation_model.tags: # Se estiver, converta o valor da tag de uma string para uma lista Python e atribua a `inference_computes_allow_list` inference_computes_allow_list = ast.literal_eval( foundation_model.tags["inference_compute_allow_list"] ) print(f"Please create a compute from the above list - {computes_allow_list}") else: # Se não estiver, defina `inference_computes_allow_list` como `None` inference_computes_allow_list = None print("`inference_compute_allow_list` is not part of model tags") # Verifique se o tipo de instância especificado está na lista permitida if ( inference_computes_allow_list is not None and instance_type not in inference_computes_allow_list ): print( f"`instance_type` is not in the allow listed compute. Please select a value from {inference_computes_allow_list}" ) # Prepare-se para criar a implantação criando um objeto `ManagedOnlineDeployment` com vários parâmetros demo_deployment = ManagedOnlineDeployment( name="demo", endpoint_name=online_endpoint_name, model=registered_model.id, instance_type=instance_type, instance_count=1, liveness_probe=ProbeSettings(initial_delay=600), request_settings=OnlineRequestSettings(request_timeout_ms=90000), ) # Crie a implantação chamando o método `begin_create_or_update` do `workspace_ml_client` com o objeto `ManagedOnlineDeployment` como argumento # Então aguarde a conclusão da operação de criação chamando o método `wait` workspace_ml_client.online_deployments.begin_create_or_update(demo_deployment).wait() # Defina o tráfego do endpoint para direcionar 100% do tráfego para a implantação "demo" endpoint.traffic = {"demo": 100} # Atualize o endpoint chamando o método `begin_create_or_update` do `workspace_ml_client` com o objeto `endpoint` como argumento # Então aguarde a conclusão da operação de atualização chamando o método `result` workspace_ml_client.begin_create_or_update(endpoint).result()
Iremos buscar alguns dados de exemplo do conjunto de teste e enviá-los para o endpoint online para inferência. Em seguida, iremos mostrar as labels pontuadas ao lado das labels de referência.
-
Este script Python está lendo um arquivo JSON Lines em um DataFrame do pandas, pegando uma amostra aleatória e resetando o índice. Aqui está uma análise do que ele faz:
-
Ele lê o arquivo ./ultrachat_200k_dataset/test_gen.jsonl em um DataFrame do pandas. A função read_json é usada com o argumento lines=True porque o arquivo está no formato JSON Lines, onde cada linha é um objeto JSON separado.
-
Ele pega uma amostra aleatória de 1 linha do DataFrame. A função sample é usada com o argumento n=1 para especificar o número de linhas aleatórias a selecionar.
-
Ele reseta o índice do DataFrame. A função reset_index é usada com o argumento drop=True para descartar o índice original e substituí-lo por um novo índice com valores inteiros padrões.
-
Ele exibe as primeiras 2 linhas do DataFrame usando a função head com o argumento 2. Porém, como o DataFrame contém apenas uma linha após a amostragem, isso exibirá apenas essa linha.
-
-
Em resumo, este script está lendo um arquivo JSON Lines em um DataFrame do pandas, pegando uma amostra aleatória de 1 linha, resetando o índice, e exibindo a primeira linha.
# Importar a biblioteca pandas import pandas as pd # Ler o arquivo JSON Lines './ultrachat_200k_dataset/test_gen.jsonl' em um DataFrame do pandas # O argumento 'lines=True' indica que o arquivo está no formato JSON Lines, onde cada linha é um objeto JSON separado test_df = pd.read_json("./ultrachat_200k_dataset/test_gen.jsonl", lines=True) # Obter uma amostra aleatória de 1 linha do DataFrame # O argumento 'n=1' especifica o número de linhas aleatórias a serem selecionadas test_df = test_df.sample(n=1) # Redefinir o índice do DataFrame # O argumento 'drop=True' indica que o índice original deve ser descartado e substituído por um novo índice de valores inteiros padrão # O argumento 'inplace=True' indica que o DataFrame deve ser modificado no local (sem criar um novo objeto) test_df.reset_index(drop=True, inplace=True) # Exibir as primeiras 2 linhas do DataFrame # No entanto, como o DataFrame contém apenas uma linha após a amostragem, isso exibirá apenas essa linha test_df.head(2)
-
Este script Python está criando um objeto JSON com parâmetros específicos e salvando-o em um arquivo. Aqui está uma descrição do que ele faz:
-
Ele importa o módulo json, que fornece funções para trabalhar com dados JSON.
-
Ele cria um dicionário parameters com chaves e valores que representam parâmetros para um modelo de aprendizado de máquina. As chaves são "temperature", "top_p", "do_sample" e "max_new_tokens", e seus valores correspondentes são 0.6, 0.9, True e 200, respectivamente.
-
Ele cria outro dicionário test_json com duas chaves: "input_data" e "params". O valor de "input_data" é outro dicionário com as chaves "input_string" e "parameters". O valor de "input_string" é uma lista contendo a primeira mensagem do DataFrame test_df. O valor de "parameters" é o dicionário parameters criado anteriormente. O valor de "params" é um dicionário vazio.
-
Ele abre um arquivo chamado sample_score.json
# Importe o módulo json, que fornece funções para trabalhar com dados JSON import json # Crie um dicionário `parameters` com chaves e valores que representam parâmetros para um modelo de aprendizado de máquina # As chaves são "temperature", "top_p", "do_sample" e "max_new_tokens", e seus valores correspondentes são 0.6, 0.9, True e 200, respectivamente parameters = { "temperature": 0.6, "top_p": 0.9, "do_sample": True, "max_new_tokens": 200, } # Crie outro dicionário `test_json` com duas chaves: "input_data" e "params" # O valor de "input_data" é outro dicionário com as chaves "input_string" e "parameters" # O valor de "input_string" é uma lista contendo a primeira mensagem do DataFrame `test_df` # O valor de "parameters" é o dicionário `parameters` criado anteriormente # O valor de "params" é um dicionário vazio test_json = { "input_data": { "input_string": [test_df["messages"][0]], "parameters": parameters, }, "params": {}, } # Abra um arquivo chamado `sample_score.json` no diretório `./ultrachat_200k_dataset` em modo de escrita with open("./ultrachat_200k_dataset/sample_score.json", "w") as f: # Escreva o dicionário `test_json` no arquivo em formato JSON usando a função `json.dump` json.dump(test_json, f)
-
-
Este script Python está invocando um endpoint online no Azure Machine Learning para avaliar um arquivo JSON. Aqui está uma descrição do que ele faz:
-
Ele chama o método invoke da propriedade online_endpoints do objeto workspace_ml_client. Este método é usado para enviar uma requisição a um endpoint online e obter uma resposta.
-
Ele especifica o nome do endpoint e da implantação com os argumentos endpoint_name e deployment_name. Neste caso, o nome do endpoint está armazenado na variável online_endpoint_name e o nome da implantação é "demo".
-
Ele especifica o caminho para o arquivo JSON a ser avaliado com o argumento request_file. Neste caso, o arquivo é ./ultrachat_200k_dataset/sample_score.json.
-
Ele armazena a resposta do endpoint na variável response.
-
Ele imprime a resposta bruta.
-
-
Em resumo, este script está invocando um endpoint online no Azure Machine Learning para avaliar um arquivo JSON e imprimindo a resposta.
# Invocar o endpoint online no Azure Machine Learning para avaliar o arquivo `sample_score.json` # O método `invoke` da propriedade `online_endpoints` do objeto `workspace_ml_client` é usado para enviar uma solicitação a um endpoint online e obter uma resposta # O argumento `endpoint_name` especifica o nome do endpoint, que está armazenado na variável `online_endpoint_name` # O argumento `deployment_name` especifica o nome do deployment, que é "demo" # O argumento `request_file` especifica o caminho para o arquivo JSON a ser avaliado, que é `./ultrachat_200k_dataset/sample_score.json` response = workspace_ml_client.online_endpoints.invoke( endpoint_name=online_endpoint_name, deployment_name="demo", request_file="./ultrachat_200k_dataset/sample_score.json", ) # Imprime a resposta bruta do endpoint print("raw response: \n", response, "\n")
-
Não esqueça de excluir o endpoint online, caso contrário você deixará o medidor de cobrança rodando para o recurso computacional utilizado pelo endpoint. Esta linha de código Python está excluindo um endpoint online no Azure Machine Learning. Aqui está uma descrição do que ela faz:
-
Ela chama o método begin_delete da propriedade online_endpoints do objeto workspace_ml_client. Este método é usado para iniciar a exclusão de um endpoint online.
-
Ela especifica o nome do endpoint a ser excluído com o argumento name. Neste caso, o nome do endpoint está armazenado na variável online_endpoint_name.
-
Ela chama o método wait para esperar que a operação de exclusão seja concluída. Esta é uma operação bloqueante, ou seja, impedirá que o script continue até que a exclusão seja finalizada.
-
Em resumo, esta linha de código está iniciando a exclusão de um endpoint online no Azure Machine Learning e esperando que a operação seja concluída.
# Exclua o endpoint online no Azure Machine Learning # O método `begin_delete` da propriedade `online_endpoints` do objeto `workspace_ml_client` é usado para iniciar a exclusão de um endpoint online # O argumento `name` especifica o nome do endpoint a ser excluído, que está armazenado na variável `online_endpoint_name` # O método `wait` é chamado para aguardar a conclusão da operação de exclusão. Esta é uma operação bloqueante, o que significa que impedirá que o script continue até que a exclusão seja concluída workspace_ml_client.online_endpoints.begin_delete(name=online_endpoint_name).wait()
-
Aviso Legal: Este documento foi traduzido utilizando o serviço de tradução por IA Co-op Translator. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.
