Поделиться через


Начало работы с пакетными развертываниями Azure OpenAI

API пакетной службы Azure OpenAI предназначен для эффективной обработки крупномасштабных и больших объемов задач. Обработка асинхронных групп запросов с отдельной квотой с 24-часовым временным поворотом при 50% меньше затрат, чем глобальный стандарт. При пакетной обработке вместо отправки одного запроса за раз вы отправляете большое количество запросов в одном файле. Глобальные пакетные запросы имеют отдельную квоту токена, вложенную в очередь, избежать нарушений работы рабочих нагрузок в Сети.

Основные примеры таких ситуаций:

  • Обработка крупномасштабных данных: быстро анализируйте обширные наборы данных параллельно.

  • Создание содержимого: создание больших объемов текста, таких как описания продуктов или статьи.

  • Проверка и сводка документов. Автоматизация проверки и сводки длинных документов.

  • Автоматизация поддержки клиентов. Обработка многочисленных запросов одновременно для ускорения ответов.

  • Извлечение и анализ данных. Извлечение и анализ данных из огромных объемов неструктурированных данных.

  • Задачи обработки естественного языка (NLP): выполнение таких задач, как анализ тональности или перевод больших наборов данных.

  • Маркетинг и персонализация: создание персонализированного содержимого и рекомендаций в масштабе.

Внимание

Мы стремимся обрабатывать пакетные запросы в течение 24 часов; Срок действия заданий, которые занимают больше времени, не истекает. Задание можно отменить в любое время. При отмене задания все оставшиеся трудоемки будут отменены, а все уже завершенные работы возвращаются. Вы будете взиматься за все завершенные работы.

Данные, хранящиеся в неактивных данных, остаются в указанном географическом регионе Azure, а данные могут обрабатываться для вывода в любом расположении Azure OpenAI. Дополнительные сведения о местонахождении данных. 

Поддержка пакетной службы

Доступность глобальной пакетной модели

Регион gpt-4o, 2024-05-13 gpt-4o, 2024-08-06 gpt-4o, 2024-11-20 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
польшацентральная
southafricanorth
southcentralus
southindia
swedencentral
switzerlandnorth
uksouth
westeurope
westus
westus3

Следующие модели поддерживают глобальный пакет:

Модель Версия Формат входных данных
gpt-4o 2024-08-06 текст + изображение
gpt-4o-mini 2024-07-18 текст + изображение
gpt-4o 2024-05-13 текст + изображение
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

Перейдите на страницу моделей для наиболее актуальных сведений о регионах и моделях, где в настоящее время поддерживается глобальный пакет.

поддержка API

Версия API
Последний выпуск API общедоступной версии: 2024-10-21
Последняя предварительная версия API: 2024-10-01-preview

В первую очередь добавлена поддержка: 2024-07-01-preview

Поддерживаемые компоненты

В настоящее время не поддерживается следующее:

  • Интеграция с API помощников.
  • Интеграция с Azure OpenAI On Your Data feature.

Примечание.

Структурированные выходные данные теперь поддерживаются в глобальной пакетной службе.

Пакетное развертывание

Примечание.

На портале Azure AI Foundry типы пакетного развертывания будут отображаться как Global-Batch и Data Zone Batch. Дополнительные сведения о типах развертывания Azure OpenAI см. в руководстве по типам развертывания.

Снимок экрана: диалоговое окно развертывания модели на портале Azure AI Foundry с выделенным типом развертывания Global-Batch.

Совет

Рекомендуется включить динамическую квоту для всех развертываний глобальной пакетной модели, чтобы избежать сбоев заданий из-за недостаточной квоты токена. Динамическая квота позволяет развертыванию оппортунистически воспользоваться преимуществами дополнительной квоты при наличии дополнительной емкости. Если динамическая квота отключена, развертывание сможет обрабатывать запросы только до ограничения токена, определенного при создании развертывания.

Необходимые компоненты

Подготовка пакетного файла

Как и в случае с тонкой настройкой, глобальный пакет использует файлы в формате строк JSON (.jsonl). Ниже приведены некоторые примеры файлов с различными типами поддерживаемого содержимого:

Формат входных данных

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

Требуется custom_id , чтобы определить, какой отдельный пакетный запрос соответствует заданному ответу. Ответы не будут возвращены одинаково, чтобы порядок, определенный в пакетном .jsonl файле.

model Атрибут должен быть задан в соответствии с именем глобального развертывания пакетной службы, которое вы хотите использовать для ответов вывода.

Внимание

Атрибут model должен быть задан в соответствии с именем развертывания глобальной пакетной службы, которое вы хотите использовать для ответов вывода. Одно и то же имя развертывания глобальной пакетной модели должно присутствовать в каждой строке пакетного файла. Если вы хотите использовать другое развертывание, необходимо сделать это в отдельном пакетном файле или задании.

Для оптимальной производительности рекомендуется отправлять большие файлы для пакетной обработки, а не большое количество небольших файлов с несколькими строками в каждом файле.

Создание входного файла

В этой статье мы создадим файл с именем test.jsonl и скопируйм содержимое из стандартного блока входного кода выше в файл. Вам потребуется изменить и добавить имя глобального пакетного развертывания в каждую строку файла.

Отправка пакетного файла

После подготовки входного файла сначала необходимо отправить файл, чтобы затем начать пакетное задание. Отправка файлов можно выполнять как программным способом, так и через Студию.

  1. Войдите на портал Azure AI Foundry.

  2. Выберите ресурс Azure OpenAI, в котором доступно развертывание глобальной пакетной модели.

  3. Выберите задания> пакетной службы и создание пакетных заданий.

    Снимок экрана: интерфейс создания пакетного задания на портале Azure AI Foundry.

  4. В раскрывающемся списке в разделе "Отправка данных> пакетной службы>" выберите "Отправить файл" и укажите путь к test.jsonl файлу, созданному на предыдущем шаге >Далее.

    Снимок экрана: интерфейс отправки файлов.

Создание пакетного задания

Нажмите кнопку "Создать", чтобы запустить пакетное задание.

Снимок экрана: создание пакетного задания портала Azure AI Foundry.

Отслеживание хода выполнения пакетного задания

После создания задания можно отслеживать ход выполнения задания, выбрав идентификатор задания для последнего созданного задания. По умолчанию вы перейдете на страницу состояния для последнего созданного пакетного задания.

Снимок экрана: идентификатор пакетного задания для задания, который в настоящее время проходит проверку.

Состояние задания можно отслеживать на панели справа:

Снимок экрана: состояние пакетного задания на портале Azure AI Foundry.

Получение выходного файла пакетного задания

После завершения или достижения состояния терминала он создаст файл ошибок и выходной файл, который можно скачать для проверки, нажав соответствующую кнопку со значком стрелки вниз.

Снимок экрана: выходные данные пакетного задания и файлы ошибок, доступные для скачивания.

Отмена пакета

Отменяет выполняемый пакет. Пакет будет находиться в состоянии cancelling до 10 минут, прежде чем переходить cancelledна , где он будет иметь частичные результаты (если таковые имеются), доступные в выходном файле.

Снимок экрана: кнопка отмены пакетного задания на портале Azure AI Foundry.

Необходимые компоненты

Действия, описанные в этой статье, предназначены для последовательного выполнения в Jupyter Notebook. По этой причине мы создадим экземпляр клиента Azure OpenAI сразу в начале примеров. Если вы хотите выполнить шаг вне порядка, вам часто потребуется настроить клиент Azure OpenAI в рамках этого вызова.

Даже если у вас уже установлена библиотека OpenAI Python, может потребоваться обновить установку до последней версии:

!pip install openai --upgrade

Подготовка пакетного файла

Как и в случае с тонкой настройкой, глобальный пакет использует файлы в формате строк JSON (.jsonl). Ниже приведены некоторые примеры файлов с различными типами поддерживаемого содержимого:

Формат входных данных

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

Требуется custom_id , чтобы определить, какой отдельный пакетный запрос соответствует заданному ответу. Ответы не будут возвращены одинаково, чтобы порядок, определенный в пакетном .jsonl файле.

model Атрибут должен быть задан в соответствии с именем глобального развертывания пакетной службы, которое вы хотите использовать для ответов вывода.

