マップデータセットは、メモリが十分で、少量のデータに対して頻繁なランダムアクセスと並列処理が必要なシナリオに適しています。このトピックでは、OssMapDataset を使用してデータセットを構築する方法について説明します。
前提条件
OSS Connector for AI/ML がインストールされ、設定済みであること。詳細については、「OSS Connector for AI/ML のインストール」および「OSS Connector for AI/ML の設定」をご参照ください。
データセットの構築
メソッド
OssMapDataset を使用してデータセットを構築するには、次のいずれかのメソッドを使用できます。
OSS_URI プレフィックス:OSS データのストレージパスに統一されたルールがあるシナリオに適しています。
OSS_URI リスト:OSS データのストレージパスが明確であるものの、散在しているシナリオに適しています。
マニフェストファイル:作成したいデータセットに数千万個などの大量のファイルが含まれており、データセットが頻繁にロードされ、バケットでデータインデックス作成が有効になっているシナリオに適しています。このメソッドは、API オペレーションを呼び出して 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)
content = item.read()
print(item.size)
print(len(content))
# データセット内のオブジェクトを反復処理します。
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
OSS_URI リストを使用したデータセットの構築
次のサンプルコードは、OssMapDataset の from_objects メソッドを使用して、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"
# 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))
# データセット内のオブジェクトを反復処理します。
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
マニフェストファイルを使用したデータセットの構築
マニフェストファイルを作成し、そのファイルを使用してデータセットを構築する必要があります。
-
マニフェストファイルの作成:
任意のディレクトリで
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/" MANIFEST_FILE_URI = "oss://ai-testset/EnglistImg/manifest_file" # 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.txt" iterable_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 iterable_dataset: print(item.key) print(item.size) print(item.label) content = item.read() print(len(content)) # OssMapDataset の from_manifest_file メソッドを使用して、OSS バケット内のマニフェストファイルからデータセットを作成します。 iterable_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)
OSS Connector for AI/ML のデータの型
データセット内のオブジェクトのデータの型は I/O メソッドをサポートしています。詳細については、「OSS Connector for AI/ML のデータの型」をご参照ください。
パラメーターの説明
OssMapDataset または OssIterableDataset を使用してデータセットを構築する場合、パラメーターを設定する必要があります。次の表にパラメーターを説明します。
パラメーター | タイプ | 必須 | 説明 |
endpoint | string | はい |
OSS へのアクセスに使用されるエンドポイントです。これは共通パラメーターです。詳細については、「リージョンとエンドポイント」をご参照ください。 |
|
region |
string |
いいえ |
共通パラメーターです。 OSS リージョン (例: |
transform |
object |
いいえ |
DataObject の応答をカスタマイズするために使用される変換関数です。これは共通パラメーターです。ビジネス要件に基づいてカスタムメソッドを使用できます。詳細については、「transform」をご参照ください。 重要
transform 内で |
cred_path |
string |
はい |
認証情報ファイルのデフォルトパスは |
config_path |
string |
はい |
OSS Connector 設定ファイルのデフォルトパスは |
oss_uri |
string |
はい |
OSS リソースパスは、データセットを構築するための OSS_URI プレフィックスとして機能します。パスは |
object_uris |
string |
はい |
データセットの作成に使用される OSS リソースパスのリストです。 |
manifest_file_path |
string |
はい |
マニフェストファイルへのパスは、ローカルファイルパスまたは |
manifest_parser |
呼び出し可能オブジェクト |
はい |
マニフェストファイルを解析するための組み込みメソッドは、開かれたマニフェストファイルを入力として受け取り、イテレータを返します。各要素は |
oss_base_uri |
string |
はい |
OSS ベース URI は、マニフェストファイル内の不完全な OSS_URI と結合されて、完全な OSS_URI を形成します。oss_base_uri が提供されていない場合は、このパラメーターを |
組み込みメソッド
transform
データセットが構築されると、データセットは transform(DataObject) 関数のイテレータを返します。DataObject は、OSS Connector for AI/ML のデータの型です。
transform 関数では、カスタムメソッドを選択できます。データセットを構築する際にメソッドを指定しない場合、デフォルトのメソッドが使用されます。
デフォルトメソッド
次のサンプルコードは、デフォルトメソッドの使用例です。データセットを構築する際にこのメソッドを指定する必要はありません。
# デフォルトの変換関数
def identity(obj: DataObject) -> DataObject:
if obj is not None:
return obj.copy()
else:
return None
カスタムメソッド
次のサンプルコードは、カスタムメソッドの使用例です。
import sys
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])
])
# 入力オブジェクトを処理するための変換関数を作成します。
def transform(object):
try:
img = Image.open(io.BytesIO(object.read())).convert('RGB')
val = trans(img)
except Exception as e:
raise e
return val, object.label
# データセットを作成する際に transform パラメーターを使用します。
iterable_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
manifest_parser
デフォルトの manifest_parser メソッドを使用します。次のサンプルコードは、データセットを構築する際に manifest_parser メソッドをインポートする方法の例を示しています。
from osstorchconnector import imagenet_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 イメージの構築」をご参照ください。