Todos os produtos
Search
Central de documentação

Object Storage Service:Build an iterable dataset for sequential stream reading from OSS data

Última atualização: Jul 03, 2026

O OssIterableDataset é ideal para cenários com memória limitada ou grandes volumes de dados. Ele é usado principalmente para processamento sequencial, quando não há necessidade de acesso aleatório nem processamento paralelo. Este tópico descreve como criar um conjunto de dados usando o OssIterableDataset.

Pré-requisitos

Instale e configure o OSS Connector for AI/ML. Para mais informações, consulte Instalar o OSS Connector for AI/ML e Configurar o OSS Connector for AI/ML.

Criar um conjunto de dados

Métodos

É possível criar um conjunto de dados com o OssIterableDataset de três formas:

  • Prefixo de URI do OSS: use este método quando os caminhos de armazenamento no OSS seguirem um padrão consistente.

  • Lista de URIs do OSS: use este método para caminhos de armazenamento específicos e não sequenciais no OSS.

  • Arquivo de manifesto: use este método para reduzir a sobrecarga de listagem de objetos do OSS. Essa opção é adequada para conjuntos de dados com muitos arquivos (dezenas de milhões, por exemplo) que exigem carregamento repetido. Também se aplica a buckets onde o recurso de recuperação escalar do OSS está ativado.

Criar um conjunto de dados a partir de um prefixo de URI do OSS

O exemplo abaixo demonstra como usar o método from_prefix do OssIterableDataset para criar um conjunto de dados com base em um prefixo (URI do OSS) específico.

from osstorchconnector import OssIterableDataset

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 OssIterableDataset
iterable_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)

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

Criar um conjunto de dados a partir de uma lista de URIs do OSS

O exemplo a seguir ilustra o uso do método from_objects do OssIterableDataset para criar um conjunto de dados usando uma lista definida de URIs do OSS. No exemplo, uris é um iterador de strings contendo múltiplas URIs do OSS.

from osstorchconnector import OssIterableDataset

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

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 OssIterableDataset
iterable_dataset = OssIterableDataset.from_objects(uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)

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

Criar um conjunto de dados a partir de um arquivo de manifesto

Antes de criar o conjunto de dados, gere o arquivo de manifesto.

  1. Crie o arquivo de manifesto:

    Execute o comando touch manifest_file em qualquer diretório para criar o arquivo. Em seguida, preencha-o conforme os exemplos abaixo.

    Exemplo de arquivo de manifesto com nomes de objetos do OSS:

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

    Exemplo de arquivo de manifesto com nomes de objetos e rótulos do OSS:

    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. Crie o conjunto de dados usando o arquivo de manifesto:

    O exemplo abaixo mostra como utilizar o método from_manifest_file do OssIterableDataset para criar um conjunto de dados a partir de um arquivo de manifesto especificado.

    from osstorchconnector import OssIterableDataset
    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 OssIterableDataset
    # The manifest_file_path parameter specifies the local path of the manifest file.
    # The manifest_parser parameter is the method for parsing the manifest file. This example uses the built-in parsing method imagenet_manifest_parser.
    # The oss_base_uri parameter specifies the base OSS URI. It is used to concatenate with the URI parsed from the manifest to form a full OSS URI. FULL_OSS_URI = BASE_OSS_URI + URI.
    MANIFEST_FILE_LOCAL = "/path/to/manifest_file"
    iterable_dataset = OssIterableDataset.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 iterable_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 OssIterableDataset
    MANIFEST_FILE_URI = "oss://ai-testset/EnglistImg/manifest_file"
    iterable_dataset = OssIterableDataset.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 iterable_dataset:
        print(item.key)
        print(item.size)
        print(item.label)
        content = item.read()
        print(len(content))
        item.close()

Tipos de dados no conjunto de dados

Os objetos presentes no conjunto de dados possuem um tipo de dado que implementa interfaces comuns de I/O. Para mais detalhes, consulte Tipos de dados no OSS Connector for AI/ML.

Descrição dos parâmetros

Configure os parâmetros a seguir para criar um conjunto de dados utilizando o OssMapDataset ou o OssIterableDataset.

Parâmetro

Tipo

Obrigatório

Descrição

endpoint

string

Sim

