隱私計算+AI工程技術實踐指南--整體介紹

矩陣元技術團隊發表於2020-09-24

隱私AI工程技術實踐指南--整體介紹
隱私AI框架整體設計思路
Rosetta框架核心設計思想
融合MPC技術的分散式隱私AI架構
多方網路的建立
隱私資料的流動
DAG的執行
小結
參考資料

專題導言:近期,基於TensorFlow的隱私AI框架Rosetta對外開源,AI開發者不需要了解密碼學等隱私保護技術,而只需要改動幾行程式碼,就能賦予自己的程式以保護資料隱私的能力。本專欄將通過多篇獨家首發技術專稿,深度披露Rosetta的整體框架設計、TensorFlow的定製化改造最佳實踐、將密碼學理論演算法進行高效工程化落地等內容。通過本系列專題,希望有更多的開發者瞭解隱私AI框架的技術挑戰,同時為密碼協議演算法工程化、AI框架深度定製等相關方向的開發者提供一些經驗參考。

資料是AI技術的“燃料”已經成為業界的共識,更多的資料往往意味著可以訓練出更準確的模型。但無論是在公司內部還是多個企業之間,為了對使用者資料負責、合法合規,在資料的分享使用時,必須注意對於原始明文資料的保護。傳統的面向靜態資料保護的安全手段無法解決資料的動態使用、分享中的隱私洩露問題,而正是這一實際需求催生出了隱私計算(在AI場景下,更進一步的可以稱之為隱私AI)這一新的交叉技術,這種技術是融合在資料的使用過程之中的,保障的是計算過程本身(廣義的講,還包括計算結果)不會洩露原始明文資料本身的資訊。

目前實現隱私計算的途徑可以分為密碼學、聯邦學習和硬體可信執行環境(TEE)等幾大類。而其中以密碼學理論為基礎的MPC(Multi-Party Computation,安全多方計算)是最有安全保障的技術路線,其秉持的基本理念是信任計算複雜度理論、程式碼,而不是信任人、硬體,而聯邦學習和TEE目前還很難講清楚安全性,經常被發現新的安全漏洞。並且,聯邦學習中核心部分也往往需要使用同態加密等密碼學手段進行強安全性的保障。從工程技術的角度上看,聯邦學習是分散式機器學習技術的延伸,主要的挑戰是在訓練過程中如何進行多異構終端的同步更新等[1],很多傳統分散式系統開發經驗仍然適用。而以MPC為代表的密碼學途徑則帶來了一些全新的挑戰。

image
MPC (圖片來自網路)

最核心的困難是,密碼學屬於計算機理論領域,很多的概念、演算法協議都需要有長期的專業知識積累才能理解,而業務落地中的典型AI方向,無論是計算機視覺、文字挖掘還是使用者行為建模等都是更加面向實際場景的,如何打通以密碼學為典型代表的隱私保護技術與AI技術之間的壁壘?這是開發者在實際構建一個通用的、易用的隱私計算框架需要解決的核心問題。具體的,圍繞著這個核心問題是一系列具體的工程技術挑戰:

如何實現系統的易用性?AI開發者不會願意,也不應該為了在業務中引入資料隱私保護能力而費時耗力的學習各種複雜、抽象的密碼演算法,一個好的隱私AI框架應該是易上手的,便於AI開發者使用自己熟悉的方式快速解決自己的資料隱私問題。

如何實現系統的高效執行?這包括單機和多機兩個層面。密碼學的計算大部分都是在大隨機數的密文上進行,為此常常需要使用專用的硬體指令、SIMD(Single Instruction/Multiple Data)等技術來進行單機並行化的加速,這些優化實現需要對於密碼學基礎庫有深入的瞭解,並往往需要根據協議演算法進行進一步的並行優化。而在多機層面上,則是需要考慮如何和很多AI框架自身的並行優化技術進行相容。

如何實現MPC多方之間的高效通訊?在MPC中,多方之間需要進行大量的同步通訊,而且通道上的內容大都是無規律的、不可壓縮的一次性使用的隨機數,這就需要在保證安全性的同時,根據具體的計算邏輯進行很多工程優化以減少通訊量和通訊次數。

