Udostępnij za pośrednictwem


Wprowadzenie do globalnych wdrożeń wsadowych usługi Azure OpenAI

Interfejs API usługi Azure OpenAI Batch jest przeznaczony do wydajnego obsługi zadań przetwarzania dużych i dużych ilości. Przetwarzaj asynchroniczne grupy żądań z oddzielnym limitem przydziału, z 24-godzinnym planem docelowym, przy mniejszym koszcie 50% niż w przypadku globalnego standardu. W przypadku przetwarzania wsadowego zamiast wysyłać jedno żądanie jednocześnie wysyłasz dużą liczbę żądań w jednym pliku. Globalne żądania wsadowe mają oddzielny limit przydziału tokenu w kolejce, co pozwala uniknąć zakłóceń obciążeń online.

Najważniejsze przypadki użycia:

  • Przetwarzanie danych na dużą skalę: szybko analizuj obszerne zestawy danych równolegle.

  • Generowanie zawartości: utwórz duże ilości tekstu, takie jak opisy produktów lub artykuły.

  • Przegląd dokumentów i podsumowanie: automatyzowanie przeglądu i podsumowania długich dokumentów.

  • Automatyzacja obsługi klienta: obsługa wielu zapytań jednocześnie w celu uzyskania szybszych odpowiedzi.

  • Wyodrębnianie i analiza danych: wyodrębnianie i analizowanie informacji z ogromnych ilości danych bez struktury.

  • Zadania przetwarzania języka naturalnego (NLP): wykonaj zadania, takie jak analiza tonacji lub tłumaczenie dużych zestawów danych.

  • Marketing i personalizacja: generowanie spersonalizowanej zawartości i rekomendacji na dużą skalę.

Ważne

Dążymy do przetwarzania żądań wsadowych w ciągu 24 godzin; Nie wygasają zadania, które trwa dłużej. Zadanie można anulować w dowolnym momencie. Po anulowaniu zadania wszystkie pozostałe prace zostaną anulowane i zostanie zwrócona każda już ukończona praca. Opłata zostanie naliczona za każdą ukończoną pracę.

Dane przechowywane w spoczynku pozostają w wyznaczonej lokalizacji geograficznej platformy Azure, podczas gdy dane mogą być przetwarzane do wnioskowania w dowolnej lokalizacji usługi Azure OpenAI. Dowiedz się więcej na temat rezydencji danych. 

Globalna obsługa partii

Obsługa regionów i modeli

Globalna partia jest obecnie obsługiwana w następujących regionach:

Region 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
brazilsouth
canadaeast
eastus
eastus2
francecentral
germanywestcentral
japaneast
koreacentral
northcentralus
norwayeast
polandcentral
southafricanorth
southcentralus
southindia
swedencentral
switzerlandnorth
uksouth
westeurope
westus
westus3

Następujące modele obsługują globalną partię:

Model Wersja Format danych wejściowych
gpt-4o 2024-08-06 tekst i obraz
gpt-4o-mini 2024-07-18 tekst i obraz
gpt-4o 2024-05-13 tekst i obraz
gpt-4 turbo-2024-04-09 text
gpt-4 0613 text
gpt-35-turbo 0125 text
gpt-35-turbo 1106 text
gpt-35-turbo 0613 text

Zapoznaj się ze stroną modeli, aby uzyskać najbardziej aktualne informacje na temat regionów/modeli, w których jest obecnie obsługiwana globalna partia.

Obsługa interfejsu API

Wersja interfejsu API
Najnowsza wersja interfejsu API ga: 2024-10-21
Najnowsza wersja zapoznawcza interfejsu API: 2024-10-01-preview

Obsługa po raz pierwszy dodana w: 2024-07-01-preview

Obsługa funkcji

Następujące elementy nie są obecnie obsługiwane:

  • Integracja z interfejsem API Asystentów.
  • Integracja z usługą Azure OpenAI w funkcji Danych.

