DUICUO

Alibaba は、大規模なスパースモデルのトレーニング/予測エンジンである DeepRec をオープンソース化しました。

さまざまなチームによる 6 年間の努力を経て、アリババ グループの大規模スパース モデル トレーニング/予測エンジンである DeepRec が正式にオープンソース化され、開発者がスパース モデル トレーニングのパフォーマンスと有効性を向上させるのに役立っています。

I. DeepRecとは何ですか?

DeepRec(PAI-TF)は、アリババグループの統合型大規模スパースモデルトレーニング/予測エンジンであり、Taobao、Tmall、Alimama、Amap、Taobao Special、AliExpress、Lazadaなどで広く使用されています。Taobaoの検索、推奨、広告などのコアビジネスをサポートし、数千億の特徴と数兆のサンプルによる超大規模なスパーストレーニングをサポートします。

DeepRec は、分散システム、グラフ最適化、演算子、ランタイムなどの領域でスパース モデルに対して詳細なパフォーマンス最適化を実行するとともに、スパース シナリオに固有の埋め込み関連機能も提供します。

2016年から開発が進められているDeepRecプロジェクトは、AlibabaグループのAOP、XDL、PAI、RTPチームとAntグループのAIInfraチームの共同作業であり、Taobaoのレコメンデーションアルゴリズムを含む複数のビジネスアルゴリズムチームから支援を受けています。DeepRecの開発は、IntelのCESGソフトウェアチーム、Optaneチーム、PSUチーム、NVIDIA GPUコンピューティング専門家チーム、Merlin HughCTRチームからも支援を受けています。

II. DeepRecアーキテクチャの設計原則

TensorFlowエンジン上で大規模なスパース特徴量をサポートするには、業界で様々な実装が存在します。最も一般的なアプローチは、ParameterServerアーキテクチャを借用し、TensorFlowの外部に独立したParameterServerと関連するオプティマイザを実装し、TensorFlow内で2つのモジュールをブリッジすることです。このアプローチには、より柔軟なPS実装などの利点がありますが、いくつかの制限もあります。

DeepRecは、「トレーニングエンジン全体を一つのシステムとして扱う」という原則に基づき、独自のアーキテクチャ設計アプローチを採用しています。TensorFlowは、最上位のAPI層、中間のグラフ最適化層、最下位の演算子層といった階層型アーキテクチャを備えたグラフベースの静的グラフトレーニングエンジンです。TensorFlowはこの3層設計を用いて、上位層における様々なワークロードのビジネスニーズとパフォーマンス最適化要件をサポートします。

DeepRecもこの設計原則を踏襲し、ストレージと計算の分離に基づいてグラフレベルでEmbeddingVariable機能を導入し、グラフの特性に基づいて通信のための演算子の融合を実現しています。この設計原則により、DeepRecは、単一マシンと分散シナリオの両方で、ユーザーが同じオプティマイザー実装と同じEmbeddingVariable実装セットを使用できるようにサポートします。同時に、グラフレベルで複数の最適化機能を導入することで、独立したモジュール設計では不可能な共同最適化設計を実現します。

III. DeepRecの利点

DeepRecは、TensorFlow 1.15、Intel-TF、NV-TFをベースに構築されたスパースモデルの学習/予測エンジンです。スパースモデルのシナリオ向けにカスタマイズおよび徹底的に最適化されており、主に以下の3種類の機能最適化が行われています。

1. モデル効果

DeepRecはスパース特徴量を豊富にサポートしており、スパースモデルのサイズを縮小しながらモデルのパフォーマンスを向上させ、非常に大規模なスケールにおけるOptimizerのパフォーマンスを最適化します。以下では、EmbeddingとOptimizerの特徴的な機能のいくつかを簡単にご紹介します。

  • EmbeddingVariable(動的弾性特性):

(1)語彙サイズの予測の難しさ、特徴の競合、静的形状変数のメモリとIOの冗長性の問題を解決し、DeepRecのEmbeddingVariableの豊富な高度な機能を提供します。これには、さまざまな特徴の受け入れ方法とさまざまな特徴の除去戦略のサポートが含まれており、スパースモデルのパフォーマンスを大幅に向上させることができます。