Внимание

Атрибут model должен быть задан в соответствии с именем развертывания глобальной пакетной службы, которое вы хотите использовать для ответов вывода. Одно и то же имя развертывания глобальной пакетной модели должно присутствовать в каждой строке пакетного файла. Если вы хотите использовать другое развертывание, необходимо сделать это в отдельном пакетном файле или задании.

Для оптимальной производительности рекомендуется отправлять большие файлы для пакетной обработки, а не большое количество небольших файлов с несколькими строками в каждом файле.

Создание входного файла

В этой статье мы создадим файл с именем test.jsonl и скопируйм содержимое из стандартного блока входного кода выше в файл. Вам потребуется изменить и добавить имя глобального пакетного развертывания в каждую строку файла. Сохраните этот файл в том же каталоге, который выполняется записная книжка Jupyter.

Отправка пакетного файла

После подготовки входного файла сначала необходимо отправить файл, чтобы затем начать пакетное задание. Отправка файлов можно выполнять как программным способом, так и через Студию. В этом примере используются переменные среды вместо значений ключа и конечной точки. Если вы не знакомы с использованием переменных среды с Python, обратитесь к одному из наших кратких руководств , где процесс настройки переменных среды описан пошаговые инструкции.

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

Выходные данные:

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

Создание пакетного задания

После успешной отправки файла можно отправить файл для пакетной обработки.

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

Примечание.

В настоящее время окно завершения должно иметь значение 24h. Если задать любое другое значение, отличное от 24h, задание завершится ошибкой. Задания, выполняемые дольше 24 часов, будут продолжать выполняться до отмены.

Выходные данные:

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

Отслеживание хода выполнения пакетного задания

После успешного создания пакетного задания можно отслеживать ход выполнения в Студии или программно. При проверке хода выполнения пакетного задания рекомендуется ожидать не менее 60 секунд между каждым вызовом состояния.

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

Выходные данные:

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

Возможны следующие значения состояния:

Состояние Description
validating Входной файл проверяется до начала пакетной обработки.
failed Входной файл завершился сбоем процесса проверки.
in_progress Входной файл был успешно проверен и пакет запущен в данный момент.
finalizing Пакет завершился, и результаты подготавливаются.
completed Пакет завершен, и результаты готовы.
expired Пакет не удалось завершить в течение 24-часового периода.
cancelling Пакет выполняется cancelled (это может занять до 10 минут, чтобы войти в силу.)
cancelled Пакет был cancelled.

Чтобы проверить сведения о состоянии задания, можно выполнить следующее:

print(batch_response.model_dump_json(indent=2))

Выходные данные:

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

Обратите внимание, что есть и error_file_id отдельные output_file_id. error_file_id Используйте эту возможность для отладки любых проблем, возникающих при выполнении пакетного задания.

Получение выходного файла пакетного задания

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)

Выходные данные:

Для краткости мы включаем только один ответ завершения чата выходных данных. Если вы выполните действия, описанные в этой статье, у вас должно быть три ответа, аналогичные приведенному ниже:

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

Дополнительные команды пакетной службы

Отмена пакета

Отменяет выполняемый пакет. Пакет будет находиться в состоянии cancelling до 10 минут, прежде чем переходить cancelledна , где он будет иметь частичные результаты (если таковые имеются), доступные в выходном файле.

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

Вывод списка пакетной службы

Вывод списка пакетных заданий для определенного ресурса Azure OpenAI.

client.batches.list()

Методы перечисления в библиотеке Python разбиены на страницы.

Список всех заданий:

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)

Пакет списка (предварительная версия)

Используйте REST API для перечисления всех пакетных заданий с дополнительными параметрами сортировки и фильтрации.

В приведенных ниже примерах мы предоставляем generate_time_filter функцию, чтобы упростить создание фильтра. Если вы не хотите использовать эту функцию, формат строки фильтра будет выглядеть следующим 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)  

Выходные данные:

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

Необходимые компоненты

Подготовка пакетного файла

Как и в случае с тонкой настройкой, глобальный пакет использует файлы в формате строк JSON (.jsonl). Ниже приведены некоторые примеры файлов с различными типами поддерживаемого содержимого:

Формат входных данных

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

Требуется custom_id , чтобы определить, какой отдельный пакетный запрос соответствует заданному ответу. Ответы не будут возвращены одинаково, чтобы порядок, определенный в пакетном .jsonl файле.

model Атрибут должен быть задан в соответствии с именем глобального развертывания пакетной службы, которое вы хотите использовать для ответов вывода.

Внимание

Атрибут model должен быть задан в соответствии с именем развертывания глобальной пакетной службы, которое вы хотите использовать для ответов вывода. Одно и то же имя развертывания глобальной пакетной модели должно присутствовать в каждой строке пакетного файла. Если вы хотите использовать другое развертывание, необходимо сделать это в отдельном пакетном файле или задании.

Для оптимальной производительности рекомендуется отправлять большие файлы для пакетной обработки, а не большое количество небольших файлов с несколькими строками в каждом файле.

Создание входного файла

В этой статье мы создадим файл с именем test.jsonl и скопируйм содержимое из стандартного блока входного кода выше в файл. Вам потребуется изменить и добавить имя глобального пакетного развертывания в каждую строку файла.

Отправка пакетного файла

После подготовки входного файла сначала необходимо отправить файл, чтобы затем начать пакетное задание. Отправка файлов можно выполнять как программным способом, так и через Студию. В этом примере используются переменные среды вместо значений ключа и конечной точки. Если вы не знакомы с использованием переменных среды с Python, обратитесь к одному из наших кратких руководств , где процесс настройки переменных среды описан пошаговые инструкции.

Внимание

Если вы используете ключ API, сохраните его в другом месте, например в Azure Key Vault. Не включайте ключ API непосредственно в код и никогда не публикуйте его.

Дополнительные сведения о безопасности служб ИИ см. в статье "Проверка подлинности запросов к службам ИИ 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"

Приведенный выше код предполагает определенный путь к файлу test.jsonl. Настройте этот путь к файлу по мере необходимости для локальной системы.

Выходные данные:

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

Отслеживание состояния отправки файлов

В зависимости от размера файла отправки может потребоваться некоторое время, прежде чем он будет полностью отправлен и обработан. Чтобы проверить состояние отправки файла, выполните следующие действия:

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

Выходные данные:

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

Создание пакетного задания

После успешной отправки файла можно отправить файл для пакетной обработки.

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

Примечание.

В настоящее время окно завершения должно иметь значение 24h. Если задать любое другое значение, отличное от 24h, задание завершится ошибкой. Задания, выполняемые дольше 24 часов, будут продолжать выполняться до отмены.

Выходные данные:

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

Отслеживание хода выполнения пакетного задания

После успешного создания пакетного задания можно отслеживать ход выполнения в Студии или программно. При проверке хода выполнения пакетного задания рекомендуется ожидать не менее 60 секунд между каждым вызовом состояния.

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

Выходные данные:

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

Возможны следующие значения состояния:

Состояние Description
validating Входной файл проверяется до начала пакетной обработки.
failed Входной файл завершился сбоем процесса проверки.
in_progress Входной файл был успешно проверен и пакет запущен в данный момент.
finalizing Пакет завершился, и результаты подготавливаются.
completed Пакет завершен, и результаты готовы.
expired Пакет не удалось завершить в течение 24-часового периода.
cancelling Пакет выполняется cancelled (это может занять до 10 минут, чтобы войти в силу.)
cancelled Пакет был cancelled.

Получение выходного файла пакетного задания

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

Дополнительные команды пакетной службы

Отмена пакета

Отменяет выполняемый пакет. Пакет будет находиться в состоянии cancelling до 10 минут, прежде чем переходить cancelledна , где он будет иметь частичные результаты (если таковые имеются), доступные в выходном файле.

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" 

Вывод списка пакетной службы

Перечислить существующие пакетные задания для заданного ресурса Azure OpenAI.

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

Вызов API списка разбиен на страницы. Ответ содержит логическое значение has_more , указывающее, когда есть больше результатов для итерации.

Пакет списка (предварительная версия)