Uwaga

Dane wyjściowe ze strukturą są teraz obsługiwane w usłudze Global Batch.

Globalne wdrażanie wsadowe

W portalu usługi Azure AI Foundry typ wdrożenia będzie wyświetlany jako Global-Batch.

Zrzut ekranu przedstawiający okno dialogowe wdrażania modelu w portalu usługi Azure AI Foundry z wyróżnionym typem wdrożenia Global-Batch.

Napiwek

Zalecamy włączenie dynamicznego limitu przydziału dla wszystkich wdrożeń globalnych modeli wsadowych, aby uniknąć błędów zadań z powodu niewystarczającego limitu przydziału tokenu w kolejce. Przydział dynamiczny umożliwia wdrożenie oportunistyczne korzystanie z większego limitu przydziału, gdy dostępna jest dodatkowa pojemność. Po wyłączeniu przydziału dynamicznego wdrożenie będzie mogło przetwarzać żądania do limitu tokenu w kolejce zdefiniowanego podczas tworzenia wdrożenia.

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie.
  • Zasób usługi Azure OpenAI z wdrożonym modelem typu Global-Batch wdrożenia. Aby uzyskać pomoc dotyczącą tego procesu, zapoznaj się z przewodnikiem tworzenia zasobów i wdrażania modelu.

Przygotowywanie pliku wsadowego

Podobnie jak dostrajanie, globalna partia używa plików w formacie wierszy JSON (.jsonl). Poniżej przedstawiono kilka przykładowych plików z różnymi typami obsługiwanej zawartości:

Format danych wejściowych

{"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?"}]}}

Element custom_id jest wymagany, aby umożliwić określenie, które pojedyncze żądanie wsadowe odpowiada danej odpowiedzi. Odpowiedzi nie będą zwracane w identycznej kolejności niż kolejność zdefiniowana w pliku wsadowym .jsonl .

model Atrybut powinien być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia usługi Batch, które ma być przeznaczone dla odpowiedzi wnioskowania.

Ważne

Atrybut model musi być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia usługi Batch, które ma być przeznaczone dla odpowiedzi wnioskowania. Ta sama nazwa wdrożenia globalnego modelu usługi Batch musi być obecna w każdym wierszu pliku wsadowego. Jeśli chcesz przeprowadzić inne wdrożenie, musisz to zrobić w osobnym pliku/zadaniu wsadowym.

Aby uzyskać najlepszą wydajność, zalecamy przesyłanie dużych plików do przetwarzania wsadowego, a nie dużej liczby małych plików z zaledwie kilkoma wierszami w każdym pliku.

Tworzenie pliku wejściowego

W tym artykule utworzymy plik o nazwie test.jsonl i skopiujemy zawartość ze standardowego bloku kodu wejściowego powyżej do pliku. Musisz zmodyfikować i dodać globalną nazwę wdrożenia wsadowego do każdego wiersza pliku.

Przekazywanie pliku wsadowego

Po przygotowaniu pliku wejściowego należy najpierw przekazać plik, aby móc rozpocząć zadanie wsadowe. Przekazywanie plików można wykonać programowo lub za pośrednictwem programu Studio.

  1. Zaloguj się do portalu usługi Azure AI Foundry.

  2. Wybierz zasób azure OpenAI, w którym masz dostępne globalne wdrożenie modelu wsadowego.

  3. Wybierz pozycję Zadania usługi Batch> +Utwórz zadania wsadowe.

    Zrzut ekranu przedstawiający środowisko tworzenia zadań wsadowych w portalu usługi Azure AI Foundry.

  4. Z listy rozwijanej w obszarze Przekazywanie danych>usługi Batch wybierz pozycję Przekaż> plik i podaj ścieżkę do test.jsonl pliku utworzonego w poprzednim kroku >Dalej.

    Zrzut ekranu przedstawiający środowisko przekazywania pliku.

Tworzenie zadania wsadowego

