Dataset peta cocok untuk skenario di mana memori cukup dan akses acak yang sering serta pemrosesan paralel diperlukan untuk sejumlah kecil data. Topik ini menjelaskan cara membangun dataset menggunakan OssMapDataset.
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 dengan OssMapDataset:
Prefiks OSS_URI: Cocok untuk skenario di mana jalur penyimpanan data OSS memiliki 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 dibuat berisi banyak file, seperti puluhan juta, dataset sering dimuat, dan pengindeksan data diaktifkan untuk bucket. Metode ini mengurangi biaya yang dihasilkan saat Anda memanggil operasi API untuk mencantumkan objek OSS.
Membangun dataset dengan menggunakan prefiks OSS_URI
Kode contoh berikut menunjukkan cara menggunakan metode from_prefix dari OssMapDataset untuk membangun dataset dengan menentukan prefiks OSS_URI di OSS:
from osstorchconnector import OssMapDataset
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 OssMapDataset untuk membangun dataset.
map_dataset = OssMapDataset.from_prefix(oss_uri=OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Akses objek dalam dataset yang dibuat secara acak.
item = map_dataset[0]
print(item.key)
content = item.read()
print(item.size)
print(len(content))
# Jelajahi objek dalam dataset.
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
Membangun dataset dengan menggunakan daftar OSS_URI
Kode contoh berikut menunjukkan cara menggunakan metode from_objects dari OssMapDataset untuk membangun dataset dengan menentukan daftar OSS_URI di OSS:
from osstorchconnector import OssMapDataset
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 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"
]
# Gunakan metode from_objects dari OssMapDataset untuk membangun dataset.
map_dataset = OssMapDataset.from_objects(object_uris=uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Akses objek dalam dataset yang dibuat secara acak.
item = map_dataset[1]
print(item.key)
print(item.size)
content = item.read()
print(len(content))
# Jelajahi objek dalam dataset.
for item in map_dataset:
print(item.key)
print(item.size)
content = item.read()
print(len(content))
Membangun dataset dengan 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 dengan merujuk pada contoh berikut:Contoh file manifest yang memiliki 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 memiliki 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 label3Bangun dataset dengan menggunakan file manifest.
Kode contoh berikut menunjukkan cara menggunakan metode from_manifest_file dari OssMapDataset untuk membangun dataset dengan menentukan file manifest:
import io from typing import Iterable,Tuple,Union from osstorchconnector import OssMapDataset 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 OssMapDataset 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 = 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) 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 membangun dataset dengan menentukan file manifest 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)
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 konektor OSS. Nilai default: |
oss_uri | string | Ya |
Jalur sumber daya OSS, yang digunakan untuk membangun dataset dengan 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 yang 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 Anda tidak menentukan metode saat membangun dataset, metode default digunakan.
Metode default
Kode contoh 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 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"
CONFIG_PATH = "/etc/oss-connector/config.test.json"
CRED_PATH = "/root/.alibabacloud/credentials"
OSS_URI = "oss://ai-testset/EnglistImg/Img/BadImag/Bmp/Sample001/"
# Tentukan operasi transform pada 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])
])
# 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 membangun dataset.
iterable_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH)
manifest_parser
Gunakan metode manifest_parser bawaan. Kode contoh 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 data loader melalui dataset dengan menggunakan PyTorch
Kode contoh berikut menunjukkan cara membuat data loader dengan menggunakan PyTorch berdasarkan dataset yang dibangun dengan OssMapDataset sebagai sumber data:
import torch
from osstorchconnector import OssMapDataset
ENDPOINT = "http://oss-cn-beijing-internal.aliyuncs.com"
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
# Gunakan metode from_prefix dari OssMapDataset untuk membangun dataset.
map_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform,cred_path=CRED_PATH, config_path=CONFIG_PATH)
# Buat data loader dengan menggunakan 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 melakukan pekerjaan pelatihan data dalam lingkungan berbasis kontainer, OSS Connector for AI/ML juga cocok untuk lingkungan tersebut. Untuk informasi lebih lanjut, lihat Bangun citra Docker yang berisi lingkungan OSS Connector for AI/ML.