@@ -256,27 +256,56 @@ func TestPlanPD_FullMatrix(t *testing.T) {
256256}
257257
258258func TestPlanPDRecommendation_DeepSeekV3 (t * testing.T ) {
259- rec , err := PlanPDRecommendation ("deepseek-v3" , 671 , 256 , 8 , "fp8" , 7168 , 61 )
259+ // minInferenceVRAMGB=772.0 matches configs/pd/models.toml for DeepSeek-V3.
260+ rec , err := PlanPDRecommendation ("deepseek-v3" , 671 , 256 , 8 , "fp8" , 7168 , 61 , 772.0 )
260261 require .NoError (t , err )
261262 require .NotNil (t , rec )
262263 require .Equal (t , 671.0 , rec .TotalParamsB )
263264 require .Equal (t , 256 , rec .TotalExperts )
264265 require .Equal (t , 8 , rec .ActiveExperts )
265266 require .Equal (t , "fp8" , rec .Precision )
266- require .Equal (t , 80 .0 , rec .MinInferenceVRAMGB )
267+ require .Equal (t , 772 .0 , rec .MinInferenceVRAMGB )
267268 require .Greater (t , rec .Prefill .TotalGPUs , 0 )
268269 require .Greater (t , rec .Decode .TotalGPUs , 0 )
269- require .Greater (t , rec .Prefill .TotalVRAMGB , 0.0 )
270+ // TotalVRAMGB = MinInferenceVRAMGB * Pods
271+ require .Equal (t , 772.0 * float64 (rec .Prefill .Pods ), rec .Prefill .TotalVRAMGB )
272+ require .Equal (t , 772.0 * float64 (rec .Decode .Pods ), rec .Decode .TotalVRAMGB )
270273 require .Greater (t , rec .Prefill .Pods , 0 )
271274 require .Greater (t , rec .Decode .Pods , 0 )
272275
273- t .Logf ("DeepSeek-V3 80G: Prefill TP=%d EP=%d GPUs=%d Pods=%d | Decode TP=%d EP=%d GPUs=%d Pods=%d" ,
274- rec .Prefill .TP , rec .Prefill .EP , rec .Prefill .TotalGPUs , rec .Prefill .Pods ,
275- rec .Decode .TP , rec .Decode .EP , rec .Decode .TotalGPUs , rec .Decode .Pods )
276+ t .Logf ("DeepSeek-V3 80G: Prefill TP=%d EP=%d GPUs=%d Pods=%d VRAM=%.0f | Decode TP=%d EP=%d GPUs=%d Pods=%d VRAM=%.0f" ,
277+ rec .Prefill .TP , rec .Prefill .EP , rec .Prefill .TotalGPUs , rec .Prefill .Pods , rec .Prefill .TotalVRAMGB ,
278+ rec .Decode .TP , rec .Decode .EP , rec .Decode .TotalGPUs , rec .Decode .Pods , rec .Decode .TotalVRAMGB )
279+ }
280+
281+ func TestPlanPDRecommendation_MinInferenceVRAMZero (t * testing.T ) {
282+ // When minInferenceVRAMGB is 0 (metadata.mini_gpu_memory_gb not populated),
283+ // keep it as 0 so the missing value is visible. PD planning still succeeds;
284+ // only the VRAM fields are 0 until the value is resolved from TOML/metadata.
285+ rec , err := PlanPDRecommendation ("deepseek-v3" , 671 , 256 , 8 , "fp8" , 7168 , 61 , 0 )
286+ require .NoError (t , err )
287+ require .NotNil (t , rec )
288+ require .Equal (t , 0.0 , rec .MinInferenceVRAMGB )
289+ // TotalVRAMGB = 0 * Pods = 0
290+ require .Equal (t , 0.0 , rec .Prefill .TotalVRAMGB )
291+ require .Equal (t , 0.0 , rec .Decode .TotalVRAMGB )
292+ // PD planning checks should still pass
293+ require .Greater (t , rec .Prefill .TotalGPUs , 0 )
294+ require .Greater (t , rec .Decode .TotalGPUs , 0 )
295+ }
296+
297+ func TestPlanPDRecommendation_MinInferenceVRAMNegative (t * testing.T ) {
298+ // Negative values should be clamped to 0.
299+ rec , err := PlanPDRecommendation ("deepseek-v3" , 671 , 256 , 8 , "fp8" , 7168 , 61 , - 10 )
300+ require .NoError (t , err )
301+ require .NotNil (t , rec )
302+ require .Equal (t , 0.0 , rec .MinInferenceVRAMGB )
303+ require .Equal (t , 0.0 , rec .Prefill .TotalVRAMGB )
304+ require .Equal (t , 0.0 , rec .Decode .TotalVRAMGB )
276305}
277306
278307func TestPlanPDRecommendation_GLM52 (t * testing.T ) {
279- rec , err := PlanPDRecommendation ("glm-5.2" , 1000 , 256 , 8 , "fp8" , 8192 , 80 )
308+ rec , err := PlanPDRecommendation ("glm-5.2" , 1000 , 256 , 8 , "fp8" , 8192 , 80 , 0 )
280309 require .NoError (t , err )
281310 require .NotNil (t , rec )
282311 require .Equal (t , 1000.0 , rec .TotalParamsB )
@@ -285,7 +314,7 @@ func TestPlanPDRecommendation_GLM52(t *testing.T) {
285314}
286315
287316func TestPlanPDRecommendation_Qwen3_30B_A3B (t * testing.T ) {
288- rec , err := PlanPDRecommendation ("qwen3-30b-a3b" , 30 , 128 , 8 , "bf16" , 2048 , 48 )
317+ rec , err := PlanPDRecommendation ("qwen3-30b-a3b" , 30 , 128 , 8 , "bf16" , 2048 , 48 , 0 )
289318 require .NoError (t , err )
290319 require .NotNil (t , rec )
291320 require .Equal (t , 30.0 , rec .TotalParamsB )
@@ -294,7 +323,7 @@ func TestPlanPDRecommendation_Qwen3_30B_A3B(t *testing.T) {
294323
295324func TestPlanPDRecommendation_UnknownModelMoE (t * testing.T ) {
296325 // Unknown MoE model with expert info from config.json
297- rec , err := PlanPDRecommendation ("custom/moe-model" , 200 , 64 , 8 , "bf16" , 4096 , 32 )
326+ rec , err := PlanPDRecommendation ("custom/moe-model" , 200 , 64 , 8 , "bf16" , 4096 , 32 , 0 )
298327 require .NoError (t , err )
299328 require .NotNil (t , rec )
300329 require .Equal (t , 200.0 , rec .TotalParamsB )
@@ -306,7 +335,7 @@ func TestPlanPDRecommendation_UnknownModelMoE(t *testing.T) {
306335}
307336
308337func TestPlanPDRecommendation_DenseModel (t * testing.T ) {
309- rec , err := PlanPDRecommendation ("custom-dense-70b" , 70 , 0 , 0 , "bf16" , 0 , 0 )
338+ rec , err := PlanPDRecommendation ("custom-dense-70b" , 70 , 0 , 0 , "bf16" , 0 , 0 , 0 )
310339 require .NoError (t , err )
311340 require .NotNil (t , rec )
312341 require .Equal (t , 70.0 , rec .TotalParamsB )
@@ -315,35 +344,35 @@ func TestPlanPDRecommendation_DenseModel(t *testing.T) {
315344}
316345
317346func TestPlanPDRecommendation_ZeroParams (t * testing.T ) {
318- _ , err := PlanPDRecommendation ("test" , 0 , 256 , 8 , "fp8" , 0 , 0 )
347+ _ , err := PlanPDRecommendation ("test" , 0 , 256 , 8 , "fp8" , 0 , 0 , 0 )
319348 require .Error (t , err )
320349 require .Contains (t , err .Error (), "total params must be positive" )
321350}
322351
323352func TestPlanPDRecommendation_NegativeParams (t * testing.T ) {
324- _ , err := PlanPDRecommendation ("test" , - 10 , 256 , 8 , "fp8" , 0 , 0 )
353+ _ , err := PlanPDRecommendation ("test" , - 10 , 256 , 8 , "fp8" , 0 , 0 , 0 )
325354 require .Error (t , err )
326355 require .Contains (t , err .Error (), "total params must be positive" )
327356}
328357
329358func TestPlanPDRecommendation_PrecisionOverride (t * testing.T ) {
330359 // Known model with explicit precision override
331360 // Use a smaller model that fits in 80GB with bf16
332- rec , err := PlanPDRecommendation ("qwen3-30b-a3b" , 30 , 128 , 8 , "bf16" , 2048 , 48 )
361+ rec , err := PlanPDRecommendation ("qwen3-30b-a3b" , 30 , 128 , 8 , "bf16" , 2048 , 48 , 0 )
333362 require .NoError (t , err )
334363 require .Equal (t , "bf16" , rec .Precision )
335364}
336365
337366func TestPlanPDRecommendation_ExpertOverride (t * testing.T ) {
338367 // Override expert count from config.json
339- rec , err := PlanPDRecommendation ("deepseek-v3" , 671 , 512 , 16 , "fp8" , 7168 , 61 )
368+ rec , err := PlanPDRecommendation ("deepseek-v3" , 671 , 512 , 16 , "fp8" , 7168 , 61 , 0 )
340369 require .NoError (t , err )
341370 require .Equal (t , 512 , rec .TotalExperts )
342371 require .Equal (t , 16 , rec .ActiveExperts )
343372}
344373
345374func TestPlanPDRecommendation_DPField (t * testing.T ) {
346- rec , err := PlanPDRecommendation ("deepseek-v3" , 671 , 256 , 8 , "fp8" , 7168 , 61 )
375+ rec , err := PlanPDRecommendation ("deepseek-v3" , 671 , 256 , 8 , "fp8" , 7168 , 61 , 0 )
347376 require .NoError (t , err )
348377 // DP should default to 1 for all recommendations
349378 require .Equal (t , 1 , rec .Prefill .DP )
0 commit comments