利用Python線程池充分發揮華為云DLS的性能
華為云DLS的配置真的好,根本不是普通開發服務器相比
然而,每張圖片都要先從OBS通過網絡讀到DLS,再用opencv做預處理,特別是網絡那里極之耗時。
干脆利用Python線程池充分發揮華為云的性能,話不多說,直接上碼
import?multiprocessing def?imgProc(imagePath): ????image?=?cv2.imdecode(np.fromstring(mox.file.read(imagePath,?binary=True),?np.uint8),?cv2.IMREAD_COLOR) ????...中間一堆預處理... ????npimage?=?img_to_array(image) ????return?npimage ??? pool=multiprocessing.Pool(64)????#開64個線程 m=multiprocessing.Manager() data=[] labels=[] asyncdata=[] for?imagePath?in?files: ????#耗時的才用多線程 ????npimage?=?pool.apply_async(imgProc,?args=(imagePath,)) ????asyncdata.append(npimage)?#注意:這里不能用get獲取結果,否則變成單線程 ????#不耗時就普通吧 ????label?=?imagePath.split(os.path.sep)[-2] ????labels.append(label) pool.close() pool.join() print("asyncdata?len:"+str(len(asyncdata))) #全部做完再取結果 for?d?in?asyncdata: ????data.append(d.get())
特別要注意get的時機,要等全部做完再get。否則如果在asyncdata.append(npimage)這里get的話,會變成單線程。
效果對比:
從3:52直接降成2:10
當然還是與本地沒得比(畢竟是網絡IO與磁盤IO是有區別)
(華為云5186張圖讀取和處理居然比3636張要快,那很明顯瓶頸是在網絡IO,而不是opencv預處理上)
所以,遇到圖片特別多的話,還是先在本地預處理好,盡量做成一個csv,來避免數萬次的網絡IO帶來的延時
(封面圖來自https://en.wikipedia.org/wiki/Multithreading_(computer_architecture))
python 深度學習服務 DLS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。