Byron Cook,亞馬遜雲科技自動推理副總裁及傑出科學家

編者按:亞馬遜雲科技是唯一一家如此大規模使用自動推理的雲提供商。隨著越來越多的人使用自動推理工具,這讓我們在提升自動推理工具的可用性和可擴充套件性上更容易進行大量的投入。我們發現自動推理工具越易於使用,它們的功能就會變得越強大,同時自動推理工具的採用率也會變得越高。我們能證明雲基礎設施的正確性對於那些看重安全的客戶而言我們的越有吸引力。正如本文所述,透過自動推理,我們不僅能夠提高安全性,還能更快地為客戶提供更高效能的程式碼,並最終節省客戶的成本。

在亞馬遜雲科技應用自動推理的10多年時間裡,我們發現經過驗證的程式碼通常比它所替代的未經驗證的程式碼效能更好。

這主要是因為在驗證過程中我們所做的bug修復通常會提升程式碼的執行效能。自動推理讓開發人員有信心去探索額外的最佳化,進一步提升系統效能。我們發現驗證的程式碼更容易更新、修改和操作,這減少了半夜的日誌分析和除錯環節。

自動推理的基本概念

在亞馬遜雲科技,我們努力為客戶構建簡單、易用的服務。但在這種簡單的背後卻是龐大、複雜的分散式系統,每秒處理著數十億個請求。驗證這些複雜系統的正確性是一個極大的挑戰。我們的服務隨著新功能的增加、元件的重新設計、安全的增強和效能的最佳化,一直處於不斷變化和發展的狀態。很多變化本身就是非常複雜的,必須在不影響亞馬遜雲科技本身或客戶的安全性和韌性的前提下進行。

設計評審、程式碼審計、壓力測試和故障注入是我們經常以及未來都會一直使用的寶貴工具。然而,我們發現仍然需要使用額外的技術來確認許多情況下的正確性。細微的bug仍可能逃過檢測,尤其是在大規模、容錯架構中。有些問題甚至可能源於最初的系統設計,而不是實施缺陷。隨著我們服務規模和複雜性的增長,我們不得不使用基於數學和邏輯的更強大技術作為對傳統測試方法的補充。這就是人工智慧(AI)的一個分支自動推理發揮作用的地方。

傳統測試側重於在特定場景下驗證系統行為,而自動推理旨在使用邏輯來驗證系統在任何可能場景下的行為。即使是一箇中等複雜的系統,要重現可能發生的每一種可能狀態和引數的組合,所需的時間也是難以想象的。自動推理可以透過計算系統正確性的邏輯證明來快速、高效地取得相同的效果。

使用自動推理需要我們的開發者具有不同的思維方式。我們不是試圖考慮所有可能的輸入場景及其可能出錯的方式,而是定義系統應該如何工作,並識別出讓它正確執行必須滿足的條件。然後,我們可以使用數學證明來驗證這些條件是否為真。換句話說,我們可以驗證系統是否正確。

自動推理將系統的規範和實施以數學的形式進行稽核,然後使用演算法來驗證系統的數學表示是否滿足規範。透過把我們的系統編碼為數學系統,並使用形式邏輯對其進行推理,自動推理使我們能夠有效和權威地解答有關係統未來行為的關鍵問題。系統能做什麼?它將做什麼?它永遠不會做什麼?自動推理可以幫助回答系統的這些問題,即便是最複雜的、大規模的和潛在無限的系統——這些場景是單單透過傳統測試無法徹底驗證的。

自動推理能讓我們達到完美的程度嗎?不能,因為它仍然依賴於對系統元件的正確行為以及系統與其環境模型之間關係的某些假設。例如,系統模型可能錯誤地假設底層元件(如編譯器和處理器)沒有任何bug(儘管也可以對這些元件進行驗證)。話雖如此,與使用傳統軟體開發和測試方法相比,自動推理讓我們更有信心達到正確性。

更快的開發

自動推理不僅僅是數學家和科學家的工具。我們的 Amazon Simple Storage Service (Amazon S3) 工程師每天都在使用自動推理來防止bug。S3的背後是世界上最大、最複雜的分散式系統之一,它儲存了400萬億個物件、EB級別的資料並通常需要每秒處理1.5億個請求。S3由許多子系統組成,這些子系統本身就是分散式系統,其中許多由數萬臺機器組成。S3一直不斷增加新的功能,同時它也被我們的客戶大量使用中。

S3索引子系統是S3的一個關鍵元件,它是一個物件後設資料儲存,來支援快速的資料查詢。該元件包含一個非常大的、複雜的資料結構和精密的最佳化演算法。以S3的這種大規模,這些演算法對於人類來說很難正確使用,同時我們也不能容許S3在查詢時發生任何錯誤,為此我們大約每個季度都會進行新的改進,但任何更改都是在極其謹慎和大量測試的前提下進行的。

基於我們15年的經驗,S3是一個構建良好以及經過充分測試的系統。然而,我們曾一度無法確認S3索引子系統中一個bug的根本原因。該系統能夠從異常中自動恢復,因此該bug的存在並沒有影響系統的行為。但我們並不滿足於此。

