Partager via


Configuration du stockage Blob Azure pour Azure OpenAI

Remarque

Ce document fait référence au portail Microsoft Foundry (classique).

🔍 Consultez la documentation Microsoft Foundry (nouvelle) pour en savoir plus sur le nouveau portail.

Azure OpenAI prend désormais en charge l’utilisation du Stockage Blob Azure pour les fichiers d’entrée et de sortie Azure OpenAI Batch. En utilisant votre propre stockage, vous n’êtes pas soumis aux restrictions de lot sur le nombre de fichiers.

Prise en charge des régions

Désormais disponible dans toutes les régions où les déploiements par lots sont soutenus.

Configuration du Stockage Blob Azure

Conditions préalables

Identité managée

Pour que votre ressource Azure OpenAI accède en toute sécurité à votre compte Stockage Blob Azure, vous devez configurer votre ressource avec une identité managée affectée par le système.

Remarque

Actuellement, les identités gérées attribuées par l'utilisateur ne sont pas prises en charge.

  1. Connectez-vous à https://portal.azure.com.

  2. Trouvez votre ressource Azure OpenAI > Sélectionnez Resource Management>Identity>System affecté>, et définissez le statut sur Activé.

    Capture d’écran montrant la configuration de l’identité managée système.

Contrôle d’accès basé sur les rôles

Une fois que votre ressource Azure OpenAI a été configurée pour l’identité managée affectée par le système, vous devez lui accorder l’accès à votre compte Stockage Blob Azure.

  1. À partir de https://portal.azure.com, recherchez et sélectionnez votre ressource Stockage Blob Azure.

  2. Sélectionnez Contrôle d’accès (IAM)>>.

    Capture d’écran montrant l’interface de contrôle d’accès pour une ressource Stockage Blob Azure.

  3. Recherchez pour Collaborateur des données de stockage Blob>Suivant.

  4. Sélectionnez Identité managée>+Sélectionner les membres> Sélectionnez l’identité managée de vos ressources Azure OpenAI.

    Capture d’écran montrant l’attribution de rôle Contributeur aux données Blob de stockage.

Si vous préférez utiliser des rôles personnalisés pour un accès plus granulaire, les autorisations suivantes sont requises :

Données d’entrée :

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

Données/dossiers de sortie :

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

Créer des conteneurs

Pour cet exemple, vous allez créer deux conteneurs nommés batch-input, et batch-output. Vous pouvez nommer ces éléments de votre choix, mais si vous utilisez un autre nom, vous devez ajuster les exemples dans les étapes suivantes.

Pour créer un conteneur sous Stockage de données> sélectionnez +Conteneur> donnez un nom à vos conteneurs.

Capture d’écran montrant les conteneurs de données Blob de stockage.

Une fois que vos conteneurs sont créés, récupérez l’URL de chaque conteneur en sélectionnant les>des paramètres> du conteneur>, copiez les URL.

Dans ce cas, nous avons :

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

Créer un fichier d'entrée

Pour cet article, nous allons créer un fichier nommé test.jsonl et copier le contenu ci-dessous dans le fichier. Vous devrez modifier et ajouter le nom de votre déploiement de type Traitement par lots global à chaque ligne du fichier.

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

Charger le fichier d’entraînement

À partir de votre compte Stockage Blob Azure, ouvrez votre conteneur d’entrée par lots que vous avez créé précédemment.

Sélectionnez Charger et sélectionner votre test.jsonl fichier.

Capture d’écran montrant l’expérience utilisateur du conteneur d’objets blob stockage Azure.

Au cours du traitement de votre jsonl fichier dans le cadre du travail de traitement par lots, vous ne pouvez apporter aucune modification au fichier. Si un fichier change pendant l’exécution du travail par lots, le travail échoue.

Créer un travail de traitement par lots

Remarque

metadata n’est actuellement pas pris en charge avec cette fonctionnalité.

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://cognitiveservices.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": ""
}

Vous pouvez surveiller l’état de la même façon que vous le feriez précédemment comme indiqué dans notre guide complet sur l’utilisation d’Azure OpenAI batch.

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

Une fois que status devient completed vous pouvez récupérer votre chemin d’accès 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"
}

Une fois votre tâche de traitement par lots terminée, vous pouvez télécharger error_blob et output_blob via l’interface Stockage Blob Azure dans le portail Azure, ou télécharger par programmation.

Remarque

error_blob, et output_blob les chemins sont toujours retournés dans la réponse même dans les cas où un fichier correspondant n’est pas créé. Dans ce cas, aucune erreur ne s’est produite, donc errors.jsonl n’a pas été créé ; seul results.jsonl existe.

pip install azure-identity azure-storage-blob

N’oubliez pas que pendant que vous avez accordé l’accès programmatique à la ressource Azure OpenAI à votre stockage Blob Azure, pour télécharger les résultats, vous devrez peut-être également donner au compte d’utilisateur qui exécute le script ci-dessous l’accès. Pour télécharger le fichier, l’accès Storage Blob Data Reader est suffisant.

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

Voir aussi

Pour plus d’informations sur Azure OpenAI Batch, consultez le guide complet du traitement par lots.