Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetesにおける学習基盤とLLMOpsの概要

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for ry ry
June 17, 2026

 Kubernetesにおける学習基盤とLLMOpsの概要

Kubernetes祭り #1 登壇資料
https://3-shake.connpass.com/event/389755/

近年、LLMの開発現場では、学習からデプロイ、運用までを支える基盤として Kubernetes の活用が進んでいます。本セッションでは、学習基盤を構築する際の分散学習やジョブスケジューリングの考慮点を解説し、LLMの運用課題に対応する「LLMOps」のプラクティスもご紹介します。学習基盤の設計に取り組む方、Kubernetes と AI 運用の概要を把握したい方向けの入門的な内容です。

Avatar for ry

ry

June 17, 2026

More Decks by ry

Other Decks in Technology

Transcript

  1. Copyright © Dell Inc. All Rights Reserved. 2 Introduction Name:

    Ryotaro Uwatsu (X: @URyo_0213) Company: Dell Technologies Japan inc. Title: Principal Engineer, Solutions Architecture Projects: • Kubernetes運用支援 • Kubernetesを用いたAI基盤の設計/構築/支援 • MLOps/LLMOps支援 • etc... Kubernetes Meetup Novice 【免責事項】 本発表の内容は、発表者個人の見解に基づくものであり、 所属組織・企業の公式見解を示すものではありません。
  2. Copyright © Dell Inc. All Rights Reserved. 8 Kubernetesにおけるジョブスケジューリング ここで、空いているNodeがある際にスケジューリングが可能な場合、KubernetesとしてはJobの完了条件であ

    る成功数(completions)を満たすようにPodを生成して処理を実行しようとしてしまいます。 Node-1 GPU: 8 Node-2 GPU: 8 Node-3 GPU: 8 Process-1 (実行中) Process-2 (実行中) llm-job-1 Process-1 GPU:8 Process-2 GPU: 8 llm-job-2 Process-1 GPU:8 Process-2 GPU: 8 Process1 (待機中) Pending
  3. Copyright © Dell Inc. All Rights Reserved. 9 Gang Schedulingとは

    複数のノードに跨ったプロセスを同時にスケジューリングする仕組みとしてGANG Schedulingがあります。 指定したプロセス数が正常に起動していない場合はJob全体が実行されないため、Jobを実行する上でとても重 要な機能です。 Node-1 Node-2 Node-3 Node-1 Node-2 Node-3 Training Job Training Job Process-1 Process-2 Process-3 Process-1 Process-2 Process-3 Process-1 (実行中) Process-2 (実行中) Process-3 (実行中) Process-1 (待機状態) Process-2 (待機状態) Pending Process-x (実行中)
  4. Copyright © Dell Inc. All Rights Reserved. 12 Kueue https://kueue.sigs.k8s.io/docs/

    Kubernetes SIGs (Special Interest Group) にて開発されている、Kubernetes ネイティブな仕組みを用いてジョ ブのキューイングを実現するためのソフトウェアです。 基本的な概念として以下の3つを用います。 • Resource Flavor: Kueueに管理されるJobをどのNodeで動かすのかの定義を行う • ClusterQueue: 各Namespaceから利用可能なリソースの定義を行う • LocalQueue: 特定のNamespaceからどのClusterQueueを利用するかの定義を行う
  5. Copyright © Dell Inc. All Rights Reserved. 13 Kueue まず、ClusterQueueで管理下に置くGPUの個数を指定し、Resource

    Flavorで対象とするNodeを指定します。 その上で、特定のNamespaceでLocalQueueを作成し、そのQueueを対象にJobを実行します。 K8s Job Kubernetes Node 1 (GPU: 8) Kubernetes Node 2 (GPU: 8) Kubernetes Node 3 (GPU: 8) K8s Job LocalQueue GPU: 24 Resource Flavor ClusterQueue K8s Job Master Pod GPU: 8 Worker Pod GPU: 8 Worker Pod GPU: 8 K8s Job
  6. Copyright © Dell Inc. All Rights Reserved. 14 Kueue K8s

    Job Kubernetes Node 1 (GPU: 8) Kubernetes Node 2 (GPU: 8) Kubernetes Node 3 (GPU: 8) LocalQueue GPU: 24 Resource Flavor ClusterQueue (High Priority Tenant) K8s Job Master Pod GPU: 8 Worker Pod GPU: 8 Worker Pod GPU: 8 Kubernetes Node 4 (GPU: 8) Kubernetes Node 5 (GPU: 8) Kubernetes Node 6 (GPU: 8) Kubernetes Node 7 (GPU: 8) Kubernetes Node 8 (GPU: 8) K8s Job LocalQueue K8s Job LocalQueue GPU: 40 ClusterQueue (Low Priority Tenant) K8s Job Master Pod GPU: 8 Worker Pod GPU: 8 Worker Pod GPU: 8 Worker Pod GPU: 8 K8s Job Worker Pod GPU: 8 以下のように、Tenantに応じた設定などが可能となっています。 Resource Flavor namespace-1 namespace-2 namespace-3 K8s Job
  7. Copyright © Dell Inc. All Rights Reserved. 15 apiVersion: batch/v1

    kind: Job metadata: name: llm-job-1 # llm-job-2,llm-job-3 namespace: playground labels: kueue.x-k8s.io/queue-name: playground-llm-queue spec: completions: 2 parallelism: 2 completionMode: Indexed template: ... spec: containers: - name: llm ... Kueue Kubernetes標準のJobに対して、「labels」を付与するのみでキューイング機能を利用することが可能です。 以下の例では、同じジョブを3つ同時実行した際の挙動を表しています。 <Jobの作成直後> <全Job 実行完了直後> $ kubectl get workload NAME QUEUE RESERVED IN ADMITTED FINISHED AGE job-llm-job-1-b3a72 playground-llm-queue clusterq-playground True 19s job-llm-job-2-ff124 playground-llm-queue 13s job-llm-job-3-2d854 playground-llm-queue 12s $ kubectl get workload NAME QUEUE RESERVED IN ADMITTED FINISHED AGE job-llm-job-1-b3a72 playground-llm-queue clusterq-playground True True 5m job-llm-job-2-ff124 playground-llm-queue clusterq-playground True True 4m54s job-llm-job-3-2d854 playground-llm-queue clusterq-playground True True 4m53s $ kubectl get pods NAME READY STATUS RESTARTS AGE llm-job-1-0-pb6h2 1/1 Running 0 26s llm-job-1-1-xzs4d 1/1 Running 0 26s
  8. Copyright © Dell Inc. All Rights Reserved. 16 Volcano https://volcano.sh/en/docs/

    Volcanoは、CNCF(Cloud Native Computing Foundation)にて管理されているジョブキューイングソフトウェア です。 Kueueとは違い、独自のスケジューリングロジックを基にJobを扱います。 基本的な概念として以下の3つを用います。 • Queue: このQueueを指定したジョブにおいて利用可能なリソースの定義を行う • Volcano Job: Queueに管理されるジョブの定義を行う
  9. Copyright © Dell Inc. All Rights Reserved. 17 CPU: 288

    Memory: 1200GB GPU: 24 Volcano Volcano特有のJobを定義することで、学習ジョブ実行のキューイング機能を利用することが可能となります。 Kubernetes Node 1 (GPU: 8) Kubernetes Node 2 (GPU: 8) Kubernetes Node 3 (GPU: 8) Volcano Job Queue Master Pod GPU: 8 Worker Pod GPU: 8 Worker Pod GPU: 8 Volcano Job Volcano Job Volcano Job
  10. Copyright © Dell Inc. All Rights Reserved. 18 Volcano Volcano

    Jobを用いて、VolcanoのQueueにジョブをキューイングします。 以下の例では、同じジョブを3つ同時実行した際の挙動を表しています。 --- apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: job-1 spec: minAvailable: 1 schedulerName: volcano queue: test policies: - event: PodEvicted action: RestartJob tasks: - replicas: 1 name: llm policies: - event: TaskCompleted action: CompleteJob template: spec: containers: ... <Jobの作成直後> <2Job目実行後> $ kubectl get podgroups NAME STATUS MINMEMBER RUNNINGS AGE job-1-30b8c6f5-b073-4ee5-a5df-95a1ebea34af Running 1 1 110s job-2-153af9e6-054c-4a35-960e-5f7a213968b7 Pending 1 92s job-3-9267b53d-b6be-4e0b-997f-3b2551ddaa24 Pending 1 78s $ kubectl get podgroups NAME STATUS MINMEMBER RUNNINGS AGE job-2-153af9e6-054c-4a35-960e-5f7a213968b7 Running 1 1 3m4s job-3-9267b53d-b6be-4e0b-997f-3b2551ddaa24 Pending 1 2m50s $ kubectl get pods NAME READY STATUS RESTARTS AGE job-1-llm-0 1/1 Running 0 2m11s $ kubectl get pods NAME READY STATUS RESTARTS AGE job-1-llm-0 0/1 Completed 0 3m30s job-2-llm-0 1/1 Running 0 17s
  11. Copyright © Dell Inc. All Rights Reserved. 20 分散学習の実行 例えばPytorchを用いた分散学習を実行する際、以下のようなコマンドを用いることになります。

    少ない物理サーバ上で実行するなどであればコマンドの実行に困りませんが、スケールしていくにつれ、どのよ うに各ノード上でコマンドを実行するかや「--nnodes」、「--node_rank」をそろえる必要があるなどの問題な どがあります。 GPU Node 1 GPU Node 2 torchrun \ --nproc_per_node=<≒GPUの数> \ # 8 --nnodes=<全体のNode数> \ # 2 --node_rank=<自分のID> \ # 0 --master_addr=<MasterのIP> \ --master_port=<MasterのPort> \ train.py torchrun \ --nproc_per_node=<≒GPUの数> \ # 8 --nnodes=<全体のNode数> \ # 2 --node_rank=<自分のID> \ # 1 --master_addr=<MasterのIP> \ --master_port=<MasterのPort> \ train.py Router Process 1 (Master) Process 2 (Worker)
  12. Copyright © Dell Inc. All Rights Reserved. 21 分散学習の実行 では、Kubernetes上で実行する場合、PodのIPは常に変わってしまったり、Manifest上で処理内容を表現する必

    要があるため、適用時に工夫しなければなりません。 (Jobを使った例) • --node_rank: JobのcompletionModeをIndexedにして、実行のコマンドでホストネームからawkなどで取得してあげる • --master_addr: Headless Serviceを使いつつ、Job内で「subdomain」を指定して、ホスト名を固定する。 • etc... Kubernetes GPU Node 1 Kubernetes GPU Node 2 Router Overlay Network torchrun \ --nproc_per_node=<≒GPUの数> \ --nnodes=<全体のNode数> \ --node_rank=<自分のID> \ --master_addr=<MasterのIP> \ --master_port=<MasterのPort> \ train.py torchrun \ --nproc_per_node=<≒GPUの数> \ --nnodes=<全体のNode数> \ --node_rank=<自分のID> \ --master_addr=<MasterのIP> \ --master_port=<MasterのPort> \ train.py Pod 1 (Master) Pod 2 (Worker)
  13. Copyright © Dell Inc. All Rights Reserved. 22 Kubeflow Training

    Operator https://www.kubeflow.org/docs/components/trainer/overview/ Kubeflow Training Operatorを用いることで、オプションの指定に必要なパラメータを環境変数に設定してくれ るため簡素化でき、スケールも容易に行うことができます。 apiVersion: trainer.kubeflow.org/v1alpha1 kind: TrainJob metadata: name: model-training spec: runtimeRef: apiGroup: trainer.kubeflow.org kind: TrainingRuntime name: pytorch-ddp-runtime trainer: numNodes: 2 numProcPerNode: 8 resourcesPerNode: limits: nvidia.com/gpu: “8" command: - "torchrun" args: - "--nproc_per_node=$(PET_PET_NPROC_PER_NODE)" - "--nnodes=$(PET_NNODES)" - "--node_rank=$(PET_NODE_RANK)" - "--master_addr=$(PET_MASTER_ADDR)" - "--master_port=$(PET_MASTER_PORT)" - "/opt/pytorch-mnist/ddp.py" Kubernetes GPU Node 1 Kubernetes GPU Node 2 Overlay Network Pod 1 (Master) Pod 2 (Worker) Service $ kubectl exec -it model-training-node-0-0-fqnmt -- env | grep PET PET_NPROC_PER_NODE=1 PET_MASTER_PORT=29500 PET_NNODES=2 PET_NODE_RANK=0 PET_MASTER_ADDR=model-training-node-0-0.model-training
  14. Copyright © Dell Inc. All Rights Reserved. 25 データセットの作成 モデルの学習に必要なデータは様々な所から収集されます。

    • Webクローリング • データの購入 • HuggingFace等のオープンなデータセット • etc...
  15. Copyright © Dell Inc. All Rights Reserved. 26 データセットの作成 一方作成したデータセットに対して、以下のようなことに注意する必要があります。

    • ライセンス・著作権・利用規約 • 個人情報・機密情報 • 透明性・説明可能性 • データ品質 • etc... つまり、最終的な学習用データセットを作成するまでの間に「どのようなデータ」から「どのような加工」を 行って、「どのような状態のデータ」なのかということを、適宜記録していくことが重要になります。
  16. Copyright © Dell Inc. All Rights Reserved. 27 MLOpsツールを使ったデータリネージ ClearMLというツールを用いてデータのリネージ管理をする例をご紹介します。

    ClearMLは下記のようなSDKで操作することができるので、Webスクレイピングするコードなどの最後に記録を 残すようなコードを記述を追加するだけで、データの軌跡を記録することができます。 version = "1.0.0" task_name = "sft_dataset_from_hf" desc = f"Uploaded original data [{metadata["user"]} ({metadata["title"]}) in {metadata["department"]}]" dataset = Dataset.create( parent_datasets=None, dataset_version=version, description=desc, use_current_task=False) dataset._task.set_user_properties(url="https://huggingface.co/datasets/...") dataset._task.set_user_properties(licence="apache-2.0") dataset.add_files(path=train_image_path) dataset.upload()
  17. Copyright © Dell Inc. All Rights Reserved. 29 MLOpsツールを使ったデータリネージ また「Task

    Information」をクリックして、詳細画面に移動すると、データセット登録時に記録した「ライセン ス」や「どこから取得したデータセットなのか」といった情報を確認できます。
  18. Copyright © Dell Inc. All Rights Reserved. 32 おわりに 今回はLLMOpsの中でも学習に焦点を当てて以下のようなことをご紹介しました。

    • Kubernetes上における、ジョブのスケジューリングについて • 学習の実行最適化について • データの管理 今回ご紹介したことはほんの一部ではありますが、こういったコンテキストを知ることで、KubernetesをAI開 発に用いるために様々な機能拡張やツールの開発が進んでいる現状をより正確にキャッチアップできると思いま すし、その一助となりましたら幸いです。