Wybierz pozycję Utwórz , aby uruchomić zadanie wsadowe.

Zrzut ekranu przedstawiający środowisko portalu Tworzenia zadania wsadowego usługi Azure AI Foundry.

Śledzenie postępu zadania wsadowego

Po utworzeniu zadania możesz monitorować postęp zadania, wybierając identyfikator zadania dla ostatnio utworzonego zadania. Domyślnie nastąpi przekierowanie na stronę stanu dla ostatnio utworzonego zadania wsadowego.

Zrzut ekranu przedstawiający identyfikator zadania wsadowego dla zadania aktualnie poddawanego walidacji.

Stan zadania można śledzić w okienku po prawej stronie:

Zrzut ekranu przedstawiający środowisko stanu zadania wsadowego w portalu usługi Azure AI Foundry.

Pobieranie pliku wyjściowego zadania wsadowego

Po zakończeniu lub osiągnięciu stanu terminalu zadanie spowoduje wygenerowanie pliku błędu i pliku wyjściowego, który można pobrać do przeglądu, wybierając odpowiedni przycisk z ikoną strzałki w dół.

Zrzut ekranu przedstawiający dane wyjściowe i pliki błędów zadania wsadowego dostępne do pobrania.

Anulowanie partii

Anuluje w toku partię. Partia będzie w stanie cancelling do 10 minut przed zmianą na cancelled, gdzie będzie mieć częściowe wyniki (jeśli istnieją) dostępne w pliku wyjściowym.

Zrzut ekranu przedstawiający przycisk anulowania zadania wsadowego w portalu azure AI Foundry.

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie.
  • Środowisko Python w wersji 3.8 lub nowszej
  • Następująca biblioteka języka Python: openai
  • Notesy programu Jupyter
  • Zasób usługi Azure OpenAI z wdrożonym modelem typu Global-Batch wdrożenia. Aby uzyskać pomoc dotyczącą tego procesu, zapoznaj się z przewodnikiem tworzenia zasobów i wdrażania modelu.

Kroki opisane w tym artykule mają być uruchamiane sekwencyjnie w notesach Jupyter Notebook. Z tego powodu utworzymy wystąpienie klienta usługi Azure OpenAI tylko raz na początku przykładów. Jeśli chcesz uruchomić krok poza kolejnością, często musisz skonfigurować klienta usługi Azure OpenAI w ramach tego wywołania.

Nawet jeśli masz już zainstalowaną bibliotekę języka Python OpenAI, może być konieczne uaktualnienie instalacji do najnowszej wersji:

!pip install openai --upgrade

Przygotowywanie pliku wsadowego

Podobnie jak dostrajanie, globalna partia używa plików w formacie wierszy JSON (.jsonl). Poniżej przedstawiono kilka przykładowych plików z różnymi typami obsługiwanej zawartości:

Format danych wejściowych

{"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?"}]}}

Element custom_id jest wymagany, aby umożliwić określenie, które pojedyncze żądanie wsadowe odpowiada danej odpowiedzi. Odpowiedzi nie będą zwracane w identycznej kolejności niż kolejność zdefiniowana w pliku wsadowym .jsonl .

model Atrybut powinien być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia usługi Batch, które ma być przeznaczone dla odpowiedzi wnioskowania.

Ważne

Atrybut model musi być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia usługi Batch, które ma być przeznaczone dla odpowiedzi wnioskowania. Ta sama nazwa wdrożenia globalnego modelu usługi Batch musi być obecna w każdym wierszu pliku wsadowego. Jeśli chcesz przeprowadzić inne wdrożenie, musisz to zrobić w osobnym pliku/zadaniu wsadowym.

Aby uzyskać najlepszą wydajność, zalecamy przesyłanie dużych plików do przetwarzania wsadowego, a nie dużej liczby małych plików z zaledwie kilkoma wierszami w każdym pliku.

Tworzenie pliku wejściowego

