このトピックでは、OSS Python SDK と OSS Python API を使用して 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
詳細については、「OSS のリージョンとエンドポイント」をご参照ください。
<your_bucket_name>
バケットの名前。
oss://プレフィックスは含めないでください。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 の使用
PyTorch ユーザー向けに、DSW は OSS のデータを直接読み書きするための OSS Python API を提供します。
トレーニングデータやモデルを OSS に保存できます:
トレーニングデータの読み込み
データを OSS バケットに保存し、データパスと対応するラベルを同じバケット内のインデックスファイルに保存できます。カスタム
Datasetを作成することで、PyTorch のDataLoaderAPI を使用して、複数のプロセスでデータを並行して読み取ることができます。次のコードは例です。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)次のプレースホルダーを実際の値に置き換えます:
endpoint: OSS エンドポイント。bucket: バケット名。auth: 認証オブジェクト。index_file: インデックスファイルへのパス。
説明この例では、インデックスファイルは次のフォーマットを使用します: カンマ (,) はサンプルを区切り、コロン (:) はサンプルパスとそのラベルを区切ります。
モデルの保存または読み込み
oss2Python API を使用して PyTorch モデルを保存または読み込みできます。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>: バケットから読み込むモデルのパス。