PyTorch Lightning 1.0 正式發布!從0到1,有這9大特點

2021-02-21 極市平臺

作者丨PyTorch Lightning team

PyTorch可以構建複雜的AI模型,但一旦研究變得複雜,就很可能會引入錯誤。PyTorch Lightning完全解決了這個問題。本文譯自Pytorch官方團隊,介紹了PyTorch Lightning V1.0.0的九大特點。 >>加入極市CV技術交流群,走在計算機視覺的最前沿

在過去的幾個月裡,我們一直在努力工作,微調 API,改進文檔,錄製教程,現在終於是時候與大家分享 PyTorch Lightning 的 V1.0.0版了。想要雲上縮放模型的極速方案嗎?請繼續閱讀。AI 研究的發展速度遠遠超過任何單一框架所能跟上的速度。深度學習的領域不斷發展,主要是在複雜性和規模。Lightning 提供了一個為複雜模型交互世界設計的用戶體驗,同時抽象出所有令人分心的工程細節,如多 GPU 和多 TPU 訓練,early stopping,日誌等.像 PyTorch 這樣的框架是為 AI 研究主要關注網絡架構的時代而設計的。nn.Module 模塊可以定義操作順序。

這些框架在為研究或生產提供極其複雜的模型所需的所有部件方面做出了令人難以置信的工作。但是一旦模型開始相互作用,比如 GAN,BERT,或者自動編碼器,這種模式就會打破,巨大的靈活性很快就會變成樣板,項目上了規模就很難維護。與之前出現的框架不同,PyTorch Lightning 被設計成封裝一系列相互作用的模型,我們稱之為深度學習系統(deep learning systems)。Lightning 是為當今世界更複雜的研究和生產案例而設計的,在這些案例中,許多模型使用複雜的規則相互作用。

PyTorch Lightning 的第二個關鍵原則是硬體和「科學」代碼必須分開。Lightning 進化到可以利用大規模的計算,而不需要向用戶展示任何抽象概念。通過這種分離,你獲得了以前不可能的新能力,比如在筆記本電腦上使用 CPU 調試你的512 GPU 作業而不需要更改代碼。

最後,Lightning 創建的願景是成為一個社區驅動的框架。構建優秀的深度學習模型需要大量的專業知識和使系統工作的小技巧。在世界各地,數以百計令人難以置信的工程師和博士們一遍又一遍地實現相同的代碼。Lightning 現在有一個不斷增長的貢獻者社區,其中有超過300個極有才華的深度學習人員,他們選擇分配相同的能量,做完全相同的優化,但是卻有成千上萬的人從他們的努力中受益。

Lightning 1.0.0 標誌著一個穩定的最終版 API。這意味著依賴於 Lightning 的主要研究項目可以放心使用,他們的代碼在未來不會中斷或改變。Lightning 的核心優勢是使最先進的 AI 研究可以大規模擴展。這是一個為專業研究人員設計的框架,在最大的計算資源上嘗試最難的想法,而不會失去任何靈活性。我們很興奮地宣布,Lightning 1.0.0 現在還可以輕鬆地大規模部署這些模型。所有的 Lightning 代碼確保了所有的東西都可以輕鬆導出到 onnx 和 torchscript。
autoencoder = LitAutoEncoder()torch.jit.save(autoencoder.to_torchscript(), "model.pt")os.path.isfile("model.pt")
with tempfile.NamedTemporaryFile(suffix='.onnx', delete=False) as tmpfile: autoencoder = LitAutoEncoder() input_sample = torch.randn((1, 28 * 28)) autoencoder.to_onnx(tmpfile.name, input_sample, export_params=True) os.path.isfile(tmpfile.name)