W tym artykule utworzymy plik o nazwie test.jsonl i skopiujemy zawartość ze standardowego bloku kodu wejściowego powyżej do pliku. Musisz zmodyfikować i dodać globalną nazwę wdrożenia wsadowego do każdego wiersza pliku. Zapisz ten plik w tym samym katalogu, w którym jest wykonywany notes Jupyter Notebook.

Przekazywanie pliku wsadowego

Po przygotowaniu pliku wejściowego należy najpierw przekazać plik, aby móc rozpocząć zadanie wsadowe. Przekazywanie plików można wykonać programowo lub za pośrednictwem programu Studio. W tym przykładzie użyto zmiennych środowiskowych zamiast wartości klucza i punktu końcowego. Jeśli nie znasz zmiennych środowiskowych w języku Python, zapoznaj się z jednym z naszych przewodników Szybki start, w którym proces konfigurowania zmiennych środowiskowych w wyjaśnieniu krok po kroku.

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

Wyjście:

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

Tworzenie zadania wsadowego

Po pomyślnym przekazaniu pliku można przesłać plik do przetwarzania wsadowego.

# 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))

Uwaga

Obecnie okno ukończenia musi być ustawione na 24h. Jeśli ustawisz dowolną inną wartość niż 24 godziny, zadanie zakończy się niepowodzeniem. Zadania trwające dłużej niż 24 godziny będą nadal wykonywane do czasu anulowania.

Wyjście:

{
  "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
  }
}

Śledzenie postępu zadania wsadowego

Po pomyślnym utworzeniu zadania wsadowego możesz monitorować jego postęp w programie Studio lub programowo. Podczas sprawdzania postępu zadania wsadowego zalecamy odczekywanie co najmniej 60 sekund między każdym wywołaniem stanu.

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}")

Wyjście:

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

Możliwe są następujące wartości stanu:

Stan Opis
validating Plik wejściowy jest weryfikowany przed rozpoczęciem przetwarzania wsadowego.
failed Plik wejściowy zakończył się niepowodzeniem w procesie walidacji.
in_progress Plik wejściowy został pomyślnie zweryfikowany, a partia jest obecnie uruchomiona.
finalizing Partia została ukończona, a wyniki są przygotowywane.
completed Partia została ukończona, a wyniki są gotowe.
expired Nie można ukończyć partii w 24-godzinnym przedziale czasu.
cancelling Trwa przetwarzanie wsadowe cancelled (może to potrwać do 10 minut).
cancelled partia to cancelled.

Aby sprawdzić szczegóły stanu zadania, można uruchomić:

print(batch_response.model_dump_json(indent=2))

Wyjście:

{
  "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
  }
}

Zwróć uwagę, że istnieje zarówno error_file_id , jak i oddzielny output_file_idelement . Użyj polecenia , error_file_id aby ułatwić debugowanie wszelkich problemów występujących w zadaniu wsadowym.

Pobieranie pliku wyjściowego zadania wsadowego

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)

Wyjście:

W celu zwięzłości uwzględniamy tylko jedną odpowiedź na ukończenie czatu w danych wyjściowych. Jeśli wykonasz kroki opisane w tym artykule, powinny istnieć trzy odpowiedzi podobne do poniższego:

{
  "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
}

Dodatkowe polecenia wsadowe

Anulowanie partii

Anuluje w toku partię. Partia będzie w stanie cancelling do 10 minut przed zmianą na cancelled, gdzie będzie mieć częściowe wyniki (jeśli istnieją) dostępne w pliku wyjściowym.

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

Wyświetlanie listy partii

Wyświetlanie listy zadań wsadowych dla określonego zasobu usługi Azure OpenAI.

client.batches.list()

Metody listy w bibliotece języka Python są podzielone na strony.

Aby wyświetlić listę wszystkich zadań:

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)

Lista wsadowa (wersja zapoznawcza)

