Configurazione di Archiviazione BLOB di Azure per Azure Batch OpenAI (versione classica)

Si applica solo a:Portale di Foundry (versione classica). Questo articolo non è disponibile per il nuovo portale foundry. Altre informazioni sul nuovo portale.

Annotazioni

I collegamenti in questo articolo potrebbero aprire contenuto nella nuova documentazione di Microsoft Foundry anziché nella documentazione di Foundry (versione classica) visualizzata.

Azure OpenAI supporta ora l'uso di Archiviazione BLOB di Azure per i file di input e output di Azure OpenAI Batch. Usando il proprio storage, non si è soggetti alle restrizioni batch sul numero di file.

Supporto per area geografica

Ora supportato in tutte le aree in cui sono supportate le distribuzioni batch.

configurazione di Archiviazione BLOB di Azure

Prerequisiti

Identità gestita

Per consentire alla risorsa OpenAI di Azure di accedere in modo sicuro all'account Archiviazione BLOB di Azure è necessario configurare la risorsa con un'identità gestita assegnata dal sistema sistema.

Annotazioni

Attualmente le identità gestite assegnate dall'utente non sono supportate.

  1. Accedere a https://portal.azure.com.

  2. Trova la risorsa Azure OpenAI > seleziona Gestione risorse>Identità>Assegnato dal sistema> imposta lo stato su Attivo.

    Screenshot che mostra la configurazione dell'identità gestita dal sistema.

Access control basata sui ruoli

Dopo aver configurato la risorsa OpenAI Azure per l'identità gestita assegnata dal sistema, è necessario concedere l'accesso all'account Archiviazione BLOB di Azure.

  1. Da https://portal.azure.com trovare e selezionare la risorsa Archiviazione BLOB di Azure.

  2. Selezionare Controllo di accesso (IAM)>Aggiungi>Aggiungi assegnazione di ruolo.

    Screenshot che mostra l'interfaccia di controllo di accesso per un Archiviazione BLOB di Azure resource.

  3. Cercare Collaboratore ai dati del BLOB di archiviazione>Avanti.

  4. Selezionare Identità gestita>+Seleziona membri> Selezionare l'identità gestita delle risorse di Azure OpenAI.

    Screenshot che mostra l'assegnazione del ruolo Collaboratore ai dati del BLOB di archiviazione.

Se si preferisce usare ruoli personalizzati per access più granulari, sono necessarie le autorizzazioni seguenti:

Dati di input:

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

Dati/cartelle di output:

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

Crea contenitori

Per questo esempio si creeranno due contenitori denominati batch-inpute batch-output. È possibile denominarli in qualsiasi modo, ma se si usa un nome alternativo, è necessario modificare gli esempi nei passaggi seguenti.

Per creare un contenitore in Data storage> Selezionare +Contenitore> Assegnare un nome ai contenitori.

Screenshot che mostra i contenitori di dati Blob di archiviazione.

Dopo aver creato i contenitori, recuperare l'URL per ogni contenitore selezionando le>> del contenitore > Copiare gli URL.

In questo caso abbiamo:

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

Creare un file di input

In questo articolo, creeremo un file denominato test.jsonl e copieremo il contenuto seguente nel file. È necessario modificare e aggiungere il nome della distribuzione in batch globale a ogni riga del file.

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

Caricare il file di training

Dall'account Archiviazione BLOB di Azure aprire il contenitore batch-input creato in precedenza.

Selezionare Carica e selezionare il test.jsonl file.

Screenshot che mostra l'UX di caricamento di un contenitore BLOB di Archiviazione di Azure.

Durante il periodo di elaborazione jsonl del file come parte del processo batch, non è possibile apportare modifiche al file. Se un file cambia mentre il processo batch esegue il processo avrà esito negativo.

Creare un processo in batch

Annotazioni

metadata attualmente non è supportato con questa funzionalità.

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

Output:

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

È possibile monitorare lo stato come descritto in precedenza nella guida comprensiva sull'uso di Azure batch 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}")

Output:

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

Una volta che status passa a completed, è possibile recuperare il percorso di output_blob:

print(batch_response.model_dump_json(indent=2))

Output:

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

Al termine del processo batch, è possibile scaricare il error_blob e output_blob tramite l'interfaccia Archiviazione BLOB di Azure nel portale di Azure oppure scaricare a livello di codice:

Annotazioni

error_blobI percorsi e output_blob vengono sempre restituiti nella risposta anche nei casi in cui non viene creato un file corrispondente. In questo caso non sono stati generati errori, quindi errors.jsonl non è stato creato, esiste solo results.jsonl.

pip install azure-identity azure-storage-blob

Tenere presente che, pur concedendo alla risorsa OpenAI di Azure l'accesso a livello di codice al tuo Archiviazione BLOB di Azure, per scaricare i risultati potrebbe essere necessario concedere anche all'account utente che esegue lo script qui sotto l'accesso. Per scaricare il file, Storage Blob Data Reader accesso è sufficiente.

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

Vedere anche

Per ulteriori informazioni su Azure OpenAI Batch, vedere la guida batch completa.