0. はじめに
本記事では2つの準同型暗号ライブラリ
- phantom-fhe
- SEAL
これらのベンチマークを自作・実行してライブラリの比較をしていきたいと思います。使用するスキームはCKKSです。
1. 環境
今回実験する環境は以下の通りです。
なお、ライブラリは2024年10月時点のものを使用しています。
OS | Ubuntu 22.04.4 LTS |
---|---|
CPU | Intel(R) Core(TM) i5-9500 CPU @ 3.00GHz |
GPU | NVIDIA GeForce RTX 3090 Ti |
RAM | 32GB |
コンパイラ | g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 nvcc(Cuda compilation tools, release 12.4, V12.4.131) |
CKKSを使用するにあたって設定したパラメータは以下の通りです。
poly_modulus_degree | 8192 ($2^{13}$) |
---|---|
scale | $2^{40}$ |
coeff_modulus | {60, 40, 60} |
2. 実行時間の比較
では本題の比較として、実行時間を見てみましょう。
operation | SEAL [μs] | phantom-fhe [μs] |
---|---|---|
encryption w/secret key |
1051.7 | 241.3 |
encryption w/public key |
2596 | 221.5 |
decryption | 107.1 | 5.1 |
addition | 25.8 | 3.2 |
multiplication | 211.0 | 7.1 |
relinearization | 1304.8 | 39.4 |
rescale | 364.1 | 21.6 |
rotation | 1335.7 | 48.9 |
SEALも十分早いですがGPUを使って計算しているというのもあり、phantom-fheの方が圧倒的に早いという結果になりました。
3. 計算精度の比較
実行時間ではphantom-fheの方が優れていました。では、計算精度はどうでしょうか?確認してみましょう。
CKKSの入力値は複素数となっているので、どのようにして精度を求めるかを考える必要があります。実部や虚部それぞれで比較してもいいですが、今回は絶対値の相対誤差を用いて比較しました。
operation | SEAL | phantom-fhe |
---|---|---|
encode | $10^{-13}$ | $10^{-6}$ |
encryption | $10^{-11}$ | $10^{-4}$ |
addition | $10^{-13}$ | $10^{-5}$ |
multiplication | $10^{-10}$ | $10^{-4}$ |
relinearization | $10^{-10}$ | $10^{-4}$ |
rescale | $10^{-9}$ | $10^{-4}$ |
これを見るとSEALに比べてphantom-fheは精度がかなり低くなってしまうようです。
精度から見て単精度の浮動小数点数を使っているのかと思いましたが、そういうわけではなさそうでした。encodeの時点で精度が低いので、原因はおそらくencodeでしょう。
CKKSのencodeでは高速フーリエ変換(FFT)を用います。FFTで用いる値(1のn乗根)は複素数のため、2進数で計算するコンピュータではどうしても精度は低下してしまいます。
phantom-fheではFFT、SEALではFFTの代わりに数論変換(NTT)を使っているようなのでその点の違いも考えられそうです。
4. まとめ
今回は準同型暗号ライブラリのSEALとphantom-fheのベンチマークを作成し、比較してみました。
その結果、実行時間の点ではphantom-fhe、計算精度の点ではSEALの方が優れていることが分かりました。
phantom-fheの計算精度が低い原因については今後も調べていくので何か分かったら報告します。