Użyj interfejsu API REST, aby wyświetlić listę wszystkich zadań wsadowych z dodatkowymi opcjami sortowania/filtrowania.

W poniższych przykładach udostępniamy generate_time_filter funkcję, aby ułatwić konstruowanie filtru. Jeśli nie chcesz używać tej funkcji, format ciągu filtru będzie wyglądać następująco: 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)  

Wyjście:

{
  "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"
}

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie.
  • Zasób usługi Azure OpenAI z wdrożonym modelem typu Global-Batch wdrożenia. Aby uzyskać pomoc dotyczącą tego procesu, zapoznaj się z przewodnikiem tworzenia zasobów i wdrażania modelu.

Przygotowywanie pliku wsadowego

Podobnie jak dostrajanie, globalna partia używa plików w formacie wierszy JSON (.jsonl). Poniżej przedstawiono kilka przykładowych plików z różnymi typami obsługiwanej zawartości:

Format danych wejściowych

{"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?"}]}}

Element custom_id jest wymagany, aby umożliwić określenie, które pojedyncze żądanie wsadowe odpowiada danej odpowiedzi. Odpowiedzi nie będą zwracane w identycznej kolejności niż kolejność zdefiniowana w pliku wsadowym .jsonl .

model Atrybut powinien być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia usługi Batch, które ma być przeznaczone dla odpowiedzi wnioskowania.

Ważne

Atrybut model musi być ustawiony tak, aby był zgodny z nazwą globalnego wdrożenia usługi Batch, które ma być przeznaczone dla odpowiedzi wnioskowania. Ta sama nazwa wdrożenia globalnego modelu usługi Batch musi być obecna w każdym wierszu pliku wsadowego. Jeśli chcesz przeprowadzić inne wdrożenie, musisz to zrobić w osobnym pliku/zadaniu wsadowym.

Aby uzyskać najlepszą wydajność, zalecamy przesyłanie dużych plików do przetwarzania wsadowego, a nie dużej liczby małych plików z zaledwie kilkoma wierszami w każdym pliku.

Tworzenie pliku wejściowego

W tym artykule utworzymy plik o nazwie test.jsonl i skopiujemy zawartość ze standardowego bloku kodu wejściowego powyżej do pliku. Musisz zmodyfikować i dodać globalną nazwę wdrożenia wsadowego do każdego wiersza pliku.

Przekazywanie pliku wsadowego

Po przygotowaniu pliku wejściowego należy najpierw przekazać plik, aby móc rozpocząć zadanie wsadowe. Przekazywanie plików można wykonać programowo lub za pośrednictwem programu Studio. W tym przykładzie użyto zmiennych środowiskowych zamiast wartości klucza i punktu końcowego. Jeśli nie znasz zmiennych środowiskowych w języku Python, zapoznaj się z jednym z naszych przewodników Szybki start, w którym proces konfigurowania zmiennych środowiskowych w wyjaśnieniu krok po kroku.

Ważne

Jeśli używasz klucza interfejsu API, zapisz go bezpiecznie w innym miejscu, na przykład w usłudze Azure Key Vault. Nie dołączaj klucza interfejsu API bezpośrednio do kodu i nigdy nie publikuj go publicznie.

Aby uzyskać więcej informacji na temat zabezpieczeń usług sztucznej inteligencji, zobacz Uwierzytelnianie żądań w usługach Azure AI.

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"

Powyższy kod zakłada określoną ścieżkę pliku dla pliku test.jsonl. Dostosuj tę ścieżkę pliku zgodnie z potrzebami dla systemu lokalnego.

Wyjście:

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

Śledzenie stanu przekazywania plików

W zależności od rozmiaru pliku przekazywania może upłynąć trochę czasu, zanim zostanie on w pełni przekazany i przetworzony. Aby sprawdzić przebieg przekazywania pliku:

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

Wyjście:

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

Tworzenie zadania wsadowego