因此,這意味著你的數據科學家、研究人員等團隊現在還可以成為將模型投入生產的人。他們不需要龐大的機器學習工程師團隊。
這是領先的公司使用 Lightning 的一個主要原因: 作為一種幫助他們大大縮短生產時間而不失去任何研究所需的靈活性的方法。這正是我們企業級服務提供的: Grid AI 是我們在雲上進行規模訓練的原生平臺。Grid 允許任何構建深度學習模型的人在大規模計算資源上迭代,然後立即將這些模型部署到一個可伸縮的環境中,能夠處理你扔給深度學習系統的最大流量。

你還會注意到,我們已經整合了所有的博客文章,極速的視頻教程,社區項目和其他資源在我們的全新主頁下,展示所有的東西快如閃電!pytorch_lightning.metrics 是一個為了在 PyTorch 和 PyTorch Lightning 中方便度量開發和使用而創建的度量 API。更新的 API 提供了一種內置方法,可以跨多個 GPU (進程)計算每步的度量,同時存儲統計信息,允許你在一個 epoch 結束時計算度量,而不必擔心與分布式後端相關的任何複雜性。它對所有的邊緣情況都進行了嚴格的測試,並且包含了越來越多的常用度量實現,比如 Accuracy、 Precision、 Recall、 Fbeta、 MeanSquaredError 等等。
class LitModel(pl.LightningModule):    def __init__(self):        ...        self.train_acc = pl.metrics.Accuracy()        self.valid_acc = pl.metrics.Accuracy()
def training_step(self, batch, batch_idx): logits = self(x) ... self.train_acc(logits, y) self.log('train_acc_step', self.train_acc)
def validation_step(self, batch, batch_idx): logits = self(x) ... self.valid_acc(logits, y) self.log('valid_acc', self.valid_acc)

要實現自定義度量,只需子類化基本 Metric 類並實現 __init__()、 update() 和 compute()方法。你所需要做的就是正確調用 add _ state () ,以便使用 DDP 實現自定義度量。使用 add_state()添加的度量狀態變量調用 reset()。
from pytorch_lightning.metrics import Metric
class MyAccuracy(Metric):
def __init__(self, dist_sync_on_step=False): super().__init__(dist_sync_on_step=dist_sync_on_step) self.add_state("correct", default=torch.tensor(0), dist_reduce_fx="sum") self.add_state("total", default=torch.tensor(0), dist_reduce_fx="sum") def update(self, preds: torch.Tensor, target: torch.Tensor): preds, target = self._input_format(preds, target) assert preds.shape == target.shape self.correct += torch.sum(preds == target) self.total += target.numel() def compute(self): return self.correct.float() / self.total

使用 Lightning,你不需要擔心什麼時候啟用/禁用梯度,做一個後向傳播,或者更新優化器,只要你從 training_step 返回一個附加圖(graph),Lightning 將自動優化。
def training_step(self, batch, batch_idx):    loss = self.encoder(batch[0])    return loss

然而,對於某些研究,比如 GAN、強化學習或者有多個優化器或者內部循環的東西,你可以關閉自動優化,自己完全控制訓練循環。
trainer = Trainer(automatic_optimization=False)

from pytorch_lightning.metrics import Metric
class MyAccuracy(Metric):
def __init__(self, dist_sync_on_step=False): super().__init__(dist_sync_on_step=dist_sync_on_step) self.add_state("correct", default=torch.tensor(0), dist_reduce_fx="sum") self.add_state("total", default=torch.tensor(0), dist_reduce_fx="sum") def update(self, preds: torch.Tensor, target: torch.Tensor): preds, target = self._input_format(preds, target) assert preds.shape == target.shape self.correct += torch.sum(preds == target) self.total += target.numel() def compute(self): return self.correct.float() / self.total

Lightning 使得 loggers 的集成變得非常簡單——只需在 LightningModule 的任何地方調用 log()方法,它就會將記錄的數量發送到你選擇的 logger。默認情況下我們使用 Tensorboard,但是你可以選擇任何你想用的支持的 logger。
def training_step(self, batch, batch_idx):   self.log('my_metric', x)