(2)アクセス効率の面では、より良いパフォーマンスとより低いメモリ使用量を達成するために、EmbeddingVariableの基礎となるHashTableはロックフリー設計を実装し、細かいメモリレイアウトの最適化を実施しました。これにより、HashTableのアクセス頻度が最適化され、トレーニング中に前方方向と後方方向でHashTableへのアクセスが1回だけ必要になります。

  • 動的ディメンション埋め込み変数:

典型的なスパースシナリオでは、類似した特徴量の出現頻度が極めて不均一になることがよくあります。通常、同じ特徴量列内の特徴量は均一な次元に設定されます。埋め込み次元が高すぎると、低頻度の特徴量が過剰適合しやすくなり、余分なメモリを大量に消費します。一方、埋め込み次元が低すぎると、高頻度の特徴量が適切に表現されず、パフォーマンスに影響を与える可能性があります。

動的次元埋め込み変数は、同じ特徴列に対して異なる特徴値を提供します。特徴の人気度に基づいて、異なる特徴次元を自動的に設定します。高頻度の特徴量は高次元に設定することで表現力を高め、低頻度の特徴量は低次元埋め込みによって過剰適合の問題を軽減し、メモリを大幅に節約できます(低頻度のロングテール特徴量の数が圧倒的に多いため)。

  • 適応埋め込み:

動的弾性特徴量を使用する場合、低頻度特徴量は過学習につながる可能性があります。EmbeddingVariable内のすべての特徴量は、初期化子によって設定された初期値(通常は0)から学習されます。頻度が増加する特徴量についても、徐々に学習してより良い状態へと改善する必要があり、他の特徴量の学習結果を共有することはできません。AdaptiveEmbedding関数は、静的なShape Variablesと動的なEmbeddingVariablesの両方を使用してスパース特徴量を格納します。新しく追加された特徴量は競合するVariablesに格納され、頻繁に発生する特徴量は競合しないEmbeddingVariablesに格納されます。EmbeddingVariablesへの特徴量転送により、競合する静的なShape Variablesからの学習結果を再利用できます。

  • Adagrad 減衰最適化ツール:

これは、超大規模学習をサポートするために提案されたAdagrad最適化器の改良版です。モデルを大量のサンプルで学習させ、長期間にわたって継続的に増分学習を行うと、Adagrad最適化器の勾配は0に近づく傾向があり、新たに追加された学習データがモデルに影響を与えなくなります。既存の累積割引方式は、勾配が0に近づく問題を解決できますが、モデルのパフォーマンスの低下も招きます(反復ベースの割引戦略は、実際のビジネスシナリオの特性を反映できません)。Adagrad Decay Optimizerは、同じ期間内のサンプルは同じ割引レベルを持つ周期割引戦略に基づいており、無限のデータ蓄積とサンプル順序がモデルに与える影響をバランスさせます。

さらに、DeepRec は、Multi-HashEmbedding や AdamAsyncOptimizer などの機能を提供しており、メモリ使用量、パフォーマンス、モデル効果の面でビジネスに実用的な支援をもたらします。

2. トレーニングパフォーマンス

DeepRecは、分散システム、グラフ最適化、演算子、ランタイムの観点から、スパースモデルのシナリオに対して徹底的なパフォーマンス最適化を実施しました。具体的には、非同期、同期、準同期トレーニングを含む様々な分散戦略を最適化し、HybridBackendとNVIDIA HugeCTR-SOKをサポートするGPU同期トレーニングを採用しています。DeepRecは、自動パイプラインSmartStage、構造化特徴量、自動グラフ融合など、スパースモデルのトレーニングのための豊富なグラフ最適化機能を提供します。DeepRecは、スパースモデルでよく使用される数十の演算子を最適化し、EmbeddingやAttentionなどの一般的なサブグラフに対して融合演算子を提供します。DeepRecのCPUAllocatorとGPUAllocatorは、メモリ/GPUメモリ使用量を大幅に削減し、E2Eトレーニングのパフォーマンスを大幅に向上させます。スレッドスケジューリングと実行エンジンでは、シナリオごとに異なるスケジューリングエンジン戦略が提供されています。以下は、分散システム、グラフ最適化、ランタイム最適化における特徴的な取り組みの一部について簡単に紹介するものです。

  • StarServer(非同期トレーニングフレームワーク):