Po pomyślnym przekazaniu pliku można przesłać plik do przetwarzania wsadowego.

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"
  }'

Uwaga

Obecnie okno ukończenia musi być ustawione na 24h. Jeśli ustawisz dowolną inną wartość niż 24 godziny, zadanie zakończy się niepowodzeniem. Zadania trwające dłużej niż 24 godziny będą nadal wykonywane do czasu anulowania.

Wyjście:

{
  "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"
}

Śledzenie postępu zadania wsadowego

Po pomyślnym utworzeniu zadania wsadowego możesz monitorować jego postęp w programie Studio lub programowo. Podczas sprawdzania postępu zadania wsadowego zalecamy odczekywanie co najmniej 60 sekund między każdym wywołaniem stanu.

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

Wyjście:

{
  "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"
}

Możliwe są następujące wartości stanu:

Stan Opis
validating Plik wejściowy jest weryfikowany przed rozpoczęciem przetwarzania wsadowego.
failed Plik wejściowy zakończył się niepowodzeniem w procesie walidacji.
in_progress Plik wejściowy został pomyślnie zweryfikowany, a partia jest obecnie uruchomiona.
finalizing Partia została ukończona, a wyniki są przygotowywane.
completed Partia została ukończona, a wyniki są gotowe.
expired Nie można ukończyć partii w 24-godzinnym przedziale czasu.
cancelling Trwa przetwarzanie wsadowe cancelled (może to potrwać do 10 minut).
cancelled partia to cancelled.

Pobieranie pliku wyjściowego zadania wsadowego

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

Dodatkowe polecenia wsadowe

Anulowanie partii

Anuluje w toku partię. Partia będzie w stanie cancelling do 10 minut przed zmianą na cancelled, gdzie będzie mieć częściowe wyniki (jeśli istnieją) dostępne w pliku wyjściowym.

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" 

Wyświetlanie listy partii

Wyświetl listę istniejących zadań wsadowych dla danego zasobu usługi Azure OpenAI.

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

Wywołanie interfejsu API listy jest podzielone na strony. Odpowiedź zawiera wartość logiczną has_more wskazującą, kiedy istnieje więcej wyników do iteracji.

Lista wsadowa (wersja zapoznawcza)

Użyj interfejsu API REST, aby wyświetlić listę wszystkich zadań wsadowych z dodatkowymi opcjami sortowania/filtrowania.

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"

Aby uniknąć spacji błędów URL rejected: Malformed input to a URL function , są zastępowane ciągiem %20.

Globalne limity partii

Nazwa limitu Wartość limitu
Maksymalna liczba plików na zasób 500
Maksymalny rozmiar pliku wejściowego 200 MB
Maksymalna liczba żądań na plik 100 000

Globalny limit przydziału partii

W tabeli przedstawiono limit przydziału partii. Wartości przydziału dla globalnej partii są reprezentowane pod względem tokenów w kolejce. Po przesłaniu pliku do przetwarzania wsadowego liczba tokenów znajdujących się w pliku jest liczone. Dopóki zadanie wsadowe nie osiągnie stanu terminalu, te tokeny będą liczone względem całkowitego limitu tokenu w kolejce.

Model Umowa Enterprise Agreement Wartość domyślna Miesięczne subskrypcje oparte na kartach kredytowych Subskrypcje MSDN Azure for Students, bezpłatne wersje próbne
gpt-4o 5 B 200 M 50 M 90 K Nie dotyczy
gpt-4o-mini 15 B 1 B 50 M 90 K Nie dotyczy
gpt-4-turbo 300 M 80 M 40 M 90 K Nie dotyczy
gpt-4 150 M 30 M 5 M 100 tys. Nie dotyczy
gpt-35-turbo 10 B 1 B 100 M 2 M 50 tys.

B = miliard | M = milion | K = tysiąc

Obiekt wsadowy

