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
.
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
- Uma assinatura do Azure - Crie uma gratuitamente.
- Um recurso OpenAI do Azure com um modelo do tipo
Global-Batch
de implantação implantado. Você pode consultar o guia de criação de recursos e implantação de modelo para obter ajuda com esse processo.
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.
Faça login no AI Studio.
Selecione o recurso OpenAI do Azure onde você tem uma implantação de modelo de lote global disponível.
Selecione Trabalhos> em lote+Criar trabalhos em lote.
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.
Criar trabalho em lote
Selecione Criar para iniciar o trabalho em lote.
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.
Você pode acompanhar o status do trabalho no painel direito:
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.
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.
Pré-requisitos
- Uma assinatura do Azure - Crie uma gratuitamente.
- Python 3.8 ou versão posterior
- A seguinte biblioteca Python:
openai
- Blocos de Notas do Jupyter
- Um recurso OpenAI do Azure com um modelo do tipo
Global-Batch
de implantação implantado. Você pode consultar o guia de criação de recursos e implantação de modelo para obter ajuda com esse processo.
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
- Uma assinatura do Azure - Crie uma gratuitamente.
- Um recurso OpenAI do Azure com um modelo do tipo
Global-Batch
de implantação implantado. Você pode consultar o guia de criação de recursos e implantação de modelo para obter ajuda com esse processo.
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: , , , , , completed expired , cancelling , cancelled . finalizing in_progress failed validating |
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:total inteiro 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. failed inteiro 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.