OSS Python SDK または OSS Python API を使用して、DSW で Object Storage Service (OSS) のデータを読み書きします。
推奨事項
大規模なデータに頻繁にアクセスする場合は、OSS をデータセットとして登録してマウントしてください。たまに、またはロジックに応じてアクセスする場合は、このトピックで説明する SDK と API の方法を使用してください。
OSS Python SDK の使用
DSW には oss2 Python パッケージが含まれています。OSS データを読み書きするには:
-
クライアントを認証して初期化します。
import oss2 auth = oss2.Auth('<your_AccessKey_ID>', '<your_AccessKey_Secret>') bucket = oss2.Bucket(auth, '<your_oss_endpoint>', '<your_bucket_name>')次のプレースホルダーを置き換えてください:
パラメーター
説明
<your_AccessKey_ID> と <your_AccessKey_Secret>
Alibaba Cloud アカウントの AccessKey ID と AccessKey Secret。詳細については、「AccessKey の作成」をご参照ください。
<your_oss_endpoint>
OSS エンドポイント。インスタンスのリージョンに対応するエンドポイントを選択します:
-
中国 (北京) リージョンの従量課金インスタンス:
oss-cn-beijing.aliyuncs.com -
中国 (北京) リージョンのサブスクリプションインスタンス:
oss-cn-beijing-internal.aliyuncs.com -
中国 (上海) リージョンの GPU P100 インスタンスまたは CPU インスタンス:
oss-cn-shanghai.aliyuncs.com -
中国 (上海) リージョンの GPU M40 インスタンス:
oss-cn-shanghai-internal.aliyuncs.com
<your_bucket_name>
バケット名。
oss://プレフィックスは含めません。 -
-
OSS データの読み取りと書き込み。
# ファイル全体を読み取ります。 result = bucket.get_object('<your_file_path/your_file>') print(result.read()) # 範囲を指定してデータを読み取ります。 result = bucket.get_object('<your_file_path/your_file>', byte_range=(0, 99)) # OSS にデータを書き込みます。 bucket.put_object('<your_file_path/your_file>', '<your_object_content>') # ファイルにデータを追加します。 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>')次のプレースホルダーを置き換えてください:
-
<your_file_path/your_file>:読み書きするファイルのパス。 -
<your_object_content>:書き込みまたは追加するコンテンツ。
-
OSS Python API の使用
DSW は、PyTorch ユーザーが OSS データを直接読み書きするための OSS Python API を提供しています。
トレーニングデータまたはモデルを OSS に保存します:
-
トレーニングデータの読み込み
パスをラベルにマッピングするインデックスファイルを含む OSS バケットにデータを保存します。カスタム
Datasetを作成して、PyTorchDataLoaderAPI を使用しマルチプロセス並列読み取りを実行します。例:import io import oss2 from PIL import Image 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)次のプレースホルダーを置き換えてください:
-
endpoint:OSS エンドポイント。 -
bucket:バケット名。 -
auth:認証オブジェクト。 -
index_file:インデックスファイルのパス。
説明インデックスファイルの形式:カンマ (,) でサンプルを区切り、コロン (:) でパスとラベルを区切ります。
-
-
モデルの保存または読み込み
oss2Python API を使用して PyTorch モデルを保存または読み込みます。 (PyTorch シリアル化チュートリアル)-
モデルの保存
from io import BytesIO import torch import oss2 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())次のプレースホルダーを置き換えてください:
-
auth:認証オブジェクト。 -
endpoint:OSS エンドポイント。 -
<your_bucket_name>:OSS バケット名。oss://プレフィックスは含めません。 -
<your_model_path>:バケット内のモデルの保存先パス。
-
-
モデルの読み込み
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))次のプレースホルダーを置き換えてください:
-
auth:認証オブジェクト。 -
endpoint:OSS エンドポイント。 -
<your_bucket_name>:OSS バケット名。oss://プレフィックスは含めません。 -
<your_model_path>:バケット内のモデルのパス。
-
-