OssIterableDataset は、メモリが限られている場合やデータ量が大きいシナリオに最適です。主に、ランダムアクセスや並列処理が不要な逐次処理に使用されます。このトピックでは、OssIterableDataset を使用してデータセットを構築する方法について説明します。
前提条件
OSS Connector for AI/ML がインストールされ、設定済みであること。詳細については、「OSS Connector for AI/ML のインストール」および「OSS Connector for AI/ML の設定」をご参照ください。
データセットの構築
メソッド
OssIterableDataset を使用してデータセットを構築するには、3 つの方法があります:
OSS URI プレフィックス:OSS ストレージパスが一貫したパターンに従う場合に使用します。
OSS URI のリスト:特定の、非連続的な OSS ストレージパスに使用します。
マニフェストファイル:OSS オブジェクトをリスト化する際のオーバーヘッドを削減するために使用します。この方法は、数千万個など多数のファイルを含み、繰り返しロードする必要があるデータセットに適しています。また、OSS の スカラー取得 機能が有効になっているバケットにも適しています。
OSS URI プレフィックスからのデータセット構築
次の例は、OssIterableDataset の from_prefix メソッドを使用して、OSS 内の指定されたプレフィックス (OSS URI) からデータセットを構築する方法を示しています。
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/"
# OssIterableDataset の from_prefix メソッドを使用してデータセットを構築
iterable_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# データセット内のオブジェクトを走査
for item in iterable_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()OSS URI のリストからのデータセット構築
次の例は、OssIterableDataset の from_objects メソッドを使用して、指定された OSS URI のリストからデータセットを構築する方法を示しています。この例では、uris は複数の OSS URI を含む文字列のイテレータです。
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"
]
# OssIterableDataset の from_objects メソッドを使用してデータセットを構築
iterable_dataset = OssIterableDataset.from_objects(uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# データセット内のオブジェクトを走査
for item in iterable_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()マニフェストファイルからのデータセット構築
マニフェストファイルからデータセットを構築する前に、まずマニフェストファイルを作成する必要があります。
マニフェストファイルの作成:
任意の場所で
touch manifest_fileコマンドを実行してマニフェストファイルを作成します。次に、例に示すようにマニフェストファイルにデータを入力します。OSS オブジェクト名を含むマニフェストファイルの例:
Img/BadImag/Bmp/Sample001/img001-00001.png Img/BadImag/Bmp/Sample001/img001-00002.png Img/BadImag/Bmp/Sample001/img001-00003.pngOSS オブジェクト名とラベルを含むマニフェストファイルの例:
Img/BadImag/Bmp/Sample001/img001-00001.png label1 Img/BadImag/Bmp/Sample001/img001-00002.png label2 Img/BadImag/Bmp/Sample001/img001-00003.png label3マニフェストファイルからのデータセット構築:
次の例は、OssIterableDataset の from_manifest_file メソッドを使用して、指定されたマニフェストファイルからデータセットを構築する方法を示しています。
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/" # OssIterableDataset の from_manifest_file メソッドを使用してローカルファイルからデータセットを構築 # manifest_file_path パラメーターは、マニフェストファイルのローカルパスを指定します。 # manifest_parser パラメーターは、マニフェストファイルを解析するメソッドです。この例では、組み込みの解析メソッド imagenet_manifest_parser を使用します。 # oss_base_uri パラメーターは、ベースとなる OSS URI を指定します。これは、マニフェストから解析された URI と連結して完全な OSS URI を形成するために使用されます。完全な OSS URI = ベース 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() # OssIterableDataset の from_manifest_file メソッドを使用して OSS バケット内のマニフェストファイルからデータセットを構築 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()
データセット内のデータの型
データセット内のオブジェクトは、一般的な I/O インターフェイスを実装するデータの型です。詳細については、「OSS Connector for AI/ML のデータの型」をご参照ください。
パラメーターの説明
OssMapDataset または OssIterableDataset を使用してデータセットを構築するには、次のパラメーターを設定します。
パラメーター | 型 | 必須 | 説明 |
endpoint | string | はい | 共通パラメーター: OSS サービスにアクセスするためのエンドポイント。詳細については、「リージョンとエンドポイント」をご参照ください。 |
region | string | いいえ | 共通パラメーター: OSS リージョン (例: |
transform | object | いいえ | 共通パラメーター: DataObject (OSS オブジェクト) を任意の型に変換するために使用される変換関数。このメソッドは必要に応じてカスタマイズできます。詳細については、「transform」をご参照ください。 重要 transform 関数で |
cred_path | string | はい | 共通パラメーター: 認証ファイルのデフォルトパスは |
config_path | string | はい | 共通パラメーター: OSS Connector の設定ファイルのデフォルトパスは |
oss_uri | string | はい | from_prefix メソッドのパラメーター: OSS URI プレフィックスからデータセットを構築するために使用される OSS リソースパス。 |
object_uris | string | はい | from_objects メソッドのパラメーター: データセットを構築するために使用される OSS リソースパスのリスト。 |
manifest_file_path | string | はい | from_manifest_file メソッドのパラメーター: マニフェストファイルのパス。ローカルファイルパスと |
manifest_parser | 呼び出し可能なオブジェクト | はい | from_manifest_file メソッドのパラメーター: マニフェストファイルを解析するための組み込みメソッド。開かれたマニフェストファイルを入力として受け取り、イテレータを返します。イテレータの各要素は |
oss_base_uri | string | はい | from_manifest_file メソッドのパラメーター: ベースとなる OSS URI。マニフェストファイルからの不完全な可能性のある OSS URI と連結して、完全な OSS URI を作成するために使用されます。oss_base_uri がない場合は、このパラメーターを |
組み込みメソッド
transform
データセットを構築すると、データセットは `transform(DataObject)` の結果を生成するイテレータを提供します。`DataObject` は OSS Connector for AI/ML のデータの型です。
transform メソッドはカスタマイズ可能です。データセットの構築時に transform メソッドを指定しない場合、デフォルトのメソッドが使用されます。
デフォルトの transform メソッド
次の例は、デフォルトの transform メソッドを示しています。データセットを構築する際に指定する必要はありません。
# デフォルトの transform 関数
def identity(obj: DataObject) -> DataObject:
if obj is not None:
return obj.copy()
else:
return Noneカスタム transform メソッド
次の例は、データセットを構築する際にカスタム transform メソッドを使用する方法を示しています。
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/"
# イメージデータの変換操作を定義
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])
])
# 入力オブジェクトを処理する transform メソッドを作成
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
# データセット構築時に transform=transform パラメーターを使用
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
デフォルトの manifest_parser メソッドを使用してデータセットを構築するには、次の例に示すようにインポートします。
from osstorchconnector import imagenet_manifest_parser次の例は、デフォルトの manifest_parser メソッドを示しています。
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}")データセットから PyTorch でデータローダーを作成
次の例は、OssIterableDataset で構築したデータセットをデータソースとして使用し、PyTorch データローダーを作成する方法を示しています。
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
# OssIterableDataset の from_prefix メソッドを使用してデータセットを構築
map_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT,transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# map_dataset に基づいて PyTorch データローダーを作成
loader = torch.utils.data.DataLoader(map_dataset, batch_size=256, num_workers=32, prefetch_factor=2)
# トレーニングループでデータを使用
# for batch in loader:
# トレーニング操作を実行
関連ドキュメント
OSS Connector for AI/ML は、コンテナ化された環境でのデータトレーニングタスクにも使用できます。詳細については、「OSS Connector for AI/ML 環境を含む Docker イメージの構築」をご参照ください。