根據 .log () 的調用位置,Lightning 自動確定何時應該進行日誌記錄(每步或每個epoch) ,但是當然你可以通過手動使用 on_step 和 on_epoch 選項來覆蓋默認行為。設置為 on_epoch = True 將在整個訓練 epoch 期間累積你的日誌值。
def training_step(self, batch, batch_idx): self.log('my_loss', loss, on_step=True, on_epoch=True, prog_bar=True, logger=True)

我們 deprecate 了 EvalResult 和 TrainResult,這有利於簡化數據流,並在訓練和驗證循環中將日誌與數據解耦。每個循環(訓練、驗證、測試)都有三個可以實現的鉤子(hooks):

x_step

x_step_end

x_epoch_end

為了說明數據是如何流動的,我們將使用訓練循環(即: x = training)
outs = []for batch in data:  out = training_step(batch)  outs.append(out)training_epoch_end(outs)

你在 training_step 中返回的任何東西都可以作為 training_epoch_end 的輸入。
def training_step(self, batch, batch_idx):  prediction = …  return {'loss': loss, 'preds': prediction}
def training_epoch_end(self, training_step_outputs): for out in training_step_outputs: prediction = out['preds']

驗證和測試步驟也是如此: validation_step 或 test_step 中返回的任何內容都可以用作{ validation/test }_step_end 或{ validation/test }_epoch_end 的輸入。如果你使用 DP 或 DDP2分布式模式(即: 拆分 batch 到不同的 GPU) ,請使用 x_step_end 手動聚合(或者不實現它,讓 lightning 自動聚合)。Lightning 現在自動為你保存一個 checkpoint 在你的當前工作目錄,還有你的最後一個訓練 epoch 的狀態。這樣可以確保在訓練被中斷的情況下繼續進行訓練。你可以自定義 checkpointing 行為來監控任意數量的訓練或驗證步驟。例如,如果你想根據驗證損失更新checkpoint:

計算你希望監控的任何指標或其他數量,例如驗證集損失。

使用 log() 方法記錄數量,並用一個鍵如 val_loss。

初始化 ModelCheckpoint 回調,並設置監視器為你的數量的鍵。

回調傳遞給 checkpoint_callback Trainer flag。

from pytorch_lightning.callbacks import ModelCheckpoint
class LitAutoEncoder(pl.LightningModule): def validation_step(self, batch, batch_idx): x, y = batch y_hat = self.backbone(x)
loss = F.cross_entropy(y_hat, y)
self.log('val_loss', loss)
# 3. Init ModelCheckpoint callback, monitoring 'val_loss'checkpoint_callback = ModelCheckpoint(monitor='val_loss')
# 4. Pass your callback to checkpoint_callback trainer flagtrainer = Trainer(checkpoint_callback=checkpoint_callback)

請在我們的 release notes (https://github.com/PyTorchLightning/pytorch-lightning/releases)中閱讀所有的 API 變化,其中包括很多 bug 的修復。來源:https://medium.com/pytorch/pytorch-lightning-1-0-from-0-600k-80fc65e2fab0

推薦閱讀


 ACCV 2020國際細粒度網絡圖像識別競賽正式開賽!

添加極市小助手微信(ID : cvmart2),備註:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳),即可申請加入極市目標檢測/圖像分割/工業檢測/人臉/醫學影像/3D/SLAM/自動駕駛/超解析度/姿態估計/ReID/GAN/圖像增強/OCR/視頻理解等技術交流群:每月大咖直播分享、真實項目需求對接、求職內推、算法競賽、乾貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發者互動交流~
覺得有用麻煩給個在看啦~  

