agent-platform release v4.40.2

Changed

  • The connectivity chart README names the GPU node’s locked-memory requirement (giantswarm/agent-platform#564): a container inherits containerd’s RLIMIT_MEMLOCK and has no CAP_IPC_LOCK, so a serving runtime that mlock()s its weights dies at engine start under the unit’s 8 MB default; a pool node created through the platform runs containerd with LimitMEMLOCK=infinity (gpu-node-pool’s memlock.conf drop-in), and a GPU node not created through the platform needs the same drop-in. No rendered object changes.

Fixed

  • The storage-initializer’s memory limit is 8Gi, headroom for a download that overlaps the runtime image’s unpack (giantswarm/agent-platform#576). modelServing.policies.storageInitializerMemoryLimit defaulted to 4Gi, sized after KServe’s 1Gi default was OOM-killed by an 8 GB download; the limit also holds the page-cache pages of the files the initializer writes, which the kernel charges to the container’s cgroup until write-back has drained them to the disk. On a 4 vCPU / 16 GiB L4 node the GPU became allocatable about 77 s before the runtime pre-pull had finished gunzipping the 8.8 GB image, so a 9.4 GB download into the emptyDir on the node’s local disk ran inside a CPU-bound unpack (load average 30, write-back saturated), its dirty pages stayed charged to the initializer and the init container was OOM-killed (exit 137) a minute in; the same download had passed whenever it started after the pre-pull, and a 16 vCPU node with the same overlap was fine. The zstd re-layered runtime image (giantswarm/agent-platform#568, 4.40.0) unpacks in about 30 s and ends the pre-pull before the GPU appears, which removes the collision on the L4 size; 8Gi is the headroom for a download that still overlaps an unpack (a bigger model, a slower disk). It fits the smallest curated L4 size: init and main containers do not run at once, so the pod’s effective request stays the predictor’s own 10Gi, within the ~12 GiB a 16 GiB node leaves to pods after the kubelet’s reservations. The meta chart mirrors the default; the README says what the limit must hold.