多級別堆棧不是問題谷歌開源全新中介碼與編譯器框架MLIR
為了更好解決TensorFlow 用戶在使用不同種類的硬件(GPU、TPU、移動設備)時,由於多級別堆棧而導致的編譯器與運行時錯誤,谷歌近日開源了一個全新的中介碼與編譯器框架MLIR 。在過去,若想解決多級別堆棧問題,則需要我們構建新的軟硬件堆棧生成器,這也意味著必須為每個新路徑重新構建優化與轉換傳遞。
TensorFlow 能夠以多種不同的方式運行,如:
- 將其發送至調用手寫運算內核的TensorFlow 執行器
- 將圖轉化為XLA 高級優化器(XLA HLO) 表示,反之,這種表示亦可調用適合CPU 或GPU 的LLVM 編輯器,或者繼續使用適合TPU 的XLA。(或者將二者結合!)
- 將圖轉化為TensorRT、nGraph 或另一種適合特定硬件指令集的編譯器格式
- 將圖轉化為TensorFlow Lite 格式,然後在TensorFlow Lite 運行時內部執行此圖,或者通過Android 神經網絡API (NNAPI) 或相關技術將其進一步轉化,以在GPU 或DSP 上運行
谷歌的MLIR(或稱為多級別中介碼)是一種表示格式和編譯器實用工具庫,介於模型表示和低級編譯器/執行器(二者皆可生成硬件特定代碼)之間,在生產質量組件的支持下,能夠對優化編譯器設計與實現進行全新探索。據了解,MLIR 深受LLVM 的影響,並不折不扣地重用其許多優秀理念,比如擁有靈活的類型系統,可在同一編譯單元中表示、分析和轉換結合多層抽象的圖等——這些抽象包括TensorFlow 運算、嵌套的多面循環區域乃至LLVM 指令和固定的硬件操作及類型。
MLIR 沒有眾所周知的固定或內置的操作列表(無“內聯函數”)。方言可完全定義自定義類型,即MLIR 如何對LLVM IR 類型系統(擁有一流匯總)、域抽象(對量化類型等經機器學習(ML) 優化的加速器有著重要意義),乃至未來的Swift 或Clang 類型系統(圍繞Swift 或Clang 聲明節點而構建)進行建模。
另外值得一提的是,雖然MLIR 充當ML 的編譯器,但它同樣支持在編譯器內部使用機器學習技術。MLIR 的擴展性有助於探索代碼降階策略,並在抽象之間執行逐步降階。
具體開源鏈接:
GitHub 代碼庫
https://github.com/tensorflow/mlir
教程
https://github.com/tensorflow/mlir/blob/master/g3doc/Tutorials/Toy/Ch-1.md
演講稿
https://drive.google.com/file/d/1hUeAJXcAXwz82RXA5VtO5ZoH8cVQhrOK/view