如何保障隱私保護技術的可擴充套件性?MPC等隱私計算技術還在不斷的發展之中,也是學術研究上的熱點問題,所以一個好的隱私AI框架,需要能夠支援研究者簡單快速的將新的演算法協議整合進來。

針對這些問題,業界已經有一些探索,下面我們結合Rosetta來具體談一談在隱私AI框架的設計和實現中可以如何克服這些挑戰。篇幅所限,本篇文章主要整體性的先介紹巨集觀設計,後續系列文章中會進一步剖析一些技術細節。

如同其他的隱私AI框架一樣,Rosetta仍然處於發展的早期,尚有一些不完善之處。我們在此以Rosetta為例是希望具體化的講清楚這一領域中的一些細節挑戰,也希望激發更多開發者參與到未來的隱私AI系統設計中來。

隱私AI框架整體設計思路

目前尚沒有大規模落地的、成熟完善的隱私AI框架,但是已經有一些探索性的開源隱私AI框架,比如PySyft、TF Encrypted和CrypTen。

image

從整體上看,這些框架都是在TensorFlow或PyTorch的前端Python層進行封裝整合的。這樣做的好處是可以直接的使用這些AI框架的上層介面來實現隱私計算演算法,而且天然的可以直接呼叫框架自身封裝好的一些高層次API高功能。這對於聯邦學習這種本身就源自分散式機器學習的技術來說是較為適合的,但是對於密碼學的MPC來說會有一些不足:

• 首先,單機的效能上無法得到充分的提升。用Python來實現各種複雜的密碼學計算、多方之間的通訊會無法充分的利用底層作業系統、硬體層的並行優化,而且更現實的是,大部分高效能的密碼學庫提供的是C/C++的介面,如果在AI框架的前端上層來實現MPC等密碼技術,則很難複用這些業界長時間積累(同時也還在不斷髮展中)下來的成果。

• 其次,密碼協議等隱私技術的實現和AI框架本身耦合過深,不利於擴充套件。由於這些AI框架本身提供的對外API介面本就是面向AI需求的,在實現較為複雜的MPC等密碼協議時不僅需要熟練使用這些框架的API,還往往需要大量直接使用numpy等庫來實現複雜的計算邏輯,這一方面破壞了對AI框架自身使用上的自洽,不再能將全部的計算邏輯完全承載在AI框架的邏輯執行圖上,另一方面也使得每一次引入新的後端密碼協議時都需要重新基於AI框架進行實現,這對於密碼協議開發者來說成本很高。

基於上述認識,Rosetta在現階段首先以TensorFlow這一流行AI框架為基礎,深度改造其前端Python入口和後端kernel實現,並封裝可插拔的MPC演算法協議作為“隱私保護引擎”來驅動整個計算過程中資料的安全流動。

Why TensorFlow?

TensorFlow和PyTorch是目前工業界最主流使用的開源AI框架。雖然很多公司在內部可能也會根據自身需求定製化改造一些元件,或者推出各具特色的新框架以在易用性、高效性、完備性等不同的維度上進行進一步突破,但是整體上看,這些框架基本的設計正規化是較為相似的,大多是通過豐富的介面API讓使用者以有向無環圖DAG的形式表達上層計算邏輯,而框架本身則會在實際排程執行這些計算任務時進行一系列的優化。TensorFlow雖然在使用者友好性上略遜色於PyTorch,常受開發者詬病,但是其在可擴充套件性、高效性上、分散式部署等方面確實是更加均衡、全面(當然這也意味著TensorFlow是更加複雜的,對其改造會更加的具有挑戰性)。所以綜合考慮下來,Rosetta在當前版本中選擇TensorFlow作為基本的底層承載體,在設計開發的過程中,一方面即會充分的利用TensorFlow內在的計算圖並行執行優化等功能以提升效率,另一方面也會盡量剋制,主要是利用其作為深度學習框架通用性的一些介面特性,而不會過於依賴其獨有的一些元件。

Rosetta框架核心設計思想

