Настройка хранилища Azure Blob для пакетной обработки Azure OpenAI (классическая)

Применяется только к:Портал Foundry (классический). Эта статья недоступна для нового портала Foundry. Дополнительные сведения о новом портале.

Замечание

Ссылки в этой статье могут открывать содержимое в новой документации Microsoft Foundry вместо классической документации Foundry, которую вы просматриваете в данный момент.

Azure OpenAI теперь поддерживает использование Хранилище BLOB-объектов Azure для Azure входных и выходных файлов пакетной службы OpenAI. Используя собственное хранилище, вы не подвергаетесь пакетным ограничениям на количество файлов.

Поддержка регионов

Теперь поддерживается во всех регионах, где поддерживаются пакетные развертывания.

конфигурация Хранилище BLOB-объектов Azure

Предпосылки

  • Учетная запись Хранилище BLOB-объектов Azure.
  • Ресурс OpenAI Azure с моделью типа развертывания Global-Batch или DataZoneBatch. Вы можете ознакомиться с руководством по созданию ресурсов и развертыванию моделей, чтобы помочь в этом процессе.

Манажируемая идентичность

Чтобы ресурс Azure OpenAI мог безопасно получить доступ к учетной записи в Хранилище BLOB-объектов Azure, необходимо настроить ресурс с помощью системно назначаемого управляемого удостоверения system назначаемого управляемого удостоверения.

Замечание

В настоящее время назначенные пользователем управляемые удостоверения не поддерживаются.

  1. Войдите в https://portal.azure.com.

  2. Найдите ваш ресурс Azure OpenAI > Выберите Resource Management>Identity>System assigned> установить статус на On.

    Снимок экрана с конфигурацией управляемого удостоверения системы.

Контроль доступа на основе ролей

После того как ваш ресурс Azure OpenAI был настроен для управляемого удостоверения, назначенного системой, необходимо предоставить ему доступ к вашей учетной записи Хранилище BLOB-объектов Azure.

  1. В https://portal.azure.com найдите и выберите ресурс Хранилище BLOB-объектов Azure.

  2. Выберите контроль доступа (IAM)>Add>Добавить назначение роли.

    Скриншот с интерфейсом управления доступом для ресурса Хранилище BLOB-объектов Azure.

  3. Выполните поиск Storage Blob Data Contributor>Далее.

  4. Выберите удостоверение Управляемое удостоверение>+Выбор участников> Выберите управляемое удостоверение ваших ресурсов Azure OpenAI.

    Скриншот, показывающий назначение роли участника для данных BLOB-объектов.

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

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

  • Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read

Выходные данные и папки:

  • Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read
  • Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write

Создание контейнеров

В этом примере вы создадите два контейнера с именем batch-inputи batch-output. Вы можете назвать их как хотите, но если вы используете другое имя, вам потребуется настроить примеры в следующих шагах.

Чтобы создать контейнер в Data storage>, выберите +Container> и назовите ваши контейнеры.

Снимок экрана, отображающий контейнеры данных объектов Blob Storage.

После создания контейнеров получите URL-адрес для каждого контейнера, выбрав >настройки>свойства>. Скопируйте URL-адреса.

В этом случае у нас есть:

  • https://{AZURE-BLOB-STORAGE-RESOURCE-NAME}.blob.core.windows.net/batch-input
  • https://{AZURE-BLOB-STORAGE-RESOURCE-NAME}.blob.core.windows.net/batch-output

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

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

{"custom_id": "task-0", "method": "POST", "url": "/v1/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": "/v1/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": "/v1/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?"}]}}

Отправка обучаемого файла

В учетной записи Хранилище BLOB-объектов Azure откройте созданный ранее контейнер batch-input.

Выберите " Отправить " и выберите test.jsonl файл.

Снимок экрана, который показывает интерфейс загрузки (UX) контейнера Blob в служба хранилища Azure.

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

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

Замечание

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

import os
from datetime import datetime
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

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

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

batch_response = client.batches.create(
    input_file_id=None,
    endpoint="/chat/completions",
    completion_window="24h",
      extra_body={ 
        "input_blob": "https://{AZURE-BLOB-STORAGE-RESOURCE-NAME}.blob.core.windows.net/batch-input/test.jsonl",
        "output_folder": {
                "url": "https://{AZURE-BLOB-STORAGE-RESOURCE-NAME}.blob.core.windows.net/batch-output",
        }
    }   
)

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

print(batch_response.model_dump_json(indent=2))

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

