API統一、乾淨,新型EagerPy實現多框架無縫銜接

2021-01-11 機器之心Pro

選自arXiv

編輯:杜偉、小舟

這個新型 Python 框架對庫開發者和用戶都大有裨益。

近年來,深度學習領域的進展與深度學習框架的開發同步進行。這些框架為自動微分和 GPU 加速提供了高級且高效的 API,從而可以利用相對較少和簡單的代碼實現極度複雜和強大的深度學習模型。

最初,Theano、Caffe、MXNet、TensorFlow 和 CNTK 等很多流行的深度學習框架使用的是基於圖的方法。用戶首先需要定義一個靜態數據流圖(static data flow graph),然後可以對它進行高效地微分、編譯並在 GPU 上執行。所以,提前了解整個計算圖有助於實現高性能。

但是,這種方法導致難以調試模型以及實現具有變化圖(changing graph)的動態模型(如 RNN)。

所以,針對這種方法的局限性,深度學習模型的 Eager Execution 成為了深度學習研究領域的主流方法。用戶不再需要提前構建靜態數據流圖,Eager Execution 框架自身就可以提供 define-by-run 的 API,它可以高速地構建臨時的動態圖。目前,兩大主流深度學習框架 PyTorch 和 TensorFlow 都在使用 eager execution 方法。

而在本文中,來自德國圖賓根大學和圖賓根伯恩斯坦計算神經科學中心的研究者將 eager execution 進行了擴展,提供了一個新的 Python 框架 EagerPy,它可以編寫自動且原生地適配 PyTorch、TensorFlow、Jax 和 Numpy 的代碼。EagerPy 對庫開發者和用戶都有裨益。

論文地址:https://arxiv.org/abs/2008.04175v1

項目地址:https://github.com/jonasrauber/eagerpy

EagerPy 能夠編寫與框架無關(framework-agnostic)的代碼,這些代碼可以與 PyTorch、TensorFlow、Jax 和 NumPy 實現原生地適配。

這樣一來,首先對於新庫開發者而言,他們不僅可以選擇同時支持上述這幾個主流深度學習框架或者為每個框架重新實現庫,而且可以對代碼重複進行處理。

其次對於這些庫的使用者而言,他們也可以更輕鬆地切換深度學習框架,並且不會被特定的第三方庫鎖定。

不僅如此,單個框架的使用者也會從 EagerPy 中獲益,這是因為 EagerPy 提供了全面的類型注釋以及對方法連結到任何框架的一致支持。

接下來我們來看 EagerPy 的具體設計與實現。

EagerPy 的設計與實現

EagerPy 的構建考慮到了 4 個設計目標。兩個主要的目標是為需要執行操作的人提供統一的 API,並維護底層框架的原始性能。這兩個主要目標定義了 EagerPy 是什麼,所以是設計的核心。

與底層框架特定的 API 相比,完全可連結的 API 和全面的類型檢查支持這兩個附加目標使 EagerPy 更加易於使用,也更安全。

儘管進行了這些更改和改進,但研究者嘗試避免不必要的熟悉度(familiarity)損失。只要有意義,EagerPy API 都會遵循 NumPy、PyTorch 和 JAX 設置的標準。

統一的 API

為了實現語法上的一致性,研究者使用適當的方法定義了一個抽象 Tensor 類,並使用一個實例變量來保存原生張量(native tensor),然後為每個支持的框架實現一個特定的子類。對於諸如 sum 或 log 的很多操作,這就像調用底層框架一樣簡單;而對於其他操作,則工作量會稍大一些。

最困難的部分是統一自動微分 API。PyTorch 使用了一個低級的 autograd API,該 API 允許但也需要對反向傳播的精確控制。TensorFlow 使用基於梯度磁帶(gradient tapes)的更高級 API。而 JAX 使用基於微分函數的相當高級的 API。

所以,為了統一它們,EagerPy 模仿了 JAX 的高級功能 API,並在 PyTorch 和 TensorFlow 中重新實現。EagerPy 通過 value_and_grad_fn() 函數將其開放。

此外,能夠編寫自動與所有支持的框架一起運行的代碼,不僅需要語法,還需要語義統一。為了確保這一點,EagerPy 附帶了一個龐大的測試套件,該套件可以驗證不同框架特定子類之間的一致性。它會在所有 pull-request 上自動運行,並且需要通過之後才能合併新代碼。

測試套件還可以作為所支持的操作和參數組合的最終參考。這樣就可以避免文檔和實現之間出現不一致,並在實踐中引出測試驅動開發過程。

原始性能

