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:
Menginstal OSS Connector for AI/ML. Lihat Instal OSS Connector for AI/ML.
Mengonfigurasi OSS Connector for AI/ML. Lihat Konfigurasi OSS Connector for AI/ML.
Pilih metode pembuatan
OssIterableDataset menyediakan tiga metode factory. Pilih metode yang sesuai dengan struktur data Anda:
| Metode | Paling cocok untuk | Kapan digunakan |
|---|---|---|
from_prefix | Objek-objek di bawah awalan path yang sama | Path mengikuti pola penamaan seragam |
from_objects | Daftar objek tertentu yang tersebar | Path eksplisit tetapi tersebar di seluruh bucket |
from_manifest_file | Set 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.pngNama 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 label3Langkah 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
endpoint | string | Ya | Titik akhir OSS yang digunakan untuk mengakses bucket. Lihat Wilayah dan titik akhir. |
cred_path | string | Ya | Path ke file kredensial. Default: /root/.alibabacloud/credentials. Lihat Konfigurasi kredensial akses. |
config_path | string | Ya | Path ke file konfigurasi OSS Connector for AI/ML. Default: /etc/oss-connector/config.json. Lihat Konfigurasi OSS Connector for AI/ML. |
transform | object | Tidak | Callable yang diterapkan pada setiap DataObject sebelum dikembalikan. Jika tidak ditentukan, fungsi identity default digunakan, yang mengembalikan obj.copy(). |
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
| Parameter | Metode | Tipe | Wajib | Deskripsi |
|---|---|---|---|---|
oss_uri | from_prefix | string | Ya | Awalan URI OSS yang digunakan untuk memilih objek. Harus diawali dengan oss://. |
object_uris | from_objects | string | Ya | Satu atau beberapa URI OSS yang mengidentifikasi objek tertentu. Harus diawali dengan oss://. |
manifest_file_path | from_manifest_file | string | Ya | Path ke file manifest. Menerima path file lokal atau URI OSS yang diawali dengan oss://. |
manifest_parser | from_manifest_file | Callable Object | Ya | Fungsi 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_uri | from_manifest_file | string | Ya | URI 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 NoneMetode 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_parserImplementasi 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
Untuk detail properti dan metode I/O yang tersedia pada setiap item dataset, lihat Tipe data di OSS Connector for AI/ML.
Untuk menggunakan OSS Connector for AI/ML di lingkungan pelatihan berbasis kontainer, lihat Buat image Docker yang berisi lingkungan OSS Connector for AI/ML.