Tous les produits
Search
Centre de documentation

Object Storage Service:build a map-style dataset for random access from data in oss

Dernière mise à jour :Aug 18, 2026

OssMapDataset convient aux scénarios impliquant de petits volumes de données et une mémoire suffisante, nécessitant un accès aléatoire fréquent et un traitement parallèle. Cette rubrique explique comment créer un jeu de données à l'aide de OssMapDataset.

Prérequis

OSS Connector for AI/ML est installé et configuré. Pour plus d'informations, consultez les rubriques Installer OSS Connector for AI/ML et Configurer OSS Connector for AI/ML.

Créer un jeu de données

Méthodes

Trois méthodes permettent de créer un jeu de données avec OssMapDataset :

  • Préfixe OSS_URI : adapté aux scénarios où les chemins de stockage OSS suivent un modèle uniforme.

  • Liste d'OSS_URIs : adaptée aux scénarios où les chemins de stockage OSS sont spécifiques mais dispersés.

  • Fichier manifeste : réduit la surcharge des opérations OSS list object. Cette méthode convient aux jeux de données contenant de nombreux fichiers (par exemple, des dizaines de millions) chargés de manière répétée, ainsi qu'aux buckets pour lesquels la fonctionnalité de récupération scalaire d'OSS est activée.

Créer un jeu de données à partir d'un préfixe OSS_URI

Cet exemple montre comment utiliser la méthode from_prefix de OssMapDataset pour créer un jeu de données à partir d'un préfixe spécifié (OSS_URI) dans OSS.

from osstorchconnector import OssMapDataset

ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.json"
CRED_PATH = "/root/.alibabacloud/credentials"
OSS_URI = "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/"

# Build a dataset using the from_prefix method of OssMapDataset.
map_dataset = OssMapDataset.from_prefix(oss_uri=OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)

# Randomly access an object in the created dataset.
item = map_dataset[0]
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()

# Traverse the objects in the dataset.
for item in map_dataset:
    print(item.key)
    print(item.size)
    content = item.read()
    print(len(content))
    item.close()

Créer un jeu de données à partir d'une liste d'OSS_URIs

Cet exemple montre comment utiliser la méthode from_objects de OssMapDataset pour créer un jeu de données à partir d'une liste spécifiée d'OSS_URIs.

from osstorchconnector import OssMapDataset

ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.json"
CRED_PATH = "/root/.alibabacloud/credentials"

# uris is a string iterator that contains multiple OSS_URIs.
uris = [
    "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/img001-00001.png",
    "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/img001-00002.png",
    "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/img001-00003.png"
]

# Build a dataset using the from_objects method of OssMapDataset.
map_dataset = OssMapDataset.from_objects(object_uris=uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)

# Randomly access an object in the created dataset.
item = map_dataset[1]
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()

# Traverse the objects in the dataset.
for item in map_dataset:
    print(item.key)
    print(item.size)
    content = item.read()
    print(len(content))
    item.close()

Créer un jeu de données à partir d'un fichier manifeste

