Partilhar via


Introdução às implantações em lote global do Azure OpenAI

A API de Lote do Azure OpenAI foi projetada para lidar com tarefas de processamento de grande escala e alto volume de forma eficiente. Processe grupos assíncronos de solicitações com cota separada, com prazo de entrega de 24 horas, a um custo 50% menor do que o padrão global. Com o processamento em lote, em vez de enviar uma solicitação de cada vez, você envia um grande número de solicitações em um único arquivo. As solicitações globais em lote têm uma cota de token enfileirada separada, evitando qualquer interrupção de suas cargas de trabalho online.

Os principais casos de utilização incluem:

  • Processamento de dados em larga escala: analise rapidamente conjuntos de dados extensos em paralelo.

  • Geração de conteúdo: crie grandes volumes de texto, como descrições de produtos ou artigos.

  • Revisão e Resumo de Documentos: Automatize a revisão e o resumo de documentos extensos.

  • Automação do suporte ao cliente: lide com várias consultas simultaneamente para respostas mais rápidas.

  • Extração e Análise de Dados: Extraia e analise informações de grandes quantidades de dados não estruturados.

  • Tarefas de Processamento de Linguagem Natural (NLP): Execute tarefas como análise de sentimento ou tradução em grandes conjuntos de dados.

  • Marketing e Personalização: Gere conteúdo personalizado e recomendações em escala.

Importante

Nosso objetivo é processar solicitações em lote dentro de 24 horas; não caducamos os postos de trabalho que demoram mais tempo. Você pode cancelar o trabalho a qualquer momento. Quando você cancela o trabalho, qualquer trabalho restante é cancelado e qualquer trabalho já concluído é devolvido. Você será cobrado por qualquer trabalho concluído.

Os dados armazenados em repouso permanecem na geografia designada do Azure, enquanto os dados podem ser processados para inferência em qualquer local do Azure OpenAI. Saiba mais sobre residência de dados. 

Suporte global em lote

Suporte a regiões e modelos

Atualmente, o lote global é suportado nas seguintes regiões:

Região GPT-4O, 2024-05-13 GPT-4O, 2024-08-06 GPT-4O-Mini, 2024-07-18 GPT-4, 0613 GPT-4, turbo-2024-04-09 GPT-35-TURBO, 0613 GPT-35-Turbo, 1106 GPT-35-Turbo, 0125
australiaeast
canadaeast
eastus
eastus2
northcentralus
E.U.A Centro-Sul
southindia
suécia central
norte da suíça
uksouth
westus
westus3

Os seguintes modelos suportam lote global:

Modelo Versão Formato de entrada
gpt-4o 2024-08-06 texto + imagem
gpt-4o-mini 2024-07-18 texto + imagem
gpt-4o 2024-05-13 texto + imagem
gpt-4 turbo-2024-04-09 texto
gpt-4 0613 texto
gpt-35-turbo 0125 texto
gpt-35-turbo 1106 texto
gpt-35-turbo 0613 texto

Consulte a página de modelos para obter as informações mais atualizadas sobre regiões/modelos onde o lote global é suportado atualmente.

Suporte de API

Versão da API
Versão mais recente da API do GA: 2024-10-21
Versão mais recente da API de visualização: 2024-10-01-preview

Suporte adicionado pela primeira vez em: 2024-07-01-preview

Suporte de funcionalidades

No momento, não há suporte para os seguintes itens:

  • Integração com a API de Assistentes.
  • Integração com o recurso Azure OpenAI On Your Data.

Nota

As saídas estruturadas agora são suportadas com o Global Batch.

Implantação global em lote

Na interface do usuário do Studio, o tipo de implantação aparecerá como Global-Batch.

Captura de tela que mostra a caixa de diálogo de implantação de modelo no Azure AI Studio com o tipo de implantação Global-Batch realçado.

Gorjeta

Recomendamos habilitar a cota dinâmica para todas as implantações de modelo de lote global para ajudar a evitar falhas de trabalho devido à cota de token enfileirada insuficiente. A cota dinâmica permite que sua implantação aproveite oportunisticamente mais cota quando houver capacidade extra disponível. Quando a cota dinâmica estiver definida como desativada, sua implantação só poderá processar solicitações até o limite de token enfileirado que foi definido quando você criou a implantação.

Pré-requisitos

Preparando seu arquivo em lote

Como o ajuste fino, o lote global usa arquivos no formato de linhas JSON (.jsonl). Abaixo estão alguns exemplos de arquivos com diferentes tipos de conteúdo suportado:

Formato de entrada

