プライバシー保護計算フレームワークSecretFlowとは?
はじめに
こんにちは。株式会社Acompany CTOの田中(@tkrk_p)です。本記事は「#アカンクリスマスアドベントカレンダー2023」22日目の記事となります。
Acompanyは、名古屋大学発ベンチャーで、プライバシーテックの研究開発と実用化を目指し、秘密計算エンジン『QuickMPC』をOSSとして公開しています。
『プライバシーテック』は、プライバシーという権利を保護する技術です。個人データの適切な活用と、個人情報の保護を両立する上で鍵となる技術として、世界で注目を集めています。
プライバシーテックには、秘密計算や連合学習、合成データ、差分プライバシーなど、さまざまな技術が存在します。
この記事では、プライバシーテックに関連するOSSの1つである、『SecretFlow』の概要と、そのアーキテクチャについて紹介します。
SecretFlowとは
SecretFlowは、データ分析や機械学習をプライバシー保護計算で行うための統合フレームワークです。アリババグループの金融部門であり、Alipayなどを運営するAntGroupによって開発され、2022年7月にオープンソース化されました。
SecretFlowは、MPC(Multi-Party Computation)、FL(Federated Learning)、TEE(Trusted Execution Environment)、HE(Homomorphic Encryption)、およびDP(Differential Privacy)など、複数の主要なプライバシー強化技術、通称PETs(Privacy-Enhancing Technologies)をサポートしており、これらを組み合わせたプライバシー保護計算が可能です。
以下で、そのアーキテクチャについて説明します。
アーキテクチャ
SecretFlowの設計目標は、データサイエンティストや機械学習開発者が、基礎となる技術的な詳細を理解することなく、データ分析や機械学習モデリングにPETsを非常に簡単に使用できるようにすることです。
この目標を達成するために、SecretFlowは、以下の層を提供します。
- デバイス抽象化層(Device and Primitives):平文デバイス(Plain Device)と、MPC, HE, TEEなどの様々な暗号プロトコルをカプセル化した暗号文デバイス(Secret Device)で構成されている。
- デバイスフロー層(Device Flow Framework):上位層で定義されたデータ分析や機械学習などのアルゴリズムをDAG形式の計算グラフで表現する。ノードはデバイス上の計算を、エッジはデバイス間のデータフローを表する。
- アルゴリズム層(AI and BI Framework):水平または垂直に分割されたデータを使用してデータ分析と機械学習を行う。デバイスフロー層以下を隠蔽しつつアルゴリズムを開発可能にすることで、開発効率を向上させる。
SecretFlowはこの階層設計により、PETsの暗号プロトコルと、そのプロトコル上でのアルゴリズム定義を分離することで、両面から発展の恩恵を享受可能かつ、それぞれの開発者がもう片方の専門知識を必要とすることなく、簡単に定義することが可能になっています。
このデバイスという概念についてより詳細に説明します。
デバイス
SecretFlowのデバイスは、物理デバイスと論理デバイスに分かれています。物理デバイスは、プライバシー保護計算に参加する各参加者の物理マシンであり、論理デバイスは一つ以上の物理デバイスで構成されます。論理デバイスは、特定のセットの演算子(Device Ops)をサポートし、独自のデータ表現(Device Object)を持っています。論理デバイスは、前述の通り平文デバイス(Plain Device)と暗号分デバイス(Secret Device)の2種類に分かれており、前者はシングルパーティでのローカル計算を、後者はマルチパーティでの秘密計算を行います。
論理デバイスのランタイムは、メモリ管理、データ送信、オペレータのスケジュール設定などを担当し、1つ以上の物理デバイス上で実行されます。論理デバイスと物理デバイスの間には 1対1 の関係はなく、物理デバイスは同時に複数の論理デバイスに属する可能性があります。同じ物理デバイスのセット上で、異なる暗号プロトコルと参加者の組み合わせに従って、異なる論理デバイスを仮想化できます。
例えば、以下図の1番上の例では、6つの物理マシンのうち3つが平文デバイスとして論理的に振る舞い、別の3つが暗号文デバイスとして3-Party設定のMPCのように論理的に振る舞う設定になっています。
次の表は、SecretFlow で現在サポートされているデバイスのリストです。
Device | Type | Runtime | Ops | Protocol | Frontend | Status |
---|---|---|---|---|---|---|
PYU | Plaintext | Python Interpreter | — | — | Python | Release |
SPU | Ciphertext | SPU VM | PSI, XLA HLO | SPDZ-2k, ABY3 | JAX, TensorFlow, PyTorch | Alpha |
HEU(PHEU Mode) | Ciphertext | PHEU Runtime | Add | Paillier | Numpy | Alpha |
HEU(FHEU Mode) | Ciphertext | HEU VM | XLA HLO | TFHE | JAX, TensorFlow, PyTorch | WIP |
TEE | Ciphertext | TEE Runtime | XLA HLO | Intel SGX | JAX, TensorFlow, PyTorch | WIP |
ここでPYUが平文デバイスに当たります。PYUは純粋なPython Interpreterをランタイムとしているため、Pythonで記述し、通常の演算子をベースにした平文処理が可能です。SPU(MPC), HEU(HE), TEEなどの暗号文デバイスはXLA(Accelerated Linear Algebra)と呼ばれるTensorFlow コンパイラをサポートする任意のフレームワーク(JAX, TensorFlow, PyTorch等)やNumpyをフロントエンドとして利用可能であり、平文デバイス同様にPythonで記述することができます。
XLAについての説明は省きますが、気になる方は以下を参照してください。
これにより、アルゴリズム開発者はランタイムの差異を気にすることなく、全ての処理をPythonで記述可能になります。
プログラマビリティ
開発者は、上記の論理デバイスを使って任意の計算処理を記述することができます。(但し、HEUは技術特性上、一部演算子のみしか利用不可)
例えば、Jaxを使ってSELU(Scaled Exponential Linear Unit)という活性化関数を実装する場合、以下のように記述することができます。
import jax.numpy as jnp
dev = Device(spu) # maybe PYU, SPU, HEU, TEE
@device(dev)
def selu(x, alpha=1.67, lmbda=1.05):
return lmbda * jnp.where(x > 0, x, alpha * jnp.exp(x) - alpha)
res = selu(x) # res is a DeviceObject
SecretFlowが独自に用意した @device
というデコレータを通して、Pythonで通常通りに定義した任意の関数をスケジューリングして実行することができます。
@device
デコレータが付与された関数は、cloudpickleによってシリアライズ、デバイスへの転送、デシリアライズされた後、ターゲットとして指定されたデバイスのPython interpreterによって実行されます。
ユーザーが定義した関数は、まず最初にXLA HLOに変換され、XLAはデバイスに依存しないコードの最適化と分析を行い、それをバックエンドデバイスに送信します。バックエンドデバイスはさらにコードの最適化と分析を行い、最終的な実行可能コードを生成します。実行可能コードは、デバイスの仮想マシン(SPU, HEU)によって解釈されるか、またはハードウェア(TEE)によって直接実行されます。
プロトコル変換
SecretFlowでは、.to(device)
メソッドによりDevice Objectを任意のデバイスに転送し、別のDevice Objectにプロトコル変換することが可能です。
以下は各Device Object間の変換テーブルです。
PYU | SPU | HEU | TEE | |
---|---|---|---|---|
PYU | share | encrypt | encrypt | encrypt |
SPU | reconstruct | encrypt+add | reconstruct+encrypt | decrypt |
HEU | decrypt | minus+decrypt | decrypt+encrypt | decrypt |
TEE | decrypt | decrypt+share | decrypt+encrypt | decrypt |
コミュニケーションとスケジュール設定
論理デバイスは一つ以上の物理デバイスにマッピングされるため、必ずしもランタイムが1つの物理マシンに閉じているとは限りません。計算グラフを実行するには、論理デバイス上のオペレータをそれに対応する物理デバイスに正しくスケジュールし、これらの物理デバイス間のデータ伝送関係を処理する分散グラフ実行エンジンが必要です。
SecretFlowの分散グラフ実行エンジンには以下の要件があります。
- きめの細かいヘテロジニアスコンピューティング: 単純なデータ処理から複雑なマルチパーティトレーニング(数時間から数十時間) まで、さまざまな粒度の計算タスクに対応し、かつCPU、GPU、TEE、FPGA などの異なるハードウェア環境を物理ノードとして利用したい。
- 柔軟なコンピューティングモデル: 水平シナリオと垂直シナリオで、データ分析や機械学習などのさまざまなワークフローに対して並列モデルを利用したい。
- 動的実行: 連合学習のようなマシンパフォーマンスが参加者によって大きく異なる可能性があるシナリオでは最も遅いワーカーノードによって同期モードの効率が悪くなるため、非同期学習モードをサポートすることで、グラフ実行エンジンで動的実行機能を利用したい。
この要件を満たすために、SecretFlowはRayをSecretFlowの分散エンジンとして選択しています。
Rayは下記のようにデコレータによりシンプルに分散並列処理を実装可能なフレームワークです。
import ray
import time
from datetime import datetime
@ray.remote
def f(x):
time.sleep(1)
return f"f({x}) finished!"
if __name__ == '__main__':
ray.init(ignore_reinit_error=True)
start_time = datetime.now()
results = [f.remote(i) for i in range(3)]
outputs = ray.get(results)
for output in outputs:
print(output)
end_time = datetime.now()
elapsed_time = end_time - start_time
print(f"経過時間: {elapsed_time.total_seconds():.1f}s")
$ python3 main.py
2023-12-04 06:09:48,485 INFO worker.py:1507 -- Calling ray.init() again after it has already been called.
f(0) finished!
f(1) finished!
f(2) finished!
経過時間: 1.0s
localでの並列処理だけでなく、remoteでの分散並列処理も可能なフレームワークになります。
これにより、複数の分散された物理マシンにまたがった実行環境上での計算が可能になっています。
まとめ
この記事では、プライバシーテックに関連するオープンソースソフトウェアの1つ、『SecretFlow』について紹介しました。
Design Motivationにも書いてある通り、すべてのシナリオに適した万能なPETsはありません。尚且つ、PETsは数学、暗号学、機械学習、データベース、ハードウェア、セキュリティ、その他様々な分野の専門知識が複雑に絡み合い、実用化に膨大な時間がかかります。
SecretFlowは、一般のデータサイエンティストや機械学習開発者が技術的な詳細を深く理解することなく、シナリオに最適なPETsを柔軟に組み合わせ、プライバシーを保護したデータ分析や機械学習を容易に開発できるようにすることを目指しています。
データの安全性とプライバシーの重要性がますます高まる現代において、プライバシーテックを組み込んだアプリケーション開発が当たり前になる未来も近いのではないでしょうか。
おまけ
PRを出したらコミュニティからの初PRだったらしく、Ant Groupからマスコットキャラクターのぬいぐるみ(日本バージョン)が届きました🐜
どなたかこのキャラクターの名前を知っている方がいたら教えてください。
参考文献
Discussion