隱私AI工程技術實踐指南--總體介紹
隱私AI框架總體設計思路
Rosetta框架核心設計思想
融合MPC技術的分佈式隱私AI架構
多方網絡的創建
隱私數據的流動
DAG的執行
小結
參考資料前端
專題導言:近期,基於TensorFlow的隱私AI框架Rosetta對外開源,AI開發者不須要了解密碼學等隱私保護技術,而只須要改動幾行代碼,就能賦予本身的程序以保護數據隱私的能力。本專欄將經過多篇獨家首發技術專稿,深度披露Rosetta的總體框架設計、TensorFlow的定製化改造最佳實踐、將密碼學理論算法進行高效工程化落地等內容。經過本系列專題,但願有更多的開發者瞭解隱私AI框架的技術挑戰,同時爲密碼協議算法工程化、AI框架深度定製等相關方向的開發者提供一些經驗參考。git
數據是AI技術的「燃料」已經成爲業界的共識,更多的數據每每意味着能夠訓練出更準確的模型。但不管是在公司內部仍是多個企業之間,爲了對用戶數據負責、合法合規,在數據的分享使用時,必須注意對於原始明文數據的保護。傳統的面向靜態數據保護的安全手段沒法解決數據的動態使用、分享中的隱私泄露問題,而正是這一實際需求催生出了隱私計算(在AI場景下,更進一步的能夠稱之爲隱私AI)這一新的交叉技術,這種技術是融合在數據的使用過程之中的,保障的是計算過程自己(廣義的講,還包括計算結果)不會泄露原始明文數據自己的信息。github
目前實現隱私計算的途徑能夠分爲密碼學、聯邦學習和硬件可信執行環境(TEE)等幾大類。而其中以密碼學理論爲基礎的MPC(Multi-Party Computation,安全多方計算)是最有安全保障的技術路線,其秉持的基本理念是信任計算複雜度理論、代碼,而不是信任人、硬件,而聯邦學習和TEE目前還很難講清楚安全性,常常被發現新的安全漏洞。而且,聯邦學習中核心部分也每每須要使用同態加密等密碼學手段進行強安全性的保障。從工程技術的角度上看,聯邦學習是分佈式機器學習技術的延伸,主要的挑戰是在訓練過程當中如何進行多異構終端的同步更新等[1],不少傳統分佈式系統開發經驗仍然適用。而以MPC爲表明的密碼學途徑則帶來了一些全新的挑戰。算法
MPC (圖片來自網絡)後端
最核心的困難是,密碼學屬於計算機理論領域,不少的概念、算法協議都須要有長期的專業知識積累才能理解,而業務落地中的典型AI方向,不管是計算機視覺、文本挖掘仍是用戶行爲建模等都是更加面向實際場景的,如何打通以密碼學爲典型表明的隱私保護技術與AI技術之間的壁壘?這是開發者在實際構建一個通用的、易用的隱私計算框架須要解決的核心問題。具體的,圍繞着這個核心問題是一系列具體的工程技術挑戰:安全
• 如何實現系統的易用性?AI開發者不會願意,也不該該爲了在業務中引入數據隱私保護能力而費時耗力的學習各類複雜、抽象的密碼算法,一個好的隱私AI框架應該是易上手的,便於AI開發者使用本身熟悉的方式快速解決本身的數據隱私問題。網絡
• 如何實現系統的高效執行?這包括單機和多機兩個層面。密碼學的計算大部分都是在大隨機數的密文上進行,爲此經常須要使用專用的硬件指令、SIMD(Single Instruction/Multiple Data)等技術來進行單機並行化的加速,這些優化實現須要對於密碼學基礎庫有深刻的瞭解,並每每須要根據協議算法進行進一步的並行優化。而在多機層面上,則是須要考慮如何和不少AI框架自身的並行優化技術進行兼容。數據結構
• 如何實現MPC多方之間的高效通訊?在MPC中,多方之間須要進行大量的同步通訊,並且信道上的內容大都是無規律的、不可壓縮的一次性使用的隨機數,這就須要在保證安全性的同時,根據具體的計算邏輯進行不少工程優化以減小通訊量和通訊次數。架構
• 如何保障隱私保護技術的可擴展性?MPC等隱私計算技術還在不斷的發展之中,也是學術研究上的熱點問題,因此一個好的隱私AI框架,須要可以支持研究者簡單快速的將新的算法協議集成進來。併發
針對這些問題,業界已經有一些探索,下面咱們結合Rosetta來具體談一談在隱私AI框架的設計和實現中能夠如何克服這些挑戰。篇幅所限,本篇文章主要總體性的先介紹宏觀設計,後續系列文章中會進一步剖析一些技術細節。
如同其餘的隱私AI框架同樣,Rosetta仍然處於發展的早期,尚有一些不完善之處。咱們在此以Rosetta爲例是但願具體化的講清楚這一領域中的一些細節挑戰,也但願激發更多開發者參與到將來的隱私AI系統設計中來。
目前尚沒有大規模落地的、成熟完善的隱私AI框架,可是已經有一些探索性的開源隱私AI框架,好比PySyft、TF Encrypted和CrypTen。
從總體上看,這些框架都是在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內在的計算圖並行執行優化等功能以提高效率,另外一方面也會盡可能剋制,主要是利用其做爲深度學習框架通用性的一些接口特性,而不會過於依賴其獨有的一些組件。
• 隱私算子(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。
Static Pass
另外一個是在SecurOp的實際執行時所進行的Dynamic Pass處理,會動態的根據當前用戶選擇的協議選擇對應的實際算子實現去執行,同時能夠在此時嵌入基於執行上下文的優化處理。
Dynamic Pass
理清楚總體的分佈式結構對於瞭解一個系統的架構大有裨益。整個隱私AI系統對外接口會涉及三個方面,如何指定物理部署上的網絡拓撲?數據在整個計算的過程當中是如何安全輸入、流動、輸出的?隱私計算邏輯要如何表達?Rosetta的總體邏輯結構以下圖所示:
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)等抽象代數結構上的操做,而具體的在代碼中則落地到對於大整數、多項式等數據結構上的處理,因此框架設計上要在三個方面達成平衡:
爲同時實現這些目標,Rosetta基於tf.string這一TensorFlow原生數據結構來承載各協議自定義的密文數據,而後經過對TensorFlow源碼代碼進行深度的hook改造使得DAG圖構建、自動求導等功能仍然可用。
如上述網絡結構圖所展現的那樣,各Player運行的是同一份基於TensorFlow編寫的AI二進制代碼,好比訓練一個簡單神經網絡模型的程序。用戶直接的使用TensorFlow中原生的算子API來構建邏輯計算圖DAG,Rosetta內部會在圖開始執行時完成到隱私算子SecureOp的轉換。與其餘隱私計算框架相比,這樣的切換成本是最低的。
在執行過程當中,各Player自身都是在按照這個DAG圖在運行,特殊的地方在於在各個算子的內部執行過程當中,各個Player會根據本身所屬的角色遵循MPC協議執行不一樣的操做,這些操做即包括本地的在密文上的處理,也包括在多方之間進行強同步的通信交互,傳輸大量隨機數形式的密文。
Rosetta 多方網絡結構圖
在本篇文章裏,結合Rosetta框架,咱們從總體上介紹了隱私AI框架在工程落地時所須要面對的挑戰,以及Rosetta等框架的一些設計方案。後續的文章中咱們會進一步就核心的關鍵模塊進行進一步的介紹。
Rosetta框架已經在Github開源
(https://github.com/LatticeX-F...)
歡迎關注咱們。