データ接続と統合Code Repositoriesリポジトリの管理コンピュート使用量

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

Code Repositories でのコンピュート使用量

Code Repositories でビルドを実行するには、コンピュート秒単位で測定されるリソースである Foundry コンピュートを使用する必要があります。このドキュメントでは、ビルドがコンピュートをどのように使用するかを詳しく説明し、製品内でコンピュート使用量を調査および管理する方法を紹介します。

1個以上のデータセットのトランスフォームビルドを実行すると、Foundry はトランスフォームのロジックをサーバーレスコンピュートクラスターに取り込み、コードを実行します。ビルドの所要時間と規模は、コードの複雑さ、入力データセットと出力データセットのサイズ、およびコードに設定された Spark 計算プロファイルによって異なります。

入力データセットに対してコードを実行する際には、並列化された計算を実行するときに Foundry コンピュート(Foundry コンピュート秒で測定)が必要となり、変換の出力を Foundry Storage に書き込むときに Foundry ストレージが必要となります。コードを記述するだけではコンピュート使用量は発生しません。データセットのビルド時にのみコンピュート使用量が発生します。

Foundry コンピュートの測定

Code Repositories を支えるトランスフォームエンジンは、バックエンドで並列計算を使用しており、通常はスケーラブルな計算フレームワークである Spark を使用します。Code Repositories のトランスフォームは、ジョブの実行時間中に使用された Foundry コンピュート秒の合計で測定されます。コンピュート秒はジョブの全実行期間にわたって測定され、入力データセットの読み取り、コードの実行(I/O 待ちなどの処理を含む)、および出力データセットの Foundry への書き戻しにかかる時間が含まれます。

トランスフォームで並列計算を使用するように設定できます。コンピュート秒は実経過時間ではなく、計算の実行時間を測定するため、並列トランスフォームでは実経過時間の1秒につき複数のコンピュート秒が発生します。Code Repositories のジョブで並列化された計算を Foundry コンピュート秒として測定する方法の詳細は、以下の例を参照してください。

Foundry の使用量に対する課金では、デフォルトの使用量換算率は次のとおりです。

vCPU / GPU使用量換算率
vCPU1
T4 GPU1.2
V100 GPU3
A100 GPU1.3
A10G GPU1.5
L4 GPU2.1
H100 GPU4.7
H200 GPU4.7

エンタープライズ向けの換算率は異なる場合があります。コンピュート使用量の計算を進める前に、Palantir の担当者にお問い合わせください。

Code Repositories の Foundry コンピュート使用量を調査する

使用量の情報は、使用量メトリクスをドリルダウンできるリソース管理アプリケーションで確認できます。

Foundry コンピュート使用量はビルドによって発生しますが、その使用量は関連する長期存続リソースに対して記録されます。データセットのトランスフォームの場合、このリソースはジョブによって実体化されるデータセットです。データセットの使用量の推移は、データセットの詳細タブにあるリソース使用メトリクスで確認できます。

複数の出力データセットを生成するトランスフォームでは、コンピュート使用量がすべてのデータセットに均等に分配されます。たとえば、トランスフォームジョブが2個のデータセットを作成し、一方が5行、もう一方が500万行であっても、Foundry コンピュート秒数は2個のデータセットに均等に分配されます。

Foundry コンピュート使用量を左右する要因を理解する

途中でキャンセルされない限り、Code Repositories のトランスフォームは、すべてのデータに対してすべてのロジックが実行され、出力が Foundry に書き戻されるまで実行されます。この実行時間に影響する主な要因は、(1) 入力データのサイズと (2) トランスフォームのロジックによって行われる計算処理の複雑さの2つです。

  • ロジックが同じであれば、入力データのサイズが大きいジョブは、入力データのサイズが小さいジョブよりも多くのコンピュートを必要とします。たとえば、100 GB のデータに対して列の処理を行うジョブは、10 GB のデータに対して同じ処理を行うジョブよりも多くの Foundry コンピュート秒を使用します。
  • データに対してより複雑な処理を行うジョブは、処理が比較的少ないジョブよりも多くのコンピュートを必要とします。これは「ジョブの複雑さ」と呼ばれることもあります。
    • 基本的な例として、2つの数学的演算 5 * 5 と 5! の演算回数を考えてみます。5 * 5 は1回の乗算です。5! は 5 * 4 * 3 * 2 *1(4回の乗算)と同等であり、5 * 5 の例の2倍の複雑さです。集計、結合、機械学習アルゴリズムなどのタスクによってジョブが複雑になるにつれ、ジョブがデータに対して実行する必要のある処理の数は増える可能性があります。

Code Repositories で Foundry コンピュート使用量を管理する

ジョブごとに、そのパフォーマンスとコンピュート使用量を左右した基礎となるコンピュートメトリクスを確認できます。詳細は、Spark の詳細を理解するを参照してください。

ジョブの Foundry コンピュート秒は、並列化されたエグゼキューターのサイズと数によって決まります。これらの設定はどちらもジョブごとに自由に設定できます。ジョブごとの設定方法については、Spark 計算プロファイルのドキュメントを参照してください。エグゼキューターのサイズは、メモリーと vCPU 数によって決まります。エグゼキューターあたりの vCPU 数とメモリーを増やすと、そのエグゼキューターで発生するコンピュート秒が増加します。

同時に実行されるタスク数は、設定されたエグゼキューター数と、それぞれの vCPU 数によって決まります。設定のオーバーライドが指定されていない場合、トランスフォームはデフォルトの Spark プロファイルを使用します。生成されるデータセットの Foundry ストレージ使用量は、作成されるデータセットのサイズによって決まります。

最終的に、異なるロジックを持つジョブでは、同じ結果を実現する場合でも、処理の数が大きく異なることがあります。

