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

Object Storage Service:OSSのデータを使用して、連続ストリーミング読み取りに適した反復可能なデータセットを構築する

最終更新日:Oct 08, 2024

反復可能なデータセットは、使用可能なメモリが限られている、または大量のデータが保存されるシナリオに適しています。 これは、シーケンシャル処理が使用され、データのランダムアクセスおよび並列処理に高い要件がないシナリオに特に適しています。 このトピックでは、OssIterableDatasetを使用して反復可能なデータセットを構築する方法について説明します。

前提条件

OSS Connector for AI/MLがインストールおよび設定されています。 詳細については、「AI/ML用OSSコネクタのインストール」および「AI/ML用OSSコネクタの設定」をご参照ください。

データセットの構築

方法

次のいずれかの方法を使用して、OssIterableDatasetを使用して反復可能なデータセットを構築できます。

  • OSS_URIプレフィックス: OSSデータのストレージパスに統一ルールがあるシナリオに適しています。

  • OSS_URIリスト: OSSデータのストレージパスがクリアで分散しているシナリオに適しています。

  • マニフェストファイル: 構築するデータセットに数千万などの多数のファイルが含まれ、データセットが頻繁に読み込まれ、バケットに対してデータインデックス作成が有効になっているシナリオに適しています。 この方法では、API操作を呼び出してOSSオブジェクトを一覧表示するときに発生する料金を削減します。

OSS_URIプレフィックスを使用したデータセットの構築

次のサンプルコードは、OssIterableDatasetのfrom_prefixメソッドを使用して、OSSでOSS_URIプレフィックスを指定してデータセットを構築する方法の例を示しています。

from osstorchconnector import OssIterableDataset

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 OssIterableDataset to build a dataset.
map_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)

# 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リストを使用してデータセットを構築する

次のサンプルコードでは、OssIterableDatasetのfrom_objectsメソッドを使用して、OSSでOSS_URIリストを指定してデータセットを構築する方法の例を示します。

from osstorchconnector import OssIterableDataset

ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
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"
]

# Use the from_objects method of OssIterableDataset to build a dataset.
map_dataset = OssIterableDataset.from_objects(uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)

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

    次のサンプルコードは、OssIterableDatasetのfrom_manifest_fileメソッドを使用して、マニフェストファイルを指定してデータセットを構築する方法の例を示しています。

    import io
    from typing import Iterable,Tuple,Union
    from osstorchconnector import OssIterableDataset
    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 OssIterableDataset 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 = 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)
    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 OssIterableDataset to build a dataset by specifying the manifest file in the OSS bucket.
    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)

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

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 OssIterableDataset

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/"

# Specify the transform operations on image objects.
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 = OssIterableDataset.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データローダーの作成

次のサンプルコードは、反復可能なデータセットをデータソースとして使用してPyTorchデータローダーを作成する方法の例を示しています。 iterableデータセットは、OssIterableDatasetを使用して作成されます。

import torch
from osstorchconnector import OssIterableDataset

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/"

def transform(object):
 data = object.read()
 return object.key, object.label

# Use the from_prefix method of OssIterableDataset to build a dataset.
map_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT,transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH)

# Create a PyTorch data loader based on map_dataset.
loader = torch.utils.data.DataLoader(map_dataset, batch_size=256, num_workers=32, prefetch_factor=2)
# 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イメージの構築」をご参照ください。