すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:OSSデータを使用してランダム読み取り用のマップデータセットを作成する

最終更新日:Oct 08, 2024

マップデータセットは、メモリが十分で、少量のデータに対して頻繁なランダムアクセスと並列処理が必要なシナリオに適しています。 このトピックでは、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))

マニフェストファイルを使用してデータセットを構築する

マニフェストファイルを作成し、マニフェストファイルを使用してデータセットを構築する必要があります。

  1. マニフェストファイルを作成する:

    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
  2. マニフェストファイルを使用してデータセットを作成します。

    次のサンプルコードは、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」をご参照ください。

重要

DataObjectオブジェクトが変換関数で返された場合、イテレータが機能しない可能性があります。 DataObjectオブジェクトを直接返さないでください。 DataObjectオブジェクトを返す場合は、copyメソッドを使用します。

cred_path

String

継続する

認証ファイルのパス。 デフォルト値: /root/.alibabacloud/credentials これは共通のパラメータです。 詳細については、「Configure access credentials」をご参照ください。

config_path

String

継続する

OSSコネクタ設定ファイルのパス。 デフォルト値: /etc/oss-connector/config.json これは共通のパラメータです。 詳細については、「Configure OSS Connector」をご参照ください。

oss_uri

String

継続する

OSSリソースパス。OSS_URIプレフィックスを使用してデータセットを構築するために使用されます。 これはfrom_prefixパラメーターです。 oss:// で始まるOSS_URIのみがサポートされています。

object_uris

String

継続する

OSSリソースパスのリスト。 リスト内のパスを使用して、データセットを作成できます。 これはfrom_objectsパラメーターです。 oss:// で始まるOSS_URIのみがサポートされています。

manifest_file_path

String

継続する

マニフェストファイルのパス。 oss:// で始まるローカルファイルパスまたはOSS_URIがサポートされています。 これはfrom_manifest_fileパラメータです。

manifest_parser

呼び出し可能オブジェクト

継続する

マニフェストファイルを解析する組み込みメソッド。 組み込みメソッドは、オープンマニフェストファイルを入力として受け取り、各要素を持つイテレータを (oss_uri,label) タプルとして返します。 これはfrom_manifest_fileパラメータです。 詳細については、「manifest_parser」をご参照ください。 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イメージの構築」をご参照ください。