All Products
Search
Document Center

Object Storage Service:Gunakan data di OSS untuk membuat dataset iterabel guna pembacaan streaming sekuensial

Last Updated:Mar 21, 2026

OssIterableDataset melakukan streaming objek dari OSS secara sekuensial, sehingga sangat cocok untuk pekerjaan pelatihan dengan memori terbatas atau set data yang terlalu besar untuk dimuat sepenuhnya. Berbeda dengan dataset bergaya map, dataset ini tidak mendukung akses acak atau pengacakan paralel antar worker.

Prasyarat

Sebelum memulai, pastikan Anda telah:

Pilih metode pembuatan

OssIterableDataset menyediakan tiga metode factory. Pilih metode yang sesuai dengan struktur data Anda:

MetodePaling cocok untukKapan digunakan
from_prefixObjek-objek di bawah awalan path yang samaPath mengikuti pola penamaan seragam
from_objectsDaftar objek tertentu yang tersebarPath eksplisit tetapi tersebar di seluruh bucket
from_manifest_fileSet data sangat besar (puluhan juta objek)Pengindeksan data diaktifkan pada bucket dan set data sering dimuat; menghindari pemanggilan berulang API list serta mengurangi biaya terkait

Buat dataset

Buat dataset menggunakan awalan URI

Gunakan from_prefix ketika semua objek pelatihan Anda memiliki awalan path yang sama di OSS.

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

# Buat dataset dari awalan URI. Semua objek di bawah awalan tersebut disertakan.
iterable_dataset = OssIterableDataset.from_prefix(
    OSS_URI,
    endpoint=ENDPOINT,
    cred_path=CRED_PATH,
    config_path=CONFIG_PATH
)

# Iterasi dataset. Setiap item adalah DataObject dengan key, size, dan read().
for item in iterable_dataset:
    print(item.key)    # kunci objek (path dalam bucket)
    print(item.size)   # ukuran objek dalam byte
    content = item.read()
    print(len(content))

Buat dataset dari daftar URI

Gunakan from_objects ketika Anda memiliki daftar URI objek tertentu, meskipun tersebar di berbagai path.

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 adalah iterator string yang berisi satu atau beberapa URI OSS.
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"
]

# Buat dataset dari daftar URI.
iterable_dataset = OssIterableDataset.from_objects(
    uris,
    endpoint=ENDPOINT,
    cred_path=CRED_PATH,
    config_path=CONFIG_PATH
)

# Iterasi dataset. Setiap item adalah DataObject dengan key, size, dan read().
for item in iterable_dataset:
    print(item.key)
    print(item.size)
    content = item.read()
    print(len(content))

Buat dataset dari file manifest

Gunakan from_manifest_file untuk set data besar dengan pengindeksan data diaktifkan. Metode ini membaca daftar objek dari file manifest yang telah dibuat sebelumnya alih-alih memanggil API list saat waktu proses, sehingga mengurangi latensi dan biaya.

Langkah 1: Buat file manifest.

Jalankan touch manifest_file dan isi dengan salah satu format berikut.

Hanya nama objek:

Img/BadImag/Bmp/Sample001/img001-00001.png
Img/BadImag/Bmp/Sample001/img001-00002.png
Img/BadImag/Bmp/Sample001/img001-00003.png

Nama objek dengan label:

Img/BadImag/Bmp/Sample001/img001-00001.png label1
Img/BadImag/Bmp/Sample001/img001-00002.png label2
Img/BadImag/Bmp/Sample001/img001-00003.png label3

Langkah 2: Buat dataset.

Contoh berikut menggunakan imagenet_manifest_parser, parser bawaan untuk file manifest. Baik path lokal maupun URI OSS didukung untuk manifest_file_path.

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

# Opsi 1: Muat file manifest dari path lokal.
# manifest_file_path: path lokal ke file manifest
# manifest_parser: mengurai setiap baris menjadi tupel (oss_uri, label)
# oss_base_uri: ditambahkan di awal path relatif dalam manifest untuk membentuk URI OSS lengkap
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))

# Opsi 2: Muat file manifest dari URI OSS.
MANIFEST_FILE_URI = "oss://manifest_fileai-testset/EnglistImg/manifest_file"
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
)

Buat PyTorch DataLoader

Teruskan dataset ke torch.utils.data.DataLoader untuk menggunakannya dalam loop pelatihan.

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(obj):
    data = obj.read()
    return obj.key, obj.label

