Ich möchte die automatische Bereitstellung von GKE-Knoten verwenden, um bei Bedarf einen Knotenpool mit GPU zu erstellen (das heißt, wenn ich einen Job starte, der GPU-Ressourcen benötigt).
Gemäß dem GCP-Tutorial habe ich einen Cluster mit aktivierten cluster autoscaling
und eingerichtet node auto-provisioning
. NAP hat Grenzwerte für CPU, Speicher und GPU festgelegt:
resourceLimits:
- maximum: '15'
minimum: '1'
resourceType: cpu
- maximum: '150'
minimum: '1'
resourceType: memory
- maximum: '2'
resourceType: nvidia-tesla-k80
Ich weiß, dass NAP funktioniert, weil es bei mir bereits einige Knoten hochgefahren hat, aber alle davon waren „normale“ (ohne GPU).
Nun muss NAP „gezwungen“ werden, einen Knotenpool mit einer GPU-Maschine zu erstellen. Davor existiert im Cluster kein GPU-Knoten. Dazu erstelle ich einen Job mit einer solchen Konfigurationsdatei:
apiVersion: batch/v1
kind: Job
metadata:
name: training-job
spec:
ttlSecondsAfterFinished: 100
template:
metadata:
name: training-job
spec:
nodeSelector:
gpu: "true"
cloud.google.com/gke-spot: "true"
cloud.google.com/gke-accelerator: nvidia-tesla-k80
tolerations:
- key: cloud.google.com/gke-spot
operator: Equal
value: "true"
effect: NoSchedule
containers:
- name: gpu-test
image: przomys/gpu-test
resources:
requests:
cpu: 500m
limits:
nvidia.com/gpu: 2 # requesting 2 GPU
restartPolicy: Never # Do not restart containers after they exit
Der Job wird erstellt, dann aber als „Nicht planbar“ markiert und das CA-Protokoll gibt mir folgenden Fehler aus:
{
"noDecisionStatus": {
"measureTime": "1650370630",
"noScaleUp": {
"unhandledPodGroups": [
{
"rejectedMigs": [
{
"reason": {
"messageId": "no.scale.up.mig.failing.predicate",
"parameters": [
"NodeAffinity",
"node(s) didn't match Pod's node affinity/selector"
]
},
"mig": {
"zone": "us-central1-c",
"nodepool": "pool-3",
"name": "gke-cluster-activeid-pool-3-af526144-grp"
}
},
{
"mig": {
"name": "gke-cluster-activeid-nap-e2-standard--c7a4d4f1-grp",
"zone": "us-central1-c",
"nodepool": "nap-e2-standard-2-w52e84k8"
},
"reason": {
"parameters": [
"NodeAffinity",
"node(s) didn't match Pod's node affinity/selector"
],
"messageId": "no.scale.up.mig.failing.predicate"
}
}
],
"napFailureReasons": [
{
"parameters": [
"Any GPU."
],
"messageId": "no.scale.up.nap.pod.gpu.no.limit.defined"
}
],
"podGroup": {
"totalPodCount": 1,
"samplePod": {
"controller": {
"apiVersion": "batch/v1",
"kind": "Job",
"name": "training-job"
},
"namespace": "default",
"name": "training-job-7k8zd"
}
}
}
],
"unhandledPodGroupsTotalCount": 1
}
}
}
Ich vermute, dasskein.Scale.up.nap.pod.gpu.kein.Limit.definiertist der wichtigste Teil.GCP-Lernprogrammweist michHier. Aber ich habe diese Grenze definiert, daher gehen mir die Ideen aus ...
Vielleicht hat jemand eine Idee, was ich falsch mache?