OssMapDataset cocok untuk skenario dengan volume data kecil dan memori yang mencukupi, yang memerlukan akses acak serta pemrosesan paralel intensif. Topik ini menjelaskan cara membuat dataset menggunakan OssMapDataset.
Prasyarat
OSS Connector for AI/ML telah diinstal dan dikonfigurasi. Untuk informasi selengkapnya, lihat Instal OSS Connector for AI/ML dan Konfigurasi OSS Connector for AI/ML.
Buat dataset
Metode
Anda dapat membuat dataset dengan OssMapDataset melalui tiga cara:
Awalan OSS_URI: Cocok untuk skenario di mana jalur penyimpanan OSS mengikuti pola seragam.
Daftar OSS_URIs: Cocok untuk skenario di mana jalur penyimpanan OSS bersifat spesifik namun tersebar.
File manifest: Mengurangi beban operasi list object OSS. Metode ini cocok untuk dataset dengan banyak file—misalnya puluhan juta—yang dimuat berulang kali, serta untuk bucket tempat fitur scalar retrieval OSS diaktifkan.
Buat dataset dari awalan OSS_URI
Contoh ini menunjukkan cara menggunakan metode from_prefix dari OssMapDataset untuk membuat dataset dari awalan tertentu (OSS_URI) di OSS.
from osstorchconnector import OssMapDataset
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 OssMapDataset.
map_dataset = OssMapDataset.from_prefix(oss_uri=OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# Akses objek secara acak dalam dataset yang dibuat.
item = map_dataset[0]
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()
# Telusuri objek-objek dalam dataset.
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()Buat dataset dari daftar OSS_URIs
Contoh ini menunjukkan cara menggunakan metode from_objects dari OssMapDataset untuk membuat dataset dari daftar OSS_URIs tertentu.
from osstorchconnector import OssMapDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.json"
CRED_PATH = "/root/.alibabacloud/credentials"
# uris adalah iterator string yang berisi beberapa 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"
]
# Buat dataset menggunakan metode from_objects dari OssMapDataset.
map_dataset = OssMapDataset.from_objects(object_uris=uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
# Akses objek secara acak dalam dataset yang dibuat.
item = map_dataset[1]
print(item.key)
print(item.size)
content = item.read()
print(len(content))
item.close()
# Telusuri objek-objek dalam dataset.
for item in map_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 membuat file manifest tersebut terlebih dahulu.
Buat file manifest.
Jalankan perintah
touch manifest_filedi direktori mana pun untuk membuat file manifest. Kemudian, isi file tersebut seperti pada contoh berikut.Contoh file manifest berisi 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 berisi 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 ini menunjukkan cara menggunakan metode from_manifest_file dari OssMapDataset untuk membuat dataset dari file manifest tertentu.
from osstorchconnector import OssMapDataset 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 OssMapDataset. # Parameter manifest_file_path menentukan jalur lokal file manifest. # Parameter manifest_parser menentukan metode untuk mengurai file manifest. Contoh ini menggunakan parser bawaan imagenet_manifest_parser. # Parameter oss_base_uri menentukan OSS_URI dasar. Nilai ini digabungkan dengan URI yang diurai dari manifest untuk membentuk OSS_URI lengkap. Formatnya: FULL_OSS_URI = BASE_OSS_URI + URI. MANIFEST_FILE_LOCAL = "/path/to/manifest_file" map_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, region=REGION) for item in map_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 OssMapDataset. MANIFEST_FILE_URI = "oss://ai-testset/EnglistImg/manifest_file" map_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, region=REGION) for item in map_dataset: print(item.key) print(item.size) print(item.label) content = item.read() print(len(content)) item.close()
Tipe data di OSS Connector for AI/ML
Tipe data untuk objek dalam dataset mengimplementasikan antarmuka I/O umum. Untuk informasi selengkapnya, lihat Tipe data di OSS Connector for AI/ML.
Parameter
Saat membuat dataset menggunakan OssMapDataset atau OssIterableDataset, Anda dapat mengonfigurasi parameter berikut.
Parameter | Tipe | Wajib | Deskripsi |
endpoint | string | Ya | Parameter umum: Titik akhir publik layanan OSS. Untuk informasi selengkapnya, lihat Wilayah dan titik akhir. |
region | string | Tidak | Parameter umum: Wilayah OSS, misalnya |
transform | object | Tidak | Parameter umum: Fungsi transform yang mengonversi DataObject (objek OSS) menjadi tipe apa pun. Anda dapat menyesuaikan metode ini sesuai kebutuhan. Untuk informasi selengkapnya, lihat transform. Penting Jangan mengembalikan objek |
cred_path | string | Ya | Parameter umum: Jalur file kredensial akses. Jalur default adalah |
config_path | string | Ya | Parameter umum: Jalur file konfigurasi OSS Connector. Jalur default adalah |
oss_uri | string | Ya | Parameter untuk metode `from_prefix`: Jalur resource OSS. Gunakan parameter ini untuk membuat dataset dari awalan OSS_URI. Hanya OSS_URIs yang diawali dengan |
object_uris | string | Ya | Parameter untuk metode `from_objects`: Daftar jalur resource OSS. Gunakan parameter ini untuk membuat dataset dari jalur-jalur dalam daftar. Hanya OSS_URIs yang diawali dengan |
manifest_file_path | string | Ya | Parameter untuk metode `from_manifest_file`: Jalur file manifest. Anda dapat menggunakan jalur file lokal atau OSS_URI yang diawali dengan |
manifest_parser | Callable Object | Ya | Parameter untuk 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 berupa tupel |
oss_base_uri | string | Ya | Parameter untuk metode `from_manifest_file`: OSS_URI dasar. Nilai ini digabungkan dengan OSS_URI yang mungkin tidak lengkap dari file manifest untuk membentuk OSS_URI lengkap. Jika Anda tidak memiliki OSS_URI dasar, atur parameter ini ke |
Metode bawaan
transform
Saat membuat dataset, dataset menyediakan iterator yang menghasilkan hasil dari transform(DataObject). DataObject merupakan tipe data di 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 None
Metode 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 OssMapDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
CONFIG_PATH = "/etc/oss-connector/config.test.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.
map_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
for item in map_dataset:
print(item[0])
print(item[1].shape)manifest_parser
Untuk menggunakan metode manifest_parser default saat membuat dataset, impor seperti pada contoh berikut.
from osstorchconnector import imagenet_manifest_parserKode berikut menunjukkan metode manifest_parser default.
import io
import logging
from typing import Iterable, Tuple
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 PyTorch dari dataset
Contoh berikut menunjukkan cara membuat data loader PyTorch yang menggunakan dataset yang dibuat oleh OssMapDataset sebagai sumber data.
import torch
from osstorchconnector import OssMapDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
REGION = "cn-beijing"
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
# Buat dataset menggunakan metode from_prefix dari OssMapDataset.
map_dataset = OssMapDataset.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, shuffle=True)
# Gunakan data dalam loop pelatihan.
# for batch in loader:
# Lakukan operasi pelatihan.
Referensi
Anda juga dapat menggunakan OSS Connector for AI/ML untuk tugas pelatihan data di lingkungan terkontainerisasi. Untuk informasi selengkapnya, lihat Buat image Docker yang berisi lingkungan OSS Connector for AI/ML.