Avant de créer un jeu de données à partir d'un fichier manifeste, vous devez créer ce fichier.

  1. Créez un fichier manifeste.

    Exécutez la commande touch manifest_file dans n'importe quel répertoire pour créer un fichier manifeste. Ensuite, remplissez le fichier comme indiqué dans les exemples suivants.

    Exemple de fichier manifeste avec des noms d'objets OSS :

    Img/BadImag/Bmp/Sample001/img001-00001.png
    Img/BadImag/Bmp/Sample001/img001-00002.png
    Img/BadImag/Bmp/Sample001/img001-00003.png

    Exemple de fichier manifeste avec des noms d'objets OSS et des libellés :

    Img/BadImag/Bmp/Sample001/img001-00001.png label1
    Img/BadImag/Bmp/Sample001/img001-00002.png label2
    Img/BadImag/Bmp/Sample001/img001-00003.png label3
  2. Créez le jeu de données à partir du fichier manifeste.

    Cet exemple montre comment utiliser la méthode from_manifest_file de OssMapDataset pour créer un jeu de données à partir d'un fichier manifeste spécifié.

    from osstorchconnector import OssMapDataset
    from osstorchconnector import imagenet_manifest_parser
    
    ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
    REGION = "cn-beijing"
    CONFIG_PATH = "/etc/oss-connector/config.json"
    CRED_PATH = "/root/.alibabacloud/credentials"
    OSS_BASE_URI = "oss://ai-testset/EnglistImg/"
    
    # Build a dataset from a local file using the from_manifest_file method of OssMapDataset.
    # The manifest_file_path parameter specifies the local path of the manifest file.
    # The manifest_parser parameter specifies the method for parsing the manifest file. This example uses the built-in parser imagenet_manifest_parser.
    # The oss_base_uri parameter specifies the base OSS_URI. It is concatenated with the URI parsed from the manifest to form the full OSS_URI. The format is: FULL_OSS_URI = BASE_OSS_URI + URI.
    MANIFEST_FILE_LOCAL = "/path/to/manifest_file"
    map_dataset = OssMapDataset.from_manifest_file(manifest_file_path=MANIFEST_FILE_LOCAL, manifest_parser=imagenet_manifest_parser, oss_base_uri=OSS_BASE_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
    for item in map_dataset:
        print(item.key)
        print(item.size)
        print(item.label)
        content = item.read()
        print(len(content))
        item.close()
    
    # Build a dataset from a manifest file in an OSS bucket using the from_manifest_file method of OssMapDataset.
    MANIFEST_FILE_URI = "oss://ai-testset/EnglistImg/manifest_file"
    map_dataset = OssMapDataset.from_manifest_file(manifest_file_path=MANIFEST_FILE_URI, manifest_parser=imagenet_manifest_parser, oss_base_uri=OSS_BASE_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
    for item in map_dataset:
        print(item.key)
        print(item.size)
        print(item.label)
        content = item.read()
        print(len(content))
        item.close()

Types de données dans OSS Connector for AI/ML

Le type de données des objets du jeu de données implémente des interfaces d'E/S courantes. Pour plus d'informations, consultez la rubrique Types de données dans OSS Connector for AI/ML.

Paramètres

Lorsque vous créez un jeu de données à l'aide de OssMapDataset ou OssIterableDataset, vous pouvez configurer les paramètres suivants.

Paramètre

Type

Obligatoire

Description

endpoint

string

Oui

Paramètre commun :

Le point de terminaison public du service OSS. Pour plus d'informations, consultez Régions et points de terminaison.

region

string

Non

Paramètre commun :

La région OSS, par exemple cn-beijing. Si vous ne définissez pas ce paramètre, la région est déduite du endpoint. Cette déduction peut échouer si le point de terminaison ne contient pas d'informations sur la région. Nous vous recommandons de spécifier la région.

transform

object

Non

Paramètre commun :

Une fonction de transformation qui convertit un DataObject (objet OSS) en n'importe quel type. Vous pouvez personnaliser cette méthode selon vos besoins. Pour plus d'informations, consultez transform.

Important

Ne renvoyez pas directement un objet DataObject dans la transformation. Cela pourrait empêcher l'itérateur de fonctionner. Pour renvoyer un objet, appelez la méthode copy.

cred_path

string

Oui

Paramètre commun :

Le chemin d'accès au fichier d'identifiants. Le chemin par défaut est /root/.alibabacloud/credentials. Pour plus d'informations, consultez Configurer les identifiants d'accès.

config_path

string

Oui

Paramètre commun :

Le chemin d'accès au fichier de configuration d'OSS Connector. Le chemin par défaut est /etc/oss-connector/config.json. Pour plus d'informations, consultez Configurer OSS Connector.

oss_uri

string

Oui

Paramètre pour la méthode from_prefix :

Le chemin d'une ressource OSS. Utilisez ce paramètre pour créer un jeu de données à partir d'un préfixe OSS_URI. Seuls les OSS_URIs commençant par oss:// sont pris en charge.

object_uris

string

Oui

Paramètre pour la méthode from_objects :

Une liste de chemins de ressources OSS. Utilisez ce paramètre pour créer un jeu de données à partir des chemins de la liste. Seuls les OSS_URIs commençant par oss:// sont pris en charge.

manifest_file_path

string

Oui

Paramètre pour la méthode from_manifest_file :

Le chemin d'accès au fichier manifeste. Vous pouvez utiliser un chemin de fichier local ou un OSS_URI commençant par oss://.

manifest_parser

Callable Object

Oui

Paramètre pour la méthode from_manifest_file :

La méthode intégrée pour analyser le fichier manifeste. Elle accepte un fichier manifeste ouvert en entrée et renvoie un itérateur. Chaque élément de l'itérateur est un tuple (oss_uri, label). Pour plus d'informations, consultez manifest_parser. Vous pouvez également créer une méthode manifest_parser personnalisée adaptée au format du fichier manifeste de votre jeu de données.

oss_base_uri

string

Oui

Paramètre pour la méthode from_manifest_file :

L'OSS_URI de base. Il est concaténé avec un OSS_URI potentiellement incomplet issu du fichier manifeste pour former un OSS_URI complet. Si vous ne disposez pas d'OSS_URI de base, définissez ce paramètre sur "".

Méthodes intégrées

transform

Remarque

Lorsque vous créez un jeu de données, celui-ci fournit un itérateur qui produit le résultat de transform(DataObject). DataObject est un type de données dans OSS Connector for AI/ML.

La méthode transform peut être personnalisée. Si vous ne spécifiez pas de méthode transform lors de la création d'un jeu de données, la méthode par défaut est utilisée.

Méthode de transformation par défaut

L'exemple suivant présente la méthode transform par défaut. Vous n'avez pas besoin de la spécifier lors de la création d'un jeu de données.

# Default transform function
def identity(obj: DataObject) -> DataObject:
    if obj is not None:
        return obj.copy()
    else:
        return None

Méthode de transformation personnalisée

L'exemple suivant montre comment utiliser une méthode transform personnalisée lors de la création d'un jeu de données.

import io
import torchvision.transforms as transforms
from PIL import Image
from osstorchconnector import OssMapDataset

ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.test.json"
CRED_PATH = "/root/.alibabacloud/credentials"
OSS_URI = "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/"

# Define the transformation operations for image data.
trans = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# Create a transform method to process the input object.
def transform(object):
    try:
        img = Image.open(io.BytesIO(object.read())).convert('RGB')
        val = trans(img)
    except Exception as e:
        raise e
    return object.key, val

# Use the transform=transform parameter when you build the dataset.
map_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
for item in map_dataset:
    print(item[0])
    print(item[1].shape)

manifest_parser

Pour utiliser la méthode manifest_parser par défaut lors de la création d'un jeu de données, importez-la comme indiqué dans l'exemple suivant.

from osstorchconnector import imagenet_manifest_parser

Le code suivant présente la méthode manifest_parser par défaut.

import io
import logging
from typing import Iterable, Tuple

def imagenet_manifest_parser(reader: io.IOBase) -> Iterable[Tuple[str, str]]:
    lines = reader.read().decode("utf-8").strip().split("\n")
    for i, line in enumerate(lines):
        try:
            items = line.strip().split('\t')
            if len(items) >= 2:
                key = items[0]
                label = items[1]
                yield (key, label)
            elif len(items) == 1:
                key = items[0]
                yield (key, '')
            else:
                raise ValueError("format error")
        except ValueError as e:
            logging.error(f"Error: {e} for line {i}: {line}")
 

Créer un chargeur de données PyTorch à partir d'un jeu de données

L'exemple suivant montre comment créer un chargeur de données PyTorch qui utilise un jeu de données créé par OssMapDataset comme source de données.

import torch
from osstorchconnector import OssMapDataset

ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.test.json"
CRED_PATH = "/root/.alibabacloud/credentials"
OSS_URI = "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/"

def transform(object):
    data = object.read()
    return object.key, object.label

# Build a dataset using the from_prefix method of OssMapDataset.
map_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform,cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)

# Create a PyTorch data loader based on map_dataset.
loader = torch.utils.data.DataLoader(map_dataset, batch_size=256, num_workers=32, prefetch_factor=2, shuffle=True)
# Use the data in the training loop.
# for batch in loader:
    # Perform training operations.

Références

Vous pouvez également utiliser OSS Connector for AI/ML pour les tâches d'entraînement des données dans un environnement conteneurisé. Pour plus d'informations, consultez la rubrique Créer une image Docker contenant l'environnement OSS Connector for AI/ML.