Un OssIterableDataset est idéal pour les scénarios impliquant une mémoire limitée ou de grands volumes de données. Il est principalement utilisé pour le traitement séquentiel lorsque l'accès aléatoire et le traitement parallèle ne sont pas requis. Cette rubrique décrit comment créer un jeu de données à l'aide d'OssIterableDataset.
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
Vous pouvez créer un jeu de données à l'aide d'OssIterableDataset de trois manières :
Préfixe d'URI OSS : utilisez cette méthode lorsque les chemins de stockage OSS suivent un modèle cohérent.
Liste d'URI OSS : privilégiez cette approche pour des chemins de stockage OSS spécifiques et non séquentiels.
Fichier manifeste : optez pour cette solution afin de réduire la surcharge liée à la liste des objets OSS. Elle convient aux jeux de données contenant de nombreux fichiers (des dizaines de millions) nécessitant un chargement répété. Elle est également adaptée aux buckets pour lesquels la fonctionnalité de récupération scalaire OSS est activée.
Créer un jeu de données à partir d'un préfixe d'URI OSS
L'exemple suivant illustre l'utilisation de la méthode from_prefix d'OssIterableDataset pour construire un jeu de données à partir d'un préfixe spécifié (URI OSS) dans 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"
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()
Créer un jeu de données à partir d'une liste d'URI OSS
L'exemple ci-dessous montre comment utiliser la méthode from_objects d'OssIterableDataset pour créer un jeu de données à partir d'une liste spécifiée d'URI OSS. Dans cet exemple, uris est un itérateur de chaînes contenant plusieurs URI 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()
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 d'abord créer ce fichier.
-
Créez un fichier manifeste :
Exécutez la commande
touch manifest_fileà n'importe quel emplacement pour créer un fichier manifeste. Ensuite, remplissez le fichier manifeste comme indiqué dans les exemples.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 :
L'exemple suivant montre comment utiliser la méthode
from_manifest_filed'OssIterableDataset pour créer un jeu de données à partir d'un fichier manifeste spécifié.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()
Types de données dans le jeu de données
Les objets du jeu de données sont d'un type de données qui 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.
Description des paramètres
Configurez les paramètres suivants pour créer un jeu de données à l'aide d'OssMapDataset ou d'OssIterableDataset.
Paramètre | Type | Obligatoire | Description |
endpoint | string | Oui | Paramètre commun : Le point de terminaison pour accéder au 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 utilisée pour convertir 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 par défaut du fichier d'authentification est |
config_path | string | Oui | Paramètre commun : Le chemin par défaut du fichier de configuration OSS Connector est |
oss_uri | string | Oui | Paramètre de la méthode from_prefix : Le chemin de la ressource OSS utilisé pour créer le jeu de données à partir d'un préfixe d'URI OSS. Seuls les URI OSS commençant par |
object_uris | string | Oui | Paramètre de la méthode from_objects : Une liste de chemins de ressources OSS utilisés pour créer le jeu de données. Seuls les URI OSS commençant par |
manifest_file_path | string | Oui | Paramètre de la méthode from_manifest_file : Le chemin du fichier manifeste. Les chemins de fichiers locaux et les URI OSS commençant par |
manifest_parser | Callable Object | Oui | Paramètre de la méthode from_manifest_file : Une 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 de |
oss_base_uri | string | Oui | Paramètre de la méthode from_manifest_file : L'URI OSS de base. Il est utilisé pour créer un URI OSS complet en le concaténant avec un URI OSS potentiellement incomplet issu du fichier manifeste. S'il n'y a pas d'oss_base_uri, 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 du jeu de données, la méthode par défaut est utilisée.
Méthode transform 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 transform 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 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
Pour créer un jeu de données à l'aide de la méthode manifest_parser par défaut, importez-la comme indiqué dans l'exemple suivant.
from osstorchconnector import imagenet_manifest_parser
L'exemple suivant présente la méthode manifest_parser par défaut.
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 avec PyTorch à partir d'un jeu de données
L'exemple suivant montre comment créer un chargeur de données PyTorch en utilisant un jeu de données construit avec OssIterableDataset comme source de données.
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
Références
OSS Connector for AI/ML peut également être utilisé pour les tâches d'entraînement de 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.