Właściwość Type Definicja
id string
object string batch
endpoint string Punkt końcowy interfejsu API używany przez partię
errors obiekt
input_file_id string Identyfikator pliku wejściowego dla partii
completion_window string Przedział czasu, w którym należy przetworzyć partię
status string Bieżący stan partii. Możliwe wartości: validating, failedfinalizingcompletedin_progress, expired, cancelling, . cancelled
output_file_id string Identyfikator pliku zawierającego dane wyjściowe pomyślnie wykonanych żądań.
error_file_id string Identyfikator pliku zawierającego dane wyjściowe żądań z błędami.
created_at integer Sygnatura czasowa utworzenia tej partii (w epokach unix).
in_progress_at integer Sygnatura czasowa rozpoczęcia postępu tej partii (w epokach unix).
expires_at integer Sygnatura czasowa wygaśnięcia tej partii (w epokach unix).
finalizing_at integer Sygnatura czasowa rozpoczęcia finalizowania tej partii (w epokach unix).
completed_at integer Sygnatura czasowa rozpoczęcia finalizowania tej partii (w epokach unix).
failed_at integer Sygnatura czasowa, gdy ta partia nie powiodła się (w epokach unix)
expired_at integer Sygnatura czasowa wygaśnięcia tej partii (w epokach unix).
cancelling_at integer Sygnatura czasowa rozpoczęcia cancelling tej partii (w epokach unix).
cancelled_at integer Sygnatura czasowa, kiedy ta partia była cancelled (w epokach unix).
request_counts obiekt Struktura obiektu:

totalliczba całkowita
Całkowita liczba żądań w partii.
completed liczba całkowita
Liczba żądań w partii, które zostały ukończone pomyślnie.
failedliczba całkowita
Liczba żądań w partii, które zakończyły się niepowodzeniem.
metadata map Zestaw par klucz-wartość, które można dołączyć do partii. Ta właściwość może być przydatna do przechowywania dodatkowych informacji o partii w formacie ustrukturyzowanym.

Często zadawane pytania

Czy obrazy mogą być używane z interfejsem API wsadowym?

Ta funkcja jest ograniczona do niektórych modeli wielomodalnych. Obecnie tylko GPT-4o obsługuje obrazy w ramach żądań wsadowych. Obrazy mogą być udostępniane jako dane wejściowe za pośrednictwem adresu URL obrazu lub zakodowanej w formacie base64 reprezentacji obrazu. Obrazy wsadowe nie są obecnie obsługiwane z GPT-4 Turbo.

Czy mogę używać interfejsu API wsadowego z dostosowanymi modelami?

Nie jest to obecnie obsługiwane.

Czy mogę używać interfejsu API wsadowego do osadzania modeli?

Nie jest to obecnie obsługiwane.

Czy filtrowanie zawartości działa z globalnym wdrożeniem usługi Batch?

Tak. Podobnie jak w przypadku innych typów wdrożeń, można tworzyć filtry zawartości i kojarzyć je z globalnym typem wdrożenia usługi Batch.

Czy mogę zażądać dodatkowego limitu przydziału?

Tak, na stronie limitu przydziału w portalu usługi Azure AI Foundry. Domyślną alokację przydziału można znaleźć w artykule limity przydziału i limity.

Co się stanie, jeśli interfejs API nie ukończy żądania w ciągu 24-godzinnego przedziału czasu?

Dążymy do przetworzenia tych żądań w ciągu 24 godzin; Nie wygasają zadania, które trwa dłużej. Zadanie można anulować w dowolnym momencie. Po anulowaniu zadania wszystkie pozostałe prace zostaną anulowane i zostanie zwrócona każda już ukończona praca. Opłata zostanie naliczona za każdą ukończoną pracę.

Ile żądań można kolejkować przy użyciu usługi Batch?

Nie ma stałego limitu liczby żądań, które można wsadować, jednak będzie zależeć od limitu przydziału tokenu w kolejce. Limit przydziału tokenu w kolejce obejmuje maksymalną liczbę tokenów wejściowych, które można w kolejce jednocześnie.

