日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用OSS中的數據構建適用于隨機讀取的Map型Dataset

OssMapDataset類型的Dataset適用于內存充足、數據量不大需要頻繁進行隨機訪問和并行處理的場景,本文為您介紹如何通過OssMapDataset構建Dataset。

前提條件

已安裝并配置OSS Connector for AI/ML。具體操作,請參見安裝OSS Connector for AI/ML配置OSS Connector for AI/ML

構建Dataset

構建方式

在使用OssMapDataset構建Dataset時,有三種構建方式:

  • OSS_URI前綴:適用于OSS存儲路徑具有統一規律的場景。

  • OSS_URI的列表:適用于OSS存儲路徑位置明確但分散的場景。

  • 清單文件:可以減少OSS list object開銷,適用于數據集文件數量大(如千萬級)且有重復加載數據集需求,以及已開通數據索引OSS功能的Bucket。

通過OSS_URI前綴構建Dataset

以下示例用于使用OssMapDatasetfrom_prefix方法從OSS中指定的前綴(OSS_URI)構建Dataset。

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/"

# 使用OssMapDataset的from_frefix方法構建Dataset
map_dataset = OssMapDataset.from_prefix(oss_uri=OSS_URI, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)

# 隨機訪問已創建Dataset中的對象
item = map_dataset[0]
print(item.key)
content = item.read()
print(item.size)
print(len(content))

# 遍歷Dataset中對象
for item in map_dataset:
    print(item.key)
    print(item.size)
    content = item.read()
    print(len(content))

通過OSS_URI列表構建Dataset

以下示例用于使用OssMapDatasetfrom_objects方法從指定的OSS_URI列表構建Dataset。

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是一個包含多個OSS_URI的字符串迭代器。
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"
]

# 使用OssMapDataset的from_objects方法構建Dataset
map_dataset = OssMapDataset.from_objects(object_uris=uris, endpoint=ENDPOINT, cred_path=CRED_PATH, config_path=CONFIG_PATH)

# 隨機訪問已創建Dataset中的對象
item = map_dataset[1]
print(item.key)
print(item.size)
content = item.read()
print(len(content))

# 遍歷Dataset中對象
for item in map_dataset:
    print(item.key)
    print(item.size)
    content = item.read()
    print(len(content))

通過清單文件構建Dataset

使用清單文件構建Dataset前,您需要創建清單文件,然后通過manifest file構建Dataset。

  1. 創建清單文件:

    在任意位置執行touch manifest_file命令創建manifest file,然后根據示例填寫manifest file。

    帶有oss對象名稱的manifest file示例:

    Img/BadImag/Bmp/Sample001/img001-00001.png
    Img/BadImag/Bmp/Sample001/img001-00002.png
    Img/BadImag/Bmp/Sample001/img001-00003.png

    帶有oss對象名稱和labelmanifest file示例:

    Img/BadImag/Bmp/Sample001/img001-00001.png label1
    Img/BadImag/Bmp/Sample001/img001-00002.png label2
    Img/BadImag/Bmp/Sample001/img001-00003.png label3
  2. 通過清單文件構建Dataset。

    以下示例用于使用OssMapDatasetfrom_manifest_file方法從指定的manifest file文件構建Dataset。

    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"
    
    # 使用 OssMapDataset 的 from_manifest_file 方法通過本地的文件構建 Dataset
    # manifest_file_path 參數指定了清單文件本地路徑
    # manifest_parser 參數為解析清單文件的方法,示例中使用了內置的解析方法 imagenet_manifest_parser
    # oss_base_uri 參數指定了BASE_OSS_URI,用于與從 manifest中解析的URI拼接成 FULL_OSS_URI,FULL_OSS_URI = BASE_OSS_URI + 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))
    
    # 使用OssMapDatasetfrom_manifest_file方法通過OSS Bucket內的manifest_file文件構建Dataset
    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)

OSS Connector for AI/ML中的數據類型