相關焦點

  • 分離硬體和代碼、穩定 API,PyTorch Lightning 1.0.0 版本正式發布
    它終於出了 1.0.0 版本,並增添了很多新功能,在度量、優化、日誌記錄、數據流、檢查點等方面均進行了完善。Keras 和 PyTorch 都是對初學者非常友好的深度學習框架,兩者各有優勢,很多研究者和開發者在選擇框架時可能會舉棋不定。
  • PyTorch 1.0 穩定版正式發布!
    穩定版終於正式發布了!昨天,在 NeurIPS 大會上,Facebook 正式發布 PyTorch 1.0 穩定版!這距離 PyTorch 1.0 預覽版發布僅僅過去了兩個月。PyTorch 1.0 預覽版首次發布是在 10 月份的 PyTorch 開發者大會,新增了面向生產的特徵和主要雲平臺的支持等功能,被認為 90% 的功能能經受住業界的考驗。
  • 像 Keras 一樣優雅地使用 pytorch-lightning
    本篇文章為大家介紹一個可以幫助大家優雅地進行深度學習研究的工具:pytorch-lightning。公眾號後臺回復關鍵字:源碼,獲取本文原始碼!pytorch-lightning 是建立在pytorch之上的高層次模型接口,pytorch-lightning之於pytorch,就如同keras之於tensorflow。關於pytorch-lightning的完整入門介紹,可以參考我的另外一篇文章。
  • 使用PyTorch Lightning自動訓練你的深度神經網絡
    我從兩年前就開始使用PyTorch了,我從0.3.0版本開始使用。在我使用PyTorch之前,我使用Keras作為我的深度學習框架,但後來我開始切換到PyTorch,原因有幾個。下面有2張圖片解釋了pytorch和pytorch lightning在編碼、建模和訓練上的區別。在左邊,你可以看到,pytorch需要更多的代碼行來創建模型和訓練。有了pytorch lightning,代碼就變成了Lightning模塊的內部,所有的訓練工程代碼都被pytorch lightning解決了。
  • 【他山之石】Ray和Pytorch Lightning 使用指北
    地址:https://www.zhihu.com/people/chea-simhttps://docs.ray.io/en/master/tune/tutorials/tune-pytorch-lightning.html本文默認已對pytorch lightning較為熟悉。
  • PyTorch Lightning工具學習
    目前PyTorch Lightning庫已經有了一定的影響力,star已經1w+,同時有超過1千多的研究人員在一起維護這個框架。這部分參考了https://zhuanlan.zhihu.com/p/120331610 和 官方文檔 https://pytorch-lightning.readthedocs.io/en/latest/trainer.html在這個模塊中,將PyTorch代碼按照五個部分進行組織
  • Node.js v8.0.0 正式發布;Nginx 1.13.1 發布;Qt 5.9 正式發布
    (文/Solidot)Node.js v8.0.0 已正式發布。v8.0.0 是下一個主要的版本,帶來了一系列重大的變化和新功能,內容十分多,本文包含主要重要的更改和功能的摘要。對 Node.js 開發者來說最重要的是 V8 5.8 保證與 V8 5.9 和即將推出的 V8 6.0 具有 ABI 的向前兼容性,這將有助於確保 Node.js 原生插件生態系統的穩定性。在 Node.js 8 的生命周期中,會計劃升級到 5.9 甚至 6.0。
  • 超參搜索調優【Ray】與模型設計工具【Pytorch Lightning 】詳解
    作者:知乎—Chea Sim地址:https://www.zhihu.com/people/chea-sim本文翻譯來源:https://docs.ray.io/en/master/tune/tutorials/tune-pytorch-lightning.html本文默認已對pytorch lightning較為熟悉。
  • Pytorch 1.1.0駕到!小升級大變動,易用性更強,支持自定義RNN
    Pytroch 1.1.0的發布除了修復了已有bug之外,最大的亮點就是可以更快、更好的支持自定義RNN,以及TensorBoard對可視化和模型調試提供了一流的本地支持。Pytorch 1.1.0,來了!
  • PyTorch 0.4.0 大更新,正式支持 Windows 平臺
    (點擊上方公眾號,可快速關注)參考:PyTorch、開源中國,整理:Python開發者(id:PythonCoder)PyTorch 是一個 Python 優先的深度學習框架,提供兩個高級功能:4 月 25 日,PyTorch 的 GitHub 主頁宣布 PyTorch 0.4.0
  • PyTorch 4分鐘教程,從0到1 帶你完成線性回歸
    2,x恢復到最初的值。print ("d(sin(x)/dx=cos(x))")運行結果:            對於pytorch中的變量和梯度計算可參考下面這篇文章:https://zhuanlan.zhihu.com/p/29904755SLR: Simple Linear Regression現在我們了解了基礎知識
  • 具有PyTorch Lightning的TensorBoard
    儘管它捕獲了趨勢,但是如果我們可以記錄諸如各個時期的準確性之類的指標,那將更有幫助。我們可以做的一件事是在N每批之後繪製數據。這可以通過在定義培訓者時將設置log_save_interval為N在這裡,大多數權重分布在-0.1到0.1之間。要將直方圖添加到Tensorboard,我們正在編寫一個輔助函數custom_histogram_adder()。
  • Flutter 1.0 正式發布!
    正式發布。從我們首次看到 Flutter 的 Beta 測試版,到如今的 1.0 正式版,總共經過了 9個月。2 月底在世界移動大會 (MWC) 上發布首個 Beta 版;5 月的 Google I/O 大會上發布 Beta 3 ;6 月底的 GMTC 發布首個預覽版;9 月的谷歌開發者大會上,發布預覽版 2;12月的 Flutter Live 2018 上,發布1.0 穩定版。
  • PyTorch 0.4.0 安裝命令大全
    小編今天已經在 Windows 10 x64 上的 Anaconda3 5.1.0 上裝了 PyTorch 0.4.0 CPU 版,感覺很好用!
  • PyTorch 0.2發布:更多NumPy特性,高階梯度、分布式訓練等
    PyTorch的GitHub新版發布說明中介紹了0.2版的以下新特性:NumPy風格的Tensor BroadcastingBroadcasting是NumPy在算數運算中處理不同形狀數組的一種方式,在特定條件下,比較小的數組會通過比較大的數組進行「廣播」,來獲得相應的形狀。
  • Spring Boot 2.1.0正式發布
    期待已久的Spring Boot 2.1.0RELEASE版本已於10月底正式發布了。
  • MindSpore 1.0版本正式發布!
    從4月30日發布的v0.2.0-alpha版本,到8月30日發布的v0.7.0-beta版本,推出了數十個亮眼的新特性,9月,在華為全聯接大會上,MindSpore正式發布v1.0.0版本(後簡稱1.0)。
  • PyTorch Lightning 1.1發布,支持多GPU切片訓練,只需一半內存
    這一點在《越獄》的發行中得到了很好的體現 GPT-3 by OpenAI, 他們最大的模型有1750億個參數,需要大量的計算和優化技巧來訓練。在訓練大型模型時,記憶很快就會成為一種有價值的資源。當我們縮放模型大小時,我們開始耗盡gpu上的內存,這限制了我們可以訓練的模型的大小。這可能令人沮喪,並促使我們嘗試更智能的內存管理技術。Sharded Training Powered by Lightning
  • PyTorch 1.7.1 發布,支持 Python 3.9,更新 cuDNN,即將支持 30 系顯卡
    Bug fix release with updated binaries for Python 3.9 and cuDNN 8.0.5.
  • PyTorch 1.2來了(正式支持Transformer與TensorBoard,新增TorchScript)
    2018 年 12 月,PyTorch 1.0 正式版發布,解決了包括可重用、性能、程式語言和可擴展性等在內的一系列問題。今日,PyTorch 發布最新版本,做了一系列更新,包括正式支持 Transformer、TensorBoard 等。