{"custom_id": "task-0", "method": "POST", "url": "/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}

O custom_id é necessário para permitir que você identifique qual solicitação de lote individual corresponde a uma determinada resposta. As respostas não serão retornadas em ordem idêntica à ordem definida no .jsonl arquivo em lotes.

model deve ser definido para corresponder ao nome da implantação do Lote Global que você deseja direcionar para respostas de inferência.

Importante

O model atributo deve ser definido para corresponder ao nome da implantação do Lote Global que você deseja direcionar para respostas de inferência. O mesmo nome de implantação do modelo de lote global deve estar presente em cada linha do arquivo em lotes. Se você quiser direcionar uma implantação diferente, deverá fazê-lo em um arquivo/trabalho em lote separado.

Para obter o melhor desempenho, recomendamos o envio de arquivos grandes para processamento em lote, em vez de um grande número de arquivos pequenos com apenas algumas linhas em cada arquivo.

Criar arquivo de entrada

Para este artigo, criaremos um arquivo chamado test.jsonl e copiaremos o conteúdo do bloco de código de entrada padrão acima para o arquivo. Você precisará modificar e adicionar seu nome de implantação em lote global a cada linha do arquivo.

Carregar ficheiro batch

Uma vez que seu arquivo de entrada é preparado, você primeiro precisa carregar o arquivo para então ser capaz de iniciar um trabalho em lote. O upload de arquivos pode ser feito de forma programática ou através do Studio.

  1. Faça login no AI Studio.

  2. Selecione o recurso OpenAI do Azure onde você tem uma implantação de modelo de lote global disponível.

  3. Selecione Trabalhos> em lote+Criar trabalhos em lote.

    Captura de tela que mostra a experiência de criação de trabalho em lote no Azure AI Studio.

  4. Na lista suspensa, em Dados em lote>: Carregar arquivos>, selecione Carregar arquivo e forneça o caminho para o test.jsonl arquivo criado na etapa >anterior: Avançar.

    Captura de ecrã que mostra a experiência de carregar ficheiros.

Criar trabalho em lote

Selecione Criar para iniciar o trabalho em lote.

Captura de ecrã da experiência de IU do Azure Studio para criar um trabalho em lotes.

Acompanhe o progresso do trabalho em lote

Depois que o trabalho for criado, você poderá monitorar o progresso do trabalho selecionando a ID do trabalho criado mais recentemente. Por padrão, você será direcionado para a página de status do trabalho em lote criado mais recentemente.

Captura de tela que mostra a ID do trabalho em lote para um trabalho atualmente em validação.

Você pode acompanhar o status do trabalho no painel direito:

Captura de tela que mostra a experiência de status do trabalho em lote no Azure AI Studio.

Recuperar arquivo de saída de trabalho em lote

Uma vez que seu trabalho tenha sido concluído ou atingido um estado terminal, ele irá gerar um arquivo de erro e um arquivo de saída que pode ser baixado para revisão, selecionando o respetivo botão com o ícone de seta para baixo.

Captura de tela que mostra a saída do trabalho em lote e os arquivos de erro disponíveis para download.

Cancelar lote

Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de mudar para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.

Captura de tela que mostra o botão de cancelamento de trabalho em lote no Azure AI Studio.

Pré-requisitos

As etapas neste artigo destinam-se a ser executadas sequencialmente no Jupyter Notebooks. Por esse motivo, só instanciaremos o cliente OpenAI do Azure uma vez no início dos exemplos. Se você quiser executar uma etapa fora de ordem, muitas vezes precisará configurar um cliente OpenAI do Azure como parte dessa chamada.

Mesmo que você já tenha a biblioteca OpenAI Python instalada, talvez seja necessário atualizar sua instalação para a versão mais recente:

!pip install openai --upgrade

Preparando seu arquivo em lote

Como o ajuste fino, o lote global usa arquivos no formato de linhas JSON (.jsonl). Abaixo estão alguns exemplos de arquivos com diferentes tipos de conteúdo suportado:

Formato de entrada

{"custom_id": "task-0", "method": "POST", "url": "/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}

O custom_id é necessário para permitir que você identifique qual solicitação de lote individual corresponde a uma determinada resposta. As respostas não serão retornadas em ordem idêntica à ordem definida no .jsonl arquivo em lotes.

model deve ser definido para corresponder ao nome da implantação do Lote Global que você deseja direcionar para respostas de inferência.

Importante

O model atributo deve ser definido para corresponder ao nome da implantação do Lote Global que você deseja direcionar para respostas de inferência. O mesmo nome de implantação do modelo de lote global deve estar presente em cada linha do arquivo em lotes. Se você quiser direcionar uma implantação diferente, deverá fazê-lo em um arquivo/trabalho em lote separado.

Para obter o melhor desempenho, recomendamos o envio de arquivos grandes para processamento em lote, em vez de um grande número de arquivos pequenos com apenas algumas linhas em cada arquivo.

Criar arquivo de entrada

Para este artigo, criaremos um arquivo chamado test.jsonl e copiaremos o conteúdo do bloco de código de entrada padrão acima para o arquivo. Você precisará modificar e adicionar seu nome de implantação em lote global a cada linha do arquivo. Salve este arquivo no mesmo diretório que você está executando seu Jupyter Notebook.

Carregar ficheiro batch

Uma vez que seu arquivo de entrada é preparado, você primeiro precisa carregar o arquivo para então ser capaz de iniciar um trabalho em lote. O upload de arquivos pode ser feito de forma programática ou através do Studio. Este exemplo usa variáveis de ambiente no lugar dos valores de chave e ponto final. Se você não está familiarizado com o uso de variáveis de ambiente com Python, consulte um de nossos inícios rápidos , onde o processo de configuração das variáveis de ambiente é explicado passo a passo.

import os
from openai import AzureOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  azure_ad_token_provider=token_provider,
  api_version="2024-10-21"
)

# Upload a file with a purpose of "batch"
file = client.files.create(
  file=open("test.jsonl", "rb"), 
  purpose="batch"
)

print(file.model_dump_json(indent=2))
file_id = file.id

Saída:

{
  "id": "file-9f3a81d899b4442f98b640e4bc3535dd",
  "bytes": 815,
  "created_at": 1722476551,
  "filename": "test.jsonl",
  "object": "file",
  "purpose": "batch",
  "status": null,
  "status_details": null
}

Criar trabalho em lote

Uma vez que seu arquivo tenha sido carregado com sucesso, você pode enviá-lo para processamento em lote.

# Submit a batch job with the file
batch_response = client.batches.create(
    input_file_id=file_id,
    endpoint="/chat/completions",
    completion_window="24h",
)

# Save batch ID for later use
batch_id = batch_response.id

print(batch_response.model_dump_json(indent=2))

Nota

Atualmente, a janela de conclusão deve ser definida para 24h. Se você definir qualquer outro valor além de 24h, seu trabalho falhará. Os trabalhos com duração superior a 24 horas continuarão a ser executados até serem cancelados.

Saída:

{
  "id": "batch_6caaf24d-54a5-46be-b1b7-518884fcbdde",
  "completion_window": "24h",
  "created_at": 1722476583,
  "endpoint": null,
  "input_file_id": "file-9f3a81d899b4442f98b640e4bc3535dd",
  "object": "batch",
  "status": "validating",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "error_file_id": null,
  "errors": null,
  "expired_at": null,
  "expires_at": 1722562983,
  "failed_at": null,
  "finalizing_at": null,
  "in_progress_at": null,
  "metadata": null,
  "output_file_id": null,
  "request_counts": {
    "completed": 0,
    "failed": 0,
    "total": 0
  }
}

Acompanhe o progresso do trabalho em lote

Depois de criar o trabalho em lote com sucesso, você pode monitorar seu progresso no Studio ou programaticamente. Ao verificar o progresso do trabalho em lote, recomendamos aguardar pelo menos 60 segundos entre cada chamada de status.

import time
import datetime 

status = "validating"
while status not in ("completed", "failed", "canceled"):
    time.sleep(60)
    batch_response = client.batches.retrieve(batch_id)
    status = batch_response.status
    print(f"{datetime.datetime.now()} Batch Id: {batch_id},  Status: {status}")

if batch_response.status == "failed":
    for error in batch_response.errors.data:  
        print(f"Error code {error.code} Message {error.message}")

Saída:

2024-07-31 21:48:32.556488 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: validating
2024-07-31 21:49:39.221560 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: in_progress
2024-07-31 21:50:53.383138 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: in_progress
2024-07-31 21:52:07.274570 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: in_progress
2024-07-31 21:53:21.149501 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:54:34.572508 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:55:35.304713 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:56:36.531816 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:57:37.414105 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: completed

Os seguintes valores de status são possíveis:

Estado Descrição
validating O arquivo de entrada está sendo validado antes que o processamento em lote possa começar.
failed O arquivo de entrada falhou no processo de validação.
in_progress O arquivo de entrada foi validado com êxito e o lote está em execução no momento.
finalizing O lote foi concluído e os resultados estão a ser preparados.
completed O lote foi concluído e os resultados estão prontos.
expired O lote não pôde ser concluído dentro da janela de tempo de 24 horas.
cancelling O lote está sendo cancelled (Isso pode levar até 10 minutos para entrar em vigor.)
cancelled o lote era cancelled.

Para examinar os detalhes do status do trabalho, você pode executar:

print(batch_response.model_dump_json(indent=2))

Saída:

{
  "id": "batch_6caaf24d-54a5-46be-b1b7-518884fcbdde",
  "completion_window": "24h",
  "created_at": 1722476583,
  "endpoint": null,
  "input_file_id": "file-9f3a81d899b4442f98b640e4bc3535dd",
  "object": "batch",
  "status": "completed",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": 1722477429,
  "error_file_id": "file-c795ae52-3ba7-417d-86ec-07eebca57d0b",
  "errors": null,
  "expired_at": null,
  "expires_at": 1722562983,
  "failed_at": null,
  "finalizing_at": 1722477177,
  "in_progress_at": null,
  "metadata": null,
  "output_file_id": "file-3304e310-3b39-4e34-9f1c-e1c1504b2b2a",
  "request_counts": {
    "completed": 3,
    "failed": 0,
    "total": 3
  }
}

Observe que há ambos error_file_id e um separado output_file_id. Use o error_file_id para ajudar na depuração de quaisquer problemas que ocorram com seu trabalho em lote.

Recuperar arquivo de saída de trabalho em lote

import json

output_file_id = batch_response.output_file_id

if not output_file_id:
    output_file_id = batch_response.error_file_id

if output_file_id:
    file_response = client.files.content(output_file_id)
    raw_responses = file_response.text.strip().split('\n')  

    for raw_response in raw_responses:  
        json_response = json.loads(raw_response)  
        formatted_json = json.dumps(json_response, indent=2)  
        print(formatted_json)

Saída:

Para maior brevidade, estamos incluindo apenas uma única resposta de conclusão de bate-papo de saída. Se você seguir as etapas neste artigo, você deve ter três respostas semelhantes à abaixo:

{
  "custom_id": "task-0",
  "response": {
    "body": {
      "choices": [
        {
          "content_filter_results": {
            "hate": {
              "filtered": false,
              "severity": "safe"
            },
            "self_harm": {
              "filtered": false,
              "severity": "safe"
            },
            "sexual": {
              "filtered": false,
              "severity": "safe"
            },
            "violence": {
              "filtered": false,
              "severity": "safe"
            }
          },
          "finish_reason": "stop",
          "index": 0,
          "logprobs": null,
          "message": {
            "content": "Microsoft was founded on April 4, 1975, by Bill Gates and Paul Allen in Albuquerque, New Mexico.",
            "role": "assistant"
          }
        }
      ],
      "created": 1722477079,
      "id": "chatcmpl-9rFGJ9dh08Tw9WRKqaEHwrkqRa4DJ",
      "model": "gpt-4o-2024-05-13",
      "object": "chat.completion",
      "prompt_filter_results": [
        {
          "prompt_index": 0,
          "content_filter_results": {
            "hate": {
              "filtered": false,
              "severity": "safe"
            },
            "jailbreak": {
              "filtered": false,
              "detected": false
            },
            "self_harm": {
              "filtered": false,
              "severity": "safe"
            },
            "sexual": {
              "filtered": false,
              "severity": "safe"
            },
            "violence": {
              "filtered": false,
              "severity": "safe"
            }
          }
        }
      ],
      "system_fingerprint": "fp_a9bfe9d51d",
      "usage": {
        "completion_tokens": 24,
        "prompt_tokens": 27,
        "total_tokens": 51
      }
    },
    "request_id": "660b7424-b648-4b67-addc-862ba067d442",
    "status_code": 200
  },
  "error": null
}

Comandos em lote adicionais

Cancelar lote

Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de mudar para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.

client.batches.cancel("batch_abc123") # set to your batch_id for the job you want to cancel

Listar lote

Liste trabalhos em lote para um recurso específico do Azure OpenAI.

client.batches.list()

Os métodos de lista na biblioteca Python são paginados.

Para listar todos os trabalhos:

all_jobs = []
# Automatically fetches more pages as needed.
for job in client.batches.list(
    limit=20,
):
    # Do something with job here
    all_jobs.append(job)
print(all_jobs)

Lote de lista (Pré-visualização)

Use a API REST para listar todos os trabalhos em lote com opções adicionais de classificação/filtragem.

Nos exemplos abaixo, estamos fornecendo a generate_time_filter função para facilitar a construção do filtro. Se você não deseja usar essa função, o formato da cadeia de caracteres do filtro seria parecido com created_at gt 1728860560 and status eq 'Completed'.

import requests
import json
from datetime import datetime, timedelta
from azure.identity import DefaultAzureCredential

token_credential = DefaultAzureCredential()
token = token_credential.get_token('https://cognitiveservices.azure.com/.default')

endpoint = "https://{YOUR_RESOURCE_NAME}.openai.azure.com/"
api_version = "2024-10-01-preview"
url = f"{endpoint}openai/batches"
order = "created_at asc"
time_filter =  lambda: generate_time_filter("past 8 hours")

# Additional filter examples:
#time_filter =  lambda: generate_time_filter("past 1 day")
#time_filter =  lambda: generate_time_filter("past 3 days", status="Completed")

def generate_time_filter(time_range, status=None):
    now = datetime.now()
    
    if 'day' in time_range:
        days = int(time_range.split()[1])
        start_time = now - timedelta(days=days)
    elif 'hour' in time_range:
        hours = int(time_range.split()[1])
        start_time = now - timedelta(hours=hours)
    else:
        raise ValueError("Invalid time range format. Use 'past X day(s)' or 'past X hour(s)'")
    
    start_timestamp = int(start_time.timestamp())
    
    filter_string = f"created_at gt {start_timestamp}"
    
    if status:
        filter_string += f" and status eq '{status}'"
    
    return filter_string

filter = time_filter()

headers = {'Authorization': 'Bearer ' + token.token}

params = {
    "api-version": api_version,
    "$filter": filter,
    "$orderby": order
}

response = requests.get(url, headers=headers, params=params)

json_data = response.json()

if response.status_code == 200:
    print(json.dumps(json_data, indent=2))
else:
    print(f"Request failed with status code: {response.status_code}")
    print(response.text)  

Saída:

{
  "data": [
    {
      "cancelled_at": null,
      "cancelling_at": null,
      "completed_at": 1729011896,
      "completion_window": "24h",
      "created_at": 1729011128,
      "error_file_id": "file-472c0626-4561-4327-9e4e-f41afbfb30e6",
      "expired_at": null,
      "expires_at": 1729097528,
      "failed_at": null,
      "finalizing_at": 1729011805,
      "id": "batch_4ddc7b60-19a9-419b-8b93-b9a3274b33b5",
      "in_progress_at": 1729011493,
      "input_file_id": "file-f89384af0082485da43cb26b49dc25ce",
      "errors": null,
      "metadata": null,
      "object": "batch",
      "output_file_id": "file-62bebde8-e767-4cd3-a0a1-28b214dc8974",
      "request_counts": {
        "total": 3,
        "completed": 2,
        "failed": 1
      },
      "status": "completed",
      "endpoint": "/chat/completions"
    },
    {
      "cancelled_at": null,
      "cancelling_at": null,
      "completed_at": 1729016366,
      "completion_window": "24h",
      "created_at": 1729015829,
      "error_file_id": "file-85ae1971-9957-4511-9eb4-4cc9f708b904",
      "expired_at": null,
      "expires_at": 1729102229,
      "failed_at": null,
      "finalizing_at": 1729016272,
      "id": "batch_6287485f-50fc-4efa-bcc5-b86690037f43",
      "in_progress_at": 1729016126,
      "input_file_id": "file-686746fcb6bc47f495250191ffa8a28e",
      "errors": null,
      "metadata": null,
      "object": "batch",
      "output_file_id": "file-04399828-ae0b-4825-9b49-8976778918cb",
      "request_counts": {
        "total": 3,
        "completed": 2,
        "failed": 1
      },
      "status": "completed",
      "endpoint": "/chat/completions"
    }
  ],
  "first_id": "batch_4ddc7b60-19a9-419b-8b93-b9a3274b33b5",
  "has_more": false,
  "last_id": "batch_6287485f-50fc-4efa-bcc5-b86690037f43"
}

Pré-requisitos

Preparando seu arquivo em lote

Como o ajuste fino, o lote global usa arquivos no formato de linhas JSON (.jsonl). Abaixo estão alguns exemplos de arquivos com diferentes tipos de conteúdo suportado:

Formato de entrada

{"custom_id": "task-0", "method": "POST", "url": "/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}

O custom_id é necessário para permitir que você identifique qual solicitação de lote individual corresponde a uma determinada resposta. As respostas não serão retornadas em ordem idêntica à ordem definida no .jsonl arquivo em lotes.

model deve ser definido para corresponder ao nome da implantação do Lote Global que você deseja direcionar para respostas de inferência.

Importante

O model atributo deve ser definido para corresponder ao nome da implantação do Lote Global que você deseja direcionar para respostas de inferência. O mesmo nome de implantação do modelo de lote global deve estar presente em cada linha do arquivo em lotes. Se você quiser direcionar uma implantação diferente, deverá fazê-lo em um arquivo/trabalho em lote separado.

Para obter o melhor desempenho, recomendamos o envio de arquivos grandes para processamento em lote, em vez de um grande número de arquivos pequenos com apenas algumas linhas em cada arquivo.

Criar arquivo de entrada

Para este artigo, criaremos um arquivo chamado test.jsonl e copiaremos o conteúdo do bloco de código de entrada padrão acima para o arquivo. Você precisará modificar e adicionar seu nome de implantação em lote global a cada linha do arquivo.

Carregar ficheiro batch

Uma vez que seu arquivo de entrada é preparado, você primeiro precisa carregar o arquivo para então ser capaz de iniciar um trabalho em lote. O upload de arquivos pode ser feito de forma programática ou através do Studio. Este exemplo usa variáveis de ambiente no lugar dos valores de chave e ponto final. Se você não está familiarizado com o uso de variáveis de ambiente com Python, consulte um de nossos inícios rápidos , onde o processo de configuração das variáveis de ambiente é explicado passo a passo.

Importante

Se você usar uma chave de API, armazene-a com segurança em outro lugar, como no Cofre de Chaves do Azure. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente.

Para obter mais informações sobre segurança de serviços de IA, consulte Autenticar solicitações para serviços de IA do Azure.

curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/files?api-version=2024-10-21 \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=batch" \
  -F "file=@C:\\batch\\test.jsonl;type=application/json"

O código acima assume um caminho de arquivo específico para seu arquivo test.jsonl. Ajuste esse caminho de arquivo conforme necessário para seu sistema local.

Saída:

{
  "status": "pending",
  "bytes": 686,
  "purpose": "batch",
  "filename": "test.jsonl",
  "id": "file-21006e70789246658b86a1fc205899a4",
  "created_at": 1721408291,
  "object": "file"
}

Acompanhe o status de upload de arquivos

Dependendo do tamanho do seu ficheiro de carregamento, poderá demorar algum tempo até que seja totalmente carregado e processado. Para verificar o status de upload do arquivo, execute:

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/files/{file-id}?api-version=2024-10-21 \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Saída:

{
  "status": "processed",
  "bytes": 686,
  "purpose": "batch",
  "filename": "test.jsonl",
  "id": "file-21006e70789246658b86a1fc205899a4",
  "created_at": 1721408291,
  "object": "file"
}

Criar trabalho em lote

Uma vez que seu arquivo tenha sido carregado com sucesso, você pode enviá-lo para processamento em lote.

curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/batches?api-version=2024-10-21 \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input_file_id": "file-abc123",
    "endpoint": "/chat/completions",
    "completion_window": "24h"
  }'

Nota

Atualmente, a janela de conclusão deve ser definida para 24h. Se você definir qualquer outro valor além de 24h, seu trabalho falhará. Os trabalhos com duração superior a 24 horas continuarão a ser executados até serem cancelados.

Saída:

{
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "completion_window": "24h",
  "created_at": "2024-07-19T17:13:57.2491382+00:00",
  "error_file_id": null,
  "expired_at": null,
  "expires_at": "2024-07-20T17:13:57.1918498+00:00",
  "failed_at": null,
  "finalizing_at": null,
  "id": "batch_fe3f047a-de39-4068-9008-346795bfc1db",
  "in_progress_at": null,
  "input_file_id": "file-21006e70789246658b86a1fc205899a4",
  "errors": null,
  "metadata": null,
  "object": "batch",
  "output_file_id": null,
  "request_counts": {
    "total": null,
    "completed": null,
    "failed": null
  },
  "status": "Validating"
}

Acompanhe o progresso do trabalho em lote

Depois de criar o trabalho em lote com sucesso, você pode monitorar seu progresso no Studio ou programaticamente. Ao verificar o progresso do trabalho em lote, recomendamos aguardar pelo menos 60 segundos entre cada chamada de status.

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/batches/{batch_id}?api-version=2024-10-21 \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Saída:

{
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "completion_window": "24h",
  "created_at": "2024-07-19T17:33:29.1619286+00:00",
  "error_file_id": null,
  "expired_at": null,
  "expires_at": "2024-07-20T17:33:29.1578141+00:00",
  "failed_at": null,
  "finalizing_at": null,
  "id": "batch_e0a7ee28-82c4-46a2-a3a0-c13b3c4e390b",
  "in_progress_at": null,
  "input_file_id": "file-c55ec4e859d54738a313d767718a2ac5",
  "errors": null,
  "metadata": null,
  "object": "batch",
  "output_file_id": null,
  "request_counts": {
    "total": null,
    "completed": null,
    "failed": null
  },
  "status": "Validating"
}

Os seguintes valores de status são possíveis:

Estado Descrição
validating O arquivo de entrada está sendo validado antes que o processamento em lote possa começar.
failed O arquivo de entrada falhou no processo de validação.
in_progress O arquivo de entrada foi validado com êxito e o lote está em execução no momento.
finalizing O lote foi concluído e os resultados estão a ser preparados.
completed O lote foi concluído e os resultados estão prontos.
expired O lote não pôde ser concluído dentro da janela de tempo de 24 horas.
cancelling O lote está sendo cancelled (Isso pode levar até 10 minutos para entrar em vigor.)
cancelled o lote era cancelled.

Recuperar arquivo de saída de trabalho em lote

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/files/{output_file_id}/content?api-version=2024-10-21 \
  -H "api-key: $AZURE_OPENAI_API_KEY" > batch_output.jsonl

Comandos em lote adicionais

Cancelar lote

Cancela um lote em andamento. O lote ficará em status cancelling por até 10 minutos, antes de mudar para cancelled, onde terá resultados parciais (se houver) disponíveis no arquivo de saída.

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/batches/{batch_id}/cancel?api-version=2024-10-21 \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Listar lote

Liste trabalhos em lote existentes para um determinado recurso do Azure OpenAI.

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/batches?api-version=2024-10-21 \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

A chamada de API de lista é paginada. A resposta contém um booleano has_more para indicar quando há mais resultados para iterar.

Lote de lista (Pré-visualização)

Use a API REST para listar todos os trabalhos em lote com opções adicionais de classificação/filtragem.

curl "YOUR_RESOURCE_NAME.openai.azure.com/batches?api-version=2024-10-01-preview&$filter=created_at%20gt%201728773533%20and%20created_at%20lt%201729032733%20and%20status%20eq%20'Completed'&$orderby=created_at%20asc" \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Para evitar o erro URL rejected: Malformed input to a URL function , os espaços são substituídos por %20.

Limites globais de lotes

Nome do limite Valor limite
Máximo de arquivos por recurso 500
Tamanho máximo do arquivo de entrada 200 MB
Máximo de solicitações por arquivo 100.000

Quota global de lotes

A tabela mostra o limite de cota de lote. Os valores de cota para lote global são representados em termos de tokens enfileirados. Quando você envia um arquivo para processamento em lote, o número de tokens presentes no arquivo é contado. Até que o trabalho em lote atinja um estado terminal, esses tokens contarão em relação ao seu limite total de tokens enfileirados.

Modelo Contrato Enterprise Predefinido Subscrições mensais baseadas em cartões de crédito Assinaturas do MSDN Azure para Estudantes, Versões Experimentais Gratuitas
gpt-4o 5 B 200 milh 50 milh 90 K N/A
gpt-4o-mini 15 B 1 B 50 milh 90 K N/A
gpt-4-turbo 300 milh 80 milh 40 milh 90 K N/A
gpt-4 150 milh 30 milh 5 milh 100 mil N/A
gpt-35-turbo 10 B 1 B 100 milh 2 milh 50 mil

B = mil milhões | M = milhões | K = mil

Objeto em lote

Propriedade Type Definição
id string
object string batch
endpoint string O ponto de extremidade da API usado pelo lote
errors objeto
input_file_id string A ID do arquivo de entrada para o lote
completion_window string O prazo dentro do qual o lote deve ser processado
status string O status atual do lote. Valores possíveis: , , , , , completedexpired, cancelling, cancelled. finalizingin_progressfailedvalidating
output_file_id string A ID do arquivo que contém as saídas de solicitações executadas com êxito.
error_file_id string O ID do arquivo que contém as saídas de solicitações com erros.
created_at integer Um carimbo de data/hora quando este lote foi criado (em épocas unix).
in_progress_at integer Um carimbo de data/hora quando este lote começou a progredir (em épocas unix).
expires_at integer Um carimbo de data/hora quando este lote expirará (em épocas unix).
finalizing_at integer Um carimbo de data/hora quando este lote começou a ser finalizado (em épocas unix).
completed_at integer Um carimbo de data/hora quando este lote começou a ser finalizado (em épocas unix).
failed_at integer Um carimbo de data/hora quando este lote falhou (em épocas unix)
expired_at integer Um carimbo de data/hora quando este lote expirou (em épocas unix).
cancelling_at integer Um carimbo de data/hora quando este lote começou cancelling (em épocas unix).
cancelled_at integer Um carimbo de data/hora quando este lote foi cancelled (em épocas unix).
request_counts objeto Estrutura do objeto:

totalinteiro
O número total de solicitações no lote.
completed inteiro
O número de solicitações no lote que foram concluídas com êxito.
failedinteiro
O número de solicitações no lote que falharam.
metadata map Um conjunto de pares chave-valor que podem ser anexados ao lote. Essa propriedade pode ser útil para armazenar informações adicionais sobre o lote em um formato estruturado.

Perguntas mais frequentes (FAQ)

As imagens podem ser usadas com a API em lote?

Esta capacidade está limitada a determinados modelos multimodais. Atualmente, apenas GPT-4o suporta imagens como parte de solicitações em lote. As imagens podem ser fornecidas como entrada via url da imagem ou uma representação codificada base64 da imagem. As imagens para lote não são atualmente suportadas com o GPT-4 Turbo.

Posso usar a API em lote com modelos ajustados?

Esse procedimento não é atualmente suportado.

Posso usar a API em lote para incorporar modelos?

Esse procedimento não é atualmente suportado.

A filtragem de conteúdo funciona com a implantação do Global Batch?

Sim. Semelhante a outros tipos de implantação, você pode criar filtros de conteúdo e associá-los ao tipo de implantação de Lote Global.

Posso pedir quota adicional?

Sim, na página de cota na interface do usuário do Studio. A alocação de cota padrão pode ser encontrada no artigo cota e limites.

O que acontece se a API não concluir minha solicitação dentro do prazo de 24 horas?

Pretendemos processar estes pedidos no prazo de 24 horas; não expiramos os trabalhos que demoram mais tempo. Você pode cancelar o trabalho a qualquer momento. Quando você cancela o trabalho, qualquer trabalho restante é cancelado e qualquer trabalho já concluído é devolvido. Você será cobrado por qualquer trabalho concluído.

Quantas solicitações posso enfileirar usando lote?

Não há um limite fixo para o número de solicitações que você pode enviar em lote, no entanto, isso dependerá da sua cota de token enfileirada. Sua cota de token enfileirada inclui o número máximo de tokens de entrada que você pode enfileirar ao mesmo tempo.

Assim que a solicitação de lote for concluída, o limite de taxa de lote será redefinido, à medida que seus tokens de entrada forem limpos. O limite depende do número de solicitações globais na fila. Se a fila da API de lote processar seus lotes rapidamente, seu limite de taxa de lote será redefinido mais rapidamente.

Resolução de Problemas

Um trabalho é bem-sucedido quando status é Completed. Os trabalhos bem-sucedidos ainda gerarão um error_file_id, mas ele será associado a um arquivo vazio com zero bytes.

Quando ocorre uma falha de trabalho, você encontrará detalhes sobre a falha na errors propriedade:

"value": [
        {
          "id": "batch_80f5ad38-e05b-49bf-b2d6-a799db8466da",
          "completion_window": "24h",
          "created_at": 1725419394,
          "endpoint": "/chat/completions",
          "input_file_id": "file-c2d9a7881c8a466285e6f76f6321a681",
          "object": "batch",
          "status": "failed",
          "cancelled_at": null,
          "cancelling_at": null,
          "completed_at": 1725419955,
          "error_file_id": "file-3b0f9beb-11ce-4796-bc31-d54e675f28fb",
          "errors": {
                "object": “list”,
                "data": [
                {
               “code”: “empty_file”,
               “message”: “The input file is empty. Please ensure that the batch contains at least one   request.”
                    }
                ]
          },
          "expired_at": null,
          "expires_at": 1725505794,
          "failed_at": null,
          "finalizing_at": 1725419710,
          "in_progress_at": 1725419572,
          "metadata": null,
          "output_file_id": "file-ef12af98-dbbc-4d27-8309-2df57feed572",

            "request_counts": {
                "total": 10,
                "completed": null,
                "failed": null
            },
        }

Códigos de erro

Código de erro Definição
invalid_json_line Uma linha (ou várias) no seu arquivo de entrada não pôde ser analisada como json válido.

Certifique-se de que não há erros de digitação, colchetes de abertura e fechamento adequados e cotações de acordo com o padrão JSON e reenvie a solicitação.
too_many_tasks O número de solicitações no arquivo de entrada excede o valor máximo permitido de 100.000.

Certifique-se de que o total de pedidos é inferior a 100.000 e reenvie o trabalho.
url_mismatch Uma linha no arquivo de entrada tem uma URL que não corresponde ao resto das linhas ou a URL especificada no arquivo de entrada não corresponde à URL do ponto de extremidade esperado.

Certifique-se de que todas as URLs de solicitação sejam as mesmas e que correspondam à URL de ponto de extremidade associada à sua implantação do Azure OpenAI.
model_not_found O nome de implantação do modelo OpenAI do Azure especificado na model propriedade do arquivo de entrada não foi encontrado.

Certifique-se de que esse nome aponte para uma implantação válida do modelo OpenAI do Azure.
duplicate_custom_id A ID personalizada para esta solicitação é uma duplicata da ID personalizada em outra solicitação.
empty_batch Verifique seu arquivo de entrada para garantir que o parâmetro ID personalizado seja exclusivo para cada solicitação no lote.
model_mismatch O nome de implantação do modelo OpenAI do Azure especificado na model propriedade desta solicitação no arquivo de entrada não corresponde ao restante do arquivo.

Certifique-se de que todas as solicitações no lote apontem para a mesma implantação de modelo AOAI na model propriedade da solicitação.
invalid_request O esquema da linha de entrada é inválido ou a SKU de implantação é inválida.

Verifique se as propriedades da solicitação em seu arquivo de entrada correspondem às propriedades de entrada esperadas e se o SKU de implantação do Azure OpenAI é globalbatch para solicitações de API em lote.

Problemas conhecidos

  • Os recursos implantados com a CLI do Azure não funcionarão imediatamente com o lote global do Azure OpenAI. Isso ocorre devido a um problema em que os recursos implantados usando esse método têm subdomínios de ponto de extremidade que não seguem o https://your-resource-name.openai.azure.com padrão. Uma solução alternativa para esse problema é implantar um novo recurso do Azure OpenAI usando um dos outros métodos de implantação comuns que manipularão corretamente a configuração do subdomínio como parte do processo de implantação.

Consulte também

  • Saiba mais sobre os tipos de implantação do Azure OpenAI
  • Saiba mais sobre as cotas e limites do Azure OpenAI