`OssMapDataset` は、データ量が少なく、メモリが十分で、頻繁なランダムアクセスと並列処理が必要なシナリオに適しています。このトピックでは、`OssMapDataset` を使用してデータセットを構築する方法について説明します。
前提条件
OSS Connector for AI/ML がインストールされ、設定されている必要があります。詳細については、「OSS Connector for AI/ML のインストール」および「OSS Connector for AI/ML の設定」をご参照ください。
データセットの構築
メソッド
`OssMapDataset` を使用してデータセットを構築するには、3 つの方法があります:
OSS_URI プレフィックス:OSS ストレージパスが統一されたパターンに従うシナリオに適しています。
OSS_URI のリスト:OSS ストレージパスが特定されているものの、散在しているシナリオに適しています。
マニフェストファイル:OSS の `list object` 操作のオーバーヘッドを削減します。この方法は、数千万個など多数のファイルを持つデータセットを繰り返しロードする場合や、OSS のスカラー取得機能が有効になっているバケットに適しています。
OSS_URI プレフィックスからのデータセット構築
この例では、`OssMapDataset` の `from_prefix` メソッドを使用して、OSS 内の指定されたプレフィックス (OSS_URI) からデータセットを構築する方法を示します。
from osstorchconnector import OssMapDataset
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/"
# OssMapDataset の from_prefix メソッドを使用してデータセットを構築します。
map_dataset = OssMapDataset.from_prefix(oss_uri=OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# 作成されたデータセット内のオブジェクトにランダムアクセスします。
item = map_dataset[0]
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()
# データセット内のオブジェクトを走査 (トラバース) します。
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()OSS_URI リストからのデータセット構築
この例では、`OssMapDataset` の `from_objects` メソッドを使用して、指定された OSS_URI のリストからデータセットを構築する方法を示します。
from osstorchconnector import OssMapDataset
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_URI を含む文字列イテレーターです。
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"
]
# OssMapDataset の from_objects メソッドを使用してデータセットを構築します。
map_dataset = OssMapDataset.from_objects(object_uris=uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# 作成されたデータセット内のオブジェクトにランダムアクセスします。
item = map_dataset[1]
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()
# データセット内のオブジェクトを走査 (トラバース) します。
for item in map_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マニフェストファイルからデータセットを構築します。
この例では、`OssMapDataset` の `from_manifest_file` メソッドを使用して、指定されたマニフェストファイルからデータセットを構築する方法を示します。
from osstorchconnector import OssMapDataset 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/" # OssMapDataset の 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" map_dataset = OssMapDataset.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 map_dataset: print(item.key) print(item.size) print(item.label) content = item.read() print(len(content)) item.close() # OssMapDataset の from_manifest_file メソッドを使用して、OSS バケット内のマニフェストファイルからデータセットを構築します。 MANIFEST_FILE_URI = "oss://ai-testset/EnglistImg/manifest_file" map_dataset = OssMapDataset.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 map_dataset: print(item.key) print(item.size) print(item.label) content = item.read() print(len(content)) item.close()
OSS Connector for AI/ML のデータの型
データセット内のオブジェクトのデータの型は、一般的な 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 リソースのパス。このパラメーターを使用して、OSS_URI プレフィックスからデータセットを構築します。 |
object_uris | string | はい | `from_objects` メソッドのパラメーター: OSS リソースパスのリスト。このパラメーターを使用して、リスト内のパスからデータセットを構築します。 |
manifest_file_path | string | はい | `from_manifest_file` メソッドのパラメーター: マニフェストファイルのパス。ローカルファイルパスまたは |
manifest_parser | Callable オブジェクト | はい | `from_manifest_file` メソッドのパラメーター: マニフェストファイルを解析するための組み込みメソッド。開かれたマニフェストファイルを入力として受け取り、イテレーターを返します。イテレーターの各要素は |
oss_base_uri | string | はい | `from_manifest_file` メソッドのパラメーター: ベースとなる OSS_URI。マニフェストファイルからの不完全な可能性のある OSS_URI と連結され、完全な OSS_URI を形成します。ベース OSS_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 OssMapDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.test.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 パラメーターを使用します。
map_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
for item in map_dataset:
print(item[0])
print(item[1].shape)manifest_parser
データセットを構築する際にデフォルトの `manifest_parser` メソッドを使用するには、次の例のようにインポートします。
from osstorchconnector import imagenet_manifest_parser次のコードは、デフォルトの `manifest_parser` メソッドを示しています。
import io
import logging
from typing import Iterable, Tuple
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 データローダーの作成
次の例は、`OssMapDataset` によって構築されたデータセットをデータソースとして使用する PyTorch データローダーを作成する方法を示しています。
import torch
from osstorchconnector import OssMapDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.test.json"
CRED_PATH = "/root/.alibabacloud/credentials"
OSS_URI = "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/"
def transform(object):
data = object.read()
return object.key, object.label
# OssMapDataset の from_prefix メソッドを使用してデータセットを構築します。
map_dataset = OssMapDataset.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, shuffle=True)
# トレーニングループでデータを使用します。
# for batch in loader:
# トレーニング操作を実行します。
参考
OSS Connector for AI/ML をコンテナ化された環境でのデータトレーニングタスクに使用することもできます。詳細については、「OSS Connector for AI/ML 環境を含む Docker イメージの構築」をご参照ください。