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.
-
Crie o arquivo de manifesto:
Execute o comando
touch manifest_fileem 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.pngExemplo 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 -
Crie o conjunto de dados usando o arquivo de manifesto:
O exemplo abaixo mostra como utilizar o método
from_manifest_filedo 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 |
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 |
cred_path | string | Sim | Parâmetro comum: O caminho padrão do arquivo de autenticação é |
config_path | string | Sim | Parâmetro comum: O caminho padrão do arquivo de configuração do 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 |
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 |
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 |
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_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.