超大規模タスクシナリオ(数百または数千のワーカー)では、ネイティブオープンソースフレームワークのいくつかの問題が露呈します。たとえば、非効率的なスレッドプールスケジューリング、クリティカルパスでのロックオーバーヘッド、非効率的な実行エンジン、頻繁な小さなパケットRPCのオーバーヘッドにより、ParameterServerは分散スケーリング中に重大なパフォーマンスボトルネックになります。StarServerは、グラフ、スレッドスケジューリング、実行エンジン、メモリ管理などの最適化が行われています。元のフレームワークのsend/recvセマンティクスをpull/pushセマンティクスに変更し、サブグラフのパーティショニングでこのセマンティクスをサポートします。また、ParameterServer側でグラフ実行中にロックフリー実行を実装することで、ロックフリー実行を実現し、サブグラフの同時実行の効率を大幅に向上させます。ネイティブフレームワークと比較して、トレーニングパフォーマンスを数倍向上でき、3000ワーカー規模までの線形分散スケーリングをサポートします。

  • SmartStage(自動化生産ライン):

スパースモデルの学習には通常、サンプルデータの読み取り、埋め込みの検出、そしてAttention/MLP計算の実行が含まれます。サンプルの読み取りと埋め込みの参照は計算負荷の高い操作ではありませんが、コンピューティングリソース(CPU、GPU)を効率的に活用できません。ネイティブフレームワークの「dataset.prefetch」インターフェースはサンプルの読み取りを非同期に実行できますが、埋め込みの参照には特徴補完やID生成といった複雑な処理が含まれており、「prefetch」ではパイプライン化できません。SmartStage機能は、グラフ内の非同期パイプライン境界を自動的に分析して挿入することで、同時実行パイプラインのパフォーマンス向上を最大化します。

  • PRMalloc(メモリアロケータ):

スパースモデルの学習には、効率的かつ効果的なメモリ利用が不可欠です。スパースモデルの学習中に大量のメモリを割り当てると、多数のマイナーページフォールトが発生する可能性があります。さらに、マルチスレッドによるメモリ割り当てでは、同時割り当ての効率性に重大な問題が生じます。DeepRecは、スパースモデルの学習に特徴的な、比較的固定された順方向および逆方向のグラフ計算パターンと反復的な複数ラウンド計算に対処するため、ディープラーニングタスク専用のメモリ管理ソリューションを設計し、メモリ利用効率とシステムパフォーマンスを向上させました。DeepRecが提供するPRMallocを使用することで、学習中のマイナーページフォールトを大幅に削減し、マルチスレッドによる同時メモリ割り当てと解放の効率を向上させることができます。

  • PMEM アロケータ (永続メモリ アロケータ):

PMDKの基盤となるlibpmemライブラリを用いて実装されたPMEMアロケータは、PMEMによってマッピングされた空間をセグメントに分割し、各セグメントはさらにブロックに分割されます。ブロックはアロケータの最小割り当て単位です。スレッド間の競合を回避するため、ブロックを割り当てるスレッドは、セグメントセットと空きリストを含む利用可能な空間の一部をキャッシュします。利用可能な空間内では、レコードサイズ(複数のブロック)ごとに空きリストとセグメントが保持されます。レコードサイズに対応する各セグメントには、そのサイズのPMEM空間のみが割り当てられ、各レコードサイズの空きリスト内のすべてのポインタは、そのレコードサイズに対応する空き空間を指します。さらに、スレッドキャッシュ間でリソースのバランスをとるため、バックグラウンドスレッドは定期的に空きリストをスレッドキャッシュからバックグラウンドプールに移動します。プール内のリソースは、すべてのフォアグラウンドスレッドで共有されます。実験の結果、永続メモリベースのメモリアロケータは、大規模モデルにおいてDRAMベースのアロケータと比較してトレーニング性能にほとんど差がない一方で、総所有コスト(TCO)において大きな利点があることが示されています。

