Kubernetesを基盤としたオープンソースの機械学習プラットフォーム「Kubeflow」は、データ前処理、モデル学習、ハイパーパラメータのチューニング、モデルのデプロイ、監視まで、AI開発に必要な全プロセスを統合的にカバーしています。その標準化されたツール群により、AIモデルの運用を大幅に簡素化できることから、今や多くのデータサイエンティストや機械学習エンジニアにとって欠かせない開発基盤となっています。
しかし、Kubeflowを活用する中で多くの開発者が直面するのが、「GPUリソースの分割ができない」という課題です。Kubeflowの設計上、1つのコンテナがGPU全体を専有してしまうため、実際のプロジェクトで必要とされる計算リソースが小さい場合でも、GPU全体が占有されてしまい、貴重なGPUリソースが遊休状態となってしまいます。
本記事では、こうした課題を解決するために開発されたINFINITIXの「ixGPU」モジュールを活用し、Kubeflow環境でGPUを柔軟かつ精密に分割する方法を、実践形式でわかりやすく解説します。GPUリソースの活用効率を高めたい方は、ぜひご一読ください。
Kubeflow環境でixGPUモジュールを活用し、GPUを柔軟に分割
カスタム YAML PodDefault 設定
本節では、Tesla P4 GPUを用いたGPUメモリの分割デモを通じて、ixGPUモジュールをKubeflowに適用する手順を紹介します。その前準備として、PodDefaultの設定を記述したYAMLファイルを用意する必要があります。
今回の例では、以下の2つのYAMLファイルを作成しました:
poddefault1.yaml と poddefault2.yaml
下記のコマンドを実行することで、それぞれのYAMLに定義されたPodDefaultリソースの内容を確認できます:
cat poddefault1.yaml
cat poddefault2.yaml
この2つのYAMLファイルには、異なるPodDefaultの設定が記述されており、Kubeflow環境内で特定のラベルが付与されたPodに対して、Tesla P4のGPUメモリを1GBと3GBに分割して割り当てるよう構成されています。
次に、以下の apply yaml コマンドを実行することで、YAMLファイルに記述されたPodDefaultの構成、つまりGPUの分割設定をKubernetesクラスターに適用します:
kubectl apply -f poddefault1.yaml
kubectl apply -f poddefault2.yaml
これにより、定義済みのPodDefaultリソースがKubernetes環境に登録され、KubeflowのPodが起動する際に、指定されたGPUメモリサイズ(1GB/3GB)が割り当てられるようになります。
続けて、以下のコマンドを実行することで、現在クラスター上の全Namespaceに存在するPodDefaultリソースの一覧と詳細情報を確認できます:
kubectl get poddefault -A
これらの操作を通じて、ixGPUを用いたGPUリソースの精密な分割と制御が、Kubeflow環境でもスムーズに実現可能となります。
Kubeflow Notebooks におけるGPU分割の実行
事前の準備作業が完了したら、Kubeflowプラットフォーム上で新たなNotebookコンテナの作成に進みます。
画面下部の 「Advanced Options(詳細オプション)」 をクリックすると、「Configurations」 セクション内に、先ほど追加した2つのGPUリソース設定が表示されます。それぞれ、Tesla P4 1GB と Tesla P4 3GB として選択可能となっています。
それぞれのNotebookコンテナ(notebook1:1GB割当、notebook2:3GB割当)を作成し終えたら、実際にリソースの分割が正しく反映されているかを確認してみましょう。
まずは 「CONNECT」ボタン をクリックし、notebook1 の JupyterLab 環境を開きます。
次に、Notebook内のターミナルまたはセル上で以下のコマンドを実行することで、現在このコンテナに割り当てられているGPUリソースを確認できます:
!nvidia-smi
図の通り、notebook1 ではGPUメモリが 1GB に制限されていることが確認できます。
notebook2 についても同様の手順で操作を進めます。「CONNECT」ボタンをクリックしてJupyterLabを起動。
次のコマンドを入力します:
!nvidia-smi
実行結果から、このコンテナには3GBのGPUメモリが割り当てられていることが確認できます。
これで、Kubeflow環境における単一GPUの柔軟なリソース分割が無事に完了しました。直感的な操作で簡単に実現できることが、お分かりいただけたのではないでしょうか。
この後は、Kubeflow Pipelines上でixGPUを活用し、ジョブごとにGPUリソースを柔軟に割り当てる構成例について解説します。これにより、パイプライン全体での計算効率を最大化し、より精緻かつ高効率なリソース活用を実現できます。
Kubeflow PipelinesにixGPUモジュールを統合し、GPUリソースを効率的に割り当てる
本章では、ixGPUモジュールをKubeflow Pipelinesに組み込み、ステップごとのGPUメモリ割り当てを柔軟に制御する方法を紹介します。
今回の例では、Pipelineに以下の2つの処理ステージを設定しています:
- Training(モデル学習)
- Testing(モデル評価)
機械学習PipelineにおけるGPUリソース割り当ての事前設定
Kubeflow Pipelineを定義する pipeline.py のPythonスクリプト内では、各ステップのGPUリソース割り当てを個別に定義しています。
演算負荷が高いTrainingステップには3GBのGPUメモリを、比較的軽量なTestingステップには1GBのリソースを割り当てることで、無駄なく最適化されたリソース配分が実現できます。
具体的なコード実装は、以下の図をご参照ください。
次に、TERMINAL上で以下のコマンドを実行し、定義済みのPipelineをコンパイルします:
python pipeline.py
実行後、画面左側のファイルリストに mnist-pipeline.yaml というファイルが生成されていることを確認できます。これは、Pythonスクリプト内で記述した機械学習ワークフローが正常に処理され、Kubeflow Pipelinesの仕様に準拠したYAML形式のパイプラインファイルとして出力されたことを意味します。
Kubeflow上でのPipeline構成
Kubeflowプラットフォームの Pipelines ページに移動し、右上にある + Upload pipeline ボタンをクリックします。
「Upload a file」 オプションを選択し、先ほどコンパイルした mnist-pipeline.yaml ファイルをアップロードします。このステップは、ローカル環境で開発・定義した機械学習ワークフローを、Kubeflowクラスタ上にデプロイし、実行・管理可能な形式に変換するための重要なプロセスとなります。
アップロードが完了すると、Kubeflow Pipelinesのユーザーインターフェース上に、正常に登録された mnist-pipeline の概要ページが表示されます。
ここから、画面右上の + Create run をクリックすることで、作成した機械学習パイプラインの実行を開始できます。設定済みのGPUリソース割り当てに基づき、各ステージ(Training/Testing)が順次自動実行される流れとなります。
パイプラインの学習ステージ(Training)が完了したら、各ステップの詳細を確認するために、該当ジョブをクリックして ログ(Logs) を確認してみましょう。
この機械学習モデルのトレーニングワークフローでは、3GBのGPUメモリリソースのみを使用して、学習タスクを正常に完了できたことがログから確認できます。
続いて、Testingステージのログ(Logs) を確認してみましょう。
GPUリソースの分割に成功し、Testingタスクには1GBのメモリを適切に割り当てたことが確認できました。
結論
以上、Kubeflowプラットフォーム上での ixGPUモジュール活用方法 をステップごとにご紹介しました。
INFINITIXのixGPUモジュールを活用することで、GPUリソースをより柔軟かつ効率的に運用でき、企業のAI開発環境におけるリソース最適化を強力に支援します。
Kubeflowとの連携によって実現するGPUの精密な分割機能にご興味を持たれた方は、ぜひお気軽にお問い合わせください。導入に関するご相談やデモのご依頼も随時受け付けております。
また、ixGPUモジュールのコア機能や技術的な優位性について詳しく知りたい方は、以下の記事もぜひご覧ください: Kubeflowの限界を超える:INFINITIXのixGPUモジュールでGPUを柔軟に分割・効率的に活用!