プライバシーを強化した生成 AI を実現する

7月 09, 2024
Krzysztof Ostrowski Research Scientist
Rene Kolga Senior Product Manager

生成 AI(gen AI)の利用が急拡大していますが、プライベートで機密性の高いデータに生成 AI を適用する製品を作る余地は、ほぼ手つかずのまま残されています。

たとえば、次のようなことに生成 AI を利用できるかもしれません。

  • 日常生活の一部となり、生活の中で起きることを認識することで、日常のさまざまな状況で役立つパーソナル アシスタントを実現するデータ処理。

  • 機密のビジネス情報。たとえば、請求書の処理やカスタマー サポートへの問い合わせ対応など、手間のかかるタスクを自動化し、生産性を向上させ、運用コストを削減する。

このような特定のアプリケーションでは、データ処理のプライバシーと機密性、透明性、外部検証性要件が厳しくなる場合があります。

Google は多くのテクノロジーを開発し、プライバシーを保つべきデータを扱う生成 AI の可能性を探ってきました。この投稿では、最近リリースされた GenC オープンソース プロジェクトを、Confidential ComputingGemma オープンソース モデル、モバイル プラットフォームと組み合わせて使う方法を説明します。これにより、独自の生成 AI アプリで、プライバシーと機密性、透明性、外部検証性要件が厳しいデータを扱う実験を始めることができます。


エンドユーザー デバイスとクラウドとの連携

この投稿で注目するシナリオは、以下に示すように、モバイルアプリでオンデバイスのデータにアクセスし、LLM で生成 AI 処理を実行します。

たとえば、デバイスに保存したメモ、文書、録画に関する要約や質問の回答を、パーソナル アシスタント アプリに依頼する場合が考えられます。こういったコンテンツには、他の人とのメッセージなどの個人情報が含まれている可能性があるため、絶対に漏れることがないようにしたいと考えます。

この例では、Gemma ファミリーのオープンソース モデルを選びました。これはモバイルアプリを想定したものですが、独自のデータをオンプレミスでホストしている企業にも、同じ原則を適用できます。

A model cascade that spans from a mobile device to a trusted enclave in cloud.

この例は、2 つの LLM を使う「ハイブリッド」設定です。1 つはユーザーのデバイスでローカル実行し、もう 1 つは Confidential Computing に対応した Google CloudConfidential Space 高信頼実行環境(TEE)にホストします。このハイブリッド アーキテクチャでオンデバイスとクラウドの両方のリソースを活用することで、モバイルアプリはそれぞれにしかない独自の利点を利用できます。

  • 量子化した Gemma 2B のインスタンスは小さく、1.5GB 以下のパッケージで提供され、最新のモバイル デバイス(Pixel 7 など)に収まります。応答時間は短く(ネットワークやデータ転送のレイテンシが発生しないため)、ネットワーク接続がなくても問い合わせに答えることができ、ローカルのオンデバイス ハードウェア リソースを活用できるのでコスト効率に優れています(したがって、同じコストで、クラウドよりもたくさんのユーザーに提供できます)。

  • 量子化していない Gemma 7B のインスタンスは大きく、35GB 近くあるので、高性能デバイスにも収まりません。クラウドにホストするため、ネットワーク接続が必要で、コストは高くなりますが、質が高く、複雑で高価な問い合わせにも答えられる(処理のリソースが豊富なため)だけでなく、さまざまな利点があります(クラウドに計算をオフロードできるので、モバイル デバイスのバッテリー消費を最小限に抑えられるなど)。

この例では、2 つのモデルを連携させ、モデル カスケードとして接続します。小さく安価で高速な Gemma 2B が最初の階層となり、簡単な問い合わせに対応します。一方、大きな Gemma 7B は、前者だけでは処理できない問い合わせのバックアップとして動作します。たとえば、少し下のコード スニペットでは、Gemma 2B をオンデバイス ルーターとして設定しています。これはまず、入力クエリを分析して 2 つのモデルのどちらが最適であるかを決定し、その結果に基づいて、問い合わせをオンデバイスでローカル処理するか、クラウドベースの TEE で動作する Gemma 7B にリレーします。


デバイスの論理拡張となる TEE

このアーキテクチャでは、クラウドの TEE を、ユーザーのモバイル デバイスの論理拡張と考えることができます。ただし、透明性、暗号化保証、信頼できるハードウェアといった特性が備わっています。

  • TEE にホストした Gemma 7B と GenC ランタイムを含むプライベート コンテナは、暗号化したメモリで実行されます。デバイスと TEE との間の通信も暗号化され、データは永続化されません(ただし必要な場合は、暗号化して保存することもできます)。

  • TEE のコードは、デバイスから委任される問い合わせを処理しますが、デバイスはインタラクションを行う前に、TEE のコードの身元と整合性を検証します。具体的には、証明書レポートを要求し、そこに含まれる TEE で実行されるコンテナ イメージの SHA256 ダイジェストと、デベロッパーがアプリにバンドルしたダイジェストを比較します。(この簡単なシナリオでは、オンデバイスのアプリと同じように、アプリのデベロッパーも純粋に信頼するものとします。さらに複雑な設定も可能ですが、この記事の範囲を超えてしまいます)

  • このシナリオでは、コンテナ イメージで実行するすべてのコードは、100% オープンソースです。したがって、デベロッパーや他の外部関係者は、イメージに含まれるコードを独立して検査し、ユーザーやデータ所有者の期待、規制や契約上の義務などに従った方法でデータを処理していることを検証できます。その後、専用のイメージを構築し、作成したイメージのダイジェストがアプリにバンドルされたダイジェストと一致し、後に TEE が返す証明書レポートでアプリに届けられることを確認します。