隱私運算元(SecureOp)作為核心抽象介面連線AI框架和隱私計算技術。TensorFlow在不同的層次上提供了多樣的擴充套件方式,Rosetta選擇後端運算元(Operation)層作為核心切入點,TensorFlow在執行運算元時會動態的繫結到具體MPC協議中的SecureOp實現中。通過這樣的抽象,密碼協議開發者可以不需要了解AI框架,只需要用C++實現滿足介面定義的各個功能函式即可,而AI開發者也不需要深入瞭解MPC等技術的實現細節,而只需要在現有運算元的基礎上進一步封裝自己想要的上層高階功能即可。

• 基於優化遍(Pass)的分階段轉換。為了儘可能的給AI開發者提供易用的介面,減少給線上AI程式賦予資料隱私保護能力時的改造成本,Rosetta在整體的設計中借鑑了程式編譯器領域的核心概念:Pass。Pass是編譯器中常用的技術,主要用作將原始碼檔案一步步轉變為機器碼過程中的多輪轉化和優化。在Rosetta中,使用者使用原生TensorFlow介面編寫的DAG(有向無環圖)形式的邏輯計算圖會被分階段的轉換、替換為多方協作執行的MPC程式,這樣可以實現對於使用者API層最少的改動。具體的,在Rosetta中,有兩個階段的Pass,一個在前端Python層的全域性DAG構建過程中生效的Static Pass,會將原生Tensor轉換為支援自定義密文型別的RttTensor,將原生Operation 轉換為支援tf.string格式輸入輸出的RttOp,並最終在圖開始啟動時進一步的轉換為承載實際MPC操作的SecureOp。

image

Static Pass

另一個是在SecurOp的實際執行時所進行的Dynamic Pass處理,會動態的根據當前使用者選擇的協議選擇對應的實際運算元實現去執行,同時可以在此時嵌入基於執行上下文的優化處理。

image

Dynamic Pass

融合MPC技術的分散式隱私AI架構

理清楚整體的分散式結構對於瞭解一個系統的架構大有裨益。整個隱私AI系統對外介面會涉及三個方面,如何指定物理部署上的網路拓撲?資料在整個計算的過程中是如何安全輸入、流動、輸出的?隱私計算邏輯要如何表達?Rosetta的整體邏輯結構如下圖所示:

image
Rosetta 多方網路結構圖

多方網路的建立

MPC技術本身就是要求多方(multi-party)參與的,一般稱他們為Player,不同的MPC演算法協議會有不同個數的參與方,以Rosetta中目前實現的三方協議SecureNN[2]為例,系統中存在三個邏輯參與方,P0、P1和P2。

在v0.2.1版本中,在這一方面的使用者介面層次上,為了保障對外的靈活性,目前支援使用者通過配置檔案來一次性指定多機之間的網路關係,也支援呼叫介面動態的啟用、解除多方之間的網路拓撲:

# 呼叫activate介面會根據配置引數或配置檔案建立起網路rtt.activate(protocol_name="SecureNN", protocol_config_str=None)
# 呼叫deactivate介面會釋放網路連結等資源
rtt.deactivate()

在內部的實現中,每一個參與方都會監聽一個本地的server埠,而同時分別建立到另外兩方之間的client網路連結,這樣的好處是相互之間的網路連結關係簡單清晰,當然也需要解決隨之而來的SecureOp併發同步執行時的一致性問題,這一點我們也會在後續文章中討論。

一些注意點

• 熟悉TensorFlow的讀者可能會疑惑,這種多方基於不同資料跑相同程式的模式,不就是TensorFlow分散式執行下對資料並行進行支援的In-graph replication和Between-graph replication嗎?並不是這樣,實際上它們是不同層次的結構,這裡講的是上層邏輯視角的MPC各參與方,在實際中,你甚至可以進一步的將各方內部執行的這一task按照TensorFlow的分散式規範進行叢集部署,而將叢集中的 "server“作為統一的對外代表。

• 上面一直講的是“邏輯上”的三方,那麼在實際的業務場景中,可能是2個、4個或以上公司之間的資料合作,是不是就不能用這些架構了嗎?其實不然,我們完全可以在上層進行一層對映,以Privacy-as-a-Service的形式提供對上層的服務,關於這一點,後續文章也會進一步介紹。

隱私資料的流動

