Dataset yang dapat diulang cocok untuk skenario dengan keterbatasan memori atau sejumlah besar data yang disimpan. Ini ideal untuk pemrosesan berurutan tanpa persyaratan tinggi pada akses acak dan pemrosesan paralel data. Topik ini menjelaskan cara membangun dataset yang dapat diulang menggunakan OssIterableDataset.
Prasyarat
OSS Connector for AI/ML telah diinstal dan dikonfigurasi. Untuk informasi lebih lanjut, lihat Instal OSS Connector for AI/ML dan Konfigurasikan OSS Connector for AI/ML.
Membangun dataset
Metode
Anda dapat menggunakan salah satu metode berikut untuk membangun dataset yang dapat diulang menggunakan OssIterableDataset:
Prefiks OSS_URI: Cocok untuk skenario dengan aturan seragam dalam jalur penyimpanan data OSS.
Daftar OSS_URI: Cocok untuk skenario dengan jalur penyimpanan data OSS yang jelas tetapi tersebar.
File manifest: Cocok untuk dataset besar, seperti puluhan juta file, yang sering dimuat, dan pengindeksan data diaktifkan untuk bucket. Metode ini mengurangi biaya operasi API untuk mencantumkan objek OSS. Untuk informasi lebih lanjut tentang pengindeksan data, lihat pengindeksan data.
Membangun dataset menggunakan prefiks OSS_URI
Kode sampel berikut menunjukkan cara menggunakan metode from_prefix dari OssIterableDataset untuk membangun dataset dengan menentukan prefiks OSS_URI 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/"
# Gunakan metode from_prefix dari OssIterableDataset untuk membangun dataset.
map_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Jelajahi objek dalam dataset.
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
Membangun dataset menggunakan daftar OSS_URI
Kode sampel berikut menunjukkan cara menggunakan metode from_objects dari OssIterableDataset untuk membangun dataset dengan menentukan daftar OSS_URI di OSS. Dalam contoh ini, uris adalah iterator string yang berisi beberapa OSS_URIs.
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 = [
"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"
]
# Gunakan metode from_objects dari OssIterableDataset untuk membangun dataset.
map_dataset = OssIterableDataset.from_objects(uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Jelajahi objek dalam dataset.
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
Membangun dataset menggunakan file manifest
Anda perlu membuat file manifest dan menggunakannya untuk membangun dataset.
Buat file manifest:
Jalankan perintah
touch manifest_fileuntuk membuat file manifest dan tentukan 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 label3Membangun dataset menggunakan file manifest.
Kode sampel berikut menunjukkan cara menggunakan metode from_manifest_file dari OssIterableDataset untuk membangun dataset dengan menentukan file manifest:
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/" MANIFEST_FILE_URI = "oss://manifest_fileai-testset/EnglistImg/manifest_file" # Gunakan metode from_manifest_file dari OssIterableDataset untuk membangun dataset dari file lokal. # Parameter manifest_file_path menentukan jalur lokal file manifest. # Parameter manifest_parser menentukan metode yang digunakan untuk penguraian file manifest. Dalam contoh, metode penguraian bawaan imagenet_manifest_parser digunakan. # Parameter oss_base_uri menentukan BASE_OSS_URI, yang digunakan untuk menggabungkan URI yang diurai dari file manifest untuk membentuk FULL_OSS_URI. 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)) # Gunakan metode from_manifest_file dari OssIterableDataset untuk membangun dataset dengan menentukan file manifest di bucket OSS. 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)
Tipe data di OSS Connector for AI/ML
Tipe data objek dalam dataset mendukung metode I/O. Untuk informasi lebih lanjut, lihat Tipe data di OSS Connector for AI/ML.
Deskripsi parameter
Jika Anda menggunakan OssMapDataset atau OssIterableDataset untuk membangun dataset, Anda harus mengonfigurasi parameter. Tabel berikut menjelaskan parameter tersebut.
Parameter | Tipe | Diperlukan | Deskripsi |
endpoint | string | Ya |
Endpoint yang digunakan untuk mengakses OSS. Ini adalah parameter umum. Untuk informasi lebih lanjut, lihat Wilayah dan endpoint. |
transform | object | Tidak |
Fungsi transform yang digunakan untuk menyesuaikan respons DataObject. Ini adalah parameter umum. Anda dapat menggunakan metode kustom berdasarkan kebutuhan bisnis Anda. Untuk informasi lebih lanjut, lihat transform. Penting Jika objek |
cred_path | string | Ya |
Jalur file autentikasi. Nilai default: |
config_path | string | Ya |
Jalur file konfigurasi OSS Connector for AI/ML. Nilai default: |
oss_uri | string | Ya |
Jalur sumber daya OSS, yang digunakan untuk membangun dataset menggunakan prefiks OSS_URI. Ini adalah parameter from_prefix. Hanya OSS_URIs yang dimulai dengan |
object_uris | string | Ya |
Daftar jalur sumber daya OSS. Anda dapat menggunakan jalur dalam daftar untuk membangun dataset. Ini adalah parameter from_objects. Hanya OSS_URIs yang dimulai dengan |
manifest_file_path | string | Ya |
Jalur file manifest. Jalur file lokal atau OSS_URI yang dimulai dengan |
manifest_parser | Callable Object | Ya |
Metode bawaan yang mengurai file manifest. Metode bawaan menerima file manifest terbuka sebagai input, dan mengembalikan iterator dengan setiap elemen sebagai tuple |
oss_base_uri | string | Ya |
URI dasar OSS, yang digunakan untuk menggabungkan OSS_URI yang mungkin tidak lengkap dalam file manifest untuk membentuk OSS_URI lengkap. Ini adalah parameter from_manifest_file. Jika oss_base_uri tidak ada, masukkan |
Metode bawaan
transform
Saat dataset dibangun, dataset mengembalikan iterator untuk fungsi transform(DataObject). DataObject adalah tipe data OSS Connector for AI/ML.
Fungsi transform memungkinkan Anda memilih metode kustom. Jika tidak ditentukan saat membangun dataset, metode default digunakan.
Metode default
Kode sampel berikut menunjukkan cara menggunakan metode default. Anda tidak perlu menentukan metode ini saat membangun dataset.
# Fungsi transform default.
def identity(obj: DataObject) -> DataObject:
if obj is not None:
return obj.copy()
else:
return NoneMetode kustom
Kode sampel berikut menunjukkan cara menggunakan metode 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/"
# Tentukan operasi transform pada objek 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])
])
# Gunakan 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 val, object.label
# Tentukan parameter transform=transform saat Anda membangun dataset.
iterable_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH)
manifest_parser
Gunakan metode manifest_parser bawaan. Kode sampel berikut menunjukkan cara mengimpor metode manifest_parser saat membangun dataset:
from osstorchconnector import imagenet_manifest_parserContoh:
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 PyTorch data loader menggunakan dataset
Kode sampel berikut menunjukkan cara membuat PyTorch data loader menggunakan dataset yang dapat diulang sebagai sumber data. Dataset yang dapat diulang dibangun menggunakan OssIterableDataset.
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(object):
data = object.read()
return object.key, object.label
# Gunakan metode from_prefix dari OssIterableDataset untuk membangun dataset.
map_dataset = OssIterableDataset.from_prefix(OSS_URI, endpoint=ENDPOINT,transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Buat PyTorch data loader 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
Untuk pekerjaan pelatihan data dalam lingkungan berbasis kontainer, OSS Connector for AI/ML juga kompatibel. Untuk informasi lebih lanjut, lihat Bangun Docker image yang berisi lingkungan OSS Connector for AI/ML.