「Lyft Marketplaceチームは、現実世界のダイナミクスに機敏に対応することで、ビジネス効率の向上を目指しています。Apache Beamは、リアルタイムの機能でモデルの精度を向上させるための堅牢でスケーラブルなMLインフラストラクチャを持つという目標を達成することを可能にしました。これらのリアルタイム機能は、Forecasting、Primetime、Dispatchなどの重要な機能をサポートしています。」

Ravi Kiran Magham
Lyftソフトウェアエンジニア

LyftにおけるBeamを用いたリアルタイムML

背景

Lyft, Inc. は、ライドヘイリング、自動車および電動スクーターのレンタル、自転車シェアリング、食品配達、ビジネス輸送ソリューションを提供するアメリカのモビリティサービスプロバイダーです。Lyftはカリフォルニア州サンフランシスコに本社を置き、米国644都市とカナダ12都市で事業を展開しています。

Lyftのような大企業から想像できるように、このような規模でドライバーと乗客を空間と時間で結びつけるには、強力なリアルタイムストリーミングインフラストラクチャが必要です。LyftのソフトウェアエンジニアであるRavi Kiran Magham氏は、大規模なストリーミングデータ処理と機械学習パイプラインを可能にすることで、Apache BeamがLyftにとってミッションクリティカルかつ不可欠なリアルタイムデータ処理技術となった経緯を説明しました。

ストリーム処理の民主化

Lyftは当初、Amazon KinesisApache Flinkを使用して、アプリケーションサービスによって生成されたイベントをAWS S3のデータレイクに変換、エンリッチ、およびシンクするストリーミングETLパイプラインを構築しました。 Apache FlinkはLyftのストリーミングアーキテクチャの基盤であり、分散ステートフルストリーム処理、正確に1回限りの処理、およびさまざまなI/Oコネクタのための堅牢で耐障害性があり、直感的なAPIにより、Apache Sparkよりも選択されました。

Lyftの人気に伴う成長は、データストリーミングインフラストラクチャに新たな要求をもたらしました。多様なプログラミング言語の好みを持つより多くのチームが、イベントドリブンストリーミングアプリケーションを探求し、ビジネスの効率化、顧客エクスペリエンスの向上、時間依存のコンプライアンス運用を提供するためのリアルタイム機械学習モデル向けのストリーミング機能を構築したいと考えていました。データプラットフォームチームは、Redisを介してデータを交換するMLモデルのアンサンブルを調整するサービスを備えた、マーケットプレイスチームのプライムタイム(サージプライシング)計算の改善を検討しました。チームは、コードの複雑さを軽減し、レイテンシ(エンドツーエンドで5分から1分未満)を改善することを目指しました。マーケットプレイスチームではPythonが必須であり、データプラットフォームチームではJavaが heavilyに使用されていたため、Lyftは2019年にApache Beam ポータビリティフレームワークの検討を開始し、すべてのチームがストリーミングを利用できるようにしました。

Apache Beamのポータビリティと多言語機能は、Beamを本格的に検討し始めた主なきっかけであり、最大の理由でした。

Ravi Kiran Magham
Lyftソフトウェアエンジニア

Apache Beamは、ランナー(Apache Flink用のBeam Flinkランナーを含む)とさまざまなプログラミング言語SDKを提供するため、プログラミング言語とデータ処理エンジンのジレンマに対するソリューションを提供します。Apache Beamは、「一度書けばどこでも実行できる」というコンセプトと、複数のプログラミング言語の変換を使用する多言語パイプライン - データパイプラインを作成する機能により、究極のポータビリティを提供します。

データインフラチームはJavaを使用していますが、製品チームには、彼らが好む事実上の言語であるため、Python SDKを提供できるため、Apache Beamの活用は私たちにとって「win-win」の決定でした。私たちは、簡単に快適にストリーミングパイプラインを作成し、Beam Flinkランナーで実行できます。

Ravi Kiran Magham
Lyftソフトウェアエンジニア

データプラットフォームチームは、Kubernetesクラスター上のFlinkアプリケーションを管理し、ストリーミングApache BeamおよびApache Flinkジョブをデプロイするために、社内サービスとFlinkK8sOperatorの制御プレーンを構築しました。Lyftは、ダウンタイムを最小限に抑えるために重要なパイプラインでブルー/グリーンデプロイメント戦略を使用し、オブザーバビリティの向上とCI/CDデプロイメントのシームレスな統合のためにカスタムマクロを使用しています。開発者の生産性を向上させるために、データプラットフォームチームは、ソースとシンクの構成を抽象化する軽量のYAMLベースのDSLを提供し、受信イベントのフィルタリングとエンリッチメントのために再利用可能なApache Beam PTransformsを提供しています.

リアルタイム機械学習パイプラインの強化

Lyft Marketplaceは、フリートの需要と供給の予測、動的価格設定、ETA計算などを最適化する上で重要な役割を果たしています。Apache Beam Python SDKとFlink Runnerにより、チームは変化に機敏に対応し、リアルタイムML(ストリーミング機能生成とモデル実行)の需要をサポートできます。データプラットフォームチームは、ストリーミングインフラストラクチャを拡張して、継続学習ユースケースをサポートしています。Apache Beamは、2時間以上の大きなウィンドウでリアルタイムデータを使用してMLモデルの継続的なトレーニングを行い、コストとETAのバイアスを特定して微調整します。

