Quiero usar el aprovisionamiento automático de nodos de GKE para crear un grupo de nodos con GPU bajo demanda (es decir, cuando inicio un trabajo que necesita recursos de GPU).
Siguiendo el tutorial de GCP, configuré un clúster con habilitado cluster autoscaling
y node auto-provisioning
. NAP ha establecido límites para CPU, memoria y GPU:
resourceLimits:
- maximum: '15'
minimum: '1'
resourceType: cpu
- maximum: '150'
minimum: '1'
resourceType: memory
- maximum: '2'
resourceType: nvidia-tesla-k80
Sé que NAP funciona porque ya me activó algunos nodos, pero todos eran "normales" (sin GPU).
Ahora, para "forzar" a NAP a crear un grupo de nodos con la máquina GPU. Antes de eso, no existía ningún nodo GPU en el clúster. Para hacer eso, estoy creando un trabajo con dicho archivo de configuración:
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
Se está creando el trabajo, pero luego se marca como "No programable" y CA Log me da el siguiente error:
{
"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
}
}
}
Mi conjetura es quesin.ampliación.nap.pod.gpu.sin.límite.definidoes la parte más importante.Tutorial de GCPme señalaaquí. Pero tengo este límite definido, por lo que me quedé sin ideas...
¿Quizás alguien tenga una idea de lo que estoy haciendo mal?