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

2021-01-20 機器之心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 版本更新,基於 Spring Boot 的 API 敏捷開發框架
    引擎重複創建引起的內存溢出問題 處理大小寫轉換 修改擴展自定義分頁時異常問題 處理 mongo 下 findAll 返回數據最多 101 條記錄問題 處理 #{${}} 變量值篏套問題 db.count() 計數優化 添加全局變量 Utils 中的 pasreToString, pasreToObject 方法來實現對象與
  • 蘋果HomePod mini國內正式開售,S5處理器實現多設備無縫銜接
    經過了一個多月的等待,HomePod mini 國行版終於在12月1日正式開售。HomePod mini 相比上代產品 HomePod 雖然依舊保持著相同的設計風格,但在產品大小、功能配置等方面都有著很大的不同。機身採用了圓形造型,表面無縫式織網包裹,整體高度不足9釐米;音箱頂部背光觸控板,可以根據語音互動產生不同的色彩波動。
  • 國產統一 AI 開源框架來了!|文末福利
    在這種情況下,韓堃和團隊開始思考:如果能把各種模型算法納入統一的框架下,將會加速算法開發迭代,也能促進團隊更好的合作。於是技術團隊對自然語言理解的代碼進行整體重構,把各種模型算法用一套系統統一起來,使代碼易用易讀易開發。在開發過程中,他們發現這套系統對於滴滴外部也是很有價值的,於是開始考慮把代碼開源,並朝這一方面努力。
  • 《看門狗》展示其"無縫銜接"多人聯機模式
    看門狗開發組近期解釋《看門狗》這款遊戲不像一般遊戲那樣分為傳統的多人模式和單人模式,而是更為「無縫銜接」的一種體驗模式。   「我們並不區分單人模式和多人模式。」遊戲首席設計師Danny Belanger在育碧的博客中發文說道。「這種在線模式是無縫銜接的,不然的話會破壞你的遊戲體驗。」
  • magic-api 0.4.7 發布,接口快速開發框架
    高亮 優化Loading界面 優化部分邏輯,支持JDK9+ 優化內部代碼,DatabaseQuery 重命名為 SQLExecutor項目介紹magic-api是一個基於Java的接口快速開發框架,通過magic-api提供的UI界面完成編寫接口,無需定義Controller、Service、Dao、Mapper、XML、VO等Java對象即可完成常見的HTTP API接口開發使用方式maven引入
  • 楊峰:多組合新型框架結構體系及建造技術
    楊峰:寧波優造建築科技有限公司總經理分享題目:《多組合新型框架結構體系及建造技術》建造業是我國國民經濟的支柱產業和重要引擎,將「傳統建造」向「智慧建造」轉型,對提高我國建造行業生產效率,拓展工程建造價值鏈、改造產業結構形態起到重要作用。
  • 蘭州新區無水港實現與全球航線無縫銜接
    >西北國際木材交易中心揭牌落成儀式在蘭州新區中川北站物流園舉行此次中遠海運貨櫃中川北聯運場站的成立,標誌著蘭州新區中川北站成功納入中遠海運國際聯運路徑,且成為甘肅省唯一的站點,這不僅實現了蘭州新區無水港與全球航線的無縫銜接
  • 無縫銜接院線!《閃光少女》獨家上線愛奇藝電影
    無縫銜接院線!《閃光少女》獨家上線愛奇藝電影 《閃光少女》無縫銜接院線獨家上線愛奇藝電影融合了「青春」「勵志」「音樂」「二次元」等元素的《閃光少女》,講述了民族樂器專業的「神經質」少女陳驚與小夥伴們組成2.5次元民樂樂隊,並且大戰西洋樂的勵志青春故事。
  • 深度學習框架簡史:TF和PyTorch雙頭壟斷,未來十年迎來黃金時期
    在此期間,所有深度學習框架都對多 GPU 訓練和分布式訓練進行了優化,提供了更加用戶直觀的 api,並衍生出了專門針對計算機視覺、自然語言處理等特定任務的 model zoo 和工具包。還值得注意的是,Francois Chollet 幾乎是獨自開發了 Keras 框架,該框架在現有框架(如 TensorFlow 和 MXNet)之上提供了神經網絡和構建塊的更直觀的高級抽象。
  • 小劇場京劇的啟示 京劇如何與當代無縫銜接
    小劇場京劇的啟示 京劇如何與當代無縫銜接 2020-12-02 10:29:57 參與互動   小劇場京劇《一蓑煙雨》的啟示  京劇如何與當代無縫銜接
  • 出行高效銜接 服務觸手可及
    羊城通董事長、總經理謝振東介紹,下一步廣州將以乘車碼、電子車票為連接器,將各種交通模式整合到統一的服務體系中,使用統一的數字交互界面來管理,並以出行者需求為核心進行資源動態配置,提供多模式無縫銜接的高品質出行服務。在匹配出行需求方面,還要精準定位MaaS服務的目標群體。
  • 太原將迎來磁懸浮列車,與地鐵2號線無縫銜接!
    太原將迎來磁懸浮列車,與地鐵2號線無縫銜接!一起來了解一下⬇️⬇️⬇️磁懸浮列車是一種現代高科技軌道交通工具,它通過電磁力實現列車與軌道之間的無接觸的懸浮和導向,再利用直線電機產生的電磁力牽引列車運行。由於磁懸浮列車具有快速、低耗、環保、安全等優點,因此前景十分廣闊。
  • F-35B可與「伊莉莎白女王」號航母「無縫銜接」
    (原標題:美英軍人稱F-35B可與「伊莉莎白女王」號航母「無縫銜接」)
  • 新沂港「公鐵水」無縫銜接
    據了解,目前新沂港已實現了「公鐵水」無縫銜接,為亞威公司、斯爾克、東方雨虹、中新鋼鐵等地方知名企業和部分淮海經濟區周邊企業服務,為「六穩」「六保」作出了實質性貢獻。「我們現在的貨櫃吞吐量已經恢復到了疫情前的正常水平。據初步統計,5月份以來,新沂港的貨櫃吞吐量已經達到了1200標箱。」新沂港相關負責人告訴記者。
  • 手擼rpc框架,並基於spring進行二次註解開發
    這是我返回給你的結果";該框架包括簡單示例都已上傳至github,連結自取:自定義rpc框架三、自定義rpc框架(一)、代碼架構rpc_apirpc_client:自定義rpc框架客戶端部分,實現了rpc客戶端部分邏輯。
  • 從鼬神到月火,如何無縫銜接?就要從一隻鳥說起
    又到了動漫閒聊(shui)時間,不管是你觀看影視作品還是MAD,總會遇到一些非常厲害的分鏡切換,尤其是那種無縫銜接,絲滑般的感覺永遠讓人百看不膩,不過這對於作品原創者來說很簡單做到,畢竟所有攝影機與素材都掌握在他們手上,而進行二創的人就存在一定難度,只能拿著現成的作品,你想做無縫銜接就相當費時。
  • 成毅《長安諾》無縫銜接,《琉璃》終於急了
    沒有頂流,沒有大牌,小琉璃完全是靠劇情、演技實現了低開高走,還是在宣發拉後腿的情況下。 早在琉璃上線時,就鬧了一出酷和芒果解約的熱搜。 而之後宣發更是慘不忍睹,前期熱搜幾乎上不去,詞條從來都只是劇名。
  • 北京闢謠9月1日前不開學 4月13日起將實現「線上線下」無縫銜接
    同時,從4月13日起,北京春季學期將實現「線上線下」無縫銜接,建立與疫情防控常態化相適應的課程教學機制。近期,市委教育工委、市教委將公布具體開學時間,請大家以官方微信公號「首都教育」等權威發布為準,不造謠、不信謠、不傳謠!
  • 精準施策 實現產業扶貧與產業振興有效銜接
    丁愛群黨的十九屆五中全會提出,要「實現鞏固拓展脫貧攻堅成果同鄉村振興有效銜接」。產業扶貧是脫貧攻堅的關鍵,產業振興是鄉村振興的重點,推進產業扶貧與產業振興相銜接,是脫貧攻堅與鄉村振興有效銜接的核心任務,需要及時謀劃、精準施策、創新推進。
  • smart-doc 2.0.1 發布,Java 零註解 API 文檔生成工具
    ,smart-doc顛覆了傳統類似swagger這種大量採用註解侵入來生成文檔的實現方法。 輕易實現在Spring Boot服務上在線查看靜態HTML5 api文檔。 開放文檔數據,可自由實現接入文檔管理系統。 一款代碼注釋檢測工具,不寫注釋的小夥伴逃不過法眼了。 插件式快速集成(支持maven和gradle插件)。 支持Apache Dubbo rpc文檔生成。