更快的計算,更高的內存效率:PyTorch混合精度模型AMP介紹

2021-01-11 deephub

作者:Rahul Agarwal

deephub翻譯組:孟翔傑

您是否知道反向傳播算法是Geoffrey Hinton在1986年的《自然》雜誌上提出的?

同樣的,卷積網絡由Yann le cun於1998年首次提出,並進行了數字分類,他使用了單個卷積層。 直到2012年下半年,Alexnet才通過使用多個卷積層在imagenet上實現最先進的技術來推廣卷積網絡。

那麼,是什麼讓他們直到現在才這麼出名?

只有在我們擁有大量計算資源的情況下,我們才能進行足夠的實驗並充分利用深度學習的潛力。

但是我們真的充分利用了現有的計算資源嗎? 我們可以做得更好嗎?

這篇文章是關於利用Tensor Cores和自動混合精度來更快地訓練深度學習網絡的。

什麼是Tensor Cores?

根據NVIDIA網站的介紹:

NVIDIA Turing和Volta GPU由Tensor Cores提供支持。Tensor Cores是一項革命性技術,可提供開創性的AI性能。 Tensor Core可以加速AI核心的大型矩陣運算,並在單個運算中執行混合精度矩陣乘法和累加計算。 在一個NVIDIA GPU中並行運行數百個Tensor Core,這可以極大地提高吞吐量和運行效率。

簡單地說; 它們是專用於特定類型矩陣操作的專用內核。

我們可以將兩個FP16矩陣相乘並將其添加到FP16 / FP32矩陣中,從而得到FP16 / FP32矩陣。 Tensor Core支持混合精度數學,即輸入為半精度(FP16),輸出為全精度(FP32)。這樣的操作對於許多深度學習任務具有內在的價值,並且Tensor Core為該操作提供了專用的硬體。

與FP32相比FP16主要有以下兩個好處。

1.FP16需要較少的內存,因此更易於訓練和部署大型神經網絡。 它還減少了數據移動。

2.使用Tensor Core,大大提高了數學運算的速度但降低了精度。 NVIDIA提供的Volta GPU的確切數量是:FP16中為125 TFlops,而FP32中為15.7 TFlops(加速8倍)

但是也有缺點。 從FP32轉到FP16時,必然會降低精度。

FP32與FP16:FP32具有八個指數位和23個小數位,而FP16具有五個指數位和十個小數位。

但是真的需要FP32嗎?

FP16實際上可以很好地表示大多數權重和漸變色。 因此,存儲和使用FP32所需的這些額外數位只是浪費。

那麼,我們應該怎麼使用Tensor Cores呢?

我檢查了我的Titan RTX GPU。它擁有576個Tensor Cores以及4,608個NVIDIA CUDA內核。 但是如何使用這些Tensor Cores?

坦白地說,NVIDIA可以輕鬆地將Tensor Cores與自動混合精度一起使用,並提供了幾行代碼。我們需要在代碼中做兩件事:

1.將FP32所需的操作(如Softmax)分配給FP32,而將FP16可以完成的操作(如卷積)自動分配給FP16。

2.使用損失縮放來保留較小的梯度值。梯度值可能超出FP16的範圍。在這種情況下,將對梯度值進行縮放,使其保持在FP16範圍內。

就算您還不了解背景細節也可以。因為它的代碼實現相對簡單。

使用PyTorch進行混合精度訓練

讓我們從PyTorch中的基本網絡開始

N, D_in, D_out = 64, 1024, 512x = torch.randn(N, D_in, device="cuda")y = torch.randn(N, D_out, device="cuda")model = torch.nn.Linear(D_in, D_out).cuda()optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)for to in range(500):y_pred = model(x)loss = torch.nn.functional.mse_loss(y_pred, y)optimizer.zero_grad()loss.backward()optimizer.step()

想要利用自動混合精度訓練的優勢,我們首先需要安裝apex庫。只需在終端中運行以下命令。

$ git clone https://github.com/NVIDIA/apex$ cd apex$ pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

然後,我們只需在神經網絡代碼中添加幾行即可利用自動混合精度(AMP)。

from apex import ampN, D_in, D_out = 64, 1024, 512x = torch.randn(N, D_in, device="cuda")y = torch.randn(N, D_out, device="cuda")model = torch.nn.Linear(D_in, D_out).cuda()optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)model, optimizer = amp.initialize(model, optimizer, opt_level="O1")for to in range(500):y_pred = model(x)loss = torch.nn.functional.mse_loss(y_pred, y)optimizer.zero_grad()with amp.scale_loss(loss, optimizer) as scaled_loss:scaled_loss.backward()optimizer.step()

在這裡,您可以看到我們使用amp初始化了模型。我們還通過使用amp.scale_loss指定損失縮放比例。

標杆分析法

我們可以使用這個很棒的存儲庫對放大器的性能進行測試,該存儲庫對CIFAR數據集上的VGG16模型進行測試。 我只需要更改幾行代碼即可為我們工作。 您可以在找到修改後的版本。 要自己運行測試代碼,您可能需要:

