このドキュメントでは、X(旧Twitter)のレコメンデーションアルゴリズムのコードベースから、技術的に特に興味深い実装や設計について解説します。
- プロダクション最適化: 超高性能、安定性、可用性を重視したミニマリスト設計
- TensorFlow Serving互換: 既存のTensorFlow ServingクライアントとgRPC APIで互換性
- プラグインアーキテクチャ: TensorFlow、ONNX Runtime、PyTorch(実験的)をサポート
// 予測サービスの非同期アーキテクチャ
pub async fn predict(
&self,
idx: usize,
version: Option<i64>,
val: Vec<TensorInput>,
ts: Instant,
) -> Result<PredictResult>- 非同期処理: Tokioベースの完全非同期実装で高スループットを実現
- メッセージパッシング: MPSCチャネルを使用したワーカープールパターン
- モデル管理: 複数モデル・複数バージョンの動的ロード/アンロード
- Prometheus統合: リアルタイムメトリクス収集
- 二部グラフ表現: フォロー関係を Producer(フォローされる人)と Consumer(フォローする人)の二部グラフで表現
- コミュニティ検出: Metropolis-Hastings サンプリングベースのコミュニティ検出で約145,000のコミュニティを発見
- スパース埋め込み: 各プロデューサーは最大1つのコミュニティに所属する最大スパース行列
- Known For 行列: プロデューサー→コミュニティの関係(n × k行列、k ≈ 145,000)
- InterestedIn 行列: A × V = U の計算でユーザーの長期的興味を算出
- リアルタイム更新: Heronストリーミングジョブでツイート埋め込みをリアルタイム更新
// ツイート埋め込みの更新ロジック
// ユーザーがツイートをファボるたびに、そのユーザーのInterestedInベクトルがツイートベクトルに加算される- インメモリ処理: 24-48時間のユーザーエンゲージメントをメモリに保持
- 協調フィルタリング: 重み付きフォローグラフからトップ重み付きツイートを効率的に取得
- リアルタイム更新: Kafkaストリームでリアルタイムに状態を取り込み・永続化
- 効率的なグラフ探索: "XXX Liked"のout-of-networkツイート生成
- GC最適化: 古いイベントの自動削除とガベージコレクション
- Finagleサービス: 高性能なThriftサービスとして実装
- 勾配ブースティング: ユーザー間相互作用の確率を予測
- BigQueryベース: 大規模グラフデータの効率的な処理
- 特徴量工程: ツイート数、フォロー数、ファボ数、その他の行動メトリクス
// 日次集計 → ロールアップ処理 → ML予測スコア算出
// 複数の相互作用タイプ(ファボ、RT、フォローなど)を統合- ユーザー影響度: ユーザー間の相互作用(メンション、RTなど)をエッジとするグラフでPageRank
- Hadoop MapReduce: 大規模分散処理での実装
- レピュテーション調整: フォロワー/フォロー比による後処理調整
- ブロック圧縮: メモリ使用量削減
- 遅延ロード: 必要時のみデータロード
- インメモリキャッシュ: 高速アクセス
- 統合ストリーム: クライアント・サーバーサイドイベントの統一処理
- マルチシンク: Kafka → HDFS、GCP Pubsub、BigQuery への並列出力
- リアルタイム性: 暗黙・明示的ユーザーアクション(ブックマーク、インプレッション、動画視聴)
- コンポーネント指向: 再利用可能で標準化されたコンポーネント
- パイプライン設定: どのコンポーネントをいつ使用するかの宣言的設定
- 階層構造: Product → Mixer → Recommendation → Candidate → Scoring
// 型安全なパイプライン設定
// 異種候補の統合(ツイート、広告、ユーザー)
// 同種候補のスコアリング・ランキング- マルチタスク学習: 通知開封確率とエンゲージメント確率を同時予測
- 畳み込み層: 独自の畳み込みアーキテクチャ
- 継続学習: リアルタイムモデル更新とチェックポイント管理
- ロジスティック回帰: より多くのツイートに対する簡易版Heavy Ranker
- リアルタイム特徴: RT数、ファボ数、返信数、毒性・ブロックスコア
- 静的特徴: URL有無、トレンドワード、テキスト品質スコア
- Index Ingester: ツイート生成時の基本情報・静的特徴
- Signal Ingester: 動的特徴(エンゲージメント数、スパムシグナル)
- User Table Features: ユーザーごとの特徴量
- Search Context Features: 検索者の情報(言語、時間)
- スケーラビリティ: インメモリ処理とストリーミングの組み合わせで大規模リアルタイム処理
- モジュラリティ: コンポーネント指向設計で保守性と再利用性を実現
- 多言語活用: 用途に応じた最適な言語選択(Rust、Scala、Python)
- データパイプライン: バッチ処理とストリーミングの効果的な組み合わせ
- 機械学習の実用化: 研究とプロダクションの橋渡しとなる実装
これらの技術は、月間数億ユーザーという大規模ソーシャルメディアプラットフォームの要求を満たすための、実践的で革新的なソリューションを示しています。