Используйте REST API для перечисления всех пакетных заданий с дополнительными параметрами сортировки и фильтрации.

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"

Чтобы избежать пробелов ошибок URL rejected: Malformed input to a URL function , заменяются %20на .

Ограничения пакета

Имя ограничения Значение ограничения
Максимальное количество файлов на ресурс 500
Максимальный размер входного файла 200 МБ
Максимальное количество запросов на файл 100,000

Квота пакетной службы

В таблице показан предел квоты пакетной службы. Значения квот для глобального пакета представлены с точки зрения закрепленных маркеров. При отправке файла для пакетной обработки количество маркеров, присутствующих в файле, учитывается. До тех пор, пока пакетное задание не достигнет состояния терминала, эти маркеры будут учитываться в отношении общего лимита, затраченного на маркер.

Глобальный пакет

Модель Соглашение Enterprise По умолчанию. Ежемесячные подписки на основе кредитной карты Подписки MSDN Azure для учащихся, бесплатные пробные версии
gpt-4o 5 B 200 М 50 М 90 K Н/П
gpt-4o-mini 15 B 1 B 50 М 90 K Н/П
gpt-4-turbo 300 М 80 М 40 М 90 K Н/П
gpt-4 150 М 30 М 5 М 100 тыс. Н/П
gpt-35-turbo 10 B 1 B 100 М 2 млн 50 тыс

B = миллиард | M = миллион | K = тысяча

Пакет зоны данных

Модель Соглашение Enterprise По умолчанию. Ежемесячные подписки на основе кредитной карты Подписки MSDN Azure для учащихся, бесплатные пробные версии
gpt-4o 500 М 30 М 30 М 90 K Н/П
gpt-4o-mini 1.5 B 100 М 50 М 90 K Н/П

Пакетный объект

Свойство Тип Определение
id строка
object строка batch
endpoint строка Конечная точка API, используемая пакетом
errors объект
input_file_id строка Идентификатор входного файла для пакета
completion_window строка Интервал времени, в течение которого должен обрабатываться пакет
status строка Текущее состояние пакета. Возможные значения: validating, failed, finalizingin_progressexpiredcompleted, . cancelledcancelling
output_file_id строка Идентификатор файла, содержащего выходные данные успешно выполненных запросов.
error_file_id строка Идентификатор файла, содержащего выходные данные запросов с ошибками.
created_at integer Метка времени при создании пакета (в эпохах UNIX).
in_progress_at integer Метка времени при запуске этого пакета (в эпохах UNIX).
expires_at integer Метка времени, когда срок действия пакета истекает (в эпохах UNIX).
finalizing_at integer Метка времени, когда этот пакет начал завершение (в эпохах UNIX).
completed_at integer Метка времени, когда этот пакет начал завершение (в эпохах UNIX).
failed_at integer Метка времени, когда этот пакет завершился сбоем (в эпохах UNIX)
expired_at integer Метка времени, когда срок действия пакета истек (в эпохах UNIX).
cancelling_at integer Метка времени при запуске cancelling этого пакета (в эпохах UNIX).
cancelled_at integer Метка времени, когда этот пакет был cancelled (в эпохах UNIX).
request_counts объект Структура объекта:

totalцелое число
Общее количество запросов в пакете.
completed целое число
Число запросов в пакете, успешно завершенных.
failedцелое число
Количество запросов в пакете, завершившемся сбоем.
metadata map Набор пар "ключ-значение", которые можно подключить к пакету. Это свойство может быть полезно для хранения дополнительных сведений о пакете в структурированном формате.

Вопросы и ответы

Можно ли использовать образы с API пакетной службы?

Эта возможность ограничена определенными многомодальными моделями. В настоящее время в пакетных запросах поддерживаются только образы GPT-4o. Изображения можно предоставлять как входные данные с помощью URL-адреса изображения или представления изображения в кодировке Base64. Образы для пакетной службы в настоящее время не поддерживаются с GPT-4 Turbo.

Можно ли использовать пакетный API с точно настроенными моделями?

В настоящее время это не поддерживается.

Можно ли использовать пакетный API для внедрения моделей?

В настоящее время это не поддерживается.

