在進行大規模機器學習或深度學習專案時,資料的高效載入與處理是提升整體訓練效率的關鍵因素之一。本文通過對比分析在使用OSS內網網域名稱與啟用OSS加速器的情況下,不同資料集構建方法(OssIterableDataset、OssMapDataset、結合Ossfs和ImageFolder)的效能差異,旨在為使用者提供資料存取原則的最佳化指南。
測試說明
測試情境:通過在使用OSS內網網域名稱以及使用OSS加速器網域名稱這兩種情境下,針對以不同方式構建的資料集讀取OSS資料的情況進行了效能以及效能上限測試。
測試資料:10,000,000張圖片,平均每張100 KB,總量約1 TB。
測試環境:網路增強通用型執行個體規格類型系列g7nex,128 VCPU,512G記憶體,160 Gbps內網頻寬。
測試資料集構建方式:OssIterableDataset與OssMapDataset類型的資料集由OSS Connector for AI/ML構建;Ossfs with ImageFolder類型的資料集則使用ossfs掛載遠程Bucket的方式構建。
效能測試
測試參數
參數
值/操作
說明
dataloader batch size
256
每次處理的資料批次大小為256個樣本。
dataloader workers
32
使用32個背景工作處理序來並行載入資料。
transform
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]) ]) def transform(object): img = Image.open(io.BytesIO(object.read())).convert('RGB') val = trans(img) return val, object.label
對資料進行了預先處理。
測試結果
資料集構建方式
資料集類型
使用OSS內網網域名稱
啟用OSS加速器預載資料,並使用加速網域名稱訪問
OSS Connector for AI/ML方式構建
OssIterableDataset
4582 img/s
4744 img/s
OssMapDataset
4010 img/s
4370 img/s
ossfs掛載遠程Bucket方式構建
Ossfs with ImageFolder
56 img/s
251 img/s
效能上限測試
測試參數
參數
值/操作
說明
dataloader batch size
256
每次處理的資料批次大小為256個樣本。
dataloader workers
32
使用32 個背景工作處理序來並行載入資料。
transform
def transform(object): data = object.read() return object.key, object.label
未對資料進行預先處理。
測試結果
資料集構建方式
資料集類型
使用OSS內網網域名稱
啟用OSS加速器預載資料,並使用加速網域名稱訪問
OSS Connector for AI/ML方式構建
OssIterableDataset
99920 img/s
123043 img/s
OssMapDataset
56564 img/s
78264 img/s
資料分析
從效能測試結果資料能夠看到,使用OSS Connector構建的IterableDataset和MapDataset這兩種類型的資料集效能,大約是傳統資料集Ossfs with ImageFolder的80倍。即便在都啟用OSS加速器的情況下,也相差約18倍。通過這樣的對比,可以明顯看出,使用OSS Connector能夠極大地提高資料處理速度,提升模型訓練效率。
從效能上限測試結果資料來看,啟用OSS加速器之後的效能,大約是不啟用OSS加速器的1.6倍左右。OSS Connector在不使用OSS加速器的情況下,能夠輕鬆應對各種高並發、高頻寬訪問。而配合使用OSS加速器後,其效能則更為強大。
測試總結
在 Python代碼中設定OSS Connector for AI/ML,就能輕鬆實現對OSS對象的流式訪問。通常情況下,使用OSS Connector可以極大地提升我們在巨量資料量訓練情境中的資料訪問效率。倘若對效能有更高的要求,則可以採用OSS加速器與OSS Connector for AI/ML相結合的方式來進行資料訓練。