こんにちは。LINE VOOM AI組織のサーバー開発者、Chan Woo ParkとYousung Yangです。
本記事ではAIに使用されるリアルタイム埋め込みを提供するサーバーを構築するにあたり、性能向上とインフラ費用削減を両立させたプロセスと結果についてお伝えします。
この記事は、AIに限らず、大 量のデータをリアルタイムで提供するサーバーの構築を必要とする、あらゆる分野に通じる内容となっています(埋め込み自体の生成方法については触れていません)。サーバー構築時に常に課題となる性能向上とコスト削減に、この記事が参考になることを願います。
この記事では、具体的な数値をなるべく省略しました。開発者が扱うデータはそれぞれ違うので、具体的な数値を提示するより、問題のアプローチ方法と解決策を詳しく説明し、みなさんがそれを簡単に再現して効果を体感できるように記事を構成しました。
プロジェクトの紹介
今回のプロジェクトを一文で説明すると、「大量の埋め込みをリアルタイムでAIモデルに提供するためのプロジェクト」です。AIモデルのニーズに合った埋め込みをリアルタイムで提供するサーバーを構築するにあたり、高TPSと高速な応答速度を実現し、それと同時にインフラコストを最小限に抑えることを目標としました。
プロジェクトの目標
プロジェクトの目標を重要度の高い順に一つずつ具体的に紹介します。
1. 高TPS(transactions per second)達成
今回のプロジェクトで最も重要な目標は、要求されるTPSを達成することでした。TPSが達成されないとサービスが成り立たないためです。AIモデルが要求するTPSは、数値だけを見ると他のLINEサービスでも見られる通常のレベルでしたが、細かく分析してみると他のサービスのTPSに数十倍、数百倍を掛けたようなレベルでした。その理由については、後述の埋め込みのデータ特性で説明します。
2. 高速な応答速度
どれだけ良いサービスでも、応答時間が遅くてユーザーを待たせてしまうと、決して良いユーザーエクスペリエンスを提供できません。後述しますが、データサイズが大きく、応答速度が遅かった、それを短縮することが重要でした。
3. インフラコスト削減
高TPSを実現するためには、必然的に大規模なインフラを使用することになります。となると、コスト削減の重要性が増し、プロジェクトの主な目標の一つとなります。例えば、VM10台規模のサービスでサーバーの性能向上と効率化によって5台に削減するのと、VM100台規模のサービスで50台に削減するのとでは、その割合は同じでも、実際のコスト削減効果は10倍違います。
埋め込み(embedding)とは?
まず、この記事でよく出てくるキーワードである埋め込みとは何かを解説します。
AIと埋め込み
まず、埋め込みの例を見てみましょう。
"data": [
{
"embedding": [
1.543545822800004554,
-0.014464245600309352,
-0.021545555220005484,
...
-2.547132266452536e-05,
-1.5454545875425444544,
-1.0452722143541654544
],
}
],
ご覧のとおり、何を意味するのか人間には分かりにくい数字の配列です。埋め込みは元々人間のためのものではなく、AIのためのものです。埋め込みは、単語、画像、動画などの実際のオブジェクトをコンピュータが処理できる形で表現したものです。カンマで区切られた数字一つ一つが次元であり、その数字の配列全体がベクトルであると考えると、各埋め込みをn次元の空間に表示できます。
これに基づいて、オブジェクトAの埋め込みとオブジェクトBの埋め込みを空間に表示し、お互いの距離を測定して、お互いの類似度を判断できます。画像を例に挙げると、黒猫の写真と白猫の写真は、シマウマの写真よりも隣接した空間に表示されます。このように、埋め込みはAIがオブジェクト間の類似度を評価する際に使用する必須要素です。
リアルタイム埋め込みとは?
AIに埋め込みが必要なタイミングは大きく2つに分けられます。1つは、モデルを学習させるときで、もう1つは、学習されたモデルを実際のサービスに適用した後、ユーザーのリクエストを受けるときです。後者の場合、ユーザーのリクエストに素早く応答しなければならないため、サーバーはモデルがリクエストした大量の埋め込みを非常に速いスピードで提供する必要があり、このとき使用する埋め込みをリアルタイム埋め込み(realtime embedding)と言います。
埋め込みのデータ特性
埋め込みがより高い次元で構成されるほど、構成している値の範囲が大きいほど、AIモデルはより正確に判断できますが、これは埋め込みがより大きなデータになるという意味でもあります。さらに、AIモデルはこのような埋め込みを1件だけリクエストすることはありません。サーバーの観点から大きな埋め込みが複数件同時に入出力されるということは、大量のI/Oが発生することを意味します。
プロジェクトに適したDB選定
プロジェクトを開始して最 初に行ったのは、DBの選定でした。プロジェクトの非常に高い性能要求レベルを達成するためには、高性能DBが必須だったからです。
必要なDBの特性を整理
まず、必要なDBの特性を把握したうえで、その基準をもとにどのDBを使うか判断できるため、具体的にどのような特性が必要かを以下のように整理しました。
RDB、NoSQLのどちらでもOK
今回のプロジェクトはリアルタイム埋め込みをキーと値で保存し、キー(サブキー(sub-key)を含む)で取得することで十分でした。保存されたデータの関係性を取得する用途ではないため、NoSQL種類のDBも使用できました。
シャーディング対応
QPS(query per second)レベルが変わっても、大量のI/Oを柔軟かつ高速にサポートし、拡張が必要なときに無停止でスケールアウトするためには、シャーディングがサポートされている必要があります。特に、ネイティブシャーディングをサポートするDBが推奨されます。MySQLのようにシャーディングを実装できる場合もありますが、効率性とメンテナンスを考慮すると、ネイティブシャーディングをサポートするDBが有利です。
ネイティブシャーディングを前提に設計されたDBは、複数のノードにデータが配置されるため、リクエストがノード全体に均等に分散され、その分ネットワーク負荷が分散されるというメリットがあります。このメリットは、特に埋め込みのようにネットワーク帯域幅を多く占有するデータを保存する場合、非常に重要な特性です。Redis ClusterやMongoDB Sharded Clusterがその代表例です。