TVM自动调度器
TVM自動調度器
隨著模型大小,算子多樣性和硬件異構性的不斷增長,優化深度神經網絡的執行速度非常困難。從計算的角度來看,深度神經網絡只是張量計算的一層,又一層。這些張量計算(例如matmul和conv2d),可以通過數學表達式輕松描述。在現代硬件上,提供高性能的實現,可能會非常具有挑戰性。必須應用各種低級優化,利用特殊的硬件內在函數,實現高性能。建立線性代數和神經網絡加速庫(如CuBLAS,CuDNN,oneMKL和oneDNN),需要大量的工程工作。
如果可以編寫數學表達式,神奇地轉化為有效的代碼實現,開發將會更加輕松。深度學習編譯器TVM及搜索模塊AutoTVM,構建為實現此目標的第一步。AutoTVM使用基于模板的搜索算法,查找給定張量計算的有效實現。這是基于模板的方法,仍然需要域專家為每個平臺上的每個算子,實施非平凡的手動模板。TVM代碼存儲庫中的這些模板,有超過15,000行代碼。除了很難開發之外,這些模板通常效率低下,搜索空間有限,無法獲得最佳性能。
為了解決AutoTVM的局限性,啟動了Ansor項目,旨在實現用于生成張量計算代碼的,全自動自動調度器。Ansor自動調度器,僅將張量表達式作為輸入,無需手動模板,即可生成高性能代碼。在搜索空間構建和搜索算法方面,進行了創新。自動調度器,可以以更自動化的方式,更少的搜索時間,獲得更好的性能。
Ansor自動調度器,現已作為tvm.auto_scheduler軟件包,集成到Apache TVM中。這是來自加州大學伯克利分校,阿里巴巴,AWS和OctoML的合作者的共同努力。可在TVM網站上,獲得有關Intel CPU,ARM CPU,NVIDIA GPU和Mali GPU的詳細教程。本文將進行簡要介紹,顯示一些基準測試結果。
系統總覽
AutoTVM與自動調度器
表1.工作流比較
表1比較了在AutoTVM和自動調度器中,為算子生成代碼的工作流。在AutoTVM中,開發人員必須經歷三個步驟。
在步驟1中,開發人員必須使用TVM的張量表達語言,編寫計算定義。這部分相對容易,TVM的張量表達式語言,看起來就像數學表達式一樣。
在步驟2中,開發人員必須編寫一個調度模板,該模板通常由20-100行棘手的DSL代碼組成。這部分需要目標硬件體系結構和算子語義的領域專業知識,很困難。
在步驟3中,通過搜索算法自動執行。
在自動調度程序中,通過自動搜索空間構建,消除了最困難的步驟2,使用更好的搜索算法,加速步驟3。通過自動搜索空間構建,不僅消除了巨大的人工工作,還可以探索更多的優化組合。這種自動化非免費提供,因為仍然需要調度規則,生成搜索空間,這些規則非常籠統。基于張量表達式的靜態分析,設計一些通用規則,應用于深度學習中,幾乎所有的張量計算。
搜索過程
圖1.搜索過程概述
圖1.顯示了優化整個神經網絡時,自動調度器的搜索過程。該系統將深度學習模型作為輸入。使用Relay的算子融合遍歷,將大模型劃分為小子圖。任務調度器,用于分配時間資源,優化許多子圖。在每次迭代中,都會選擇一個最有可能,提高端到端性能的子圖。對于此子圖,分析其張量表達式為生成幾個草圖。使用學習成本模型運行,進化搜索,獲取一批優化程序。優化程序將發送到實際硬件,進行測量。測量完成后,分析結果將用作反饋,更新系統的所有組件。反復重復,直到優化收斂,或用完時間預算為止。
由于自動調度器從頭開始生成調度器,會重用TOPI中的現有計算定義,但不會重用調度器模板。
基準結果
對AutoTVM和Auto-scheduler的性能進行基準測試。CPU基準測試是在AWS c5.9xlarge上完成的,該c5.9xlarge配備了Intel 18核skylake 8124-m CPU。GPU基準測試是在配備了NVIDIA T4 GPU的AWS g4dn.4xlarge上完成的。所有的基準代碼,原始數據,調整日志,都可以在此倉庫中找到。
生成代碼的性能
在三個網絡上,對fp32單批推理延遲,進行了基準測試。圖2顯示了相對于AutoTVM的自動調度器的相對加速。在所有情況下,自動調度器的性能,都比AutoTVM高出1.02倍至8.95倍。這是因為自動調度器會探索更大的搜索空間,涵蓋了TOPI手動模板中,遺漏的更有效的優化組合。BERT-base @ GPU是極端情況,手動模板的設計非常糟糕。對于BERT模型中的形狀,用于密集層的手動模板,效果不佳。
圖2.代碼性能比較(越高越好)
搜索時間
眾所周知,基于搜索的方法可能非常耗時,關心搜索時間。讓搜索收斂到單個神經網絡,通常需要幾個小時。圖3比較了AutoTVM和自動調度程序的搜索時間。盡管自動搜索程序的搜索空間較大,在大多數情況下,收斂所需的時間要少得多。這主要是因為自動調度器,具有更好的成本模型和任務調度器。
圖3.搜索時間比較(越低越好)
更多結果
上面的存儲庫用作TVM的,內部基準測試工具,僅比較了最新的AutoTVM和AutoScheduler。還嘗試了在Apple M1芯片上,進行自動調度,獲得了一些不錯的結果。
結論
構建了TVM自動調度器,該系統會自動為張量表達式,生成高性能代碼。與以前的AutoTVM相比,自動調度器,不需要手動模板。自動調度器能夠在較短的時間內,生成具有更好性能的調度器。通過在搜索空間構建和搜索算法方面,進行創新實現這一目標。
對自動調度器的當前性能感到興奮。有興趣擴展自動調度器的功能,更好地支持稀疏運算符,低精度運算符和動態形狀。
總結
- 上一篇: 将代码生成器带入TVM
- 下一篇: TinyML-TVM如何驯服TinyML