PyTorch上也有Keras了,訓練模型告別Debug,只需專注數據和邏輯

2020-12-04 量子位

魚羊 發自 凹非寺

量子位 報導 | 公眾號 QbitAI

在開始一個新的機器學習項目時,難免要重新編寫訓練循環,加載模型,分布式訓練……然後在Debug的深淵裡看著時間譁譁流逝,而自己離項目核心還有十萬八千裡。

雖然這世上已經有了神器Keras,能用幾條語句就輕鬆組建一個神經網絡,但一想到它是站在Tensorflow的肩膀上,就讓人不禁想起江湖中的那句傳說:

PyTorch 真香!

那麼為什麼不做一個PyTorch上的Keras呢?

來自Facebook的Willian Falcon小哥決定一試,他搞了個包裝器,把PyTorch中的各種通用配置全部包裝在一起。

這個PyTorch輕量級包裝器,就是PyTorch Lightning

有了這樣一個快速研究框架,使用者只需關注核心訓練和驗證邏輯,繁瑣的工程細節通通自動化一鍵完成,既能保證核心訓練邏輯的正確性,又能保證最佳的實踐體驗。

像閃電一樣迅疾

所以,Lightning到底有多好用?

在這張圖中,灰色部分代表Lightning能自動完成的部分,而藍色的部分則能夠根據使用者的需求,被定義成任意底層模型,可以是你自己的新模型,也可以是預訓練模型,fast.ai架構等等。

舉幾個例子好了。

比如說,梯度下降

原來,你需要這樣:

在Lightning裡,這一整段代碼不需要你自己敲了,只需輸入以下兩行代碼:

不僅如此,在Lightning裡,想用上單個GPU,直接調用即可:

使用能將內存佔用減少一半的黑科技16位精度,不費吹灰之力:

使用多個GPU進行分布式訓練,so easy:

甚至是在1024個節點上以1024個GPU進行訓練,也是開箱即用:

自動化功能還遠不止這一些,以下模塊,均包含其中:

想要訓練閃電那麼快的神經網絡嗎?Lightning簡直為此量身定做。

此外,Lightning還和Tensorboard集成在了一起,可以輕鬆實現可視化學習。

只需記錄實驗路徑:

然後在該路徑運行tensorboard即可:

食用方法

想要使用Lightning,需要完成兩件事。

1、定義Lightning Model

這一步會花費掉比較長的時間。

Lightning Model是nn.Module的嚴格超類,它提供了與模型進行交互的標準界面。

啟用Lightning Model最簡單的方法是根據下面這個最小示例(minimal example)進行局部修改:

import os

import torch

from torch.nn import functional as F

from torch.utils.data import DataLoader

from torchvision.datasets import MNIST

import torchvision.transforms as transforms

import pytorch_lightning as ptl

class CoolModel(ptl.LightningModule):

def__init__(self):

super(CoolModel, self).__init__()

#not the best model...

self.l1 = torch.nn.Linear(28 * 28, 10)

defforward(self, x):

return torch.relu(self.l1(x.view(x.size(0),-1)))

defmy_loss(self, y_hat, y):

return F.cross_entropy(y_hat, y)

deftraining_step(self, batch, batch_nb):

x, y= batch

y_hat = self.forward(x)

return {'loss': self.my_loss(y_hat, y)}

defvalidation_step(self, batch, batch_nb):

x, y= batch

y_hat = self.forward(x)

return {'val_loss': self.my_loss(y_hat, y)}

defvalidation_end(self, outputs):

avg_loss = torch.stack([x['val_loss'] for x inoutputs]).mean()

return {'avg_val_loss': avg_loss}

defconfigure_optimizers(self):

return [torch.optim.Adam(self.parameters(),lr=0.02)]

@ptl.data_loader

deftng_dataloader(self):

return DataLoader(MNIST(os.getcwd(),train=True,download=True,transform=transforms.ToTensor()), batch_size=32)

@ptl.data_loader

defval_dataloader(self):

return DataLoader(MNIST(os.getcwd(),train=True,download=True,transform=transforms.ToTensor()), batch_size=32)

@ptl.data_loader

deftest_dataloader(self):

return DataLoader(MNIST(os.getcwd(),train=True,download=True,transform=transforms.ToTensor()), batch_size=32)

2、擬合訓練器

訓練器能處理Lightning自動化部分的代碼核心邏輯,它會在訓練過程中提取出最佳實踐。

基本的用法是像這樣:

只要確保它的正確執行,只需一個Trainer,計算集群(SLURM),Debug,分布式訓練就通通不在話下了。

