摘要:訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)需要大量的內(nèi)存,用戶使用這個工具包,可以在計算時間成本僅增加的基礎(chǔ)上,在上運(yùn)行規(guī)模大倍的前饋模型。使用導(dǎo)入此功能,與使用方法相同,使用梯度函數(shù)來計算參數(shù)的損失梯度。隨后,在反向傳播中重新計算檢查點之間的節(jié)點。
OpenAI是電動汽車制造商特斯拉創(chuàng)始人 Elon Musk和著名的科技孵化器公司 Y Combinator總裁 Sam Altman于 2016年聯(lián)合創(chuàng)立的 AI公司,使命是建立安全的人工智能,確保 AGI(Artificial general intelligence,通用人工智能)的全球效益“盡可能廣泛和均勻分配”。
目前,這個非營利組織已經(jīng)有 60名全職研究人員和工程人員,“摒棄隨之產(chǎn)生的利己機(jī)會,為實現(xiàn)自己的使命而奮斗”。
Y Combinator和一家電動車制造商能夠走到一起創(chuàng)辦人工智能公司 OpenAI,是因為兩家公司共同的目標(biāo):創(chuàng)造一種新的人工智能實驗室,這個實驗室不受包括 Google在內(nèi)的任何人的控制,讓人類以安全的方式開發(fā)真正的人工智能。人工智能威脅論的 Musk建立 OpenAI,除了他所說讓人類以安全的方式開發(fā)真正的人工智能這一目標(biāo)外,也是出于其公司未來業(yè)務(wù)的需求,特斯拉、SpaceX都需要人工智能。
他同時也是十分積極的人工智能威脅論支持者,多次直言不諱對于人工智能失去人類控制導(dǎo)致災(zāi)難性后果的擔(dān)憂。
研究成果:使用梯度檢查點節(jié)約內(nèi)存
OpenAI自創(chuàng)立以來開發(fā)了分層強(qiáng)化學(xué)習(xí)算法、機(jī)器人模擬訓(xùn)練閉環(huán)系統(tǒng)等項目,近日研究員 Tim Salimans和 Yaroslav Bulatov又推出了一個工具包,可以讓內(nèi)存計算和模型更加適配。
訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)需要大量的內(nèi)存,用戶使用這個工具包,可以在計算時間成本僅增加 20%的基礎(chǔ)上,在 GPU上運(yùn)行規(guī)模大 10倍的前饋模型。
同樣地,計算反向傳播的梯度損失會在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的過程中占用大量內(nèi)存。通過我們這個模型定義的計算圖檢查點節(jié)點,并在反向傳播期間重新計算這些節(jié)點之間的圖形部分,可以降低計算梯度的內(nèi)存成本。當(dāng)訓(xùn)練由 n層組成的深度前饋神經(jīng)網(wǎng)絡(luò)時,我們可以以這種方式將存儲器消耗降低到 O(sqrt(n)),代價是執(zhí)行一次額外的正向傳播(參見例子:Training Deep Nets with Sublinear Memory Cost, by Chen et al(2016)。這個存儲庫在 Tensorflow中提供了這個功能,使用 Tensorflow圖形編輯器自動重寫反向傳遞的計算圖。
?
使用常規(guī) tf.gradients函數(shù)和我們的內(nèi)存優(yōu)化梯度方法訓(xùn)練同樣批量大小的 ResNet模型時所使用的內(nèi)存
如何運(yùn)行?
對于具有 n層的簡單前饋神經(jīng)網(wǎng)絡(luò),用于獲得梯度的計算圖如下所示:
標(biāo)記了 f的節(jié)點激活神經(jīng)網(wǎng)絡(luò)層。在正向傳遞期間,所有這些節(jié)點按順序一一被評估。相對于這些層的激活和參數(shù)的損失梯度由用 b標(biāo)記的節(jié)點表示。在反向傳遞期間,所有這些節(jié)點都按照相反的順序進(jìn)行評估。計算 b節(jié)點需要 f節(jié)點的計算結(jié)果,因此所有 f節(jié)點在正向傳遞之后都被保存在存儲器中。只有當(dāng)反向傳播進(jìn)行到足以計算出一個 f節(jié)點的所有依賴關(guān)系或子節(jié)點時,它才能從內(nèi)存中消失。這意味著簡單反向傳播所需的內(nèi)存隨神經(jīng)網(wǎng)絡(luò)層數(shù) n線性增長。下面我們顯示這些節(jié)點的計算順序。紫色陰影圓圈表示在給定時間需要保存在內(nèi)存中的節(jié)點。
?
Vanilla backprop
如上所述的簡單反向傳播的計算效果較佳:它僅對每個節(jié)點進(jìn)行一次計算。但是,如果我們愿意重新計算節(jié)點,則可以節(jié)省大量內(nèi)存。例如,當(dāng)需要時我們可以簡單地重新計算每個節(jié)點的正向傳遞。執(zhí)行順序和使用的內(nèi)存如下所示:
使用這種策略,圖中計算神經(jīng)網(wǎng)絡(luò)層數(shù)為 n的梯度所需的內(nèi)存不變,這在內(nèi)存方面是最優(yōu)的。但是,請注意,節(jié)點評估的數(shù)量現(xiàn)在擴(kuò)大到 n ? ^2,而之前為 n:n個節(jié)點中的每一個都按 n次的順序重新計算。因此,對于深度網(wǎng)絡(luò)來說,圖形計算變得慢得多,這使得該方法在深度學(xué)習(xí)中不切實際。
為了在內(nèi)存和計算之間取得平衡,我們需要提出一個允許節(jié)點重新計算但不至于太頻繁的策略。我們在這里使用的策略是將神經(jīng)網(wǎng)絡(luò)激活的一個子集標(biāo)記為檢查點節(jié)點。
?
我們選擇的檢查點節(jié)點
這些檢查點節(jié)點在正向傳遞后保留在內(nèi)存中,而其余節(jié)點至多重新計算一次。重新計算后,非檢查點節(jié)點將保存在內(nèi)存中,直到不再需要它們。對于簡單前饋神經(jīng)網(wǎng)絡(luò)來說,所有的神經(jīng)元激活節(jié)點都是由正向傳播定義的圖形分隔符或關(guān)節(jié)點。這意味著我們只需要在 backprop期間計算 b節(jié)點時,重新計算 b節(jié)點和它之前的最后一個檢查點之間的節(jié)點。當(dāng) backprop計算進(jìn)展到檢查點節(jié)點時,所有從它重新計算的節(jié)點都可以從內(nèi)存中刪除。計算和內(nèi)存使用的結(jié)果順序如下所示:
?
圖 3.檢查節(jié)點 backprop
對于本例中的簡單前饋網(wǎng)絡(luò)來說,較佳選擇是將每個 sqrt(n)節(jié)點標(biāo)記為檢查點。這樣,檢查點節(jié)點的數(shù)量和檢查點之間的節(jié)點數(shù)目都是 sqrt(n),這意味著所需的內(nèi)存現(xiàn)在也與我們網(wǎng)絡(luò)中層數(shù)的平方根成比例。由于每個節(jié)點最多只能重新計算一次,因此該策略所需的額外計算量僅相當(dāng)于網(wǎng)絡(luò)的單個正向傳遞。
我們的軟件包可以實現(xiàn)檢查點 backprop,如上圖 3所示。這個過程是通過采用將上圖(圖 1)標(biāo)準(zhǔn) backprop,并使用 Tensorflow圖形編輯器對其自動重寫來實現(xiàn)的。對于包含關(guān)節(jié)點(單節(jié)點圖分隔符)的圖,我們使用 sqrt(n)策略自動選擇檢查點,為前饋網(wǎng)絡(luò)提供 sqrt(n)所需內(nèi)存。對于只包含多節(jié)點圖分隔符的普通圖像,使用我們的檢查點 backprop仍然有效,但是目前還需要用戶手動選擇檢查點。
在我們軟件包的 博客文章中可以找到計算圖、內(nèi)存使用情況和梯度計算策略的附加說明文件。
?
安裝要求
pip install tf-nightly-gpu
pip install toposort networkx pytest
另外,在運(yùn)行測試時,要確??梢哉业?CUDA分析工具接口(CUPTI),例如,通過運(yùn)行
```pip install toposort networkx pytestexport LD_LIBRARY_PATH =“$ {LD_LIBRARY_PATH}:/ usr / local / cuda / extras / CUPTI / lib64”
?
使用方法
這個存儲庫提供了基于 Tensorflow的 tf.gradient的替代方案。使用from memory_saving_gradients import gradients導(dǎo)入此功能,與使用 tf.gradients方法相同,使用梯度函數(shù)來計算參數(shù)的損失梯度。 (假設(shè)你明確地調(diào)用 tf.gradients,而不是在 tf.train.Optimizer中隱式調(diào)用)。
除了 tf.gradients的常規(guī)參數(shù)之外,我們的梯度函數(shù)還有一個額外的參數(shù):檢查點。檢查點參數(shù)將通過計算圖告訴您向前傳遞過程中所需檢查點的梯度函數(shù)。隨后,在反向傳播中重新計算檢查點之間的節(jié)點。您可以使用很多 tensor、梯度(ys,xs,檢查點 = [tensor1,tensor2]),或者可以使用以下幾個關(guān)鍵字之一:
"collection"(默認(rèn)值):檢查由 tf.get_collection("checkpoints")返回的所有張量。之后在定義模型時,需要確保使用 tf.add_to_collection(“檢查點”,張量)將張量添加到此集合中。
"內(nèi)存":使用啟發(fā)式自動選擇一組節(jié)點作為檢查點,實現(xiàn)我們所需的 O(sqrt(n))內(nèi)存使用。啟發(fā)式方法通過自動識別圖中的關(guān)節(jié)點,即在移除時將圖分成兩個部分的張量,然后找出這些張量的合理數(shù)目。目前,它適用于很多(但不是全部)模型。
"速度":這個選項通過檢查所有操作的輸出來使運(yùn)行速度較大化,且通常成本高昂,即卷積和矩陣乘法。
?
覆蓋tf.gradients
直接使用新梯度函數(shù)的一個有效果的替代方法,是覆寫 Python已經(jīng)注冊到 tf.gradients的函數(shù),如下所示:
import tensorflow as tf
import memory_saving_gradients
# monkey patch tf.gradients to point to our custom version, with automatic checkpoint selection
def gradients_memory(ys, xs, grad_ys=None, **kwargs):
? return memory_saving_gradients.gradients(ys, xs, grad_ys, checkpoints="memory", **kwargs)
tf.__dict__["gradients"] = gradients_memory
之后,使用節(jié)約內(nèi)存的版本對 tf.gradients的調(diào)用都將使用內(nèi)存保存版本。
?
測試
測試文件夾包含用于測試代碼的正確性,并分析各種模型內(nèi)存使用情況的腳本。修改代碼后,您可以從該文件夾運(yùn)行./run_all_tests.sh來執(zhí)行測試。
?
在 CIFAR10上測試不同層數(shù)的 ResNet的內(nèi)存使用情況和運(yùn)行時間。大小為 1280,GTX1080
限制
在運(yùn)行處理大型圖形過慢的模型之前,這些代碼用 Python執(zhí)行所有的圖形操作。當(dāng)前用于自動選擇檢查點的算法純粹是啟發(fā)式的,預(yù)計在我們測試之外的某些模型上會失敗。在這種情況下,應(yīng)使用手動模式選擇檢查點。
?
參考
Academic papers describing checkpointed backpropagation: Training Deep Nets with Sublinear Memory Cost, by Chen et al. (2016), https://arxiv.org/pdf/1604.06174.pdfMemory-Efficient Backpropagation Through Time, by Gruslys et al. (2016) https://arxiv.org/pdf/1604.06174.pdf
Explanation of using graph_editor to implement checkpointing on TensorFlow graphs: https://github.com/tensorflow/tensorflow/issues/4359#issuecomment-269241038, https://github.com/yaroslavvb/stuff/blob/master/simple_rewiring.ipynb
Experiment code/details: https://medium.com/@yaroslavvb/testing-memory-saving-on-v100-8aa716bbdf00
TensorFlow memory tracking package:
https://github.com/yaroslavvb/chain_constant_memory/blob/master/mem_util_test.py
Implementation of "memory-poor" backprop strategy in TensorFlow for a simple feed-forward net:
https://github.com/yaroslavvb/chain_constant_memory/
?
再度招兵買馬
在過去的幾個月,OpenAI一直保持沉默。而近期,這家公司似乎渴望把更多的人才招攬到團(tuán)隊中去,發(fā)布了多個招聘職位。
從公司發(fā)布的工作崗位上看,團(tuán)隊不僅需要招聘協(xié)調(diào)員,還要招聘更多的人員。
https://twitter.com/OpenAI/status/951498942541283328?ref_src=twsrc%5Etfw&ref_url=https%3A%2F%2Finterestingengineering.com%2Felon-musk-and-openai-want-to-create-an-artificial-intelligence-that-wont-spell-doom-for-humanity
目前,OpenAI官網(wǎng)招聘頁面放出的招聘崗位(以舊金山為例)主要包括技術(shù)人員(基礎(chǔ)架構(gòu)工程師,機(jī)器學(xué)習(xí)方面工程師、研究院、工作人員、實習(xí)生)、運(yùn)營人員(業(yè)務(wù)經(jīng)理、招聘協(xié)調(diào)員)。
招聘頁面:https://jobs.lever.co/openai
當(dāng)初,OpenAI花了大價錢邀請一眾大佬加盟,其中就包括曾在谷歌和 Facebook實習(xí)過的研究員 Wojciech Zaremba,說 OpenAI開出的價錢“近乎瘋狂”。那么,瘋狂的 offer價錢在 2016年時到底是什么水平呢?據(jù)微軟研究院副總裁 Peter Lee稱,當(dāng)時一名較高級研究員的 offer遠(yuǎn)超過美國全國橄欖球聯(lián)賽的較高級四分衛(wèi)的酬勞,這還是在沒有硅谷跟你搶人才的情況下。Zaremba說道,OpenAI給他開出的價格是市場平均水平的兩至三倍。
聯(lián)想到最近 OpenAI人才流失比較嚴(yán)重,比如加州伯克利大學(xué)教授、機(jī)器人學(xué)習(xí)大牛 Pieter Abbeel離開 OpenAI創(chuàng)立智能機(jī)器人公司 Embodied Intelligence,想必這次招聘他們出的價錢也不會低。
原文鏈接:
https://github.com/openai/gradient-checkpointing
https://openai.com/
https://interestingengineering.com/elon-musk-and-openai-want-to-create-an-artificial-intelligence-that-wont-spell-doom-for-humanity
歡迎加入本站公開興趣群商業(yè)智能與數(shù)據(jù)分析群
興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價值的辦法,實際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉庫,數(shù)據(jù)挖掘工具,報表系統(tǒng)等全方位知識
QQ群:81035754
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/4718.html
摘要:更廣泛地說,這些結(jié)果表明神經(jīng)網(wǎng)絡(luò)訓(xùn)練不需要被認(rèn)為是一種煉丹術(shù),而是可以被量化和系統(tǒng)化。中間的曲線中存在彎曲,漸變噪聲標(biāo)度預(yù)測彎曲發(fā)生的位置。 由于復(fù)雜的任務(wù)往往具有更嘈雜的梯度,因此越來越大的batch計算包,可能在將來變得有用,從而消除了AI系統(tǒng)進(jìn)一步增長的一個潛在限制。更廣泛地說,這些結(jié)果表明神經(jīng)網(wǎng)絡(luò)訓(xùn)練不需要被認(rèn)為是一種煉丹術(shù),而是可以被量化和系統(tǒng)化。在過去的幾年里,AI研究人員通過數(shù)...
摘要:第一個主流產(chǎn)品級深度學(xué)習(xí)庫,于年由啟動。在年月日宣布,的開發(fā)將終止。張量中最基本的單位是常量變量和占位符。占位符并沒有初始值,它只會分配必要的內(nèi)存。是一個字典,在字典中需要給出每一個用到的占位符的取值。 為什么選擇 TensorFlow?在本文中,我們將對比當(dāng)前最流行的深度學(xué)習(xí)框架(包括 Caffe、Theano、PyTorch、TensorFlow 和 Keras),幫助你為應(yīng)用選擇最合適...
摘要:七強(qiáng)化學(xué)習(xí)玩轉(zhuǎn)介紹了使用創(chuàng)建來玩游戲?qū)⑦B續(xù)的狀態(tài)離散化。包括輸入輸出獨(dú)熱編碼與損失函數(shù),以及正確率的驗證。 用最白話的語言,講解機(jī)器學(xué)習(xí)、神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)示例基于 TensorFlow 1.4 和 TensorFlow 2.0 實現(xiàn) 中文文檔 TensorFlow 2 / 2.0 官方文檔中文版 知乎專欄 歡迎關(guān)注我的知乎專欄 https://zhuanlan.zhihu.com/...
摘要:為了進(jìn)一步了解的邏輯,圖對和進(jìn)行了展開分析。另外,在命名空間中還隱式聲明了控制依賴操作,這在章節(jié)控制流中相關(guān)說明。簡述是高效易用的開源庫,有效支持線性代數(shù),矩陣和矢量運(yùn)算,數(shù)值分析及其相關(guān)的算法。返回其中一塊給用戶,并將該內(nèi)存塊標(biāo)識為占用。 3. TF 代碼分析初步3.1 TF總體概述為了對TF有整體描述,本章節(jié)將選取TF白皮書[1]中的示例展開說明,如圖 3 1所示是一個簡單線性模型的TF...
摘要:我仍然用了一些時間才從神經(jīng)科學(xué)轉(zhuǎn)向機(jī)器學(xué)習(xí)。當(dāng)我到了該讀博的時候,我很難在的神經(jīng)科學(xué)和的機(jī)器學(xué)習(xí)之間做出選擇。 1.你學(xué)習(xí)機(jī)器學(xué)習(xí)的歷程是什么?在學(xué)習(xí)機(jī)器學(xué)習(xí)時你最喜歡的書是什么?你遇到過什么死胡同嗎?我學(xué)習(xí)機(jī)器學(xué)習(xí)的道路是漫長而曲折的。讀高中時,我興趣廣泛,大部分和數(shù)學(xué)或科學(xué)沒有太多關(guān)系。我用語音字母表編造了我自己的語言,我參加了很多創(chuàng)意寫作和文學(xué)課程。高中畢業(yè)后,我進(jìn)了大學(xué),盡管我不想去...
閱讀 2857·2023-04-25 18:58
閱讀 984·2021-11-25 09:43
閱讀 1220·2021-10-25 09:46
閱讀 3506·2021-09-09 11:40
閱讀 1707·2021-08-05 09:59
閱讀 878·2019-08-29 15:07
閱讀 966·2019-08-29 12:48
閱讀 707·2019-08-29 11:19