git clone https://github.com/MLWhiz/data_science_blogscd data_science_blogs/amp/pytorch-apex-experiment/python run_benchmark.pypython make_plot.py --GPU 'RTX' --method 'FP32' 'FP16' 'amp' --batch 128 256 512 1024 2048

這將在主目錄中為您生成以下圖形:

在這裡,我們使用各種精度和批處理大小訓練了同一模型。 我們可以看到,從FP32到amp,內存需求降低了,而精度卻保持大致相同。時間也會減少,但不會減少那麼多。 這可能因為數據集或模型比較簡單。

根據NVIDIA提供的標準,自動混合精度的運行速度比標準FP32快3倍,如下所示。

來源:加速比是指單精度和自動混合精度訓練固定次數下的時間的比例。

相關焦點

  • PyTorch 1.6來了:新增自動混合精度訓練、Windows版開發維護權移交...
    新版本增加了一個 amp 子模塊,支持本地自動混合精度訓練。Facebook 還表示,微軟已擴大了對 PyTorch 社區的參與,現在擁有 PyTorch 在 Windows 上的開發和維護所有權。相比於以往的 PyTorch 版本,本次即將發布的 PyTorch 1.6 有哪些吸引人的地方呢?
  • 百度聯合英偉達發布最新論文:使深度學習效率事半功倍的混合精度...
    據了解,大多數的深度學習模型使用的是32位單精度浮點數(FP32)來進行訓練,而混合精度訓練的方法則通過16位浮點數(FP16)進行深度學習模型訓練,從而減少了訓練深度學習模型所需的內存,同時由於FP16的運算比FP32運算更快,從而也進一步提高了硬體效率。通過用半精度運算替代全精度運算來提高效率,這一技術原理聽起來很簡單明了,但將其付諸實施並不像聽起來那麼簡單。
  • 代碼詳解:用Pytorch訓練快速神經網絡的9個技巧
    但這份終極指南,會一步步教你清除模型中所有的(GP模型)。不要讓你的神經網絡變成這樣。(圖片來源:Monsters U)這份指南的介紹從簡單到複雜,一直介紹到你可以完成的大多數PITA修改,以充分利用你的網絡。例子中會包括一些Pytorch代碼和相關標記,可以在 Pytorch-Lightning訓練器中用,以防大家不想自己敲碼!這份指南針對的是誰?
  • 9個技巧讓你的PyTorch模型訓練變得飛快!
    我們會講到: 使用DataLoaders  DataLoader中的workers數量  Batch size  梯度累計  保留的計算圖  移動到單個  16-bit 混合精度訓練  移動到多個GPUs中(模型複製)  移動到多個GPU-nodes中 (8+GPUs)  思考模型加速的技巧Pytorch-Lightning
  • AI簡報:內存256KB設備也能人臉檢測!
    但是圖像識別對內存有較高的要求,一般搭載MCU的設備內存都不高,怎樣才能解決這個問題呢? 最近,微軟提出了一種RNNPool方法,甚至可在內存只有256 KB的STM32開發板上運行人臉檢測模型。它可以在不損失準確度的情況下大幅降低激活圖的採樣率。 RNNPool在語法上等效於池化算子,可以快速減小中間圖的大小。
  • PyTorch框架歷史和特性更迭與安裝過程
    在最初的版本中,PyTorch支持的深度學習計算操作很少,而且在並行計算和異構計算(CPU/GPU混合)方面的支持不是很完善。在後續版本中,PyTorch逐漸引入了多進程計算的功能,而且逐漸集成了CuDNN的GPU深度學習計算庫,引入了越來越多的張量運算操作和深度學習模塊。在PyTorch 0.2.0中已經實現了高階導數、分布式計算、張量廣播等功能。
  • Google提出移動端新SOTA模型MixNets:用混合深度卷積核提升精度
    在本文中,作者系統地研究了不同內核大小的影響,並發現將多種內核大小的優勢結合在一起可以帶來更高的準確性和性能。基於此觀察,作者提出了一種新的混合深度卷積(Mixed Depthwise Convolution, MDConv),它自然地在單個卷積中混合了多個內核大小。
  • PyTorch中使用DistributedDataParallel進行多GPU分布式模型訓練
    (也可以結合使用這些技術,例如同時使用模型和數據並行化,但這是一個高級主題,我們不在這裡介紹)因為這篇文章是對DistributedDataParallel並行API的介紹,所以我們不會再進一步討論模型並行化的細節——但請關注以後關於這個主題的文章!數據並行是如何工作的在前一節中,我給出了數據並行化的概述。在這一節中,我們將深入研究細節。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    據官網介紹,PyTorch 是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。官網:http://pytorch.orgGitHub:https://github.com/pytorch/pytorchPyTorch 是一個 Python 軟體包,其提供了兩種高層面的功能:使用強大的 GPU 加速的 Tensor 計算(類似 numpy)構建於基於 tape 的 autograd 系統的深度神經網絡如有需要,你也可以復用你最喜歡的
  • PyTorch上也有Keras了,訓練模型告別Debug,只需專注數據和邏輯
    在這張圖中,灰色部分代表Lightning能自動完成的部分,而藍色的部分則能夠根據使用者的需求,被定義成任意底層模型,可以是你自己的新模型,也可以是預訓練模型,fast.ai架構等等。舉幾個例子好了。比如說,梯度下降。
  • 新版PyTorch 1.2 已發布:功能更多、兼容更全、操作更快!
    PyTorch 發布了相關文章介紹了每個工具的更新細節,雷鋒網 AI 開發者將其整理與編譯如下。PyTorch 簡介自 PyTorch 1.0 發布以來,我們的社區不斷在進行擴展、添加入新的工具。這些發展為 PyTorch Hub 中越來越多可用的模型做出了極大的貢獻,並不斷增加了其在研究和生產中的用途。
  • 語音識別開源工具PyTorch-Kaldi:兼顧Kaldi效率與PyTorch靈活性
    機器之心原創作者:Nurhachu Null本文主要介紹用於語音識別的開源工具——PyTorch-Kaldi。PyTorch-Kaldi 論文首頁1.3 Why pytorch-kaldi?在 PyTorch 中實現聲學模型,在 Kaldi 中執行特徵提取、標籤/對齊計算和解碼。這也再次從側面證明了 PyTorch 作為一個深度學習框架所具有的的卓越的靈活性和便利性。事實上,很多人都認為 PyTorch 比 TensorFlow 更加適合做研究工作。本文的第二部分將會重點介紹一下 PyTorch-Kaldi 開源工具。
  • TensorFlow 2.4來了:上線對分布式訓練和混合精度的新功能支持
    Keras 更新混合精度在 TensorFlow 2.4 中,Keras 混合精度 API 已經脫離試驗階段,成為穩定的 API。大多數 TensorFlow 模型使用 float32 dtype,但現在有些低精度數據類型佔用的內存更少,比如 float16。混合精度指的是在同一模型中使用 16 位和 32 位浮點數以進行更快的訓練。這一 API 可將模型性能在 GPU 上提高到 3 倍,在 TPU 上提高 60%。要使用混合精度 API,必須使用 Keras 層和優化器,但不一定需要使用其他 Keras 類。
  • 用Java實現目標檢測|PyTorch
    魚羊 編輯整理量子位 報導 | 公眾號 QbitAI編者按:作為一個Java開發者,你是否曾為在PyTorch上部署模型而苦惱?這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。
  • 單精度、雙精度和半精度浮點格式之間的區別
    藉此,科學家可以對最大的星系,或是最小的粒子進行精確計算。 但是,計算精度越高,意味著所需的計算資源、數據傳輸和內存存儲就越多。其成本也會更大,同時也會消耗更多的功率。 由於並非每個工作負載都需要高精度,因此 AI 和 HPC 研究人員可以通過混合或匹配不同級別的精度的方式進行運算,從而使效益最大化。
  • 用Java實現目標檢測 | PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。
  • PyTorch更新!谷歌幫助開發,正式支持TensorBoard | 5大開源項目
    其中,最重要的功能是支持TensorBoard,它是谷歌為TensorFlow打造的可視化工具,能夠幫助開發人員評估和調試模型。根據Facebook介紹,在開發這一功能的時候,他們與谷歌有非常密切的合作。
  • FEKO計算中減少內存的方法
    用FEKO軟體進行電磁仿真時,由於電磁仿真對計算資源的強烈需求,計算資源尤其是內存的大小極大的成為決定求解問題規模的約束條件。為了在已有的硬體計算條件下,解決儘量大的電磁問題,FEKO提供了一些減少內存的途徑,主要可分為二個層面,其一是算法層面的節約內存,其二是技巧層面的節約內存。本文引用地址:http://www.eepw.com.cn/article/259796.htm算法從算法上面來講,FEKO提供的有MoM,MLFMM,PO,UTD,FEM。
  • 高性能PyTorch是如何煉成的?整理的10條脫坑指南
    如果你使用灰度圖像作為模型的輸入,請離線調整顏色。如果你正在進行自然語言處理(NLP),請事先做分詞處理(tokenization),並存入磁碟。在訓練期間一次次重複相同的操作沒有意義。在進行漸進式學習時,你可以以多種解析度保存訓練數據的,這還是比線上調至目標解析度更快。對於表格數據,請考慮在創建 Dataset 時將 pd.DataFrame 目標轉換為 PyTorch 張量。
  • 降低預測過程計算成本,這些NLP模型壓縮方法要知道
    因此,這篇文章主要著眼於在基本模型預訓練後可以用於降低預測過程計算成本的方法,主要包含以下方法:數值精度約簡:通過降低計算過程中使用的浮點數精度(浮點約簡)和量化,來加速計算。計算融合:在計算圖中選擇節點並進行合併的技巧。