One More Thing

你可能會問,為什麼要搞一個Lightning呢,用fast.ai不好嗎?

作者小哥表示,Lightning和fast.ai之間就沒什麼好比的,fast.ai面向有志於進入深度學習領域的新手,而Lightning面向的是ML領域中活躍的研究人員們。

就算真的要比,Lightning可是開箱即用的,不僅如此,在高性能計算、調試工具和可用性方面,小哥都對Lightning充滿信心。他自信地甩出了三張對比表格:

嗯,PyTorch真香!

傳送門

GitHub地址:

https://github.com/williamFalcon/pytorch-lightning

教學博客:

https://towardsdatascience.com/supercharge-your-ai-research-with-pytorch-lightning-337948a99eec

— 完 —

相關焦點

  • Keras vs PyTorch:誰是第一深度學習框架?
    兩大框架的連結:  Keras:https://github.com/keras-team/keras (https://keras.io/)  PyTorch:https://github.com/pytorch/pytorch  你想學習深度學習嗎?
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    keras是google的一個大佬開發的一個高度封裝的模型框架,已開源到github上。起初的計算後臺為Theano(和tensorflow差不多的一個框架),後來經過一系列的劇情,現在默認的計算後臺就為tensorflow了。
  • Keras vs PyTorch,哪一個更適合做深度學習?
    Keras 還做了一點圖像預處理,使數據適用於模型。以上代碼展示了模型。在 Keras(TensorFlow)上,我們首先需要定義要使用的東西,然後立刻運行。在 Keras 中,我們無法隨時隨地進行試驗,不過 PyTorch 可以。以上的代碼用於訓練和評估模型。
  • 基於PyTorch的「Keras」:除了核心邏輯通通都封裝
    例如在 PyTorch 1.0 中,編譯工具 torch.jit 就包含一種名為 Torch Script 的語言,它是 Python 的子語言,開發者使用它能進一步對模型進行優化。用 PyTorch 寫模型,除了數據加載和模型定義部分外,整個訓練和驗證的邏輯、配置都需要我們手動完成,這些步驟都較為繁瑣。甚至可以說,研究者需要耗費相當多的精力處理這一部分的代碼,還要祈禱不出 Bug。
  • PyTorch實現TPU版本CNN模型
    隨著深度學習模型在各種應用中的成功實施,現在是時候獲得不僅準確而且速度更快的結果。為了得到更準確的結果,數據的大小是非常重要的,但是當這個大小影響到機器學習模型的訓練時間時,這一直是一個值得關注的問題。為了克服訓練時間的問題,我們使用TPU運行時環境來加速訓練。為此,PyTorch一直在通過提供最先進的硬體加速器來支持機器學習的實現。
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    然後,我們將使用MNIST手寫數字分類數據集,並在PyTorch和TensorFlow中使用CNN(卷積神經網絡)建立圖像分類模型。這將是你的起點,然後你可以選擇自己喜歡的任何框架,也可以開始構建其他計算機視覺模型。
  • 二分類、多分類、回歸任務,一個項目get競賽必備模型
    機器之心報導機器之心編輯部數據挖掘類比賽必備模型,四種實現方法,你值得擁有。數據科學競賽是學習各類算法、深入理解數據科學、提升和挑戰自己的絕佳機會,而這些競賽中有一些常用的模型。近日,有開發者在 GitHub 上開源了一個包含數據挖掘類比賽常用模型的項目,主要涵蓋二分類、多分類以及回歸任務。項目代碼全部使用 Python 實現。
  • 迎來PyTorch,告別 Theano,2017 深度學習框架發展大盤點
    目前的開發現狀如下:大體上,每個框架都會針對某個特定屬性進行優化,比如訓練速度、對網絡架構的支持、能在行動裝置上推理等等。在大多數情況下,研發階段最需要的屬性和產品階段是不一樣的。而在任意一個框架上訓練的神經網絡模型,無法直接在另一個框架上用。開發者需要耗費大量時間精力把模型從一個開發平臺移植到另一個。這導致效率的降低以及進度延遲。
  • Keras結合Keras後端搭建個性化神經網絡模型(不用原生Tensorflow)
    它幫我們實現了一系列經典的神經網絡層(全連接層、卷積層、循環層等),以及簡潔的迭代模型的接口,讓我們能在模型層面寫代碼,從而不用仔細考慮模型各層張量之間的數據流動。但是,當我們有了全新的想法,想要個性化模型層的實現,Keras的高級API是不能滿足這一要求的,而換成Tensorflow又要重新寫很多輪子,這時,Keras的後端就派上用場了。
  • PyTorch中使用DistributedDataParallel進行多GPU分布式模型訓練
    我們會:討論一般的分布式訓練方式,尤其是數據並行化涵蓋torch.dist和DistributedDataParallel的相關功能,並舉例說明如何使用它們測試真實的訓練腳本,以節省時間什麼是分布式訓練?在研究分布式和數據並行之前,我們需要先了解一些關於分布式訓練的背景知識。目前普遍使用的分布式訓練基本上有兩種不同形式:數據並行化和模型並行化。
  • 評測| CNTK在Keras上表現如何?能實現比TensorFlow更好的深度學習嗎?
    Docker 容器可以使用 nvidia-docker 進行加載,這可以讓 Docker 容器訪問主機上的 GPU。在容器中運行深度學習腳本只需運行 Docker 命令行。當腳本運行完後,會自動退出容器。這種方法恰巧保證了每次執行是獨立的;這為基準評估/重複執行提供了理想的環境。
  • 從R-CNN到YOLO,一文帶你了解目標檢測模型(附論文下載)
    它和R-CNN的區別是,輸入不需要放縮到指定大小,同時增加了一個空間金字塔池化層,每幅圖片只需要提取一次特徵。加載訓練好的權值,用tensorflow再次訓練,再將導出計算圖到C++環境中。https://github.com/thtrieu/darkflow使用你自己的數據訓練YOLO模型。利用分類標籤和自定義的數據進行訓練,darknet支持Linux / Windows系統。
  • Keras入門系列教程:兩分鐘構建你的第一個神經網絡模型
    創建新圖層,損失函數並開發最先進的模型。導入tf.kerastf.keras是TensorFlow實現的 Keras API規範。這是一個用於構建和訓練模型的高級API,其中包括對TensorFlow特定功能的一流支持,例如急切執行, tf.data pipeline和estimators。
  • Keras和TensorFlow究竟哪個會更好?
    我會使用基於 TensorFlow 的標準 keras 模塊和 tf.keras 模塊,來實現一個卷積神經網絡(CNN)。然後,基於一個示例數據集,來訓練這些 CNN,然後檢查所得結果,你會發現,Keras 和 TensorFlow 是可以和諧共處的。
  • 用PyTorch重新創建Keras API
    老實說,在Keras的模型訓練中,我很興奮這個進度條,真是太棒了。那麼,為什麼不嘗試把Keras訓練模型的經驗帶到PyTorch呢?這個問題讓我開始了工作,最後我用所有那些花哨的進度條重現了Keras的Dense層、卷積層和平坦層。模型可以通過堆疊一層到另一層來創建,並通過簡單地調用fit方法進行訓練,該方法類似於Keras的工作方式。
  • 手把手教程:如何從零開始訓練 TF 模型並在安卓系統上運行
    ,將 tf.Keras 模型轉換為 tflite 格式,並在 Android 上運行該模型。1.訓練自定義分類器加載數據我們將使用作為tf.keras框架一部分的mnst數據。2.模型保存和轉換訓練結束後,我們將保存一個 Keras 模型並將其轉換為 TFLite 格式。
  • 兩個提高深度學習訓練效率的絕技
    提高GPU利用率:CPU vs GPUGPU利用率低, 主要原因是CPU處理的效率跟不上GPU2.1 CPU vs GPU的通信 CPU負責加載數據+數據預處理,並不斷的在內存和顯存之間交互數據  GPU負責模型訓練(圖片來自網絡)
  • Keras官方中文版文檔正式發布了
    model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))現在,你可以批量地在訓練數據上進行迭代了
  • Keras 之父講解 Keras:幾行代碼就能在分布式環境訓練模型 |...
    該例子中,我用 Keras API 定義模型,用 TensorFlow estimator 和 experiments 在分布式環境訓練模型。示例: 視頻內容問答這是一個視頻問答問題。我們有一組 10 秒短視頻組成的數據集,視頻內容是人從事各種活動。一個深度學習模型將會觀察這些視頻的每一幀畫面,進行理解,然後你可以用簡短的自然語言問它視頻內容。
  • 初學者怎樣使用Keras進行遷移學習
    模型的構建是一個三步過程: 導入預先訓練的模型並添加密集層。 將數據加載到ImageDataGenerators中。 訓練和評估模型。 假設你想訓練一個犬種分類器來識別120種不同的犬種,我們最後一層只需要120個神經元。使用以下代碼完成。 這是這個過程的第一步。導入和構建所需的模型。 要檢查模型的體系結構,我們只需要使用下面給出的這行代碼。