為什麼這個bug存在這麼久?像S3這樣的分散式系統擁有大量元件,每個元件都有自己的異常情況(corner cases),而且有可能同時發生很多異常情況。就S3而言,它擁有超過300個微服務,這些異常情況的潛在組合的數量是巨大的。即使開發人員有證據證明bug存在,並可能知道引起bug的根本原因,但對於開發人員來說,他們不可能考慮到所有異常情況,更不用說這些異常情況的不同組合了。

這種複雜性促使我們探索如何使用自動推理來探索可能隱藏在這些狀態中的可能狀態和錯誤。透過構建系統的正式規範,我們能夠找到bug並證明未來不存在此類bug。使用自動推理也讓我們有信心每一兩個月釋出一次更新和改進,而不是一年只發布三或四次。

更快的程式碼

Amazon Identity and Access Management (IAM)服務的正確性是確保我們客戶工作負載安全的基礎。每個傳送到亞馬遜雲科技的請求即每個API 呼叫都由IAM授權引擎處理,這會涉及到數百萬客戶、數千種資源型別和數百種亞馬遜雲科技的服務。這種請求每秒就超過12億次。這是亞馬遜雲科技中對安全要求最高以及需要高度擴充套件的軟體之一。

在亞馬遜雲科技,任何改變在進入到生產環境之前,我們需要有極高的信心確保系統保持安全和正確。使用自動推理,我們可以證明我們的系統在幾乎所有情況下遵守特定的安全屬性。我們稱之為可證明的安全性。自動推理不僅使我們能夠為客戶提供可證明的安全保證,還讓我們能夠大規模交付功能、安全性和最佳化。

與S3一樣,IAM在過去超過15年時間裡,已經成為一個經過時間考驗的、值得信賴的系統。但我們想進一步提高標準。我們構建了一個正式規範來捕獲現有IAM授權引擎的行為,將其策略評估原則編碼為可證明的定理,並使用自動推理構建了一個新的、更高效的實施。今年早些時候,我們部署了新的經過證明正確的授權引擎——沒人注意到。自動推理使我們能夠無縫地用經證明正確的替換物代替授權引擎,一個最關鍵的亞馬遜雲科技基礎設施之一。

有了規範和證明,我們可以很有信心的安全、積極地最佳化程式碼。在IAM的大規模下,每一微秒的效能改進都意味著更好的客戶體驗和我們自身更好的成本最佳化。我們最佳化了字串匹配、刪除了不必要的記憶體分配和冗餘計算、加強了安全性並提高了可擴充套件性。每次更新後,我們都會再次執行證明,來確認系統仍在正確執行。

現在,最佳化後的IAM授權引擎相比之前快了50%。如果不使用自動推理,我們根本不可能這麼有信心地進行如此重要的最佳化。

更快的程式碼部署

大多數線上安全交易都受到加密保護。例如,RSA加密演算法透過生成兩個金鑰來保護資料:一個用於加密資料,另一個用於解密資料。這些金鑰實現了安全的資料傳輸以及安全的數字簽名。在加密這種場景下,正確性和效能至關重要——加密演算法中的一個bug可能是災難性的。

隨著亞馬遜雲科技客戶將工作負載遷移到Amazon Graviton上,針對ARM指令集的密碼最佳化的好處也得到凸顯。但是,透過加密最佳化獲得更好的效能是很複雜的,這使得驗證修改後的加密演算法是否正常執行變得困難。在我們開始使用自動推理之前,對密碼學庫進行最佳化通常需要數月的審查,才能獲得足夠的信心將其投入生產環境。

自動推理的力量就在於此:正式驗證使RSA更快,部署也更快。當我們將自動推理應用於橢圓曲線密碼學時,我們也看到了類似的提升。

形成一個良性迴圈

我們在過去十多年間,在亞馬遜雲科技的內部越來越多的應用自動推理技術來證明我們的雲基礎設施和服務的正確性。我們經常使用這些方法不僅用於驗證正確性,而且還用於增強安全性和可靠性,以及最小化設計缺陷。可以使用自動推理為一個系統建立一個精確且可測試的模型,使用該模型快速驗證更改是否安全,或者發現它們是不安全的來避免對生產環節產生有害影響。

我們可以回答關於我們基礎設施的一些關鍵問題,來檢測可能導致資料洩露的錯誤配置。我們可以阻止一些我們無法透過其他技術發現的微妙但嚴重的錯誤進入生產環境。有了模型檢查,我們獲得了顯著的效能最佳化,這是我們以往不敢嘗試的。自動推理為關鍵系統按預期執行提供了嚴格的數學保證。

亞馬遜雲科技是唯一一家如此大規模使用自動推理的雲提供商。隨著越來越多的人使用自動推理工具,這讓我們在提升自動推理工具的可用性和可擴充套件性上更容易進行大量的投入。我們發現自動推理工具越易於使用,它們的功能就會變得越強大,同時自動推理工具的採用率也會變得越高。我們越能證明雲基礎設施的正確性,對於那些看重安全的客戶而言我們的雲就越有吸引力。正如前文所述,我們不僅能夠提高安全性,還能更快地為客戶提供更高效能的程式碼,並最終節約客戶的成本。

我們正處於一個新時代的開端,在這個時代大規模雲架構的關鍵屬性,諸如安全、合規性、可用性、永續性和防護等都可以實現自動證明。亞馬遜與眾不同之處就在於,我們從基礎就用可靠的數學推理並持續分析我們所構建的一切,防止從AI幻覺到分析虛擬機器監控程式、密碼學和分散式系統等潛在問題的發生。