Dataset map cocok untuk skenario dengan memori mencukupi dan kebutuhan akses acak serta pemrosesan paralel pada volume data kecil. Topik ini menjelaskan cara membuat dataset menggunakan OssMapDataset.
Prasyarat
OSS Connector for AI/ML telah diinstal dan dikonfigurasi. Untuk informasi selengkapnya, lihat Install OSS Connector for AI/ML dan Configure OSS Connector for AI/ML.
Buat dataset
Metode
Anda dapat menggunakan salah satu metode berikut untuk membuat dataset dengan OssMapDataset:
Awalan OSS_URI: cocok untuk skenario di mana jalur penyimpanan data OSS mengikuti aturan yang seragam.
Daftar OSS_URI: cocok untuk skenario di mana jalur penyimpanan data OSS jelas tetapi tersebar.
File manifest: cocok untuk skenario di mana dataset yang ingin Anda buat berisi sejumlah besar file—misalnya puluhan juta—sering dimuat, dan pengindeksan data diaktifkan untuk bucket tersebut. Metode ini mengurangi biaya yang timbul saat Anda memanggil operasi API untuk mendaftar objek OSS.
Buat dataset dengan menggunakan awalan OSS_URI
Kode contoh berikut menunjukkan cara menggunakan metode from_prefix dari OssMapDataset untuk membuat dataset dengan menentukan awalan 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 dengan 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 secara acak sebuah objek dalam dataset yang telah dibuat.
item = map_dataset[0]
print(item.key)
content = item.read()
print(item.size)
print(len(content))
# Iterasi objek-objek dalam dataset.
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
Buat dataset dengan menggunakan daftar OSS_URI
Kode contoh berikut menunjukkan cara menggunakan metode from_objects dari OssMapDataset untuk membuat dataset dengan menentukan daftar 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"
# uris adalah iterator string yang berisi 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 dengan 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 secara acak sebuah objek dalam dataset yang telah dibuat.
item = map_dataset[1]
print(item.key)
print(item.size)
content = item.read()
print(len(content))
# Iterasi objek-objek dalam dataset.
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
Buat dataset dengan menggunakan file manifest
Anda perlu membuat file manifest dan menggunakannya untuk membuat dataset.
-
Buat file manifest:
Jalankan perintah
touch manifest_filedi direktori mana pun untuk membuat file manifest, lalu isi file tersebut sesuai contoh berikut.Contoh file manifest yang 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 yang berisi nama dan label objek 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 -
Buat dataset dengan menggunakan file manifest.
Kode contoh berikut menunjukkan cara menggunakan metode from_manifest_file dari OssMapDataset untuk membuat dataset dengan menentukan file manifest:
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/" MANIFEST_FILE_URI = "oss://ai-testset/EnglistImg/manifest_file" # Gunakan metode from_manifest_file dari OssMapDataset untuk membuat dataset dari file lokal. # Parameter manifest_file_path menentukan jalur lokal file manifest. # Parameter manifest_parser menentukan metode yang digunakan untuk mengurai file manifest. Contoh ini menggunakan parser bawaan, yaitu imagenet_manifest_parser. # Parameter oss_base_uri menentukan URI dasar OSS. URI ini ditambahkan di awal URI relatif dari manifest untuk membentuk URI OSS lengkap. MANIFEST_FILE_LOCAL = "/path/to/manifest_file.txt" iterable_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 iterable_dataset: print(item.key) print(item.size) print(item.label) content = item.read() print(len(content)) # Gunakan metode from_manifest_file dari OssMapDataset untuk membuat dataset dari file manifest yang berada di bucket OSS. iterable_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)
Tipe data di OSS Connector for AI/ML
Tipe data objek dalam dataset mendukung metode I/O. Untuk informasi selengkapnya, lihat Tipe data di OSS Connector for AI/ML.
Deskripsi parameter
Jika Anda menggunakan OssMapDataset atau OssIterableDataset untuk membuat dataset, Anda harus mengonfigurasi parameter-parameter berikut. Tabel berikut menjelaskan parameter tersebut.
Parameter | Tipe | Wajib | Deskripsi |
endpoint | string | Ya |
Endpoint yang digunakan untuk mengakses OSS. Ini merupakan parameter umum. Untuk informasi selengkapnya, lihat Wilayah dan endpoint. |
|
region |
string |
Tidak |
Parameter umum. Wilayah OSS, seperti |
transform |
object |
Tidak |
Fungsi transform yang digunakan untuk menyesuaikan respons DataObject. Ini merupakan parameter umum. Anda dapat menggunakan metode kustom sesuai kebutuhan bisnis Anda. Untuk informasi selengkapnya, lihat transform. Penting
Jangan langsung mengembalikan objek |
cred_path |
string |
Ya |
Jalur default file kredensial adalah |
config_path |
string |
Ya |
Jalur default untuk file konfigurasi OSS Connector adalah |
oss_uri |
string |
Ya |
Jalur resource OSS berfungsi sebagai awalan OSS_URI untuk membuat Dataset. Jalur tersebut harus diawali dengan |
object_uris |
string |
Ya |
Daftar jalur resource OSS yang digunakan untuk membuat Dataset. Hanya URI OSS yang diawali dengan |
manifest_file_path |
string |
Ya |
Jalur ke file manifest dapat berupa jalur file lokal atau URI OSS yang diawali dengan |
manifest_parser |
Callable Object |
Ya |
Metode bawaan untuk mengurai file manifest menerima file manifest yang telah dibuka sebagai input dan mengembalikan iterator, di mana setiap elemen berupa tupel |
oss_base_uri |
string |
Ya |
URI dasar OSS digabungkan dengan URI OSS yang tidak lengkap dalam file manifest untuk membentuk URI OSS lengkap. Jika oss_base_uri tidak disediakan, atur parameter ini ke |
Metode bawaan
transform
Saat dataset dibuat, dataset mengembalikan iterator untuk fungsi transform(DataObject). DataObject adalah tipe data OSS Connector for AI/ML.
Fungsi transform memungkinkan Anda menggunakan metode kustom. Jika tidak ditentukan saat membuat dataset, metode default akan digunakan.
Metode default
Kode contoh berikut menunjukkan cara menggunakan metode default. Anda tidak perlu menentukan metode ini saat membuat dataset.
# Fungsi transform default
def identity(obj: DataObject) -> DataObject:
if obj is not None:
return obj.copy()
else:
return None
Metode kustom
Kode contoh berikut menunjukkan cara menggunakan metode kustom:
import sys
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 fungsi 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 val, object.label
# Gunakan parameter transform saat membuat dataset.
iterable_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH, region=REGION)
manifest_parser
Gunakan metode manifest_parser default. Kode contoh berikut menunjukkan cara mengimpor metode manifest_parser saat membuat dataset:
from osstorchconnector import imagenet_manifest_parser
Contoh:
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} for line {i}: {line}")
Buat data loader melalui dataset dengan menggunakan PyTorch
Kode contoh berikut menunjukkan cara membuat data loader menggunakan PyTorch berdasarkan dataset yang dibuat dengan 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 dengan 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
Jika Anda menjalankan pekerjaan pelatihan data di lingkungan terkontainerisasi, OSS Connector for AI/ML juga cocok untuk lingkungan tersebut. Untuk informasi selengkapnya, lihat Buat image Docker yang berisi lingkungan OSS Connector for AI/ML.