マップデータセットは、メモリが十分で、少量のデータに対して頻繁なランダムアクセスと並列処理が必要なシナリオに適しています。 このトピックでは、OssMapDatasetを使用してデータセットを構築する方法について説明します。
前提条件
OSS Connector for AI/MLがインストールおよび設定されています。 詳細については、「AI/ML用OSSコネクタのインストール」および「AI/ML用OSSコネクタの設定」をご参照ください。
データセットの構築
方法
次のいずれかの方法を使用して、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"
CONFIG_PATH = "/etc/oss-connector/config.json"
CRED_PATH = "/root/.alibabacloud/credentials"
OSS_URI = "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/"
# Use the from_prefix method of OssMapDataset to build a dataset.
map_dataset = OssMapDataset.from_prefix(oss_uri=OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Access objects in the created dataset at random.
item = map_dataset[0]
print(item.key)
content = item.read()
print(item.size)
print(len(content))
# Traverse the objects in the dataset.
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"
CONFIG_PATH = "/etc/oss-connector/config.json"
CRED_PATH = "/root/.alibabacloud/credentials"
# uris is a string iterator that contains multiple OSS_URIs.
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"
]
# Use the from_objects method of OssMapDataset to build a dataset.
map_dataset = OssMapDataset.from_objects(object_uris=uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Access objects in the created dataset at random.
item = map_dataset[1]
print(item.key)
print(item.size)
content = item.read()
print(len(content))
# Traverse the objects in the dataset.
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.png
OSSオブジェクトの名前とラベルを持つマニフェストファイルの例:
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メソッドを使用して、マニフェストファイルを指定してデータセットを構築する方法の例を示しています。
import io from typing import Iterable,Tuple,Union from osstorchconnector import OssMapDataset from osstorchconnector import imagenet_manifest_parser ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com" CONFIG_PATH = "/etc/oss-connector/config.json" CRED_PATH = "/root/.alibabacloud/credentials" OSS_BASE_URI = "oss://ai-testset/EnglistImg/" MANIFEST_FILE_URI = "oss://manifest_fileai-testset/EnglistImg/manifest_file" # Use the from_manifest_file method of OssMapDataset to build a dataset from a local file. # The manifest_file_path parameter specifies the local path of the manifest file. # The manifest_parser parameter specifies the method used for parsing the manifest file. In the example, the built-in parsing method imagenet_manifest_parser is used. # The oss_base_uri parameter specifies BASE_OSS_URI, which is used to combine the URI parsed from the manifest file to form FULL_OSS_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) for item in iterable_dataset: print(item.key) print(item.size) print(item.label) content = item.read() print(len(content)) # Use the from_manifest_file method of OssMapDataset to build a dataset by specifying the manifest file in the OSS bucket. 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)
)
OSS Connector for AI/MLのデータ型
データセット内のオブジェクトのデータ型は、I/Oメソッドをサポートしています。 詳細については、「OSS Connector For AI/MLのデータ型」をご参照ください。
パラメータ説明
OssMapDatasetまたはOssIterableDatasetを使用してデータセットを構築する場合は、パラメーターを設定する必要があります。 下表に、各パラメーターを説明します。
パラメーター | タイプ | 必須 | 説明 |
endpoint | String | 継続する |
OSSへのアクセスに使用されるエンドポイント。 これは共通のパラメータです。 詳細は、「リージョンとエンドポイント」をご参照ください。 |
変換 | object | 継続しない |
DataObjectの応答をカスタマイズするために使用される変換関数。 これは共通のパラメータです。 ビジネス要件に基づいてカスタムメソッドを使用できます。 詳細については、「transform」をご参照ください。 重要
|
cred_path | String | 継続する |
認証ファイルのパス。 デフォルト値: |
config_path | String | 継続する |
OSSコネクタ設定ファイルのパス。 デフォルト値: |
oss_uri | String | 継続する |
OSSリソースパス。OSS_URIプレフィックスを使用してデータセットを構築するために使用されます。 これはfrom_prefixパラメーターです。 |
object_uris | String | 継続する |
OSSリソースパスのリスト。 リスト内のパスを使用して、データセットを作成できます。 これはfrom_objectsパラメーターです。 |
manifest_file_path | String | 継続する |
マニフェストファイルのパス。 |
manifest_parser | 呼び出し可能オブジェクト | 継続する |
マニフェストファイルを解析する組み込みメソッド。 組み込みメソッドは、オープンマニフェストファイルを入力として受け取り、各要素を持つイテレータを |
oss_base_uri | String | 継続する |
OSSベースURI。マニフェストファイルで不完全である可能性のあるOSS_URIを連結して、完全なOSS_URIを形成するために使用されます。 これはfrom_manifest_fileパラメータです。 oss_base_uriが存在しない場合は、 |
組み込みメソッド
変換
データセットが構築されると、データセットはtransform(DataObject) 関数のイテレータを返します。 DataObjectは、OSS Connector for AI/MLのデータ型です。
変換関数を使用すると、カスタムメソッドを選択できます。 データセットのビルド時にメソッドを指定しない場合は、既定のメソッドが使用されます。
デフォルトの方法
次のサンプルコードは、デフォルトメソッドの使用方法の例を示しています。 データセットをビルドするときにこのメソッドを指定する必要はありません。
# The default transform function.
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"
CONFIG_PATH = "/etc/oss-connector/config.test.json"
CRED_PATH = "/root/.alibabacloud/credentials"
OSS_URI = "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/"
# Specify the transform operations on image data.
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])
])
# Use a transform method to process the input object.
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
# Specify the transform=transform parameter when you build the dataset.
iterable_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH)
manifest_parser
デフォルトのmanifest_parserメソッドを使用します。 次のサンプルコードは、データセットを構築するときにmanifest_parserメソッドをインポートする方法の例を示しています。
from osstorchconnector import imagenet_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を使用したデータセットによるデータローダーの作成
次のサンプルコードは、OssMapDatasetをデータソースとして使用して構築されたデータセットに基づいて、PyTorchを使用してデータローダーを作成する方法の例を示しています。
import torch
from osstorchconnector import OssMapDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
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
# Use the from_prefix method of OssMapDataset to build a dataset.
map_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform,cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Create a data loader by using PyTorch based on map_dataset.
loader = torch.utils.data.DataLoader(map_dataset, batch_size=256, num_workers=32, prefetch_factor=2, shuffle=True)
# Use data in the training loop.
# for batch in loader:
# Perform the training operations.
...
関連ドキュメント
コンテナ化された環境でデータトレーニングジョブを実行する場合、OSS Connector for AI/MLもコンテナ化された環境に適しています。 詳細については、「OSS Connector For AI/ML環境を含むDockerイメージの構築」をご参照ください。