コードを最適化して使用量を管理する

コードを最適化し、ジョブが使用するコンピュート秒を管理する方法はいくつかあります。このセクションでは、よく使われる最適化手法の詳細情報へのリンクを紹介します。

  • Foundry がコードリポジトリのほとんどの種類のバッチ計算に採用している分散クラスター計算フレームワークである Spark では、さまざまな最適化手法を利用できます。Spark の最適化について詳しくはこちら。
  • Spark では、パーティション分割を最適化することでビルドを高速化できます。最適なパーティション数は、行数、列数、列のデータ型、および内容によって異なります。データセットのサイズ128 MB あたり、およそ1個のパーティションを推奨します。
  • インクリメンタル(差分処理)計算は、トランスフォームを実行して出力データセットを生成する効率的な方法です。トランスフォームのビルド履歴を活用することで、インクリメンタル計算では、トランスフォームを実行するたびに出力データセット全体を再計算する必要がなくなります。
  • 特に小規模から中規模のデータセットでは、単一ノードのアプリケーション向けベンチマークで一貫して Spark を上回るパフォーマンスを示すコンピュートエンジンが、Spark 以外にもいくつかあります。そのため、これらの代替アプリケーションを使ってパイプラインを実行すると、処理速度の向上とコンピュート消費量の削減につながる可能性があります。これらのオプションを最大限に活用するために、軽量トランスフォームについて理解を深めることを推奨します。
  • スケジュールを使ってビルドをオーケストレーションしている場合は、コストを最適化するためにスケジュール設定のベストプラクティスを参照することを推奨します。

Foundry コンピュート使用量を計算する

使用例1:標準メモリー

この例では、標準的なメモリー要求量で静的にリソースが割り当てられるジョブについて、Foundry コンピュートの測定方法を示します。

Driver profile:
    vCPUs: 1
    GiB_RAM: 6
Executor profile:
    vCPUs: 1
    GiB_RAM: 6
    Count: 4
Total Job Wall-Clock Runtime: 
    120 seconds



Calculation
driver_compute_seconds = max(num_vcpu, GiB_RAM/7.5) * num_seconds
                       = max(1vcpu, 6gib/7.5gib) * 120sec
                       = 120 compute-seconds

executor_compute_seconds = num_executors * max(num_vcpu, GiB_RAM/7.5) * num_seconds 

                         = 4 * max(1, 6/7.5) * 120sec 
                         = 480 compute-seconds

total_compute_seconds = 120 + 480 = 600 compute-seconds 

使用例2:大容量メモリー

この例では、より大きなメモリー要求量で静的にリソースが割り当てられるジョブについて、Foundry コンピュートの測定方法を示します。

Driver Profile:
    vCPUs: 2
    GiB_RAM: 6
Executor profile:
    vCPUs: 1
    GiB_RAM: 15
    Count: 4
Total Job Wall-Clock Runtime: 
    120 seconds



Calculation:
driver_compute_seconds = max(num_vcpu, GiB_RAM/7.5) * num_seconds
                       = max(2vcpu, 6gib/7.5gib) * 120sec
                       = 240 compute-seconds

executor_compute_seconds = num_executors * max(num_vcpu, GiB_RAM/7.5) * num_seconds 
                         = 4 * max(1, 15/7.5) * 120sec 
                         = 960 compute-seconds

total_compute_seconds = driver_compute_seconds + executor_compute_seconds
                      = 240 + 960 = 1200 compute-seconds

使用例3:動的なエグゼキューター数

この例では、動的にリソースが割り当てられるジョブについて、Foundry コンピュートの測定方法を示します。ジョブの実行時間の一部では2個のエグゼキューターで処理が実行され、残りの時間では4個のエグゼキューターで処理が実行されます。

Driver Profile:
    vCPUs: 2
    GiB_RAM: 6
Executor profile:
    vCPUs: 1
    GiB_RAM: 6
    Count: 
        min: 2
        max: 4
Total Job Wall-Clock Runtime: 
    120 seconds:
        2 executors: 60 seconds
        4 executors: 60 seconds



Calculation:
driver_compute_seconds = max(num_vcpu, GiB_RAM/7.5) * num_seconds
                       = max(2vcpu, 6gib/7.5gib) * 120sec
                       = 240 compute-seconds

# エグゼキューター2個でのジョブ実行時間に対する計算秒数を計算します
2_executor_compute_seconds = num_executors * max(num_vcpu, GiB_RAM/7.5) * num_seconds 
                           = 2 * max(1, 6/7.5) * 60sec 
                           = 120 compute-seconds 

# エグゼキューター4個でのジョブ実行時間に対する計算秒数を計算します
4_executor_compute_seconds = num_executors * max(num_vcpu, GiB_RAM/7.5) * num_seconds 
                           = 4 * max(1, 6/7.5) * 60sec 
                           = 240 compute-seconds
                         

total_compute_seconds = driver_compute_seconds + 2_executor_compute_seconds + 4_executor_compute_seconds
                      = 240 + 120 + 240 = 600 compute-seconds

使用例4:GPU コンピュート

この例では、静的にリソースが割り当てられるジョブについて、Foundry GPU コンピュートの測定方法を示します。

Driver profile:
    T4 GPU: 1
Executor profile:
    T4 GPU: 1
    Count: 4
Total Job Wall-Clock Runtime: 
    120 seconds


Calculation:
driver_compute_seconds = num_gpu * gpu_usage_rate * num_seconds
                       = 1gpu * 1.2 * 120sec
                       = 144 compute-seconds

executor_compute_seconds = num_executors * num_gpu * gpu_usage_rate * num_seconds 
                         = 4 * 1 * 1.2 * 120sec 
                         = 576 compute-seconds

total_compute_seconds = 144 + 576 = 720 compute-seconds