Работает ли фильтрация содержимого с глобальным развертыванием пакетной службы?

Да. Аналогично другим типам развертывания, можно создавать фильтры содержимого и связывать их с типом глобального пакетного развертывания.

Можно ли запросить дополнительную квоту?

Да, на странице квоты на портале Azure AI Foundry. Выделение квот по умолчанию можно найти в статье о квоте и ограничениях.

Что произойдет, если API не завершает мой запрос в течение 24 часов?

Мы стремимся обрабатывать эти запросы в течение 24 часов; Срок действия заданий, которые занимают больше времени, не истекают. Задание можно отменить в любое время. При отмене задания все оставшиеся трудоемки будут отменены, а все уже завершенные работы возвращаются. Вы будете взиматься за все завершенные работы.

Сколько запросов можно выполнить в очереди с помощью пакетной службы?

Однако не существует фиксированного ограничения на количество запросов, которые можно пакетировать, однако она будет зависеть от квоты закрепленного токена. Квота заложенного токена включает максимальное количество входных маркеров, которые можно заквидеть одновременно.

После завершения пакетного запроса ограничение скорости пакетной службы сбрасывается по мере очистки входных маркеров. Ограничение зависит от количества глобальных запросов в очереди. Если очередь API пакетной службы быстро обрабатывает пакеты, ограничение скорости пакетной службы сбрасывается быстрее.

Устранение неполадок

Задание успешно выполняется при status выполнении Completed. Успешные задания по-прежнему создают error_file_id, но они будут связаны с пустым файлом с нулевым байтами.

При сбое задания вы найдете сведения о сбое в свойстве errors :

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

Коды ошибок

Код ошибки Определение
invalid_json_line Строка (или несколько) в входном файле не удалось проанализировать как допустимый json.

Убедитесь, что нет опечаток, правильных открывающих и закрывающих квадратных скобок, а также кавычки согласно стандарту JSON и повторно отправьте запрос.
too_many_tasks Число запросов во входном файле превышает максимально допустимое значение 100 000.

Убедитесь, что общий объем запросов составляет менее 100 000 и повторно отправьте задание.
url_mismatch Строка в входном файле имеет URL-адрес, который не соответствует остальным строкам, или URL-адрес, указанный в входном файле, не соответствует ожидаемому URL-адресу конечной точки.

Убедитесь, что все URL-адреса запросов одинаковы, и что они соответствуют URL-адресу конечной точки, связанному с развертыванием Azure OpenAI.
model_not_found Имя развертывания модели Azure OpenAI, указанное в свойстве model входного файла, не найдено.

Убедитесь, что это имя указывает на допустимое развертывание модели Azure OpenAI.
duplicate_custom_id Пользовательский идентификатор для этого запроса является дубликатом пользовательского идентификатора в другом запросе.
empty_batch Проверьте входной файл, чтобы убедиться, что параметр пользовательского идентификатора уникален для каждого запроса в пакете.
model_mismatch Имя развертывания модели Azure OpenAI, указанное в model свойстве этого запроса в входном файле, не соответствует остальной части файла.

Убедитесь, что все запросы в пакетной точке в одном развертывании модели Службы OpenAI Azure в model свойстве запроса.
invalid_request Схема входной строки недопустима или номер SKU развертывания недопустим.

Убедитесь, что свойства запроса в входном файле соответствуют ожидаемым свойствам входных данных, а номер SKU развертывания Azure OpenAI предназначен globalbatch для запросов пакетного API.

Известные проблемы

  • Ресурсы, развернутые с помощью Azure CLI, не будут работать без использования глобального пакета Azure OpenAI. Это связано с проблемой, из-за которой ресурсы, развернутые с помощью этого метода, имеют поддомены конечных точек, которые не соответствуют шаблону https://your-resource-name.openai.azure.com . Решение этой проблемы заключается в развертывании нового ресурса Azure OpenAI с помощью одного из других распространенных методов развертывания, которые будут правильно обрабатывать настройку поддомена в процессе развертывания.

См. также

  • Дополнительные сведения о типах развертывания Azure OpenAI
  • Дополнительные сведения о квотах и ограничениях Azure OpenAI