Po zakończeniu żądania wsadowego limit szybkości wsadu zostanie zresetowany, ponieważ tokeny wejściowe są czyszczone. Limit zależy od liczby żądań globalnych w kolejce. Jeśli kolejka interfejsu API usługi Batch szybko przetwarza partie, limit szybkości wsadu jest resetowany szybciej.

Rozwiązywanie problemów

Zadanie kończy się pomyślnie, gdy status ma wartość Completed. Pomyślne zadania będą nadal generować error_file_id, ale będą one skojarzone z pustym plikiem o zerowych bajtach.

Po wystąpieniu błędu zadania znajdziesz szczegółowe informacje o błędzie errors we właściwości :

"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
            },
        }

Kody błędów

Kod błędu Definicja
invalid_json_line Wiersz (lub wiele) w pliku wejściowym nie był w stanie zostać przeanalizowany jako prawidłowy kod json.

Upewnij się, że nie ma literówek, odpowiednich nawiasów otwierających i zamykających oraz cudzysłowów zgodnie ze standardem JSON i prześlij ponownie żądanie.
too_many_tasks Liczba żądań w pliku wejściowym przekracza maksymalną dozwoloną wartość 100 000.

Upewnij się, że łączna liczba żądań wynosi poniżej 100 000 i prześlij ponownie zadanie.
url_mismatch Wiersz w pliku wejściowym ma adres URL, który nie jest zgodny z resztą wierszy, lub adres URL określony w pliku wejściowym nie jest zgodny z oczekiwanym adresem URL punktu końcowego.

Upewnij się, że wszystkie adresy URL żądań są takie same i że są zgodne z adresem URL punktu końcowego skojarzonym z wdrożeniem usługi Azure OpenAI.
model_not_found Nie można odnaleźć nazwy wdrożenia modelu usługi Azure OpenAI określonej we model właściwości pliku wejściowego.

Upewnij się, że ta nazwa wskazuje prawidłowe wdrożenie modelu usługi Azure OpenAI.
duplicate_custom_id Identyfikator niestandardowy dla tego żądania jest duplikatem identyfikatora niestandardowego w innym żądaniu.
empty_batch Sprawdź plik wejściowy, aby upewnić się, że niestandardowy parametr identyfikatora jest unikatowy dla każdego żądania w partii.
model_mismatch Nazwa wdrożenia modelu usługi Azure OpenAI określona we model właściwości tego żądania w pliku wejściowym nie jest zgodna z resztą pliku.

Upewnij się, że wszystkie żądania w punkcie wsadowym do tego samego wdrożenia modelu AOAI we model właściwości żądania.
invalid_request Schemat wiersza wejściowego jest nieprawidłowy lub jednostka SKU wdrożenia jest nieprawidłowa.

Upewnij się, że właściwości żądania w pliku wejściowym są zgodne z oczekiwaną właściwością danych wejściowych i że jednostka SKU wdrożenia usługi Azure OpenAI jest globalbatch dla żądań interfejsu API wsadowego.

Znane problemy

  • Zasoby wdrożone za pomocą interfejsu wiersza polecenia platformy Azure nie będą działać bez użycia globalnej partii usługi Azure OpenAI. Jest to spowodowane problemem polegającym na tym, że zasoby wdrożone przy użyciu tej metody mają poddomeny punktów końcowych, które nie są zgodne ze wzorcem https://your-resource-name.openai.azure.com . Obejściem tego problemu jest wdrożenie nowego zasobu usługi Azure OpenAI przy użyciu jednej z innych typowych metod wdrażania, które będą prawidłowo obsługiwać konfigurację poddomeny w ramach procesu wdrażania.

Zobacz też

  • Dowiedz się więcej o typach wdrożeń usługi Azure OpenAI
  • Dowiedz się więcej o limitach przydziałów i limitach usługi Azure OpenAI