一見すると、この設定は複雑に思えるかもしれません。実際、ゼロからすべてを設定する場合は、そのようになります。GenC を開発したのは、このプロセスを簡単にするためにほかなりません。


デベロッパー エクスペリエンスをシンプルにする

以上のようなシナリオを設定するために、GenC で実際に書かなければならないコードの例を示します。人気の選択肢として、ここではデフォルトで Python を使いますが、Java と C++ のオーサリング API も提供しています。この例では、デリケートな話題ほど、強力なモデル(慎重な回答を作成できるモデル)で処理すべきシグナルとして扱います。この例は、説明用に簡略化されていることに注意してください。実際には、ルーティング ロジックをさらに洗練させ、アプリケーション固有のものにする必要があるでしょう。特に小型モデルでは、慎重なプロンプト エンジニアリングを行わなければ、優れたパフォーマンスは実現できません。

@genc.authoring.traced_computation
def cascade(x):
  gemma_2b_on_device = genc.interop.llamacpp.model_inference(
    '/device/llamacpp', '/gemma-2b-it.gguf', num_threads=16, max_tokens=64)
 
  gemma_7b_in_a_tee = genc.authoring.confidential_computation[
    genc.interop.llamacpp.model_inference(
      '/device/llamacpp', '/gemma-7b-it.gguf', num_threads=64, max_tokens=64),
    {'server_address': /* サーバー アドレス */, 'image_digest': /* イメージ ダイジェスト */ }]
 
  router = genc.authoring.serial_chain[
    genc.authoring.prompt_template[
      """Read the following input carefully: "{x}".
      Does it touch on political topics?"""],
    gemma_2b_on_device,
    genc.authoring.regex_partial_match['does touch|touches']]
 
  return genc.authoring.conditional[
    gemma_2b_on_device(x), gemma_7b_in_a_tee(x)](router(x))

GitHub のチュートリアルで、このような例を作成して実行する方法を細かく説明しています。ご覧のとおり、抽象化のレベルは、LangChain などの一般的な SDK で見られるものと同等です。Gemma 2B および 7B モデルの推論呼び出しは、プロンプト テンプレートや出力パーサ内に散りばめられ、チェーンに組み入れられます。(今のところ、LangChain との相互運用は限られていますが、今後改善したいと考えています)

Gemma 2B モデルの推論呼び出しは、デバイスで実行されるチェーンから直接行われますが、Gemma 7B の呼び出しは、明示的に confidential_computation 文に埋め込まれている点に注意してください。

重要なのは、ここにサプライズはないということです。プログラマーは、デバイスでどの処理を実行するか、デバイスからクラウドの TEE に委任するのは何かを、常に完全に制御しています。この決定は、コード構造に明示的に反映されています。(この例では、Gemma 7B 呼び出しを 1 つの信頼できるバックエンドに委任しているだけですが、提供するメカニズムは汎用的なので、エージェント ループ全体など、大きな処理のチャンクを任意の数のバックエンドに委任することもできます)


プロトタイピングから柔軟なデプロイまで

上のコードはおなじみの Python 構文で書かれていますが、内部的には、中間表現(略して「IR」)と呼ばれるものに変換されます。これは、プラットフォームにも言語にも依存しないポータブルな形式です。

このアプローチには、たくさんの利点があります。その一部を挙げましょう。

  • Jupyter ノートブックなど、短時間で反復作業できる便利な開発環境で、生成 AI ロジックのプロトタイピングやテストを行えます。また、同じ生成 AI コードを、最小限の変更または無変更で、モバイル デバイスの Java アプリなどにデプロイできます。チュートリアルでは、IR を含むファイルをモバイル デバイスにコピーし、アプリに読み込むだけの手順になっています。

  • 異なる言語やプラットフォーム(Linux ベースからモバイル プラットフォームまで、また Python から Java、C++ まで)に同じロジックをデプロイして実行し、一貫した動作を実現できます。さまざまな製品をターゲットにする予定なら、これは大きなメリットになります。

  • プロセスやマシンの境界を越えて、生成 AI ロジックの任意の部分を動的に委任できます。このシナリオでは、それが暗黙的に行われ、モバイル デバイスからクラウドの TEE に委任されています。この簡単な例では、1 つの操作(Gemma 7B 推論呼び出し)だけを委任しています。私たちが提供するメカニズムは、はるかに汎用的です。

現実のデプロイでは、パフォーマンスが重要な要素になることがほとんどです。現時点で公開されている例は、動作が CPU に限定されており、現在の GenC は、llama.cpp のみを使って TEE にあるモデルを動作させています。ただし、Confidential Computing チームは、Intel AMX 内蔵アクセラレータ機密モードで実行する Nvidia H 100 GPU のプレビュー(近日公開)によって Intel TDX のサポートを拡張しています。利用できるソフトウェアとハードウェアのオプションを拡大し、最高のパフォーマンスを実現し、さまざまなモデルをサポートできるように、積極的に作業を進めていますので、今後のアップデートにご期待ください!


感想をお聞かせください!

興味をお持ちいただければ幸いです。この投稿では、ここで紹介したテクノロジーの一部を使って、独自の生成 AI アプリケーションを作ってみることをおすすめしています。なお、GenC は実験および研究目的で開発された試験運用版フレームワークであることを覚えておいてください。可能性を実証し、このエキサイティングな空間を皆さんと一緒に探求するために開発しています。貢献したい方は、作者に連絡するか、GitHub からお知らせください。ぜひ力を合わせましょう!