extjs 表格数据重新加载_一个简单的更改让PyTorch读取表格数据的速度提高20倍:可大大加快深度学习训练的速度...
來(lái)源:DeepHub IMBA
本文約3000字,建議閱讀5分鐘我在PyTorch中對(duì)表格的數(shù)據(jù)加載器進(jìn)行的簡(jiǎn)單更改如何將訓(xùn)練速度提高了20倍以上,而循環(huán)沒(méi)有任何變化!深度學(xué)習(xí):需要速度
在訓(xùn)練深度學(xué)習(xí)模型時(shí),性能至關(guān)重要。數(shù)據(jù)集可能非常龐大,而低效的訓(xùn)練方法意味著迭代速度變慢,超參數(shù)優(yōu)化的時(shí)間更少,部署周期更長(zhǎng)以及計(jì)算成本更高。由于有許多潛在的問(wèn)題要探索,很難證明花太多時(shí)間來(lái)進(jìn)行加速工作是合理的。但是幸運(yùn)的是,有一些簡(jiǎn)單的加速方法!我將向您展示我在PyTorch中對(duì)表格的數(shù)據(jù)加載器進(jìn)行的簡(jiǎn)單更改如何將訓(xùn)練速度提高了20倍以上,而循環(huán)沒(méi)有任何變化!這只是PyTorch標(biāo)準(zhǔn)數(shù)據(jù)加載器的簡(jiǎn)單替代品。對(duì)于我正在訓(xùn)練的模型,可以16分鐘的迭代時(shí)間,減少到40秒!所有這些都無(wú)需安裝任何新軟件包,不用進(jìn)行任何底層代碼或任何超參數(shù)的更改。研究/產(chǎn)業(yè)裂痕
在監(jiān)督學(xué)習(xí)中,對(duì)Arxiv-Sanity的快速瀏覽告訴我們,當(dāng)前最熱門(mén)的研究論文都是關(guān)于圖像(無(wú)論是分類(lèi)還是生成GAN)或文本(主要是BERT的變體)。深度學(xué)習(xí)在傳統(tǒng)機(jī)器學(xué)習(xí)效果不好的這些領(lǐng)域非常有用,但是這需要專(zhuān)業(yè)知識(shí)和大量研究預(yù)算才能很好地執(zhí)行。許多公司擁有的許多數(shù)據(jù)已經(jīng)以很好的表格格式保存在數(shù)據(jù)庫(kù)中。一些數(shù)據(jù)包括用于終生價(jià)值估算的客戶(hù)詳細(xì)信息,優(yōu)化和財(cái)務(wù)的時(shí)間序列數(shù)據(jù)。表格數(shù)據(jù)有何特別之處?
那么,為什么研究與產(chǎn)業(yè)之間的裂痕對(duì)我們來(lái)說(shuō)是一個(gè)問(wèn)題呢?好吧,最新的文本/視覺(jué)研究人員的需求與那些在表格數(shù)據(jù)集上進(jìn)行監(jiān)督學(xué)習(xí)的人的需求截然不同。以表格形式顯示數(shù)據(jù)(即數(shù)據(jù)庫(kù)表,Pandas DataFrame,NumPy Array或PyTorch Tensor)可以通過(guò)以下幾種方式簡(jiǎn)化操作:可以通過(guò)切片從連續(xù)的內(nèi)存塊中獲取訓(xùn)練批次。
無(wú)需按樣本進(jìn)行預(yù)處理,從而使我們能夠充分利用大批量培訓(xùn)來(lái)提高速度(請(qǐng)記住要提高學(xué)習(xí)率,所以我們不會(huì)過(guò)擬合!)
如果您的數(shù)據(jù)集足夠小,則可以一次將其全部加載到GPU上。(雖然在技術(shù)上也可以使用文本/視覺(jué)數(shù)據(jù),但數(shù)據(jù)集往往更大,并且某些預(yù)處理步驟更容易在CPU上完成)。
pytorch和Dataloader
如我們所見(jiàn),加載表格數(shù)據(jù)非常容易,快捷!因此,默認(rèn)情況下,PyTorch當(dāng)然可以很好地處理表格數(shù)據(jù)…對(duì)嗎?事實(shí)證明并非如此!?就在上周,我正在訓(xùn)練一些表格數(shù)據(jù)上的PyTorch模型,并想知道它為什么花了這么長(zhǎng)時(shí)間來(lái)訓(xùn)練。我看不到任何明顯的瓶頸,但是由于某些原因,GPU使用率比預(yù)期的要低得多。當(dāng)我進(jìn)行一些分析時(shí),我發(fā)現(xiàn)了罪魁禍?zhǔn)住璂ataLoader。什么是DataLoader?DataLoader完全按照您的想象做:將數(shù)據(jù)從任何位置(在磁盤(pán),云,內(nèi)存中)加載到模型使用它所需的任何位置(RAM或GPU內(nèi)存)中。除此之外,他們還負(fù)責(zé)將您的數(shù)據(jù)分為幾批,重新整理,并在必要時(shí)對(duì)單個(gè)樣本進(jìn)行預(yù)處理。將此代碼包裝在DataLoader中比散布在整個(gè)代碼中更好,因?yàn)樗梢允鼓闹饕?xùn)練代碼保持整潔。官方的PyTorch教程還建議使用DataLoader。您如何使用它們?這取決于您擁有的數(shù)據(jù)類(lèi)型。對(duì)于表格數(shù)據(jù),PyTorch的默認(rèn)DataLoader可以使用TensorDataset。這是圍繞訓(xùn)練所需的張量的輕量級(jí)包裝,通常是X(或特征)和Y(或標(biāo)簽)張量。 data_set = TensorDataset(train_x, train_y) train_batches = DataLoader(data_set, batch_size=1024, shuffle=False)然后,您可以在訓(xùn)練循環(huán)中使用它:
for x_batch, y_batch in train_batches: optimizer.zero_grad() loss = loss_fn(model(x_batch), y_batch) loss.backward() optimizer.step() ...為什么這樣不好?這看起來(lái)不錯(cuò),當(dāng)然也很干凈!問(wèn)題在于,每次加載批處理時(shí),PyTorch的DataLoader會(huì)在每個(gè)示例中調(diào)用一次DataSet上的__getitem __()函數(shù)并將其連接起來(lái),而不是一次大批量地讀取批處理!因此,我們最終不會(huì)利用表格數(shù)據(jù)集的優(yōu)勢(shì)。當(dāng)我們使用大批量時(shí),這尤其糟糕。我們?cè)撊绾谓鉀Q?用下面的兩行替換上面的前兩行,然后從該文件復(fù)制FastTensorDataLoader的定義(有關(guān)此項(xiàng),請(qǐng)?jiān)赑yTorch論壇上獲得Jesse Mu的支持): train_batches = FastTensorDataLoader(train_x, train_y, batch_size=1024,shuffle=False)FastTensorDataLoader只是一個(gè)小的自定義類(lèi),除了PyTorch之外沒(méi)有任何依賴(lài)關(guān)系-使用它不需要對(duì)您的訓(xùn)練代碼進(jìn)行任何更改!它也支持改組,盡管下面的基準(zhǔn)測(cè)試適用于未改組的數(shù)據(jù)。這有什么區(qū)別?在我使用的基準(zhǔn)測(cè)試集上,自定義表格格式DataLoader的運(yùn)行速度快了20倍以上。在這種情況下,這意味著用40秒鐘的時(shí)間運(yùn)行之前超過(guò)15分鐘的程序-迭代速度上的巨大差異!兩次接近相同的運(yùn)行-除了一次需要15分鐘以上,而另一次不到一分鐘!
該基準(zhǔn)是在本《自然》論文中使用的希格斯數(shù)據(jù)集上運(yùn)行的。與11m個(gè)示例相比,它為大多數(shù)公共表格建立ML數(shù)據(jù)集(可能很小!)提供了更現(xiàn)實(shí)的深度學(xué)習(xí)基準(zhǔn)。這是一個(gè)二進(jìn)制分類(lèi)問(wèn)題,具有21個(gè)實(shí)值特征。很高興看到,在進(jìn)行任何超參數(shù)優(yōu)化之前,我們只需訓(xùn)練40秒鐘就能在測(cè)試裝置上獲得超過(guò)0.77的ROC AUC!盡管我們離本文所達(dá)到的0.88尚有一段距離。希望對(duì)您有所幫助,并且您可以在自己的訓(xùn)練代碼中看到類(lèi)似的速度提升!實(shí)施此方法后,我發(fā)現(xiàn)了一些進(jìn)一步的優(yōu)化措施,從而使總加速接近100倍!如果您想了解更多信息,請(qǐng)發(fā)表評(píng)論,我們可以在后續(xù)文章中介紹這些內(nèi)容。有關(guān)如何自己運(yùn)行基準(zhǔn)代碼的信息,請(qǐng)參見(jiàn)附錄。該示例包括用于運(yùn)行默認(rèn)PyTorch DataLoader,更快的自定義代碼以及計(jì)時(shí)結(jié)果并記錄到TensorBoard的代碼。這篇帖子的實(shí)現(xiàn)源于Genesis Cloud的計(jì)算功勞:以令人難以置信的成本效率實(shí)現(xiàn)云GPU,并在冰島的數(shù)據(jù)中心中使用100%可再生能源。注冊(cè)時(shí)可獲得$ 50的免費(fèi)贈(zèng)送金額,使用GTX 1080Ti可獲得160多個(gè)小時(shí)!附錄:運(yùn)行基準(zhǔn)測(cè)試
您可以自己查看結(jié)果,以下是復(fù)制實(shí)驗(yàn)的說(shuō)明。如果您已經(jīng)安裝了本地GPU和PyTorch,則可以跳過(guò)前兩個(gè)步驟!使用您最喜歡的GPU云提供商創(chuàng)建一個(gè)新的Ubuntu 18.04實(shí)例(我使用Genesis cloud-注冊(cè)后可獲得$ 50的免費(fèi)積分,足以運(yùn)行此實(shí)驗(yàn)數(shù)百次!)。
使用Lambda Stack一口氣安裝CUDA和PyTorch :(這樣做后請(qǐng)不要忘記重啟!)
下載數(shù)據(jù)集
克隆存儲(chǔ)庫(kù)
運(yùn)行基準(zhǔn)腳本
總結(jié)
以上是生活随笔為你收集整理的extjs 表格数据重新加载_一个简单的更改让PyTorch读取表格数据的速度提高20倍:可大大加快深度学习训练的速度...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实现电影级特效,苹果新专利可将人脸表情实
- 下一篇: 【超分辨率实验】Matlab-使用深度学