Dataset中對象的數據類型實現了常用的IO接口。更多信息,請參見OSS Connector for AI/ML中的數據類型。

構建參數說明

使用OssMapDatasetOssIterableDataset構建Dataset時需要進行相應配置,具體配置項說明請參見下表。

參數名

參數類型

是否必選

說明

endpoint

string

公共參數:

OSS對外服務的訪問域名。更多信息,請參見訪問域名和數據中心

transform

object

公共參數:

轉換函數,用于將DataObject(oss object)轉換成任意類型。可以根據需求自定義其方法,具體請參見transform。

重要

請勿在transform中直接返回DataObject對象,可能導致迭代器無法工作。如果要返回對象,需要調用copy方法。

cred_path

string

公共參數:

鑒權文件默認路徑為/root/.alibabacloud/credentials。更多信息,請參見配置訪問憑證。

config_path

string

公共參數:

OSS Connector配置文件默認路徑為/etc/oss-connector/config.json。更多信息,請參見配置OSS Connector。

oss_uri

string

from_prefix方法參數:

OSS資源路徑,用于通過OSS_URI前綴構建Dataset。僅支持以oss:// 開頭的OSS_URI。

object_uris

string

from_objects方法參數:

OSS資源路徑列表,通過列表中的路徑構建Dataset。僅支持以oss:// 開頭的OSS_URI。

manifest_file_path

string

from_manifest_file方法參數:

清單文件的路徑,支持本地文件路徑或以oss://開頭的OSS_URI。

manifest_parser

Callable Object

from_manifest_file方法參數:

解析清單文件的內置方法,接收已打開的清單文件作為輸入,返回一個迭代器,每個元素為(oss_uri,label)的元組。具體請參見manifest_parser。您也可以根據不同數據集的manifest file格式自定義manifest_parser方法。

oss_base_uri

string

from_manifest_file方法參數:

OSS基礎URI,用于拼接清單文件中可能不完整的OSS_URI,形成完整的OS_URI。如果沒有oss_base_uri,需要填寫為""

內置方法

transform

說明

構建Dataset時,Dataset會返回transform(DataObject) 的迭代器。其中DataObjectOSS Connector for AI/ML中的數據類型。

transform支持自定義其方法,在構建dataset時如果不指定transform,則會使用默認的transform方法。

默認transform方法

以下示例為默認transfrom方法,在構建Dataset時無需指定。

#默認transform函數
def identity(obj: DataObject) -> DataObject:
    if obj is not None:
        return obj.copy()
    else:
        return None

自定義transform方法

以下示例用于構建Dataset時使用自定義transform方法。

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/"

# 定義圖像數據的轉換操作
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])
])

# 創建transform方法對輸入的對象進行處理
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

# 在構建dataset時使用transform=transform參數
iterable_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform, cred_path=CRED_PATH, config_path=CONFIG_PATH)
 

manifest_parser

默認manifest_parser方法,在構建Dataset時需導入示例如下。

from osstorchconnector import imagenet_manifest_parser

以下示例為默認manifest_parser方法。

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}")

使用PyTorch通過Dataset創建數據加載器

以下示例展示了如何根據OssMapDataset構建的Dataset作為數據源來創建PyTorch數據加載器。

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

# 使用OssMapDataset的from_frefix方法構建Dataset
map_dataset = OssMapDataset.from_prefix(OSS_URI, endpoint=ENDPOINT, transform=transform,cred_path=CRED_PATH, config_path=CONFIG_PATH)

# 基于map_dataset創建PyTorch數據加載器
loader = torch.utils.data.DataLoader(map_dataset, batch_size=256, num_workers=32, prefetch_factor=2, shuffle=True)
# 在訓練循環中使用數據
# for batch in loader:
     # 進行訓練操作
   ...

相關文檔

如果您是在容器化環境中進行數據訓練任務,那么OSS Connector for AI/ML同樣適用于容器化環境。具體操作,請參見構建含有OSS Connector for AI/ML環境的Docker鏡像。