原標題:Glue and coprocessor architectures
作者:Vitalik,以太坊創始人;編譯:鄧通,金色財經
特別感謝 Justin Drake、Georgios Konstantopoulos、Andrej Karpathy、Michael Gao、tarun Chitra 和各種 Flashbots 貢獻者提供的反饋和評論。
如果您以中等程度的細節分析現代世界中正在進行的任何資源密集型計算,您會一次又一次發現的一個特點是,計算可以分為兩個部分:
- 相對少量的複雜但計算量不大的「業務邏輯」;
- 大量密集但高度結構化的「昂貴工作」。
實踐中這種不同方式的例子有哪些?
首先,讓我們了解一下我最熟悉的環境:以太坊虛擬機 (EVM)。 這是我最近進行的以太坊交易的 geth 調試跟蹤:在 ENS 上更新我的博客的 IPFS 哈希。 該交易總共消耗了 46924 gas,可以按以下方式分類:- 基本成本:21,000
- 調用數據:1,556
- EVM 執行:24,368
- SLOAD 操作碼:6,400
- SSTORE 操作碼:10,100
- LOG 操作碼:2,149
- 其他:6,719
ENS 哈希更新的 EVM 跟蹤。 倒數第二列是 gas 消耗。
這個故事的寓意是:大部分執行(如果僅看 EVM,則約為 73%,如果包括涵蓋計算的基本成本部分,則約為 85%)集中在極少數結構化的昂貴操作中:存儲讀寫、日誌和加密(基本成本包括 3000 用於支付簽名驗證,EVM 還包括 272 用於支付哈希)。 其餘執行是「業務邏輯」:換 calldata 的位以提取我試圖設置的記錄的 ID 和我將其設置為的哈希,等等。 在代幣轉移中,這將包括添加和減去餘額,在更高級的應用程序中,這可能包括循環,等等。
在 EVM 中,這兩種執行形式以不同的方式處理。 高級業務邏輯用更高級的語言編寫,通常是 Solidity,它可以編譯到 EVM。 昂貴的工作仍然由 EVM 操作碼(SLOAD 等)觸發,但 99% 以上的實際計算是在直接在客戶端代碼(甚至是庫)內部編寫的專用模塊中完成的。
為了加強對這種模式的理解,讓我們在另一個背景下探索它:使用 torch 用 python 編寫的 AI 代碼。
變壓器模型的一個塊的前向傳遞
我們在這裡看到了什麼? 我們看到了用 Python 編寫的相對少量的「業務邏輯」,它描述了正在執行的操作的結構。 在實際應用中,還會有另一種類型的業務邏輯,它決定了諸如如何獲取輸入以及對輸出執行的操作等細節。 但是,如果我們深入研究每個單獨的操作本身(self.norm、torch.cat、+、*、self.attn 內部的各個步驟……), 我們會看到矢量化計算:相同的操作並行計算大量值。 與第一個示例類似,一小部分計算用於業務邏輯,大部分計算用於執行大型結構化矩陣和向量運算 -- 事實上,大多數只是矩陣乘法。
就像在 EVM 示例中一樣,這兩種類型的工作以兩種不同的方式處理。 高級業務邏輯代碼是用 Python 編寫的,這是一種高度通用和靈活的語言,但也非常慢,我們只是接受低效率,因為它只涉及總計算成本的一小部分。 同時,密集型操作是用高度優化的代碼編寫的,通常是在 GPU 上運行的 CUDA 代碼。 我們甚至越來越多地開始看到 LLM 推理在 ASIC 上進行。
現代可編程密碼學,如 SNARK,在兩個層面上再次遵循類似的模式。 首先,證明器可以用高級語言編寫,其中繁重的工作是通過矢量化操作完成的,就像上面的 AI 示例一樣。 我在這裡的圓形 STARK 代碼展示了這一點。 其次,在密碼學內部執行的程序本身可以以一種在通用業務邏輯和高度結構化的昂貴工作之間進行劃分的方式編寫。
要了解其工作原理,我們可以看看 STARK 證明的最新趨勢之一。 為了通用且易於使用,團隊越來越多地為廣泛採用的最小虛擬機(如 RISC-V)構建 STARK 證明器。 任何需要證明執行情況的程序都可以編譯成 RISC-V,然後證明者可以證明該代碼的 RISC-V 執行情況。
來自 RiscZero 文檔的圖表
這非常方便:這意味著我們只需要編寫一次證明邏輯,從那時起,任何需要證明的程序都可以用任何「傳統」編程語言編寫(例如 RiskZero 支持 Rust)。 但是,有一個問題:這種方法會產生很大的開銷。 可編程加密已經非常昂貴;在 RISC-V 解釋器中增加運行代碼的開銷太多了。 因此,開發人員想出了一個竅門:確定構成大部分計算的特定昂貴操作(通常是哈希和簽名),然後創建專門的模塊來非常有效地證明這些操作。 然後,您只需將低效但通用的 RISC-V 證明系統和高效但專業的證明系統結合在一起,就可以兩全其美。
除了 ZK-SNARK 之外的可編程加密,例如多方計算 (MPC) 和完全同態加密 (FHE),可能會使用類似的方法進行優化。
總體來說,現象是怎樣的?
現代計算越來越多地遵循我所說的粘合和協處理器架構:你有一些中央「粘合」組件,它具有高通用性但效率低,負責在一個或多個協處理器組件之間傳送數據,這些協處理器組件具有低通用性但效率高。這是一種簡化:在實踐中,效率和通用性之間的權衡曲線幾乎總是有兩個以上的層次。 GPU 和其他在行業中通常被稱為「協處理器」的芯片不如 CPU 通用,但比 ASIC 通用。 專業化程度的權衡很複雜,這取決於對算法的哪些部分在五年後仍將保持不變,哪些部分在六個月後會發生變化的預測和直覺。 在 ZK 證明架構中,我們經常看到類似的多層專業化。 但對於廣泛的思維模型,考慮兩個層次就足夠了。 在許多計算領域都有類似的情況:
從上述例子來看,計算當然可以以這種方式分割,這似乎是一種自然法則。 事實上,你可以找到幾十年來計算專業化的例子。 然而,我認為這種分離正在增加。 我認為這是有原因的:
我們最近才達到 CPU 時鐘速度提升的極限,因此只有通過並行化才能獲得進一步的收益。 但是,並行化很難推理,因此對於開發人員來說,繼續按順序推理並讓並行化在後端發生往往更為實際,並包裝在為特定操作構建的專用模塊中。
計算速度最近才變得如此之快,以至於業務邏輯的計算成本已經變得真正可以忽略不計。 在這個世界中,優化業務邏輯運行的 VM 以達到計算效率以外的目標也是有意義的:開發人員友好性、熟悉性、安全性和其他類似目標。 同時,專用的「協處理器」模塊可以繼續為效率而設計,並從它們與粘合劑的相對簡單的「接口」中獲得其安全性和開發人員友好性。
最重要的昂貴操作是什麼變得越來越清晰。 這在密碼學中最為明顯,其中最有可能使用哪些類型的特定昂貴操作:模數運算、橢圓曲線線性組合(又稱多標量乘法)、快速傅里葉變換等等。 在人工智能中,這種情況也變得越來越明顯,二十多年來,大部分計算都是「主要是矩陣乘法」(儘管精度水平不同)。 其他領域也出現了類似的趨勢。 與 20 年前相比,(計算密集型)計算中的未知未知數要少得多。
這意味著什麼?
一個關鍵點是,膠合器應優化以成為好的膠合器,而協處理器也應優化以成為好的協處理器。 我們可以在幾個關鍵領域探索這一點的含義。EVM區塊鏈虛擬機(例如 EVM)不需要高效,只需要熟悉即可。 只需添加正確的協處理器(又稱「預編譯」),低效 VM 中的計算實際上可以與本機高效 VM 中的計算一樣高效。 例如,EVM 的 256 位寄存器所產生的開銷相對較小,而 EVM 的熟悉度和現有開發者生態系統帶來的好處是巨大且持久的。 優化 EVM 的開發團隊甚至發現,缺乏並行化通常不是可擴展性的主要障礙。
改進 EVM 的最佳方法可能只是 (i) 添加更好的預編譯或專用操作碼,例如 EVM-MAX 和 SIMD 的某種組合可能是合理的,以及 (ii) 改進存儲布局,例如,verkle 樹的更改作為副作用,大大降低了訪問彼此相鄰的存儲槽的成本。
以太坊 Verkle 樹提案中的存儲優化,將相鄰的存儲密鑰放在一起並調整 gas 成本以反映這一點。 像這樣的優化,加上更好的預編譯,可能比調整 EVM 本身更重要。
安全計算和開放硬件在硬件層面上提高現代計算安全性的一大挑戰是其過於復雜和專有的性質:芯片設計為高效,這需要專有優化。 後門很容易隱藏,側信道漏洞不斷被發現。
人們繼續從多個角度努力推動更開放、更安全的替代方案。 一些計算越來越多地在受信任的執行環境中完成,包括在用戶的手機上,這已經提高了用戶的安全性。 推動更開源的消費硬件的行動仍在繼續,最近取得了一些勝利,比如運行 Ubuntu 的 RISC-V 筆記本電腦。
運行 Debian 的 RISC-V 筆記本電腦
然而,效率仍然是一個問題。 上述鏈接文章的作者寫道:
RISC-V 等較新的開源芯片設計不可能與已經存在並經過數十年改進的處理器技術相媲美。 進步總有一個起點。
更偏執的想法,比如這種在 FPGA 上構建 RISC-V 計算機的設計,面臨著更大的開銷。 但是,如果膠合和協處理器架構意味著這種開銷實際上並不重要,那會怎樣? 如果我們接受開放和安全芯片將比專有芯片慢,如果需要甚至放棄推測執行和分支預測等常見優化,但試圖通過添加(如果需要,專有)ASIC 模塊來彌補這一點,這些模塊用於最密集的特定類型的計算,那會怎樣? 敏感計算可以在「主芯片」中完成,該芯片將針對安全性、開源設計和側信道阻力進行優化。 更密集的計算(例如 ZK 證明、AI)將在 ASIC 模塊中完成,這將了解有關正在執行的計算的更少信息(可能,通過加密盲化,在某些情況下甚至可能為零信息)。
密碼學另一個關鍵點是,這一切都對密碼學,尤其是可編程密碼學成為主流非常樂觀。 我們已經在 SNARK、MPC 和其他設置中看到了一些特定的高度結構化計算的超優化實現:某些哈希函數的開銷僅比直接運行計算貴幾百倍,而且人工智能(主要是矩陣乘法)的開銷也非常低。 GKR 等進一步的改進可能會進一步降低這一水平。 完全通用的 VM 執行,特別是在 RISC-V 解釋器中執行時,可能會繼續產生大約一萬倍的開銷,但出於本文中描述的原因,這並不重要:只要使用高效的專用技術分別處理計算中最密集的部分,總開銷就是可控的。
矩陣乘法專用 MPC 的簡化圖,這是 AI 模型推理中最大的組件。 請參閱本文了解更多詳細信息,包括如何保持模型和輸入的私密性。
「膠合層只需要熟悉,不需要高效」這一想法的一個例外是延遲,以及在較小程度上的數據帶寬。 如果計算涉及對同一數據進行數十次重複的繁重操作(就像密碼學和人工智能一樣),那麼由低效膠合層導致的任何延遲都可能成為運行時間的主要瓶頸。 因此,膠合層也有效率要求,儘管這些要求更為具體。
結論
總體而言,我認為上述趨勢從多個角度來看都是非常積極的發展。首先,這是在保持開發人員友好性的同時最大化計算效率的合理方法,能夠同時獲得更多兩者對每個人都有好處。特別是,通過在客戶端實現專業化以提高效率,它提高了我們在用戶硬件本地運行敏感且性能要求高的計算(例如 ZK 證明、LLM 推理)的能力。其次,它創造了一個巨大的機會之窗,以確保對效率的追求不會損害其他價值,最明顯的是安全性、開放性和簡單性:計算機硬件中的側通道安全性和開放性、降低 ZK-SNARK 中的電路複雜性以及降低虛擬機中的復雜性。 從歷史上看,對效率的追求導致這些其他因素退居次要地位。 有了膠合和協處理器架構,它不再需要。 機器的一部分優化效率,另一部分優化通用性和其他價值,兩者協同工作。這一趨勢對密碼學也非常有利,因為密碼學本身就是「昂貴的結構化計算」的一個主要例子,而這一趨勢加速了這一趨勢的發展。 這為提高安全性又增加了一個機會。 在區塊鏈世界中,安全性的提高也成為可能:我們可以少擔心虛擬機的優化,而更多地關注優化預編譯和與虛擬機共存的其他功能。
第三,這一趨勢為規模較小、較新的參與者提供了參與的機會。如果計算變得不那麼單一,而更加模塊化,這將大大降低進入門檻。 即使使用一種類型的計算的 ASIC,也有可能有所作為。 在 ZK 證明領域和 EVM 優化中也是如此。 編寫具有近乎前沿水平效率的代碼變得更加容易和易於訪問。 審計和形式化驗證此類代碼變得更加容易和易於訪問。 最後,由於這些非常不同的計算領域正在趨同於一些共同模式,因此它們之間有更多的協作和學習空間。