iterable_dataset = OssIterableDataset.from_prefix(
    OSS_URI,
    endpoint=ENDPOINT,
    transform=transform,
    cred_path=CRED_PATH,
    config_path=CONFIG_PATH
)

# Buat DataLoader yang didukung oleh dataset iterabel.
loader = torch.utils.data.DataLoader(
    iterable_dataset,
    batch_size=256,
    num_workers=32,
    prefetch_factor=2
)

# Gunakan loader dalam loop pelatihan.
for batch in loader:
    # Lakukan operasi pelatihan.
    ...

Parameter

Tabel berikut mencantumkan semua parameter untuk OssIterableDataset. Parameter yang ditandai sebagai common berlaku untuk ketiga metode factory.

Parameter umum

ParameterTipeWajibDeskripsi
endpointstringYaTitik akhir OSS yang digunakan untuk mengakses bucket. Lihat Wilayah dan titik akhir.
cred_pathstringYaPath ke file kredensial. Default: /root/.alibabacloud/credentials. Lihat Konfigurasi kredensial akses.
config_pathstringYaPath ke file konfigurasi OSS Connector for AI/ML. Default: /etc/oss-connector/config.json. Lihat Konfigurasi OSS Connector for AI/ML.
transformobjectTidakCallable yang diterapkan pada setiap DataObject sebelum dikembalikan. Jika tidak ditentukan, fungsi identity default digunakan, yang mengembalikan obj.copy().
Penting

Jangan mengembalikan DataObject secara langsung dari fungsi transform — iterator mungkin gagal. Kembalikan salinan menggunakan obj.copy() atau ekstrak data yang Anda butuhkan (misalnya, byte mentah atau tensor).

Parameter spesifik metode

ParameterMetodeTipeWajibDeskripsi
oss_urifrom_prefixstringYaAwalan URI OSS yang digunakan untuk memilih objek. Harus diawali dengan oss://.
object_urisfrom_objectsstringYaSatu atau beberapa URI OSS yang mengidentifikasi objek tertentu. Harus diawali dengan oss://.
manifest_file_pathfrom_manifest_filestringYaPath ke file manifest. Menerima path file lokal atau URI OSS yang diawali dengan oss://.
manifest_parserfrom_manifest_fileCallable ObjectYaFungsi yang mengurai file manifest dan mengembalikan iterator dari tupel (oss_uri, label). Gunakan imagenet_manifest_parser bawaan atau berikan implementasi kustom. Lihat manifest_parser.
oss_base_urifrom_manifest_filestringYaURI OSS dasar yang ditambahkan di awal path relatif dalam manifest untuk membentuk URI OSS lengkap. Berikan "" jika manifest sudah berisi URI lengkap.

Metode bawaan

transform

Saat dataset diiterasi, setiap DataObject dilewatkan melalui fungsi transform sebelum dikembalikan.

Metode default

Jika tidak ada transform yang ditentukan, fungsi identitas berikut digunakan:

# Transform default: mengembalikan salinan DataObject.
def identity(obj: DataObject) -> DataObject:
    if obj is not None:
        return obj.copy()
    else:
        return None

Metode kustom

Untuk menerapkan pra-pemrosesan — misalnya, decoding gambar dan menormalkan nilai piksel — teruskan fungsi kustom:

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

# Definisikan pipeline pra-pemrosesan gambar.
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 kustom: decode gambar dan terapkan pra-pemrosesan.
# Mengembalikan tupel (tensor, label) — bukan DataObject itu sendiri.
def transform(obj):
    try:
        img = Image.open(io.BytesIO(obj.read())).convert('RGB')
        val = trans(img)
    except Exception as e:
        raise e
    return val, obj.label

iterable_dataset = OssIterableDataset.from_prefix(
    OSS_URI,
    endpoint=ENDPOINT,
    transform=transform,
    cred_path=CRED_PATH,
    config_path=CONFIG_PATH
)

manifest_parser

manifest_parser mengurai file manifest dan mengembalikan iterator dari tupel (oss_uri, label) yang dikonsumsi oleh from_manifest_file.

Impor parser bawaan:

from osstorchconnector import imagenet_manifest_parser

Implementasi bawaan membaca baris yang dipisahkan tab. Baris dengan dua bidang atau lebih menghasilkan (key, label); baris dengan satu bidang menghasilkan (key, '').

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} untuk baris {i}: {line}")

Untuk mendukung format manifest berbeda, implementasikan fungsi dengan signature yang sama: menerima objek file-like yang terbuka dan mengembalikan iterable dari tupel (oss_uri, label).

Langkah selanjutnya