Parâmetro comum:

Endpoint para acessar o serviço OSS. Para mais informações, consulte Regiões e endpoints.

region

string

Não

Parâmetro comum:

A região do OSS, como cn-beijing. Se não for definido, o conector tenta inferi-la automaticamente a partir do endpoint. No entanto, a inferência pode falhar caso o endpoint não contenha informações da região. Especifique a região explicitamente.

transform

object

Não

Parâmetro comum:

Função de transformação usada para converter um DataObject (objeto do OSS) em qualquer tipo desejado. Personalize este método conforme necessário. Para mais informações, consulte transform.

Importante

Não retorne diretamente um objeto DataObject na função transform. Isso pode interromper o funcionamento do iterador. Para retornar um objeto, chame o método copy.

cred_path

string

Sim

Parâmetro comum:

O caminho padrão do arquivo de autenticação é /root/.alibabacloud/credentials. Para mais informações, consulte Configurar credenciais de acesso.

config_path

string

Sim

Parâmetro comum:

O caminho padrão do arquivo de configuração do OSS Connector é /etc/oss-connector/config.json. Para mais informações, consulte Configurar o OSS Connector.

oss_uri

string

Sim

Parâmetro do método from_prefix:

Caminho do recurso OSS usado para criar o conjunto de dados a partir de um prefixo de URI do OSS. Apenas URIs que começam com oss:// são suportadas.

object_uris

string

Sim

Parâmetro do método from_objects:

Lista de caminhos de recursos OSS usada para criar o conjunto de dados. Apenas URIs que começam com oss:// são suportadas.

manifest_file_path

string

Sim

Parâmetro do método from_manifest_file:

Caminho do arquivo de manifesto. Caminhos de arquivos locais e URIs do OSS iniciados com oss:// são suportados.

manifest_parser

Callable Object

Sim

Parâmetro do método from_manifest_file:

Método integrado para analisar o arquivo de manifesto. Ele recebe um arquivo de manifesto aberto como entrada e retorna um iterador. Cada elemento do iterador é uma tupla no formato (oss_uri, label). Para mais informações, consulte manifest_parser. Também é possível personalizar o método manifest_parser com base no formato dos diferentes arquivos de manifesto do conjunto de dados.

oss_base_uri

string

Sim

Parâmetro do método from_manifest_file:

URI base do OSS. Usada para formar uma URI completa do OSS através da concatenação com uma URI potencialmente incompleta proveniente do arquivo de manifesto. Caso não haja oss_base_uri, defina este parâmetro como "".

Métodos integrados

transform

Ao criar um conjunto de dados, ele fornece um iterador que produz o resultado de transform(DataObject). O DataObject é um tipo de dados no OSS Connector for AI/ML.

O método transform pode ser personalizado. Se você não especificar um método transform durante a criação do conjunto de dados, o método padrão será utilizado.

Método transform padrão

O exemplo abaixo apresenta o método transform padrão. Não é necessário especificá-lo ao criar um conjunto de dados.

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

Método transform personalizado

O exemplo a seguir demonstra como aplicar um método transform personalizado na criação de um conjunto de dados.

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

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/"

# 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 building the dataset
iterable_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
for item in iterable_dataset:
    print(item[0])
    print(item[1].shape)

manifest_parser

Para criar um conjunto de dados usando o método manifest_parser padrão, importe-o conforme o exemplo abaixo.

from osstorchconnector import imagenet_manifest_parser

O exemplo seguinte exibe o método manifest_parser padrão.

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

Criar um carregador de dados com PyTorch a partir de um conjunto de dados

O exemplo abaixo mostra como criar um carregador de dados do PyTorch utilizando um conjunto de dados criado com o OssIterableDataset como source.

import torch
from osstorchconnector import OssIterableDataset

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/"

def transform(obj):
    return obj.key, obj.label

# Build a dataset using the from_prefix method of OssIterableDataset
map_dataset = OssIterableDataset.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)
# Use the data in the training loop
# for batch in loader:
     # Perform training operations

Referências

O OSS Connector for AI/ML também pode ser utilizado em tarefas de treinamento de dados dentro de ambientes containerizados. Para mais informações, consulte Criar uma imagem Docker contendo o ambiente do OSS Connector for AI/ML.