每一個邏輯參與方都可以有自己私有的明文輸入資料,也可以繼續處理上一次任務輸出的密文結果。在整個程式的執行過程中,只有開始和結束時資料才會以明文的形式存在:開始時對於私有資料的引入,以及最後可配置是否將結果以明文的形式恢復出來加以輸出。而在中間各個運算元的計算過程中,資料總是以密文形式在本地的邏輯上下文、多方之間進行互動。

對外介面方面,在實際的業務中多方資料之間是需要關聯對齊的,目前Rosetta提供常見的兩種資料集處理方法,一是對應於整體上資料集是在各方之間“水平劃分”的場景,即各方擁有不同樣本id的全部特徵屬性值;另一種對應於整體資料集是在各方之間“垂直劃分”的場景,即各方之間擁有相同樣本id的部分特徵屬性值。這些都可以呼叫PrivateDataset類的load_data等介面方便的處理。而在輸出階段,提供瞭如下兩個介面:

# 將一個密文形式的cipher_tensor恢復為明文, receive_party引數指定3方中哪幾方可以獲得明文結果rtt.SecureReveal(cipher_tensor, receive_party=0b111)
# 與原生TensorFlow中模型儲存介面SaveV2具有一樣的函式原型,可通過配置檔案指定哪幾方可以獲得明文模型檔案
rtt.SecureSaveV2(prefix, tensor_names, shape_and_slices, tensors, name=None)

隱私集合求交PSI(Private Set Intersection)技術

在實際場景中還存在一個很現實的問題,就是多方之間樣本的對齊問題,比如將A方的樣本id所指向的樣本和B方此樣本id對應的屬性資訊給對應起來。PSI技術可以安全的解決上述問題,目前各個開源框架中還沒有將這一功能很好的整合進來,Rosetta目前正在整合這一功能,將在近期版本中釋出。

在內部實現中,密碼學中的很多運算是在空間較大的環(Ring)、域(Field)和格(Lattice)等抽象代數結構上的操作,而具體的在程式碼中則落地到對於大整數、多項式等資料結構上的處理,所以框架設計上要在三個方面達成平衡:

  1. 儘可能的實現使用者對於內部密文資料結構的透明無感;
  2. TensorFlow的DAG圖構建、自動求導等核心功能仍需要無縫的支援;
  3. 支援不同的MPC協議使用自定義的具體資料結構物件以便於擴充套件。

為同時實現這些目標,Rosetta基於tf.string這一TensorFlow原生資料結構來承載各協議自定義的密文資料,然後通過對TensorFlow原始碼程式碼進行深度的hook改造使得DAG圖構建、自動求導等功能仍然可用。

DAG的執行

如上述網路結構圖所展示的那樣,各Player執行的是同一份基於TensorFlow編寫的AI二進位制程式碼,比如訓練一個簡單神經網路模型的程式。使用者直接的使用TensorFlow中原生的運算元API來構建邏輯計算圖DAG,Rosetta內部會在圖開始執行時完成到隱私運算元SecureOp的轉換。與其他隱私計算框架相比,這樣的切換成本是最低的。

在執行過程中,各Player自身都是在按照這個DAG圖在執行,特殊的地方在於在各個運算元的內部執行過程中,各個Player會根據自己所屬的角色遵循MPC協議執行不同的操作,這些操作即包括本地的在密文上的處理,也包括在多方之間進行強同步的通訊互動,傳輸大量隨機數形式的密文。

image

Rosetta 多方網路結構圖

小結

在本篇文章裡,結合Rosetta框架,我們從整體上介紹了隱私AI框架在工程落地時所需要面對的挑戰,以及Rosetta等框架的一些設計方案。後續的文章中我們會進一步就核心的關鍵模組進行進一步的介紹。

Rosetta框架已經在Github開源
https://github.com/LatticeX-F...
歡迎關注我們。

參考資料

  1. Bonawitz, K., Eichner, H., Grieskamp, W., Huba, D., Ingerman, A., Ivanov, V., ... & Van Overveldt, T. (2019). Towards federated learning at scale: System design. _arXiv preprint arXiv:1902.01046_.
  2. Wagh, S., Gupta, D., & Chandran, N. (2018). SecureNN: Efficient and Private Neural Network Training. _IACR Cryptol. ePrint Arch._, _2018_, 442.

相關文章