OssIterableDataset sangat ideal untuk skenario dengan memori terbatas atau volume data besar. Dataset ini terutama digunakan untuk pemrosesan sekuensial yang tidak memerlukan akses acak maupun pemrosesan paralel. Topik ini menjelaskan cara membuat dataset menggunakan OssIterableDataset.
Prasyarat
OSS Connector for AI/ML telah diinstal dan dikonfigurasi. Untuk informasi lebih lanjut, lihat Instal OSS Connector for AI/ML dan Konfigurasi OSS Connector for AI/ML.
Buat dataset
Metode
Anda dapat membuat dataset menggunakan OssIterableDataset dengan tiga cara:
Awalan URI OSS: Gunakan metode ini jika jalur penyimpanan OSS mengikuti pola yang konsisten.
Daftar URI OSS: Gunakan metode ini untuk jalur penyimpanan OSS spesifik yang tidak berurutan.
File manifest: Gunakan metode ini untuk mengurangi overhead saat mendaftar objek OSS. Metode ini cocok untuk dataset dengan banyak file—misalnya puluhan juta file—yang perlu dimuat berulang kali. Metode ini juga sesuai untuk bucket tempat fitur scalar retrieval OSS diaktifkan.
Buat dataset dari awalan URI OSS
Contoh berikut menunjukkan cara menggunakan metode from_prefix dari OssIterableDataset untuk membuat dataset dari awalan (URI OSS) tertentu di OSS.
from osstorchconnector import OssIterableDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.json"
CRED_PATH = "/root/.alibabacloud/credentials"
OSS_URI = "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/"
# Buat dataset menggunakan metode from_prefix dari OssIterableDataset
iterable_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# Telusuri objek-objek dalam dataset
for item in iterable_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()Buat dataset dari daftar URI OSS
Contoh berikut menunjukkan cara menggunakan metode from_objects dari OssIterableDataset untuk membuat dataset dari daftar URI OSS tertentu. Dalam contoh ini, uris adalah iterator string yang berisi beberapa URI OSS.
from osstorchconnector import OssIterableDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
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"
]
# Buat dataset menggunakan metode from_objects dari OssIterableDataset
iterable_dataset = OssIterableDataset.from_objects(uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# Telusuri objek-objek dalam dataset
for item in iterable_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()Buat dataset dari file manifest
Sebelum membuat dataset dari file manifest, Anda harus terlebih dahulu membuat file manifest tersebut.
Buat file manifest:
Jalankan perintah
touch manifest_filedi lokasi mana pun untuk membuat file manifest. Kemudian, isi file manifest seperti pada contoh berikut.Contoh file manifest dengan nama objek OSS:
Img/BadImag/Bmp/Sample001/img001-00001.png Img/BadImag/Bmp/Sample001/img001-00002.png Img/BadImag/Bmp/Sample001/img001-00003.pngContoh file manifest dengan nama objek OSS dan label:
Img/BadImag/Bmp/Sample001/img001-00001.png label1 Img/BadImag/Bmp/Sample001/img001-00002.png label2 Img/BadImag/Bmp/Sample001/img001-00003.png label3Buat dataset dari file manifest:
Contoh berikut menunjukkan cara menggunakan metode from_manifest_file dari OssIterableDataset untuk membuat dataset dari file manifest tertentu.
from osstorchconnector import OssIterableDataset from osstorchconnector import imagenet_manifest_parser ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com" REGION = "cn-beijing" CONFIG_PATH = "/etc/oss-connector/config.json" CRED_PATH = "/root/.alibabacloud/credentials" OSS_BASE_URI = "oss://ai-testset/EnglistImg/" # Buat dataset dari file lokal menggunakan metode from_manifest_file dari OssIterableDataset # Parameter manifest_file_path menentukan jalur lokal file manifest. # Parameter manifest_parser adalah metode untuk mengurai file manifest. Contoh ini menggunakan metode penguraian bawaan imagenet_manifest_parser. # Parameter oss_base_uri menentukan URI dasar OSS. Parameter ini digunakan untuk menggabungkan dengan URI yang diurai dari manifest guna membentuk URI OSS lengkap. FULL_OSS_URI = BASE_OSS_URI + URI. MANIFEST_FILE_LOCAL = "/path/to/manifest_file" 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, region=REGION) for item in iterable_dataset: print(item.key) print(item.size) print(item.label) content = item.read() print(len(content)) item.close() # Buat dataset dari file manifest di Bucket OSS menggunakan metode from_manifest_file dari OssIterableDataset MANIFEST_FILE_URI = "oss://ai-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, region=REGION) for item in iterable_dataset: print(item.key) print(item.size) print(item.label) content = item.read() print(len(content)) item.close()
Tipe data dalam dataset
Objek dalam dataset memiliki tipe data yang mengimplementasikan antarmuka I/O umum. Untuk informasi lebih lanjut, lihat Tipe data dalam OSS Connector for AI/ML.
Deskripsi parameter
Konfigurasikan parameter berikut untuk membuat dataset menggunakan OssMapDataset atau OssIterableDataset.
Parameter | Tipe | Wajib | Deskripsi |
endpoint | string | Ya | Parameter umum: Endpoint untuk mengakses layanan OSS. Untuk informasi lebih lanjut, lihat Wilayah dan endpoint. |
region | string | Tidak | Parameter umum: Wilayah OSS, seperti |
transform | object | Tidak | Parameter umum: Fungsi transform yang digunakan untuk mengonversi DataObject (objek OSS) ke tipe apa pun. Anda dapat menyesuaikan metode ini sesuai kebutuhan. Untuk informasi lebih lanjut, lihat transform. Penting Jangan langsung mengembalikan objek |
cred_path | string | Ya | Parameter umum: Jalur default file autentikasi adalah |
config_path | string | Ya | Parameter umum: Jalur default file konfigurasi OSS Connector adalah |
oss_uri | string | Ya | Parameter metode from_prefix: Jalur resource OSS yang digunakan untuk membuat dataset dari awalan URI OSS. Hanya URI OSS yang dimulai dengan |
object_uris | string | Ya | Parameter metode from_objects: Daftar jalur resource OSS yang digunakan untuk membuat dataset. Hanya URI OSS yang dimulai dengan |
manifest_file_path | string | Ya | Parameter metode from_manifest_file: Jalur file manifest. Jalur file lokal dan URI OSS yang dimulai dengan |
manifest_parser | Callable Object | Ya | Parameter metode from_manifest_file: Metode bawaan untuk mengurai file manifest. Metode ini menerima file manifest yang telah dibuka sebagai input dan mengembalikan iterator. Setiap elemen dalam iterator merupakan tupel |
oss_base_uri | string | Ya | Parameter metode from_manifest_file: URI dasar OSS. Digunakan untuk membuat URI OSS lengkap dengan menggabungkannya dengan URI OSS yang mungkin tidak lengkap dari file manifest. Jika tidak ada oss_base_uri, atur parameter ini ke |
Metode bawaan
transform
Saat Anda membuat dataset, dataset tersebut menyediakan iterator yang menghasilkan hasil dari `transform(DataObject)`. `DataObject` adalah tipe data dalam OSS Connector for AI/ML.
Metode transform dapat disesuaikan. Jika Anda tidak menentukan metode transform saat membuat dataset, metode default akan digunakan.
Metode transform default
Contoh berikut menunjukkan metode transform default. Anda tidak perlu menentukannya saat membuat dataset.
# Fungsi transform default
def identity(obj: DataObject) -> DataObject:
if obj is not None:
return obj.copy()
else:
return NoneMetode transform kustom
Contoh berikut menunjukkan cara menggunakan metode transform kustom saat membuat dataset.
import io
import torchvision.transforms as transforms
from PIL import Image
from osstorchconnector import OssIterableDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.json"
CRED_PATH = "/root/.alibabacloud/credentials"
OSS_URI = "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/"
# Definisikan operasi transformasi untuk data 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])
])
# Buat metode transform untuk memproses objek input
def transform(object):
try:
img = Image.open(io.BytesIO(object.read())).convert('RGB')
val = trans(img)
except Exception as e:
raise e
return object.key, val
# Gunakan parameter transform=transform saat membuat dataset
iterable_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
for item in iterable_dataset:
print(item[0])
print(item[1].shape)manifest_parser
Untuk membuat dataset menggunakan metode manifest_parser default, impor seperti pada contoh berikut.
from osstorchconnector import imagenet_manifest_parserContoh berikut menunjukkan metode manifest_parser default.
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}")Buat data loader dengan PyTorch dari dataset
Contoh berikut menunjukkan cara membuat data loader PyTorch menggunakan dataset yang dibuat dengan OssIterableDataset sebagai sumber data.
import torch
from osstorchconnector import OssIterableDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
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):
return obj.key, obj.label
# Buat dataset menggunakan metode from_prefix dari OssIterableDataset
map_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT,transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# Buat data loader PyTorch berdasarkan map_dataset
loader = torch.utils.data.DataLoader(map_dataset, batch_size=256, num_workers=32, prefetch_factor=2)
# Gunakan data dalam loop pelatihan
# for batch in loader:
# Lakukan operasi pelatihan
Referensi
OSS Connector for AI/ML juga dapat digunakan untuk tugas pelatihan data di lingkungan terkontainerisasi. Untuk informasi lebih lanjut, lihat Buat image Docker yang berisi lingkungan OSS Connector for AI/ML.