秘密計算エンジニアとしてZamaAIのConcreteライブラリのリリースを読んですごいと思ったところ

**@kenmaro**です。
普段は主に**秘密計算、準同型暗号などの記事について投稿しています**。
秘密計算に関連するまとめの記事に関しては以下をご覧ください。

> - [秘密計算エンジニアを始めて２年半が経った。](https://qiita.com/kenmaro/items/48059dd60f79e80f5ef8)
> - [秘密計算エンジニアを始めて3年が経った。](https://qiita.com/kenmaro/items/a1d90a074d552b7bf886)

## 概要
フランスに拠点を持つスタートアップ
「**Zama AI**」から出たリリースをぜひ読んでいただきたいと思ったので、
ここで共有したいと思っています。

準同型暗号関連の記事についてはいくつか今まで書いてきましたが、
**私からみてこれらのリリースですごいと思ったこと**、
をピックアップして書いてみたいと思います。

要点だけまとめて、あとはリリース元へと誘導するだけの記事になってしまうかもしれませんが、
興味のある方はぜひリリース元を読んでみてください。

**１つ目のリリースはこちら**

https://www.zama.ai/post/introducing-the-concrete-framework

**２つ目のリリースはこちら**

https://www.zama.ai/post/concrete-core-v1-0-gamma-with-gpu-acceleration


この二つのリリースについて言及しようと思います。


## 1つめのリリース


このリリースはわりと一般的な内容で、Concreteライブラリがどのようなライブラリなのか、
ライブラリにどのような展望があるのか、ということについてまとめられています。

技術的な内容などはあまり記載されていないですが、
私がこのリリースを読んで感じることを勝手に書いてみます。

- **実装のアーキテクチャに明確な階層があり、開発者に優しく、綺麗な思想が見える**
- **ライブラリとしてのエンドユーザが明確**
- **ハードウェアを利用した高速化と、それによるユースケースのカバレッジの向上が（ぼんやりだが）見えている**
- **ライブラリの開発に対する熱意が垣間見えるところが気持ちいい**

少しだけ各ポイントについて深掘ります。

#### 実装のアーキテクチャに明確な階層があり、開発者に優しく、綺麗な思想が見える

私は正直なところOSSにコントリビュートしたような経験はなく、
あくまでバックエンドや理論サイドもカバーしたプロダクト開発のようなことしかやったことがありませんが、
準同型暗号についてもいくつかのOSSを使ったり、実装をチェックしたりしてきました。

**ライブラリの設計というのはOSSである以上非常に重要**であり、

- **どれだけ拡張性のあるライブラリになるか、**
- **メンテナンスがしやすいのか、新しいコントリビュータが入りやすいか**、

などは設計によって大きく左右されるでしょう。

その観点でConcreteライブラリは、
**非常に整備され、ドキュメントもかなり整備されており、レベルが非常に高いです。**

各モジュールの上下構造や各機能も明確に分けられているため、コントリビュータがどこに変更を加えればいいのか、などとてもわかりやすくなっています。

Rustで書かれているところも、依存関係がカオス化しやすいC++に比べて開発者に優しいかなと思います。

#### ライブラリとしてのエンドユーザが明確
これはAPIの整備の仕方から見て取れます。

**Python API でNumpy のようなインターフェースを用意**するところなど、
**実際のデータサイエンティストやプログラマーをエンドユーザとして明確に捉えていて**素晴らしいなと思います。

上に記載した各レイヤの階層構造がはっきりしているというところもあるのですが、
もっと低レイヤの実装に興味のあるリサーチャーについてもどの階層にアクセスすればいいかも把握しやすい作りだと言えます。



#### ハードウェアを利用した高速化と、それによるユースケースのカバレッジが（ぼんやりだが）見えている
これは記事の最後のセクションに書かれているところですが、
１０００倍、１万倍の高速化に対して、現状実用性の面から閉ざされているユースケースのうち、何割が解放できるのか、というところを見ており、
また、その高速化についての目処も立っている、
という自信のようなものも伺えました。


#### ライブラリの開発に対する熱意が垣間見えるところが気持ちいい

**私はこの記事を読んで彼らのライブラリへの開発の熱意を感じることができました。**
暗号界隈でもかなり著名な方達が実装に携わっていらっしゃるので、
これから業界のスタンダートとして使われるようになるライブラリだと思っています。




## ２つめのリリース

２つめのリリースは、１つめのリリースでも言及されたのですが、
ハードウェアを使用した高速化や、提供予定のAPIの少し詳細な内容となっています。

いくつか私がコメントしたいポイントをピックアップします。

- **WASM API（とC API）を（限定的だが）リリースした**
- **ブートストラップを実行するAPIを、用途に合わせて２種類提供する**
- **実測値も記載がありイメージがつかめる**

少しだけ詳細について言及します。

#### WASM API（とC API）を（限定的だが）リリースした

これは１つ目の記事の感想にも関連するのですが、
実際にこのライブラリを使うであろうエンドユーザのことをしっかり考えているなあと思い、本当にすごいと思いました。

例えば暗号関連の研究者は、基本的にCやC++に精通している人が多いでしょうから、
C APIが用意されていればそれらの人も使ってみたくなるでしょう。

また、実際にライブラリを使用してなにかアプリケーションを作ったりする時、
WASM APIが用意されていればブラウザ上で鍵を生成したり、
暗号化、復号などの主要操作を行うことができるので非常に便利でしょう。


この点では、以前の記事

https://qiita.com/kenmaro/items/15b300333b0854f56bbc

ここでもお伝えしたように、準同型暗号のライブラリとしては非常に有名なマイクロソフトリサーチのSEALも、
フロントで使えるようなライブラリが（外部のチームが）開発されていました。

このように、ディベロッパーのことをかなり考えたAPIを徐々に整備しているところが素晴らしいなと思った次第です。


#### ブートストラップを実行するAPIを、用途に合わせて２種類提供する

これはどういうことかピンとこない人もいるかと思いますが、
私はとてもすごいと感じたポイントなので言及させてください。

理由は、これもエンドユーザの実運用を意識しないと２つ用意しようと思わないはずだからです。
かゆいところに手が届くような機能があると、わかってるなあ、、と思うと思いますが、
まさにそんな感覚を受けました。

２種類用意されたAPIなのですが、簡単に言うと、

- **超高速で実行でき、並列性が低いAPI**
- **そこそこのレベルで高速に実行できて、並列性が高いAPI**

が用意されています。

TFHE形式のブートストラップについては、以前

https://qiita.com/kenmaro/items/a1d90a074d552b7bf886#tfhe%E4%BA%9C%E7%A8%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%96%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88%E3%82%B9%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E5%9E%8B%E5%BD%A2%E5%BC%8F

この辺りに書きましたが、
**暗号に対して任意の関数を実行できるLUTを使ったルックアップの操作**
のことです。

このLUTを実際に使う時、用途によっては（特にMLなどの用途では）、

- **大量のLUTを用意する必要があるパターン**
- **１つのLUTに対して大量の暗号についてルックアップするパターン**

などがあるため、２つめのAPIは非常に重宝するでしょう。

一方でもし演算がシンプルな構成であれば、１つめのAPIを使って実行時間を最短にすることも選択できますし、
アプリケーションレベルでこのライブラリをどう使いたいか、
というところを考えるエンジニアに対しても非常にケアしてくれているなあと思った次第です。


#### 実測値も記載がありイメージがつかめる
最後に、リリースに実測値と使用したパラメータ、使用した実機のスペックなどが記載されており、
簡単な研究結果のまとめみたいになっていたので、
具体的にどのくらいの速度が出ているのか理解できましたし、ありがたいなと思いました。




## まとめ

以上、今回は**Zama AI**が開発する
プログラマブルブートストラップを搭載したTFHE亜種のライブラリ、
「**Concrete**」についてのリリースについて思ったことをコメントしてみました。

いいことばかり今回書いてしまいましたが、リリースでも言及されている通り、
実際に使う時のパラメータ選定や、限定されているビット数などは実運用上困難なところもあるかと思います。
実際私が以前使ってみた時は、パラメータの選定に苦労しました。

しかしながら、**このようなライブラリがOSSとして整備され、
機能、性能の面で改善されていくに従い、いろんなユーザが使うようなライブラリになるのではないかと思っています。**

みなさんも興味があればぜひConcreteを触ってみて、準同型暗号による演算がどのようにして行われるのか試してみてはいかがでしょうか。


今回はこの辺で。



@kenmaro