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

GPU を使用してモデルをトレーニングする

このページでは、Foundry で機械学習モデルをトレーニングする際に GPU リソースを活用する手順を説明します。GPU アクセラレーションにより、ディープラーニングモデルやその他の計算負荷の高いアルゴリズムのトレーニング時間を大幅に短縮できます。Foundry で GPU を使用してモデルをトレーニングする場合は、1個以上の GPU を設定した Jupyter® コードワークスペースを使用することを推奨します。

前提条件

GPU を使用できるのは、GPU リソースキューが割り当てられたプロジェクトから実行されるジョブのみです。プロジェクトにリソースキューが設定されているかどうかは、以下に示すように、プロジェクトのファイルツリー表示の右サイドバーにある旗アイコンを選択して確認できます。

ファイルシステムのサイドバーに表示されるプロジェクトのリソースキュー割り当て。

リソース管理者には、プロジェクトにリソースキューを割り当てるために必要な権限があります。このユーザーグループは Control Panel で設定できます。リソースキューは、左サイドバーのアプリケーションセクションからアクセスできる Resource Management アプリケーションで割り当てるか、上の例に示したリンクを選択して割り当てることができます。このグループに属していない場合は、Foundry Issue を送信して Palantir 管理者または Palantir 担当者に連絡し、プロジェクトで GPU を有効にするよう依頼してください。

対応している GPU の種類や GPU がコンピュート使用量に与える影響については、Code Workspaces または Code Repositories のコンピュート使用量に関するドキュメントを参照してください。ホスティング設定によっては、ドキュメントに記載されている GPU の種類の一部をエンロールメントで利用できない場合があります。利用可能な GPU の種類がないエンロールメントもあります。エンロールメントで現在利用できない種類の GPU を有効にするには、Palantir サポートにお問い合わせください。

Jupyter® と VS Code ワークスペースで GPU を使用する

VS Code または Jupyter® ワークスペースのいずれでも、Code Workspaces サイドバーの設定メニューから GPU をリクエストできます。

Code Workspaces でのセッションサイズの管理。

TensorFlow、PyTorch、または同様のパッケージの GPU 対応バージョンを含む環境を用意するには、GPU を備えたコードワークスペースにパッケージをインストールします。

Code Workspaces で GPU を適切に設定する手順は、以下のとおりです。

  1. コードワークスペースを起動し、設定メニューで GPU を有効にします。
  2. ワークスペースに GPU を追加した_後_に、Maestro またはライブラリサイドバーを使用して、TensorFlow や PyTorch などの目的の機械学習ライブラリをインストールします。
  3. パッケージの GPU 対応バージョンがインストールされていることを確認します。確認方法の詳細については、以下の確認手順を参照してください。
  4. 必要に応じて環境をリセットまたは更新し、GPU 対応のビルドがインストールされるようにします。詳細については、以下のトラブルシューティングセクションを参照してください。

トラブルシューティング

このセクションでは、Python の GPU 対応パッケージでよく発生する問題を簡潔に説明します。詳細については、以下のPython ライブラリに関する考慮事項を参照してください。

GPU パッケージではなく CPU 専用パッケージがインストールされる

GPU を設定する前に TensorFlow などのパッケージをインストールすることは、よくある誤りです。この場合、ライブラリの CPU 専用バージョンがインストールされます。ロックファイルまたはインストールログのビルド文字列を確認すると、ワークスペースがこの状態にあるかどうかを判断できます。GPU 対応のビルドの名前には cuda が含まれ、CPU 専用のビルドの名前には cpu が含まれます。

解決策: ワークスペースに GPU を追加した_後_にパッケージをインストールするか、GPU を追加してから環境をリセットします。

詳細: GPU のないワークスペースに TensorFlow または同様のライブラリをインストールすると、Conda は CPU 専用のビルドバリアントを選択します。ビルド文字列には、cpu_py310heba74a3_3 のように cpu が含まれます。一方、GPU 対応バージョンのビルド文字列には、tensorflow-2.17.0-cuda120py310heb3ae67_203 のように cuda が含まれます。以下は、パッケージのインストール時のログの例です。

インストールされるパッケージのバージョンを示すインストールログ。

