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


Настройка хранилища BLOB-объектов Azure для Azure OpenAI

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

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

  • австралиявосток
  • Истус
  • Германия-запад-центр
  • northcentralus
  • Центральная Польша
  • SwedenCentral
  • Швейцария север
  • eastus2
  • Вестус

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

Предпосылки

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

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

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

Замечание

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

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

  2. Найдите ресурс > Azure OpenAI Select Resource Management>Identity>System, назначенный> для параметра " Вкл.".

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

Управление доступом на основе ролей

После настройки ресурса Azure OpenAI для системно назначенного управляемого удостоверения необходимо предоставить ему доступ к учетной записи хранения Azure Blob.

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

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

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

Чтобы создать контейнер в хранилище данных>, выберите +Контейнер> и назовите ваши контейнеры.

Снимок экрана, который показывает контейнеры данных Blob хранилища.

После создания контейнеров получите 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": "/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?"}]}}

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

В учетной записи хранения BLOB-объектов Azure откройте созданный ранее контейнер пакетного ввода .

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

Снимок экрана, показывающий интерфейс загрузки в контейнер BLOB-объектов в службе хранилища Azure.

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

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

Замечание

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

import os
from datetime import datetime
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="2025-04-01-preview"
)

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 через интерфейс Azure Blob Storage в портале 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 см. в комплексном руководстве по пакетной службе.