{
  "id": "batch_b632a805-797b-49ed-9c9c-86eb4057f2a2",
  "completion_window": "24h",
  "created_at": 1747516485,
  "endpoint": "/chat/completions",
  "input_file_id": null,
  "object": "batch",
  "status": "validating",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "error_file_id": null,
  "errors": null,
  "expired_at": null,
  "expires_at": 1747602881,
  "failed_at": null,
  "finalizing_at": null,
  "in_progress_at": null,
  "metadata": null,
  "output_file_id": null,
  "request_counts": {
    "completed": 0,
    "failed": 0,
    "total": 0
  },
  "error_blob": "",
  "input_blob": "https://docstest002.blob.core.windows.net/batch-input/test.jsonl",
  "output_blob": ""
}

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

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

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

2025-05-17 17:16:56.950427 Batch Id: batch_b632a805-797b-49ed-9c9c-86eb4057f2a2,  Status: validating
2025-05-17 17:17:57.532054 Batch Id: batch_b632a805-797b-49ed-9c9c-86eb4057f2a2,  Status: validating
2025-05-17 17:18:58.156793 Batch Id: batch_b632a805-797b-49ed-9c9c-86eb4057f2a2,  Status: in_progress
2025-05-17 17:19:58.739708 Batch Id: batch_b632a805-797b-49ed-9c9c-86eb4057f2a2,  Status: in_progress
2025-05-17 17:20:59.398508 Batch Id: batch_b632a805-797b-49ed-9c9c-86eb4057f2a2,  Status: finalizing
2025-05-17 17:22:00.242371 Batch Id: batch_b632a805-797b-49ed-9c9c-86eb4057f2a2,  Status: completed

Как только status станет completed, вы сможете получить свой путь output_blob:

print(batch_response.model_dump_json(indent=2))

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

{
  "id": "batch_b632a805-797b-49ed-9c9c-86eb4057f2a2",
  "completion_window": "24h",
  "created_at": 1747516485,
  "endpoint": "/chat/completions",
  "input_file_id": null,
  "object": "batch",
  "status": "completed",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": 1747516883,
  "error_file_id": null,
  "errors": null,
  "expired_at": null,
  "expires_at": 1747602881,
  "failed_at": null,
  "finalizing_at": 1747516834,
  "in_progress_at": 1747516722,
  "metadata": null,
  "output_file_id": null,
  "request_counts": {
    "completed": 3,
    "failed": 0,
    "total": 3
  },
  "error_blob": "https://docstest002.blob.core.windows.net/batch-output/{GUID}/errors.jsonl",
  "input_blob": "https://docstest002.blob.core.windows.net/batch-input/test.jsonl",
  "output_blob": "https://docstest002.blob.core.windows.net/batch-output/{GUID}/results.jsonl"
}

После завершения пакетного задания можно скачать error_blob и output_blob через интерфейс Хранилище BLOB-объектов Azure на портале Azure или скачать программно:

Замечание

error_blob, а также output_blob пути всегда возвращаются в ответе, даже в тех случаях, когда соответствующий файл не создается. В этом случае не было никаких ошибок, поэтому errors.jsonl не было создано, существует только results.jsonl .

pip install azure-identity azure-storage-blob

Помните, что хотя вы предоставили ресурсу Azure OpenAI программный доступ к вашему хранилищу Хранилище BLOB-объектов Azure, для загрузки результатов вам также может потребоваться предоставить доступ учетной записи пользователя, который выполняет скрипт ниже. Для скачивания файла достаточно доступа Storage Blob Data Reader.

# Import required libraries
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Define storage account and container information
storage_account_name = "docstest002" # replace with your storage account name
container_name = "batch-output"

# Define the blob paths to download
blob_paths = [
    "{REPLACE-WITH-YOUR-GUID}/results.jsonl",
]

credential = DefaultAzureCredential()
account_url = f"https://{storage_account_name}.blob.core.windows.net"
blob_service_client = BlobServiceClient(account_url=account_url, credential=credential)
container_client = blob_service_client.get_container_client(container_name)

for blob_path in blob_paths:
    blob_client = container_client.get_blob_client(blob_path)
    
    file_name = blob_path.split("/")[-1]
    
    print(f"Downloading {file_name}...")
    with open(file_name, "wb") as file:
        download_stream = blob_client.download_blob()
        file.write(download_stream.readall())
    
    print(f"Downloaded {file_name} successfully!")

См. также

Дополнительные сведения о пакетной обработке Azure OpenAI см. в подробном руководстве по пакетной обработке.