Jupyter のライブラリサイドバーからロックファイルを表示して、どのビルドがインストールされたかを確認することもできます。VS Code では、ロックファイルは .maestro/hawk.lock にあります。meta.yaml または hawk.lock ファイルの直接編集には対応しておらず、問題が発生する可能性があります。必ずライブラリサイドバーまたは Maestro コマンドを使用してください。

Jupyter のロックファイルを開く方法。

環境を解決できないエラー:利用可能な選択肢がないため CUDA をインストールできない

GPU がない状態で、たとえば tensorflow=2.17.0=*cuda* のように GPU 対応パッケージを強制的にインストールしようとすると、__cuda に言及する環境を解決できないエラーが発生し、インストールに失敗します。

解決策: ワークスペースに GPU を追加してから、パッケージをインストールします。

詳細: GPU のないワークスペースでビルド文字列を指定して、パッケージの GPU 対応バージョンを強制的にインストールしようとすると、__cuda 仮想パッケージが存在しないため、conda による依存関係の解決に失敗します。以下は、パッケージの GPU 対応バージョンを強制的にインストールしようとするコマンドの例です。

maestro env conda install tensorflow=2.17.0=*cuda*

次のエラーメッセージが表示されます。

ERROR ❌  Unsolvable environment error: ["tensorflow ==2.17.0 *cuda* cannot be installed because there are no viable options:
└─ tensorflow 2.17.0 | (...) | 2.17.0 would require
└─ __cuda *, for which no candidates were found."]

ワークスペースに GPU を追加しても環境の再解決が開始されない

CPU 専用パッケージのインストール後に GPU を追加しても、インストール済みパッケージの GPU 対応バージョンに環境が自動で更新されることはありません。

解決策: GPU を追加した_後_にパッケージを再インストールするか、次のコマンドで環境をリセットします。

Copied!
1 maestro env reset --hard

または、依存関係を追加または削除して、環境の再解決を開始します。

詳細: パッケージの CPU 専用バージョンがすでにインストールされているワークスペースに GPU を追加すると、環境の復元処理では既存のロックファイルが使用されます。このファイルは、元の CPU 専用の制約を引き続き満たしています。そのため、インストール済みパッケージの GPU 対応バージョンは自動でインストールされません。GPU 対応バージョンをインストールするには、GPU を追加した_後_にパッケージを再インストールするか、環境をリセットして強制的に再解決するか、依存関係を変更してロックファイルを無効にする必要があります。ロックファイルを手動で削除することは推奨しません。環境の管理には、必ず対応しているコマンドを使用してください。

Code Repositories で GPU を使用する

Python トランスフォームで GPU を使用する場合は、lightweight デコレーターの使用を推奨します。lightweight API ドキュメントの説明に従って、GPU の種類を指定できます。

Copied!
1 2 3 4 5 6 7 8 import torch # meta.yaml ファイルに pytorch と pytorch-gpu を忘れずに追加してください import logging from transforms.api import transform, Output, lightweight, LightweightOutput @lightweight(gpu_type='NVIDIA_T4') @transform(out=Output('/Project/folder/output')) def compute(out: LightweightOutput): logging.info(torch.cuda.get_device_name(0))

Spark を使用する Python トランスフォームで GPU を使用するには、DRIVER_GPU_ENABLED プロファイル、EXECUTOR_GPU_ENABLED プロファイル、またはその両方をプロジェクトにインポートし、コードリポジトリで使用します。GPU の種類を指定する必要はなく、プロジェクトのリソースキューで利用可能な GPU の種類が使用されます。Spark プロファイルのインポートについては、こちらをご覧ください。

コードや使用しているライブラリが Spark を介した推論やトレーニングの分散実行をサポートしていない場合は、モデルのトレーニングや推論の処理をエグゼキューターに分散するなどのタスクを、コードで処理できることを確認してください。

ドライバーのみの Spark ジョブよりも lightweight を優先する

lightweight トランスフォームは、ドライバーのみのプロファイルで Spark を使用するよりも高いパフォーマンスを発揮します。Spark では、処理の分散や、Spark DataFrame をモデルが想定している可能性の高い Pandas DataFrame などの Python オブジェクトに変換する際に、オーバーヘッドが発生します。処理をエグゼキューターに分散したい場合や、モデルが Spark DataFrame をネイティブに使用できる場合を除き、lightweight デコレーターを使用して Spark トランスフォームを避けることを推奨します。ただし、後述するモデルをコンテナとして実行する方法は例外です。この方法は Spark トランスフォームでのみサポートされており、lightweight トランスフォームではサポートされていません。

Code Repositories に GPU 対応パッケージをインストールする

以下の手順は、Palantir プラットフォームの Code Repositories ユーザーインターフェース内で管理されているリポジトリにのみ適用されます。ブラウザーベースの VS Code で GPU 対応パッケージを使用するには、前述のコードワークスペースの手順を参照してください。

Code Repositories では、環境仕様を生成する conda の環境解決プロセスと、実際のビルドは異なるサーバーで実行されます。conda による解決を実行するサーバーには GPU が搭載されておらず、GPU を使用するように設定することもできません。その代わり、Foundry では、仮想パッケージに関する conda ドキュメント ↗で推奨されているように、CONDA_OVERRIDE_CUDA 環境変数を使用して、実行したい CUDA バージョンを指定できます。

GPU がサポートする最大の CUDA バージョンを確認するには、GPU を有効にしたコードワークスペースのターミナルで nvidia-smi コマンドを実行します。出力の右上に表示されるバージョンがサポートされる最大のバージョンであり、そのバージョン以下の任意の CUDA バージョンを使用できます。GPU と機械学習フレームワークの両方に対応する CUDA バージョンを選択してください。詳細については、以下の Gradle コードスニペットにあるフレームワークのドキュメントリンクを参照してください。

変数を設定するには、リポジトリの歯車アイコンを選択し、隠しファイル・フォルダを表示を切り替えて、最も深い階層にある build.gradle ファイルを見つけ、以下の行を追加します。また、pytorch-gpu や tensorflow-gpu をインストールするか、前述のビルド文字列の制約を使用して、GPU 対応パッケージを使用することを指定する必要があります。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 // CUDA のセットアップ tasks.runVersions { // 11.8 は単なる例です。以下に対応する最新のバージョンを使用します。 // モデルのトレーニングフレームワークのバージョンに対応する CUDA バージョン // および GPU/ドライバーに対応するバージョンです。 // tensorflow については https://www.tensorflow.org/install/source#gpu を参照します。 // pytorch については https://pytorch.org/get-started/locally/ の linux の項目を参照します。 environment("CONDA_OVERRIDE_CUDA", "11.8") } tasks.condaPackRun { environment("CONDA_OVERRIDE_CUDA", "11.8") }

このスニペットを最上位の build.gradle ファイルに追加しないでください。リポジトリの作成に使用したテンプレートに応じて、以下のいずれかのフォルダー内に追加してください。

  • transforms-python フォルダー: トランスフォームテンプレートから作成したリポジトリを使用する場合。
  • transformers-model-training フォルダー: モデルテンプレートから作成したリポジトリを使用する場合。

コードリポジトリにインストールされているパッケージを確認するには、隠しファイル conda-versions.run.linux-64.lock を確認するか、使用されているパッケージのバージョンが一覧表示されるチェックログに移動します。

トランスフォームのプレビュー時には GPU を使用できないため、ビルドの実行時に想定される動作とは異なる動作になる可能性があります。

Python ライブラリに関する考慮事項

Python 環境の管理には、PyPI や Pip ではなく conda の使用を推奨します。conda は、互換性のない依存関係を持つパッケージのインストールを許可しないためです。競合がある場合、conda はエラーを出し、競合するパッケージのインストールを拒否します。これにより、どのパッケージをインストールしても、Foundry が transforms-python や palantir_models などのコア機能に利用する Python ライブラリが引き続き動作することが保証されます。

conda の GPU 対応パッケージ

tensorflow や pytorch などの機械学習ライブラリは、通常、パッケージの CPU 専用バージョンを公開しています。これは、CUDA など、GPU トレーニングに必要な大容量のバイナリを不必要にダウンロードしないようにするためです。ライブラリの CUDA 対応バージョンがインストールされていることを確認することが重要です。そうでない場合、ライブラリは GPU の検出と使用に失敗し、モデルのトレーニングは CPU のみで実行されます。

Conda は、インストール元のシステムに搭載されている GPU を確認し、インストールするパッケージのバージョンを決定します。システムに GPU がない場合、conda はインストールするパッケージとして CPU 専用ビルドを選択します。特定のビルドバージョンを指定して GPU 対応パッケージのインストールを強制しようとすると、conda-forge ドキュメント ↗で説明されているように、__cuda 仮想パッケージを通じてシステムに GPU がないことが検出され、conda の依存関係の解決に失敗します。前述のセクションでは、これによる影響と Foundry で GPU を使用する方法をよりよく理解できるように、Code Workspaces と Code Repositories の例を説明しています。

Pip

必要に応じて、Code Repositories と Code Workspaces で pip を使用してパッケージをインストールすることもできます。この場合、conda パッケージの依存関係の要件は無視され、既存の conda 環境に pip パッケージとその依存関係が追加でインストールされます。

GPU の使用を確認する

PyTorch での GPU の使用

PyTorch が GPU を使用していることと、処理が高速化されることを確認するには、Jupyter® コードワークスペースまたはコードリポジトリで以下のコードを実行します。表示される高速化の度合いは、実際のモデルのトレーニングで得られる結果を代表するものではない可能性があります。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import torch import time import logging logger = logging.getLogger(__name__) A_cpu = torch.randn(5000, 5000) B_cpu = torch.randn(5000, 5000) start_time = time.time() C_cpu = torch.matmul(A_cpu, B_cpu) cpu_time = time.time() - start_time logger.warning(f"CPU execution time: {cpu_time:.4f} seconds") if torch.cuda.is_available(): A_gpu = torch.randn(5000, 5000, device='cuda') B_gpu = torch.randn(5000, 5000, device='cuda') # GPU を初期化するためのウォームアップ実行 _ = torch.matmul(A_gpu, B_gpu) torch.cuda.synchronize() # 実際のベンチマーク start_time = time.time() C_gpu = torch.matmul(A_gpu, B_gpu) torch.cuda.synchronize() # GPU の計算が完了するまで待機します gpu_time = time.time() - start_time logger.warning(f"GPU execution time: {gpu_time:.4f} seconds") logger.warning(f"GPU speedup: {cpu_time/gpu_time:.2f}x faster")

GPU の使用状況を調べる

コンソールで nvidia-smi コマンドを使用すると、GPU の使用状況をリアルタイムで監視できます。このコマンドは、GPU 使用率、メモリー使用量、実行中のプロセスに関する詳細情報を表示します。

  1. JupyterLab® のファイルブラウザーで + アイコンを選択し、ターミナルを選択してターミナルを開きます。
  2. watch -n0.2 nvidia-smi コマンドを実行すると、現在の GPU 使用率が継続的に更新されて表示されます。

GPU の使用状況を監視するための nvidia-smi の出力。

GPU 使用時にサイドカーで推論を実行する

モデルのインポート先のリポジトリでそのモデルが生成されておらず、そのリポジトリで推論を実行する場合は、モデルの Python 依存関係をインポートし、リポジトリの依存関係と照合して解決する必要があります。これにより、モデルのライブラリが異なるバージョンに解決されたり、依存関係の競合によってエラーが発生したりするなどの問題が起こる可能性があります。特に、複雑な GPU 対応の依存関係が含まれる場合、この処理は困難になります。

この場合は、ModelInput クラスで use_sidecar=True を設定することを推奨します。これにより、各エグゼキューターおよびドライバーとともにコンテナが実行され、必要な Python 環境でモデルが読み込まれます。以下の例のように、sidecar_resources 引数を使用してサイドカーコンテナに GPU を要求できます。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from transforms.api import transform, Input, Output, configure, LightweightInput, LightweightOutput from palantir_models.transforms import ModelInput from palantir_models import ModelAdapter # @transform.using で use_sidecar=True を使用するには、palantir_models バージョン 0.2010.0 以降が必要です。 @transform.using( inference_output=Output("path_to_output"), inference_input=Input("path_to_input"), model=ModelInput( "path_to_model", use_sidecar=True, sidecar_resources={"gpus": 1, "cpus": 3.4, "memory_gb": 16} ), ) def compute( inference_output: LightweightOutput, inference_input: LightweightInput, model: ModelAdapter ): inference_results = model.transform(inference_input) inference = inference_results.df_out inference_output.write_pandas(inference)