拡張リソースを使用してKubernetes GPU RAMを分割


前の2つのバージョン(1)および(2)に記載されているように、gpuは、クバーネディスがリソースを要求する際に多くの制限を有する.
そこで,以下の場合,参照のためにGPU RAMを分割して容器に割り当てる方法について議論する.

  • n個のコンテナでGPUを共有して割り当てることはできない.
  • 連続パイプラインの各GPU要求に制限がある場合は、順次運転可能であるが、しばしばエラー(Pending、timeout等)
  • が発生する.

  • GPUをコンテナに分割して割り当てるが、NVIDIA MIGはA 100、A 30などのシリーズのみをサポートする.(A 5000などの低価格製品ユーザーはMIG-を使用できませんが、実はこれは決して低価格ではありません…)

  • クバーネディスでGPUを利用したいのですが、MIGではなくGPU分割配分方法を探しています!
  • Kubernetesには、CPUとRAMの間の機能を提供する生産資源割当という概念があります.->これは今日使用するコアコンセプトです.このようにVRAMリクエストを分けて
  • サーバー仕様/コンテナ要件構造の決定

  • サーバー仕様から開始します.kubectl get nodes -o yaml
  • 割り当て可能セクションには、ノード割り当て可能な仕様がリストされています.
  • は直接free -hでメモリ(RAM)をチェックし、df -hで容量をチェックするのが便利です.
  • VRAMは、現在使用されているGPU情報から得られる.(NVIDIA RTX A5000 D6 24GB)
    - CPU : 40core
  • Memory(RAM) : 62.47 GiB (available: 52G)
  • 一時記憶:457.44ギガビット(Avail:224 G)
  • VRAM : 24GB
  • KB、KB、KIを混同するユーザの容量を定義する

  • コンテナ要求仕様
    この部分はまだ確認方法が見つかっていません.
    コンテナが正常に動作するには、どのくらいのリソースが必要かを決定できます.
    今回のリリースでは、CPU/RAMのリソース要件を指定するのではなく、VRAMにのみlimitを指定するのでスキップ!
  • 人の在職者に尋ねたところ、podを実験的に生成して返し、使用量に応じて仮想メモリを再割り当てしたという.また、以下に示すように、仮想メモリを6つに分け、使用量に対して仮想メモリを設定しすぎて、1 GBごとにpodを割り当てる24つに分けます.
  • 拡張リソースの作成

  • Kubernetesは「Extended Resource」を定義している.
    -カスタムリソースを追加できることを示す、次の画像でリソースを定義します.
  • ノードへの拡張リソースの追加

  • API用のJWTトークンが取得される.
  • kubectl get serviceaccount default
    TOKEN=$(kubectl get secret $(kubectl get sa default \
        -ojsonpath="{.secrets[0].name}") \
        -ojsonpath="{.data.token}" | base64 -d)
    echo $TOKEN

  • defaultという名前のユーザーに適切な権限を付与しましょう.
  • 便宜上、クラスタ-admin権限を付与します.操作環境では、非常に危険な行為ですので、適切な権限を与えてください.
  • kubectl create clusterrolebinding default-cluster-admin --clusterrole cluster-admin --serviceaccount kubeflow-user-example-com:default

  • APIサーバアドレスについて説明します.kubectl cluster-info
    https://192.168.0.14:8443を申請してもいいですよ.

  • トークンとサービスアカウントのライセンスが完了しました.apiの結果が正常かどうかを見てみましょう.curl -k -H "Authorization: Bearer $TOKEN" https://192.168.0.14:8443

  • ノード名もチェックします.kubectl get nodes

  • Kubernetes APIサーバ上でHTTP PATCHを実行してResourceを拡張する準備が整いました.curl -k -H "Authorization: Bearer $TOKEN" --header "Content-Type: application/json-patch+json" --request PATCH --data '[{"op": "add", "path": "/status/capacity/ggaman.com~1vram", "value": "24"}]' https://192.168.0.14:8443/api/v1/nodes/tyan/status
  • フォーマットは次のとおりです.curl -k -H "Authorization: Bearer $TOKEN" --header "Content-Type: application/json-patch+json" --request PATCH --data '[{"op": "add", "path": "/status/capacity/<정의하고자하는 ExtendedResource 이름>", "value": "<VRAM>"}]' <컨트롤플레인 api주소>/api/v1/nodes/<노드이름>/status

    拡張リソースが適用されていることを確認します。

    kubectl get nodes -o yaml
  • ggaman.com/vramは固定フォーマットです.同じものを使えばいい
  • 無事にCustomリソース登録を完了しました!では、これらのリソースを利用してパイドのリソースを制限し、GPUを分割しましょう.
  • 拡張リソースを使用してGPUパーティションをチェックする


    ユーザーは以前のようにpodでresourcesを使用することができます.limitを設定するように簡単にnvidia.com/gpuggaman.com/vramに変更すればいい!
    "spec": {
                "tfReplicaSpecs": {
                    "Chief": {
                        "replicas": 1,
                        "restartPolicy": "OnFailure",
                        "template": {
                            "metadata": {
                                "annotations": {"sidecar.istio.io/inject": "false"}
                            },
                            "spec": {
                                "containers": [
                                    {
                                        "name": "tensorflow",
                                        "image": "docker.io/moey920/train_forecasting_model:latest",
                                        "command": [
                                            "python",
                                            "/code/ecm_forecasting_ar_lstm/main.py",
                                            f"--df_me={df_me}",
                                            "--input_width=${trialParameters.inputWidth}",
                                            "--label_width=${trialParameters.labelWidth}",
                                            "--shift=${trialParameters.shift}",
                                        ],
                                        "resources": {
                                            "limits": {
                                                "ggaman.com/vram": 1
                                            }
                                        },
                                    }
                                ]
                            },
                        },
                    },
    これで、以下に示すように、1つのGPUが複数のコンテナに並列に割り当てられたVRAMが表示されます.

    ふろく


    出典:https://blog.ggaman.com/1025https://coffeewhale.com/apiserver