@@ -158,15 +158,103 @@ queue:
158158 # # Default: 3
159159 # job_buffer_size: 3
160160
161- # Host booking strategy configuration
161+ # ---------------------------------------------------------------------------
162+ # Host booking strategy. Two variants:
163+ #
164+ # Saturation (default) — legacy first-fit. Saturation flags control B-tree
165+ # iteration direction (saturated-first vs spread-first per dimension).
162166 # host_booking_strategy:
163- # # Enable core saturation booking
164- # # Default: true
167+ # type: saturation
165168 # core_saturation: true
166- #
167- # # Enable memory saturation booking
168- # # Default: false
169169 # memory_saturation: false
170+ #
171+ # Epvm — E-PVM stranding score; picks the lowest-scoring host among up to
172+ # `max_candidates` scanned. Iteration is always saturated-first under Epvm,
173+ # independent of the Saturation flags. `weights` express per-dimension
174+ # importance ratios (W3 normalization, see scheduler design doc).
175+ # host_booking_strategy:
176+ # type: epvm
177+ # max_candidates: 500
178+ # weights:
179+ # cores: 1.0
180+ # mem: 1.0
181+ # gpus: 2.0
182+ # gpu_mem: 1.0
183+ # gpu_count_reservation: 2.0
184+ # gpu_mem_reservation: 2.0
185+ #
186+ # --- gpu_*_reservation (soft-reservation penalty) --------------------------
187+ # Applied ONLY when the layer requests no GPUs (gpus_min == 0). Penalizes GPU
188+ # hosts to nudge non-GPU work onto non-GPU hosts. The penalty is split into
189+ # two independent knobs so operators control the count-vs-memory balance:
190+ #
191+ # penalty = gpu_count_reservation * idle_gpus
192+ # + gpu_mem_reservation * idle_gpu_memory_gb
193+ #
194+ # Unlike the stranding weights these scale raw capacity (not a normalized
195+ # stranding term). A typical default is 2.0/2.0 — strong enough to push GPU
196+ # hosts behind non-GPU hosts for non-GPU work, weak enough not to swamp the
197+ # cores/mem stranding signal. On hosts with a lot of GPU memory the mem
198+ # penalty will tend to dominate; raise `gpu_count_reservation` (or lower
199+ # `gpu_mem_reservation`) to rebalance.
200+ #
201+ # --- Example: equal-weight baseline ----------------------------------------
202+ # Cores and memory stranding count equally; GPU dimensions count slightly
203+ # more; non-GPU work mildly prefers non-GPU hosts. Matches the defaults.
204+ # host_booking_strategy:
205+ # type: epvm
206+ # max_candidates: 500
207+ # weights:
208+ # cores: 1.0
209+ # mem: 1.0
210+ # gpus: 2.0
211+ # gpu_mem: 1.0
212+ # gpu_count_reservation: 2.0
213+ # gpu_mem_reservation: 2.0
214+ #
215+ # --- Example: GPU-scarce farm ----------------------------------------------
216+ # Protect GPU hosts aggressively for GPU work and make GPU stranding very
217+ # expensive (don't waste a GPU on a low-GPU layer). Reservation favors count
218+ # heavily since GPUs themselves are the scarce resource.
219+ # host_booking_strategy:
220+ # type: epvm
221+ # max_candidates: 500
222+ # weights:
223+ # cores: 1.0
224+ # mem: 1.0
225+ # gpus: 8.0
226+ # gpu_mem: 2.0
227+ # gpu_count_reservation: 10.0
228+ # gpu_mem_reservation: 1.0
229+ #
230+ # --- Example: memory-tight farm --------------------------------------------
231+ # Penalize memory stranding more than cores so jobs with high mem:core
232+ # ratios go to high-memory hosts first.
233+ # host_booking_strategy:
234+ # type: epvm
235+ # max_candidates: 500
236+ # weights:
237+ # cores: 1.0
238+ # mem: 3.0
239+ # gpus: 2.0
240+ # gpu_mem: 1.0
241+ # gpu_count_reservation: 2.0
242+ # gpu_mem_reservation: 2.0
243+ #
244+ # --- Example: cores-only (debugging sanity check) --------------------------
245+ # Scoring degenerates to "pack cores tightest" — useful for diagnosing
246+ # whether other dimensions are responsible for a placement regression.
247+ # host_booking_strategy:
248+ # type: epvm
249+ # max_candidates: 500
250+ # weights:
251+ # cores: 1.0
252+ # mem: 0.0
253+ # gpus: 0.0
254+ # gpu_mem: 0.0
255+ # gpu_count_reservation: 0.0
256+ # gpu_mem_reservation: 0.0
257+ # ---------------------------------------------------------------------------
170258
171259 # Soft memory limit multiplier for frame memory requirements
172260 # Used as a threshold to determine if a frame can be dispatched based on available memory
0 commit comments