私たちは現在、7,500 ノードにスケーリングされた Kubernetes クラスターを所有しており、GPT のような巨大なオブジェクトのためのスケーラブルなインフラストラクチャを生み出しています。 -3、CLIP、および DALL・E 、それにもかかわらず、ニューラル言語ユニットのスケーリング規則などのフリートの小規模な反復検査についても同様です。 単一の Kubernetes クラスターをこの次元にスケーリングすることは、もはや着実に実行されるわけではなく、特別な注意が必要ですが、利点は、コードを変更せずにグループを調査してスケールアップするマシンを見つけることを可能にする簡単なインフラストラクチャです.
閉鎖以来、
あまりにも遠くにフェッチする前に、ワークロードを説明することはよく知られています。 Kubernetes で衰退するアプリケーションとハードウェアは、従来の企業で簡単に利用できるものとは少し異なります。 私たちの考慮事項とそれに対応する解決策は、場合によっては単純に、または場合によっては、セットアップであなたの贅沢に正しく一致しない可能性もあります!
ジョブを見つけるマシンは多くのノードにまたがり、各ノードのすべてのハードウェア リソースへのフェッチ エントリがある場合に最も効率的に実行されます。 これにより、GPU は、NVLink のトレイン、または GPU がNICとの対応を取り次第GPUDirectの列車。 したがって、何百ものワークロードに対して、単一のポッドがノード全体を占有します。 NUMA、CPU、または PCIE に役立つリソースの競合は、スケジューリングのコンポーネントではなくなりました。 ビンパッキングまたは断片化は、もはや同じ古い領域ではありません。 私たちの最新のクラスターはずんぐりした二分帯域幅を所有しているため、ラックやネットワーク トポロジの問題も解決しません。 これはすべて、現在私たちが多くのノードを所有しているのに対し、スケジューラーへのストレスはかなり低いことを意味しています.
とはいえ、kube-scheduler へのストレスは急激です。 . 最新のジョブは、可能性として、すべてがすぐに作成される多数のポッド全体で構成されている可能性があり、その後、かなり低いチャーン率に戻ります.
私たちの最大のジョブは MPI をフェードし、すべてのポッドはあるレベルのジョブは、単一の MPI コミュニケーターに参加しています。 参加しているポッドのいずれかが停止すると、ジョブ全体が停止し、再開する必要があります。 ジョブは従来の基盤上でチェックポイントを実行し、再開すると最終チェックポイントから再開されます。 したがって、ポッドが セミステートフル であることを念頭に置いています。 – 強制終了された Pod は変更される可能性があり、作業を続行できます。 それほど強力な Kubernetes 負荷分散には依存していません。 私たちは非常に小さな HTTPS トラフィックを所有しており、A/B 試行、ブルー/グリーン、またはカナリアの必要性を使用していません。 Pod は、プロバイダー エンドポイントではなく、SSH 経由で MPI を使用して Pod IP アドレスで相互に通信を維持します。 プロバイダーの「発見」は禁止されています。 ジョブの起動時にどのポッドが MPI に参加しているかの 1 回限りの検索を合法的に中止します。 全体として、データセットまたはチェックポイントのいくつかのシャードを BLOB ストレージからすぐにストリーミングするか、迅速にローカルのエフェメラル ディスクにキャッシュします。 POSIX セマンティクスが非常に重要な場合に備えて、PersistentVolume のペアを所有していますが、ブロブ ストレージははるかにスケーラブルであり、slack detach/keep 操作を必要としません。
最後に、私たちの仕事の特徴は、ワークロード自体がどのように変化しているかを主に調べることです。 スーパーコンピューティング ワーカーは、コンピューティング インフラストラクチャの「実稼働」という途方もない段階で、私たちが念頭に置いているものを取得しようと努力しますが、そのクラスターで衰退するアプリケーションは急速に存続し、その開発者はフリートを反復します。 現代の使用パターンは、特性と適切なトレードオフに関する私たちの仮定を環境に与える可能性があります。 私たちは、問題の取引時にフリートに応答できる持続可能なマシンを望んでいます.
ネットワーキングクラスター内のノードとポッドの品揃えが増えるにつれて、Flannel がスループットをスケールアップするのに苦労していることがわかりました。必要。 Azure VMSS の IP 構成と関連する CNI プラグインのために、科学を応用したネイティブ ポッド ネットワーキングのトレインに切り替えました。 これにより、ポッドでホスト ステージのネットワーク スループットを取得することができました。私たちの最大のクラスターでは、いつでも列車で約 200,000 の IP アドレスを所有していると思われます。 ルートベースのポッド ネットワーキングを調査した後、効果的にトレーニングを行うには、さまざまなルート内によく知られている障害があることがわかりました
カプセル化の増加を抑える基盤となる SDN またはルーティング エンジンに対する要求を満たしますが、ネットワークのセットアップは簡単です。 VPN やトンネリングを追加すると、余分なアダプターが排除される可能性さえあります。 低い MTU を持つネットワークのペア フラグメントの結果としてのパケット フラグメンテーションについて悩む必要はありません。 コミュニティ ポリシーとトラフィックの監視は簡単です。 パケットの送信元と休暇スペースに関する曖昧さはなくなりました。ポッド。 これにより、研究者はネットワークの使用パターンを視覚化できます。 特に、私たちの実験の多くは明らかな Web およびポッド内通信パターンを所有しているため、ボトルネックがどこで発生するかを調査することは非常に貴重です.
iptables mangle 原則は、特定の基準に一致するパケットを恣意的に印象付ける伝統的なものでさえある可能性があります。 ここに、トラフィックが内部または Web シュアであるかどうかを検出するための私たちの原則があります。 FORWARD
原則は Pod からのトラフィックをマスクします。vs INPUT
および OUTPUT ホストからのトラフィック:iptables -t mangle -A INPUT ! -s 10.0.0.0/8 -m コメント –comment “iptables-exporter openai traffic=web-in” iptables -t mangle -A FORWARD ! -s 10.0.0.0/8 -m コメント –comment “iptables-exporter openai traffic=web-in” iptables -t mangle -A OUTPUT ! -d 10.0.0.0/8 -m コメント –comment “iptables-exporter openai traffic=web-out” iptables -t mangle -A FORWARD ! -d 10.0.0.0/8 -m コメント –comment “iptables-exporter openai traffic=web-out” マークが付けられるとすぐに、iptables はカウンターを生成して、バイトの組み合わせを調べます。およびこのルールに一致するパケット。 iptables 自体:
% iptables -t mangle -L -v Chain FORWARD (ポリシー ACCEPT 50M パケット、334G バイト) ) pkts バイト ゴール プロト オプトイン ソース バケーション スペース .... 1253K 555M all -- any any any where !10.0.0.0/8 /iptables-exporter openai traffic=web-out */ 1161K 7937M all -- any any !10.0 .0.0/8 where /iptables-exporter openai traffic=web-in */ として知られる出生元プロメテウス エクスポーターを育成します。 iptables-exporter を使用して、追跡されたこれらを監視マシンにフェッチします。 これは、さまざまな種類の前提条件に一致するパケットを調べるための簡単なアプローチです. 私たちのネットワーク モデルのちょっと変わった側面の 1 つは、ノード、ポッド、ネットワーク CIDR 範囲を研究者に復元します。 ハブ アンド スポーク ネットワーク モデルを所有し、ネイティブ ノードとポッドの CIDR 範囲をトレーニングして、そのトラフィックをルーティングします。 研究者はハブに参加し、そこから実際の特定の人物クラスター (スポーク) のいずれかへの独自のフェッチ エントリを取得します。 それにもかかわらず、クラスター自体は互いに会話することはできません。 これにより、クラスターがリモート化されたままになり、障害の分離をクラッシュさせる可能性のある甘やかされて育ったクラスターの依存関係を使用しないことが保証されます。 「NAT」ホストをトレーニングしてプロバイダー ネットワークを変換します。 CIDR は、クラスターの外部からのトラフィックとは異なります。 この設定により、研究者は、実験のためにどのようなネットワーク構成をどのように、どのような形式から取得できるかを柔軟に選択できます。 API サーバー
マークが付けられるとすぐに、iptables はカウンターを生成して、バイトの組み合わせを調べます。およびこのルールに一致するパケット。 iptables 自体:
% iptables -t mangle -L -v Chain FORWARD (ポリシー ACCEPT 50M パケット、334G バイト) ) pkts バイト ゴール プロト オプトイン ソース バケーション スペース .... 1253K 555M all -- any any any where !10.0.0.0/8 /iptables-exporter openai traffic=web-out */ 1161K 7937M all -- any any !10.0 .0.0/8 where /iptables-exporter openai traffic=web-in */
として知られる出生元プロメテウス エクスポーターを育成します。 iptables-exporter を使用して、追跡されたこれらを監視マシンにフェッチします。 これは、さまざまな種類の前提条件に一致するパケットを調べるための簡単なアプローチです. 私たちのネットワーク モデルのちょっと変わった側面の 1 つは、ノード、ポッド、ネットワーク CIDR 範囲を研究者に復元します。 ハブ アンド スポーク ネットワーク モデルを所有し、ネイティブ ノードとポッドの CIDR 範囲をトレーニングして、そのトラフィックをルーティングします。 研究者はハブに参加し、そこから実際の特定の人物クラスター (スポーク) のいずれかへの独自のフェッチ エントリを取得します。 それにもかかわらず、クラスター自体は互いに会話することはできません。 これにより、クラスターがリモート化されたままになり、障害の分離をクラッシュさせる可能性のある甘やかされて育ったクラスターの依存関係を使用しないことが保証されます。
「NAT」ホストをトレーニングしてプロバイダー ネットワークを変換します。 CIDR は、クラスターの外部からのトラフィックとは異なります。 この設定により、研究者は、実験のためにどのようなネットワーク構成をどのように、どのような形式から取得できるかを柔軟に選択できます。
API サーバー
Kubernetes API サーバーおよび etcd は、正常に機能するクラスターのよく知られた公式であるため、これらのシステムへのストレスに特に注意を払っています。
kube-prometheus によって提供される Grafana ダッシュボードをトレーニングします。 、追加の居住用ダッシュボードに加えて。 API サーバーでの HTTP Tell 429 (Too Many Requests) および 5xx (Server Error) のレートを考慮すべきハイステージ シグナルとして警告することは非常に重要です。 他の人々は API サーバーの内部 kube をフェードアウトさせますが、私たちはクラスター自体の外部でそれらを継続的にフェードさせてきました。 すべての etcd および API サーバーは、専用ノードで非常に贅沢に衰退します。 私たちの最大のクラスターは、5 つの API サーバーと 5 つの etcd ノードをフェードさせて重みを分散し、もし誰かが乗り降りしたとしても大きな影響を与えないようにします。 私たちの
閉鎖ウェブログ投稿 で Kubernetes の機会を非常に豪華な etcd クラスターに分割して以来、etcd で重大な問題は発生していません。 API サーバーはステートレスであり、通常、自己治療機会のワーカーまたはスケールセットで簡単に操作できます。 インシデントの寓話では、etcd クラスターの自己治療的な自動化をまだ実行しようとはしていません。これは、クラスター内のノードの品揃えに比例してスケーリングする傾向があります。 7,500 ノードのクラスターでは、API サーバーごとに最大 70 GB のヒープが従来からあることがわかります。したがって、幸いなことに、これは将来にわたって実質的に内部ハードウェア機能であり続けるはずです. API サーバーに対する巨大なストレスの 1 つが、エンドポイントの WATCH になりました。 「kubelet」や「node-exporter」などのサービスのペアがあり、クラスター内のすべてのノードがメンバーになります。 ノードがクラスターに追加またはクラスターから削除される可能性がある場合、この WATCH が起動します。 そして、慣習的にそれぞれのノード自体が kubelet
を監視するようになりました kube-proxy 経由のプロバイダーの場合、これらの応答に必要な # と帯域幅は、$N^2$ と非常に大きくなる可能性があり、まれに 1GB/秒以上になることもあります。 EndpointSlices、Kubernetes 1.17 で起動、この負荷を 1000 分の 1 に減らした大きな利益でした。 同じように、私たちは、集まる。 私たちは、DaemonSet が API サーバーと相互作用することを明確にするよう努めています。 各ノードを調整する必要がなくなった場合は、 などの中間キャッシング プロバイダーを導入します。 Datadog Cluster Agent は、クラスタの巨大なボトルネックを解消するための正しいサンプルのようです。
)私たちのクラスターが成長するにつれて、私たちはクラスターの断固たる自動スケーリングを大幅に中止します。 それにもかかわらず、自動スケーリングがあまりにも強力すぎると、まれに問題が発生することがあります。 最近のノードがクラスターに参加したときに多くのリクエストが生成され、すぐにノードの束全体を追加すると、API サーバーの容量が過負荷になる可能性があります。 この o を平滑化します。 ut は、たとえ 2 秒でも合法であったとしても、機能停止を回避するのに役立ちました.
Prometheus と Grafana による時系列メトリクス
We Prometheus をトレーニングして時系列メトリックを収集し、グラフ、ダッシュボード、シグナルの Grafana を収集します。
kube-prometheus のデプロイから始めました。大量のメトリクスを収集し、視覚化のためにダッシュボードを修正します。 時間の経過とともに、ダッシュボード、メトリクス、およびシグナルに何百もの豪華なものを追加しました.ノードをますます追加するにつれて、メトリクスの膨大な量に苦労しました.プロメテウスによってよそよそしい。 kube-prometheus は非常に貴重な記録を大量に公開していますが、そのうちの 2 つは実際に調べたことはありませんでした。 . 私たちは訓練します プロメテウスの原理
しばらくの間、遅かれ早かれクラッシュするまで、Prometheus がますますメモリの中で贅沢になる領域に苦労しました。メモリ不足エラー (OOM) のコンテナ。 これにより、アプリケーションに大量のメモリ容量を投入した後でも、影響が発生しました。 さらに悪いことに、破裂すると、再び使用可能になる前に、起動時に write-forward-log レコードのデータを再生するのに何時間もかかることになりました
これらの OOM のソースを突き止めました Grafana と Prometheus の間の相互作用であり、Grafana は /api/v1/series をトレーニングします。 API on Prometheus にスポットを当てて質問する {le!=””} (最も着実に、「与えるヒストグラム メトリクスの合計」)。 /api/v1/seriesの実装 時間と居住地の両方で制限がなくなりました。多くの結果が得られる場所の場合、これはおそらく、これまで以上に多くの記憶と時間の中で贅沢になり続けるでしょう. また、リクエスタがあきらめて接続を閉じた後も、成長し続けます。 私たちにとって、十分な記憶は決してなく、プロメテウスは遅かれ早かれ破裂するでしょう. 私たちは パッチを適用しました Prometheus がこの API の内部に Context を作成し、タイムアウトをタグに配置することで、完全に固定されました.インスタンスを再起動する必要がありましたが、WAL リプレイはリージョンのままでした。 Prometheus が最新のメトリクスを収集してクエリを処理する前に、すべての WAL ログを再生するのに何時間もかかる可能性があります。 Sturdy Perception、GOMAXPROCS=24 を適用することに遭遇しました。 は巨大な後押しをしました。 Prometheus は、あるレベルの WAL リプレイですべてのコアをトレーニングしようとします。コアの数が多いサーバーでは、競合によってすべてのパフォーマンスが失われます。
We 「 ***********************************************************・************* ヘルスチェック
他の人々は API サーバーの内部 kube をフェードアウトさせますが、私たちはクラスター自体の外部でそれらを継続的にフェードさせてきました。 すべての etcd および API サーバーは、専用ノードで非常に贅沢に衰退します。 私たちの最大のクラスターは、5 つの API サーバーと 5 つの etcd ノードをフェードさせて重みを分散し、もし誰かが乗り降りしたとしても大きな影響を与えないようにします。 私たちの
API サーバーに対する巨大なストレスの 1 つが、エンドポイントの WATCH になりました。 「kubelet」や「node-exporter」などのサービスのペアがあり、クラスター内のすべてのノードがメンバーになります。 ノードがクラスターに追加またはクラスターから削除される可能性がある場合、この WATCH が起動します。 そして、慣習的にそれぞれのノード自体が kubelet
同じように、私たちは、集まる。 私たちは、DaemonSet が API サーバーと相互作用することを明確にするよう努めています。 各ノードを調整する必要がなくなった場合は、 などの中間キャッシング プロバイダーを導入します。 Datadog Cluster Agent は、クラスタの巨大なボトルネックを解消するための正しいサンプルのようです。
私たちのクラスターが成長するにつれて、私たちはクラスターの断固たる自動スケーリングを大幅に中止します。 それにもかかわらず、自動スケーリングがあまりにも強力すぎると、まれに問題が発生することがあります。 最近のノードがクラスターに参加したときに多くのリクエストが生成され、すぐにノードの束全体を追加すると、API サーバーの容量が過負荷になる可能性があります。 この o を平滑化します。 ut は、たとえ 2 秒でも合法であったとしても、機能停止を回避するのに役立ちました.
Prometheus と Grafana による時系列メトリクス
We Prometheus をトレーニングして時系列メトリックを収集し、グラフ、ダッシュボード、シグナルの Grafana を収集します。
ノードをますます追加するにつれて、メトリクスの膨大な量に苦労しました.プロメテウスによってよそよそしい。 kube-prometheus は非常に貴重な記録を大量に公開していますが、そのうちの 2 つは実際に調べたことはありませんでした。 . 私たちは訓練します プロメテウスの原理
しばらくの間、遅かれ早かれクラッシュするまで、Prometheus がますますメモリの中で贅沢になる領域に苦労しました。メモリ不足エラー (OOM) のコンテナ。 これにより、アプリケーションに大量のメモリ容量を投入した後でも、影響が発生しました。 さらに悪いことに、破裂すると、再び使用可能になる前に、起動時に write-forward-log レコードのデータを再生するのに何時間もかかることになりました
これらの OOM のソースを突き止めました Grafana と Prometheus の間の相互作用であり、Grafana は /api/v1/series をトレーニングします。 API on Prometheus にスポットを当てて質問する {le!=””} (最も着実に、「与えるヒストグラム メトリクスの合計」)。 /api/v1/seriesの実装 時間と居住地の両方で制限がなくなりました。多くの結果が得られる場所の場合、これはおそらく、これまで以上に多くの記憶と時間の中で贅沢になり続けるでしょう. また、リクエスタがあきらめて接続を閉じた後も、成長し続けます。 私たちにとって、十分な記憶は決してなく、プロメテウスは遅かれ早かれ破裂するでしょう. 私たちは パッチを適用しました Prometheus がこの API の内部に Context を作成し、タイムアウトをタグに配置することで、完全に固定されました.インスタンスを再起動する必要がありましたが、WAL リプレイはリージョンのままでした。 Prometheus が最新のメトリクスを収集してクエリを処理する前に、すべての WAL ログを再生するのに何時間もかかる可能性があります。 Sturdy Perception、GOMAXPROCS=24 を適用することに遭遇しました。 は巨大な後押しをしました。 Prometheus は、あるレベルの WAL リプレイですべてのコアをトレーニングしようとします。コアの数が多いサーバーでは、競合によってすべてのパフォーマンスが失われます。
We 「 ***********************************************************・************* ヘルスチェック
これほど巨大なクラスターでは、間違いなく自動化に依存して、クラスターから不正な動作をしているノードを検出して取り除きます。 時間をかけて、さまざまなヘルスチェック システムを構築してきました。 パッシブヘルスチェック
一部のヘルスチェックは受動的で、すべてのノードで継続的に動作します。 これらのビデオには、ネットワークの到達可能性、欠陥のあるディスクや太いディスク、GPU エラーなど、従来のマシン リソースが表示されます。 GPU はさまざまな方法で検討を繰り返しますが、単純な同じ古いものは「修正不可能な ECC エラー」です。 Nvidia の Knowledge Heart GPU Manager (DCGM) ツールを使用すると、この問題やその他のさまざまな「Xid」エラーに対する質問を簡単に配置できます。 これらのエラーを観察する 1 つのアプローチは、dcgm-exporter を使用して、メトリックを監視マシンである Prometheus に取り込みます。 これは、DCGM_FI_DEV_XID_ERRORS として表示される場合があります。 メトリクスは、最近発生した直近のエラー コードのみに限定されます。 また、 NVML Instrument Ask API は、GPU の有効な存在と動作に関するより詳細な記録を公開します。
エラーを検出した場合場合によっては、物理的に変更されることを熱望している基礎となる GPU 内で結果をもたらす場合でも、GPU またはマシンをリセットすることによって全体的に固定できます。
ヘルスチェックをもう 1 回実行すると、上流のクラウド プロバイダーからの修復イベントが追跡されます。 有名なクラウド サプライヤはいずれも、現在の VM が遅かれ早かれ混乱を引き起こす次の修理時期に備えている場合に対処するためのアプローチをトレーニングしています。 VM を再起動する必要がある可能性があるため、基盤となるハイパーバイザー パッチを使用したり、物理ノードを他のハードウェアに交換したりする可能性があります
これらのパッシブ ヘルスチェックすべてのノードのバックグラウンド内で繰り返しフェードします。 ヘルスチェックが失敗し始めると、ノードは自動的に閉鎖されるため、ノードで最新のポッドがスケジュールされることはありません。 より深刻なヘルスチェックの失敗については、ポッドの立ち退きを試みて、当分の間、すべての作業ポッドを調査して、まっすぐに終了することもできます。 Pod Disruption Budget を介して構成可能で、このエビクションを可能にするかどうかを仲介するのは、Pod 自体まで穏やかです。 最後に、最終的に Pod 自体が終了するか、7 日が経過すると (SLA の割り当て)、VM を強制的に終了することができます。
難しいGPU評価残念ながら、すべての GPU がサポートされなくなりました。考慮事項は、DCGM を介して表示されるエラー コードとして明らかになります。 GPU をトレーニングして追加の考慮事項を選択し、ハードウェアとドライバーが期待どおりに動作していることを明確にする評価ライブラリを構築しました。 これらの評価は、バックグラウンドでフェードすることはできません。操作するには、GPU の元のトレインが数秒または数分間必要です。
まず、これらの評価をノードは、起動時に「プリフライト」と名付けられたマシンで使用されます。 すべてのノードは、「プリフライト」テイントとタグを使用してクラスターに参加します。 このテイントにより、同じ古いポッドがノードでスケジュールされなくなります。 DaemonSet は、このタグを持つすべてのノードでプリフライト テスト ポッドを操作するように構成されています。 テストが正常に完了すると、テスト自体によってテイントとタグが削除され、ノードは同じ古いトレインに使用できるようになります
その後、フェードも行います。これらの評価は、ノードの寿命のあるレベルで定期的に行われます。 これを CronJob としてフェードし、クラスター内の任意のノードに着陸できるようにします。 これは、どのノードのフェッチが検査されるかについては、少しランダムであり、制御されていません。 クォータとリソース使用量
その後、フェードも行います。これらの評価は、ノードの寿命のあるレベルで定期的に行われます。 これを CronJob としてフェードし、クラスター内の任意のノードに着陸できるようにします。 これは、どのノードのフェッチが検査されるかについては、少しランダムであり、制御されていません。 クォータとリソース使用量
クラスターをスケールアップするにつれて、研究者は自分たちに支払われたすべての容量をリージョンに確保し始めました。 以前のジョブ スケジューリング システムは、Kubernetes が所有していない、競合するグループ間の作業をわずかにフェードアウトするために、多数の多様な公式を手元に所有していました。 時間の経過とともに、これらのジョブ スケジューリング システムから着想を得て、Kubernetes ネイティブのアプローチでいくつかの機能を確立しました 人的汚染
私たちはそれぞれのクラスタにプロバイダーを所有しています。たくさんの機能を備えた「workers-helpful resource-supervisor」。 そのレコード ソースは、特定のクラスターで容量を所有するすべての検査グループのタプル (ノード セレクター、適用するワーカー タグ、割り当て量) を指定する ConfigMap です。 これをクラスター内の最新のノードと調整し、ノードの適切な組み合わせを openai.com/workers=teamname で汚染します。 :NoSchedule.
「労働者-また、それぞれのジョブが送信されると、送信者のワーカー メンバーシップに応じて対応する容認が利用されるように、アドミッション Webhook プロバイダーも備えています。 taint を利用することで、Kubernetes ポッド スケジューラを柔軟に制限できます。たとえば、優先順位の低いポッドに対して「任意の」許容を許可するなどです。 )
CPU & GPU バルーン
VM ベースのクラスターを動的にスケーリングするためのクラスター オートスケーラーのトレーニングと同様に効果的に、クラスターのあるレベルで異常なコントリビューターを修復 (削除して再追加) するようにトレーニングします。 クラスタの「最小ディメンション」をゼロに、クラスタの「最大ディメンション」を手持ちの容量に環境によってこれを中止します。 それにもかかわらず、クラスター オートスケーラーは、怠惰なノードを検出した場合、絶対的な最大の必須容量までスケールダウンしようとします。 さまざまな原因 (VM トレッキングの遅延、事前に支払われたコスト、上記の API サーバーの影響) のために、この遅延スケーリングは常に最高ではありません.
そのため、CPU 絶対トップと GPU ホストの両方に対してバルーン展開を開始しました。 この展開は、優先度の低いポッドの「最大ディメンション」の品揃えを持つ ReplicaSet で構成されます。 これらのポッドはノード内のリソースを優先するため、オートスケーラーはそれらを遅延として所有していません。 それにもかかわらず、それらは優先順位が低いため、スケジューラーはそれらを直接追い出し、確固たる作業の余地を与えることができます。 (ノード上で怠惰なワークロードと見なされる DaemonSet を回避するために、DaemonSet のキープ内で Deployment のトレインを作成することを選択しました。)
繰り返しの一部として、ポッドの非親和性をトレーニングして、ポッドがノード全体に均等に分散されるようにします。 Kubernetes スケジューラの以前のバリエーションには、ポッドのアンチアフィニティを備えた $O(N^2)$ パフォーマンス リージョンがありました。 これは Kubernetes 1.18 以降で修正されています。
ギャングスケジューリング
私たちの合計の実験には、1 つ以上の StatefulSet が含まれ、それぞれがコーチング作業の特定の断片を処理します。 オプティマイザーの場合、研究者は StatefulSet のすべてのコントリビューターをスケジュールする必要があります。これは、あらゆるコーチングが実行される可能性があるよりも早く行われる必要があります (従来の基盤では、オプティマイザーのコントリビューター間で調整するように MPI をトレーニングしており、MPI はワーカーのメンバーシップの調整に弱いためです)。
それにもかかわらず、デフォルトでは、Kubernetes は、1 つの StatefulSet からのエレガントなすべてのリクエストを他のものより優先する可能性がなくなりました。 例として、2 つの実験がそれぞれクラスターの容量の 100% を要求した場合、1 つの実験または別の実験のすべてをスケジュールする際に、Kubernetes が各実験のポッドの絶対的な上位半分をスケジュールする可能性があり、デッドロックが発生します。
パーソナライズされたスケジューラーが必要な問題を 2 つ試しましたが、同じ古いポッドと競合するエッジ ケースに遭遇しました。予定されています。 Kubernetes 1.18 では、コア Kubernetes スケジューラのプラグイン構造が導入されました。これにより、このような数式をネイティブに追加できるように、より強力になりました。 私たちは近い過去にのみ上陸しましたこの領域を解決するための正しいアプローチとして、Coscheduling プラグイン。
Kubernetes クラスターをスケールアップする際には、対処すべき多くの考慮事項があります。 それらのほんの一部を以下に示します:
メトリクス私たちの規模では、Prometheus のビルトイン TSDB ストレージ エンジンがコンパクトにならないために多くの問題がありました。また、再起動するたびに WAL (Write-Forward-Log) を再生するために長いインスタンスを必須にする必要があります。 クエリは、「質問を配置する」という結果になる傾向もあります。 n to processing will load too many samples” エラー。 特定の Prometheus と効果的に一致するストレージに移行する過程にあり、エンジンに質問します。 それがどうなるかについて立てられた将来のウェブログに潜入エージェントフォワード!
ポッド コミュニティ ビジター シェイピングクラスターをスケールアップすると、それぞれのポッドが手元に特定の量の Web 帯域幅を所有するように計算されます。 特定の個人ごとの総 Web 帯域幅要件は大きく変化し、私たちの研究者は現在、担当者のデータセットや設定するアプリケーション パッケージなど、Web 上の他の領域によく知られている有用なリソース ストレスを意図せずに配置する柔軟性を所有しています。
結論
クラスターをスケールアップすると、それぞれのポッドが手元に特定の量の Web 帯域幅を所有するように計算されます。 特定の個人ごとの総 Web 帯域幅要件は大きく変化し、私たちの研究者は現在、担当者のデータセットや設定するアプリケーション パッケージなど、Web 上の他の領域によく知られている有用なリソース ストレスを意図せずに配置する柔軟性を所有しています。
結論
私たちはKubernetesに出会いました私たちの調査のニーズに対応する非常に柔軟なプラットフォームになることです。 スケールアップする柔軟性があり、私たちが配置した最も不安なワークロードを満たすことができます。 後押しが必要な分野はまだたくさんありますが、OpenAI のスーパーコンピューティング担当者は、Kubernetes がどのようにスケーリングできるかを探求し続けます。 このラフな作業が夢中に思える場合は、覚えておく必要があります