沒有 EagerPy,想要與不同深度學習框架進行交互的代碼必須經過 NumPy 實現。這需要在 CPU(NumPy)和 GPU(PyTorch、TensorFlow 和 JAX)之間進行高成本的內存複製,反之亦然。

此外,許多計算僅在 CPU 上執行,為了避免這種情況,EagerPy 僅保留對原始框架特定張量的引用(例如 GPU 上的 PyTorch 張量),並將所有的操作委託給相應的框架。這幾乎不產生任何的計算開銷。

完全可連結的 API

求和或平方之類的許多運算都要採用張量並返回一個張量。通常情況下,這些運算按順序被調用。例如使用平方、求和和開平方根以計算 L2 範數。

在 EagerPy 中,所有運算都成為了張量對象(tensor object)上可用的方法。這樣就可以按照它們的自然順序(x.square().sum().sqrt())來連結操作。相反,例如,NumPy 需要相反的操作順序,即 np.sqrt(np.square(x).sum())。

類型檢查

在 Python3.5 中,Python 語法的擴展已經實現了對類型注釋的支持(van Rossum 等人,2015 年)。即使具有類型注釋,Python 仍然是一種動態類型化的程式語言,並且當前在運行時會忽略所有類型注釋。但是,我們可以在運行代碼之前通過靜態代碼分析器檢查這些類型注釋。

EagerPy 帶有所有參數和返回值的全面類型注釋,並使用 Mypy(Lehtosalo 等人,2016 年)對這些注釋進行檢查。這有助於我們捕獲 EagerPy 中的漏洞,否則這些漏洞將一直不會被發現。

EagerPy 用戶可以通過鍵入自己代碼的注釋,並根據 EagerPy 的函數籤名(function signature)自動檢查代碼來進一步優化。這一點很關鍵,因為 TensorFlow、NumPy 和 JAX 當前自身不提供類型注釋。

EagerPy 的代碼實例解析

如下代碼 1 為一個通用 EagerPy 範數函數,它可以通過任何框架中的原生張量被調用,並且返回的範數依然作為同一個框架中的原生張量。

代碼 1:框架無關的範數函數。

EagerPy 和原生張量之間的轉換

原生張量可以是 PyTorch GPU 或 CPU 張量,如下代碼 2 所示:

代碼 2:原生 PyTorch 張量。

可以是 TensorFlow 張量,如下代碼 3 所示:

代碼 3:原生 TensorFlow 張量。

可以是 JAX 數組,如下代碼 4 所示:

代碼 4:原生 JAX 數組。

可以是 NumPy 數組,如下代碼 5 所示:

代碼 5:原生 NumPy 數組。

無論是哪種原生張量,通常都可以使用 ep.astensor 將它轉換為適當的 EagerPy 張量。在此步驟中,通過使用正確的 EagerPy 張量類來自動封裝原生張量。此外,最初的原生張量通常可以利用. raw 屬性實現訪問。完整示例如下代碼 6 所示:

EagerPy 和原生張量之間的轉換。

在函數中通常將所有輸入轉換為 EagerPy 張量。這可以通過單獨調用 ep.astensor 完成,但在使用 ep.astensors 時,代碼可以更加簡潔,如下:

實現框架無關的通用函數

通過上文中的轉換函數,我們可以定義一個簡單的框架無關函數,如下代碼 8 所示:

代碼 8:一個簡單的框架無關範數函數。

如下代碼 9 所示,通過一個 PyTorch 張量來調用範數函數:

如下代碼 10 所示,通過一個 TensorFlow 張量來調用範數函數:

此外,還需要注意一點,如果如上代碼 8 所示使用 EagerPy 張量來調用函數,則 ep.astensor 調用只會返回它的輸入。但是,最後一行代碼中的 result.raw 調用依然會提取底層原生張量。通常而言,實現的通用函數最好可以透明地操控任何原生張量和 EagerPy 張量,也就是說返回類型應該總是與輸入類型相匹配。

這在 Foolbox 等庫中非常有用,可以使用戶同時處理 EagerPy 和原生張量。

為此,EagerPy 提供上述轉換函數的兩種派生函數,分別是 ep.astensor_和 ep.astensors_,它們可以返回一個能夠恢復輸入類型的反轉函數。

如果 astensor_的輸入是一個原生張量,則 restore_type 等同於. raw;而如果原輸入是一個 EagerPy 張量,則 restore_type 將不會調用. raw。因此,我們可以編寫對任何輸入都透明的改進版框架無關通用函數,如下代碼 11 所示:

最後,如下代碼 12 所示,使用 ep.astensors_來轉換和恢復多個輸入:

相關焦點

  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    用儘可能簡單的方式,完成儘可能多的需求。通過約定的方式 實現統一的標準。告別加班,拒絕重複勞動,遠離搬磚概述"Rocket-API" 基於spring boot 的API敏捷開發框架,服務端50%以上的功能只需要寫SQL或者 mongodb原始執行腳本就能完成開發,另外30%也在不停的完善公共組件,比如文件上傳,下載,導出,預覽,分頁等等通過一二行代碼也能完成開發,剩下的20%也能依賴於動態編譯技術生成class的形式,不需要發布部署,不需要重啟來實現研發團隊的快速編碼
  • 基於Django和翻譯API實現web版的中英文對照翻譯(一)
    一番了解之後,決定選用谷歌翻譯/搜狗翻譯/有道翻譯官方提供的翻譯api自己實現一個web版的翻譯界面。目前搜狗翻譯/有道翻譯都已經開始收費,但收費的標準還可以讓人接受,以搜狗翻譯為例,現價:40.00/百萬字符。還是可以接受的。閒言少敘。直入正題。
  • 強力推薦:小學英語線上教學與課堂教學「起承轉接」的無縫銜接
    江麗華老師的銜接方案以《做好「起承轉接」,實現「無縫銜接」》為題,詳細介紹了學校六年級英語科組的具體做法,給人以啟發,催人以思考。教海無涯,共享是岸。真誠地感謝江麗華老師的分享。教學路漫漫,攜手永向前。江南一燭,願燭光照亮我,也照亮更多志同道合的您。
  • MMSegmentation:標準統一的語義分割框架
    在近幾年的會議中,語義分割的論文層出不窮,但是市面上一直缺乏一款能夠相對公平比較各種方法的框架。為了方便研究員和工程師們,OpenMMLab開源了一套基於 PyTorch 實現的標準統一的語義分割框架:MMSegmentation。在 MMSeg 下,研究員們復現和比較了很多語義分割的算法,並對訓練測試的超參進行了優化和統一,在精度,速度,穩定性等方面都超過目前開源的其他代碼庫。
  • 標準統一的語義分割框架
    在近幾年的會議中,語義分割的論文層出不窮,但是市面上一直缺乏一款能夠相對公平比較各種方法的框架。為了方便研究員和工程師們,我們開源了一套基於 PyTorch 實現的標準統一的語義分割框架:MMSegmentation。
  • api框架 web 最好的go_golang api框架 - CSDN
    所謂框架框架一直是敏捷開發中的利器,能讓開發者很快的上手並做出應用,甚至有的時候,脫離了框架,一些開發者都不會寫程序了。成長總不會一蹴而就,從寫出程序獲取成就感,再到精通框架,快速構造應用,當這些方面都得心應手的時候,可以嘗試改造一些框架,或是自己創造一個。
  • 加強證券領域「行刑銜接」
    第三,隨著我國資本市場的快速發展,證券期貨市場中不斷衍生出新型違法行為,但卻缺乏規制的法律依據。另一方面,在司法層面主要原因在於兩者在處罰種類和標準上差異較大,證明標準差異較大,案件的移送標準不好把握等。第一,證券處罰種類迥異,行政處罰措施中主要包括了申誡罰、財產罰、資格(能力)罰,刑事處罰主要包括監禁刑和罰金。
  • 深度學習框架簡史:TF和PyTorch雙頭壟斷,未來十年迎來黃金時期
    在此期間,所有深度學習框架都對多 GPU 訓練和分布式訓練進行了優化,提供了更加用戶直觀的 api,並衍生出了專門針對計算機視覺、自然語言處理等特定任務的 model zoo 和工具包。還值得注意的是,Francois Chollet 幾乎是獨自開發了 Keras 框架,該框架在現有框架(如 TensorFlow 和 MXNet)之上提供了神經網絡和構建塊的更直觀的高級抽象。
  • 審批實現「四統一」
    「提速」怎麼提?20個工作日以內;交通工程、水利工程項目審批時限減至90個工作日以內;省和設區市初步建成工程建設項目審批制度框架和信息數據平臺,並與國家工程建設項目審批管理系統對接。對於聯合驗收涉及的土地、規劃、房產等測繪工作,推行「多測合一」,由建設單位委託同一家測繪單位承擔,實行「一次委託、聯合測繪、成果共享」。  ●推行區域評估。
  • getty 發布,一個完全基於 java 實現的 aio 框架
    AIO的發布使得實現一套網絡通訊框架變得相對簡單。但如果你不努力,可能也無法理解哦。3、本人對netty比較喜歡,無論是其性能還是編程思想(JBOSS提供的一個java開源網絡框架,可以說是java網絡通訊裡的一哥,極其穩定和強大的性能使得被廣泛使用)4、有了netty為何還要自己造輪子?這裡有兩個原因,其一是本人就喜歡造輪子,這是病,改不了。
  • 長春龍嘉國際機場航拍,和高鐵無縫銜接
    長春龍嘉機場是東北唯一一座高鐵和機場無縫銜接的大型國際機場,可乘高鐵直達長春火車站、長春西站以及吉林火車站。
  • Restful Api-接口設計
    RESTful API特徵 (1) 每一個uri代表一種資源; (2) 客戶端和伺服器之間,傳遞這種資源的某種表現層; (3) 客戶端通過四個HTTP動詞(GET、POST、DELETE、PUT),對伺服器端資源進行操作,實現
  • 大慶API5L PSL2 X60無縫鋼管廠家產品澆注方式
    大慶API5LPSL2X60無縫鋼管廠家產品澆注方式   大慶API5L PSL2 X60無縫鋼管廠家產品澆注方式    球墨鑄鐵管因為其優異的特性主要表現,所做成的廚房用品十分火爆,不但表面美觀大方,並且堅固耐用,表面長期的明亮水平給人一種乾淨衛生的覺得
  • 理解RESTful API 架構設計規範與實踐
    第四章描述了設計 REST 的動機:「為 Web 應該如何運轉創建一種架構模型, 使之成為 Web 協議標準的指導框架」。第五章從一個沒有約束的空架構開始,不斷的添加約束,從而使此架構進化為 Web 所需要的架構。所以,REST 是一組架構約束。REST 約束包括:客戶-伺服器,無狀態,緩存,統一接口,分層系統,按需代碼。
  • 太原將迎來磁懸浮列車,與地鐵2號線無縫銜接!
    一起來了解一下磁懸浮列車是一種現代高科技軌道交通工具,它通過電磁力實現列車與軌道之間的無接觸的懸浮和導向,再利用直線電機產生的電磁力牽引列車運行。由於磁懸浮列車具有快速、低耗、環保、安全等優點,因此前景十分廣闊。
  • 線上線下無縫銜接,華為雲與三體雲共建在線教育直播課堂
    前不久,華為雲宣布與百餘家教育行業合作夥伴共同成立「隨時學教育聯盟」,一起為廣大師生提供便利可靠的優質在線教育學習資源和綜合教學教務管理服務,保障了學校與教育機構師生們教學任務的正常開展,切實實現了足不出戶就能「在線也高效,教學有保障「。
  • 熱力無縫供暖管道隨州生產廠家如何做到安全維護保養
    絲口接口處表面應處理乾淨。  輸水用DN100以下的小直徑內塗塑鋼管的連接,實際應用中多採用螺紋連接。塗塑鋼管在具有很多競爭優勢,主要有塗塑複合鋼管、煤礦井下用塗塑複合鋼管和內外塗塑鋼管等產品,這些產品在消費活動中利用比擬普遍。塗塑鋼管在裝置時能夠選擇管件銜接或者其他銜接方式,但是不能選擇焊接。
  • 宜昌API5L X42無縫鋼管廠家產品布置結構
    將直髮捲經切頭、切尾、裁邊及多道次的校直、整平等鑄軋線解決後,再切板或重卷,即變成:熱軋鋼、整平熱軋鋼卷、縱剖帶等商品。精密鋼管的冷拔與熱軋工藝講解。從總體情況看,無縫鋼管市場供大於求狀況雖略有緩解,但總體上仍是供大於求面。原燃無縫鋼管價格繼續下降,對無縫鋼管價格支撐作用進一步減弱12月份,鋼管生產用原燃材料價格繼續回落。Q345B無縫鋼管庫存保持低水平,後期市場壓力進一步減輕。
  • 詳解API網關核心功能和API管理擴展
    簡單來說API網關就是將所有的微服務提供的API接口服務能力全部匯聚進來,統一接入進行管理,也正是通過統一攔截,就可以通過網關實現對API接口的安全,日誌,限流熔斷等共性需求。如果再簡單說下,通過網關實現了幾個關鍵能力。
  • 考研英語短文寫作的三大基本要素:框架結構、連貫銜接和遣詞造句
    合理組織文章結構,使其內容統一、連貫; 4. 根據寫作目的和特定作者,恰當選用語域。這些要求無疑是明確的、全面的。然而,具體來看,我們應該分清楚基本要求和重點要求。所謂基本要求是指一般說來都能相當了解並達到的,例如關於寫作的拼寫和標點要正確。這是最低的要求,如果達不到,那就是沒有達到考試的最低門檻。