Utilisez le SDK Python OSS ou l'API Python OSS pour lire et écrire des données Object Storage Service (OSS) dans DSW.
Recommandations
Pour un accès fréquent à des données volumineuses, enregistrez OSS comme jeu de données et montez-le. Pour un accès ponctuel ou dépendant de la logique métier, utilisez les méthodes SDK et API décrites dans cette rubrique.
Utilisation du SDK Python OSS
DSW inclut le package Python oss2. Pour lire et écrire des données OSS :
-
Authentifiez-vous et initialisez le client.
import oss2 auth = oss2.Auth('<your_AccessKey_ID>', '<your_AccessKey_Secret>') bucket = oss2.Bucket(auth, '<your_oss_endpoint>', '<your_bucket_name>')Remplacez ces espaces réservés.
Paramètre
Description
<your_AccessKey_ID> et <your_AccessKey_Secret>
L'AccessKey ID et l'AccessKey secret de votre compte Alibaba Cloud. Pour plus d'informations, consultez Créer une AccessKey.
<your_oss_endpoint>
L'endpoint OSS. Sélectionnez l'endpoint correspondant à la région de votre instance :
-
Instances en paiement à l'utilisation dans la région Chine (Pékin) :
oss-cn-beijing.aliyuncs.com -
Instances par abonnement dans la région Chine (Pékin) :
oss-cn-beijing-internal.aliyuncs.com -
Instances GPU P100 ou instances CPU dans la région Chine (Shanghai) :
oss-cn-shanghai.aliyuncs.com -
Instances GPU M40 dans la région Chine (Shanghai) :
oss-cn-shanghai-internal.aliyuncs.com
<your_bucket_name>
Le nom du bucket, sans le préfixe
oss://. -
-
Lisez et écrivez des données OSS.
# Read a complete file. result = bucket.get_object('<your_file_path/your_file>') print(result.read()) # Read data by range. result = bucket.get_object('<your_file_path/your_file>', byte_range=(0, 99)) # Write data to OSS. bucket.put_object('<your_file_path/your_file>', '<your_object_content>') # Append data to a file. result = bucket.append_object('<your_file_path/your_file>', 0, '<your_object_content>') result = bucket.append_object('<your_file_path/your_file>', result.next_position, '<your_object_content>')Remplacez les espaces réservés suivants :
<your_file_path/your_file>: chemin du fichier à lire ou à écrire.<your_object_content>: contenu à écrire ou à ajouter.
Utilisation de l'API Python OSS
DSW fournit l'API Python OSS permettant aux utilisateurs de PyTorch de lire et d'écrire directement des données OSS.
Stockez les données d'entraînement ou les modèles dans OSS :
-
Charger les données d'entraînement
Stockez les données dans un bucket OSS avec un fichier d'index associant les chemins aux libellés. Créez un objet
Datasetpersonnalisé pour exploiter l'APIDataLoaderde PyTorch et effectuer des lectures parallèles multiprocessus. Exemple :import io import oss2 import PIL import torch class OSSDataset(torch.utils.data.dataset.Dataset): def __init__(self, endpoint, bucket, auth, index_file): self._bucket = oss2.Bucket(auth, endpoint, bucket) self._indices = self._bucket.get_object(index_file).read().split(',') def __len__(self): return len(self._indices) def __getitem__(self, index): img_path, label = self._indices(index).strip().split(':') img_str = self._bucket.get_object(img_path) img_buf = io.BytesIO() img_buf.write(img_str.read()) img_buf.seek(0) img = Image.open(img_buf).convert('RGB') img_buf.close() return img, label dataset = OSSDataset(endpoint, bucket, auth, index_file) data_loader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, num_workers=num_loaders, pin_memory=True)Remplacez ces espaces réservés :
endpoint: endpoint OSS.bucket: nom du bucket.auth: objet d'authentification.index_file: chemin du fichier d'index.
RemarqueFormat du fichier d'index : les virgules (,) séparent les échantillons et les deux-points (:) séparent le chemin du libellé.
-
Enregistrer ou charger un modèle
Enregistrez ou chargez un modèle PyTorch à l'aide de l'API Python
oss2. Tutoriel de sérialisation PyTorch.-
Enregistrer un modèle
from io import BytesIO import torch import oss2 # Specify the Bucket name. bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO() torch.save(model.state_dict(), buffer) bucket.put_object("<your_model_path>", buffer.getvalue())Remplacez les espaces réservés suivants :
auth: objet d'authentification.endpoint: endpoint OSS.<your_bucket_name>: nom du bucket OSS, sans le préfixeoss://.<your_model_path>: chemin de destination du modèle dans le bucket.
-
Charger un modèle
from io import BytesIO import torch import oss2 bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO(bucket.get_object("<your_model_path>").read()) model.load_state_dict(torch.load(buffer))Remplacez les espaces réservés suivants :
auth: objet d'authentification.endpoint: endpoint OSS.<your_bucket_name>: nom du bucket OSS, sans le préfixeoss://.<your_model_path>: chemin du modèle dans le bucket.
-