3. 展開とサービス提供

  • 増分モデルのエクスポートと読み込み:

高いタイムリーさが求められるビジネスでは、分単位、あるいは秒単位の頻繁なオンラインモデル更新が求められます。テラバイトから10テラバイトに及ぶ超大規模モデルの場合、モデル生成からデプロイまでのプロセスを数分で完了することは困難です。さらに、超大規模モデルを用いたトレーニングと予測は、マルチノードサービスにおけるリソースの浪費とレイテンシの増加という問題を抱えています。DeepRecは、増分モデル生成およびロード機能を提供し、超大規模モデルの生成とロードを大幅に高速化します。

マルチレベルハイブリッドストレージの組み込み:

スパースモデルはホット/コールド特徴量の偏りを示し、アクセス頻度の低い特徴量へのアクセスと更新頻度が低いため、メモリ/GPUメモリの無駄が生じるだけでなく、非常に大きなモデルをメモリ/GPUスペースに保存することができません。DeepRecは、マルチレベルハイブリッドストレージ機能(最大4レベルのハイブリッドストレージ:HBM+DRAM+PMEM+SSD)を提供し、アクセス頻度の低い特徴量を安価なストレージメディアに、アクセス頻度の高い特徴量をより高速で高価なストレージメディアに自動的に保存します。マルチレベルハイブリッドストレージにより、1つのノードでTBから10TBまでのモデルのトレーニングと提供を実行できます。

マルチレベルハイブリッドストレージは、スパースモデルのトレーニングにおいてGPUの能力を最大限に活用しながら、ストレージ制限による計算リソースの無駄を削減します。これにより、より少ないマシンで同規模のモデルをトレーニングすることも、同じ数のマシンでより大規模なモデルをトレーニングすることも可能です。また、マルチレベルハイブリッドストレージは、単一のマシンで非常に大規模なモデルの予測を実行する際に分散サービスによって発生するレイテンシの増加の問題を回避し、大規模モデルの予測性能を向上させながらコストを削減します。マルチレベルハイブリッドストレージ機能は、自動特徴検出アクセスも備えています。効率的なヒートマップ戦略に基づき、頻繁に使用される特徴を高速ストレージメディアに配置し、使用頻度の低い特徴を低速ストレージメディアにオフロードすることで、複数のメディア間での特徴の移動を非同期的に実行します。

IV. DeepRec をオープンソース化する理由

オープンソースのディープラーニングフレームワークは、一般的に、スパース埋め込み機能、モデルトレーニングパフォーマンス、デプロイメント反復、そしてスパースシナリオにおけるオンラインサービスといったニーズを十分にサポートすることができません。DeepRecは、アリババグループ内の検索、レコメンデーション、広告といったコアビジネスシナリオや、パブリッククラウド上の様々なビジネスシナリオを通して洗練されており、様々なスパースシナリオにおけるトレーニング効果とパフォーマンス要件をサポートできます。

アリババは、オープンソースコミュニティを設立し、外部の開発者と幅広く協力することで、スパースモデルのトレーニング/予測フレームワークの開発をさらに促進し、さまざまなビジネスシナリオにおける検索促進モデルのトレーニングと予測のビジネス効果とパフォーマンスの向上を実現したいと考えています。

本日のDeepRecのオープンソース化は、私たちにとってほんの小さな一歩に過ぎません。皆様からのフィードバックをお待ちしております。最後に、DeepRecにご興味をお持ちいただけましたら、ぜひ当社のウェブサイトをご覧いただき、コードやご意見をフレームワークにご提供ください。大変光栄に存じます。

オープンソースアドレス: https://github.com/alibaba/DeepRec