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 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
canadaeast | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
eastus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
eastus2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
francecentral | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
japaneast | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
koreacentral | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
northcentralus | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
norwayeast | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
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 interfejsie użytkownika programu Studio typ wdrożenia będzie wyświetlany jako 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
- Dane wejściowe w warstwie Standardowa
- Obraz zakodowany w formacie Base64
- Adres URL obrazu
- Dane wyjściowe ze strukturą
{"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.
Zaloguj się do programu AI Studio.
Wybierz zasób azure OpenAI, w którym masz dostępne globalne wdrożenie modelu wsadowego.
Wybierz pozycję Zadania usługi Batch> +Utwórz zadania wsadowe.
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.
Tworzenie zadania wsadowego
Wybierz pozycję Utwórz , aby uruchomić zadanie wsadowe.
Ś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.
Stan zadania można śledzić w okienku po prawej stronie:
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ół.
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.
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
- Dane wejściowe w warstwie Standardowa
- Obraz zakodowany w formacie Base64
- Adres URL obrazu
- Dane wyjściowe ze strukturą
{"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_id
element . 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
- Dane wejściowe w warstwie Standardowa
- Obraz zakodowany w formacie Base64
- Adres URL obrazu
- Dane wyjściowe ze strukturą
{"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 , failed finalizing completed in_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:total liczba całkowita Całkowita liczba żądań w partii. completed liczba całkowita Liczba żądań w partii, które zostały ukończone pomyślnie. failed liczba 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 interfejsie użytkownika programu Studio. 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.