Apache Beamによる特徴量生成とMLモデル実行 Apache Beamによる特徴量生成とMLモデル実行

Lyftは、特徴量生成とMLモデル実行を複数のストリーミングパイプラインに分割しました。ストリーミングApache Beamパイプラインは、リアルタイムで特徴量を生成し、モデル実行パイプラインによって消費されるKafkaトピックに書き込みます。ユーザー設定に基づいて、特徴量は複製され、モデルIDによってステートフルな ParDo変換にキーアウトされます。これは、タイマーやデータ(特徴量)の可用性を利用してMLモデルを呼び出します。特徴量はグローバルウィンドウに格納され、状態は明示的にクリーンアップされます。MLモデルはModel Servingインフラストラクチャの一部として実行され、その出力は別のMLモデルへの入力特徴量になる可能性があります。このDAGワークフローをサポートするために、Apache Beamパイプラインは出力をKafkaに書き込み、Redisに書き込むことに加えて、処理のためにモデル実行ストリーミングパイプラインにフィードします。

複雑なリアルタイム特徴量生成には、1秒未満のレイテンシで1分あたり約400万件の1KBイベントを処理し、空間と時間粒度(1分と5分)にわたる複数のイベント属性で約100の特徴量を生成することが含まれます。Apache Beamにより、Lyft Marketplaceチームはレイテンシを60%削減し、コードを大幅に簡素化し、多くのチームとユースケースをストリーミングにオンボードすることができました。

マーケットプレイスチームは、リアルタイムの特徴量計算とモデル実行のためにApache Beamを頻繁に使用しています。1秒未満のレイテンシでイベントをリアルタイムで処理することで、MLモデルは市場のダイナミクスを早期に理解し、情報に基づいた意思決定を行うことができます。

Ravi Kiran Magham
Lyftソフトウェアエンジニア

ユースケースの拡大

Lyftは、60以上のユースケースでApache Beamを活用し、重要なビジネスコミットメントの完了とリアルタイムのユーザーエクスペリエンスの向上を可能にしました。

たとえば、LyftのMap Data Deliveryチームは、道路閉鎖をリアルタイムで特定するために、バッチプロセスからストリーミングパイプラインに移行しました。彼らのルーティングエンジンはこの情報を使用して、最適なルートを決定し、ETAを改善し、より良いドライバーと顧客エクスペリエンスを提供します。ジョブは約40万イベント/秒を処理し、サードパーティの道路閉鎖とリアルタイムの交通データからのデータストリームを結合して実際の閉鎖を特定し、それらをイベントとしてKafkaに公開します。カスタムS3 PTransformにより、ジョブはダウンストリームバッチ処理のために閉鎖のスナップショットを定期的に公開できます。

Apache Beamにより、Lyftは、空港での乗車と降車の報告に関連する非常に具体的なユースケースを最適化することができました。空港は、モビリティアプリケーションがすべての乗車と降車を報告し、それらをフリートの入場と退場の時刻と一致させることを要求しています。そうしないと、コンプライアンススコアが低下し、ペナルティを受けるリスクさえあります。当初、LyftはKCLライブラリを使用してイベントを消費し、Redisに格納するという複雑な実装を行っていました。Pythonワーカープロセスは定期的に実行され、Redisからデータを読み取り、サービスAPI呼び出しでデータを結合およびエン

多くの企業が標準的なビジネスモデルを刷新しているように、Lyftはオープンソースソフトウェアに依存し、コミュニティに還元することを好みます。Lyftによって開発されたビッグデータフレームワーク、ツール、実装の多くは、GitHubでオープンソース化されています。Lyftは2018年からApache Beamに大きく貢献しており、LyftのエンジニアはBeam Summit North AmericaBerlin BuzzwordsO’Reilly Strata Data & AIなど、さまざまなイベントでApache Beamの統合について発表しています。

結果

Apache Beamモデルの移植性は、分散実行の鍵となります。これにより、LyftはJVMベース以外の言語で記述されたミッションクリティカルなデータパイプラインをJVMベースのランナーで実行することができました。そのため、コードの書き直しを回避し、多くのAPIスタイルとランタイム環境の潜在的なコストを回避することで、パイプラインの開発時間を数日から数時間に短縮しました。ユーザーコードの完全な分離と、ライブラリの制限のないネイティブCPythonの実行により、容易なオンボーディングと導入が実現しました。Apache Beamの複数言語およびクロス言語機能は、Lyftのプログラミング言語のジレンマを解決しました。統一されたプログラミングモデルにより、Lyftは特定のテクノロジスタックに縛られることがなくなりました。

Apache Beamにより、LyftはバッチMLモデルのトレーニングから、ウィンドウイングを使用してデータの鮮度をきめ細かく制御できるリアルタイムMLトレーニングに移行することができました。データエンジニアリングチームと製品チームは、特定のタスクの適切性または好みに基づいて、PythonとJavaの両方を使用できます。Apache Beamは、Lyftが非常に低いレイテンシでほぼリアルタイムにイベントを処理する60以上のストリーミングパイプラインを正常に構築およびスケーリングするのに役立ちました。新しいユースケースが次々と登場しており、LyftはBeam SQLGo SDKを活用して、チームにApache Beamの複数言語機能をフルレンジで提供することを計画しています。

この情報は役に立ちましたか?