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.
-
Créez un fichier manifeste.
Exécutez la commande
touch manifest_filedans 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.pngExemple 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 -
Créez le jeu de données à partir du fichier manifeste.
Cet exemple montre comment utiliser la méthode
from_manifest_filedeOssMapDatasetpour 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 |
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 |
cred_path | string | Oui | Paramètre commun : Le chemin d'accès au fichier d'identifiants. Le chemin par défaut est |
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 |
oss_uri | string | Oui | Paramètre pour la méthode 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 |
object_uris | string | Oui | Paramètre pour la méthode 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 |
manifest_file_path | string | Oui | Paramètre pour la méthode Le chemin d'accès au fichier manifeste. Vous pouvez utiliser un chemin de fichier local ou un OSS_URI commençant par |
manifest_parser | Callable Object | Oui | Paramètre pour la méthode 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_base_uri | string | Oui | Paramètre pour la méthode 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
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.