From a28d48a740856ca7d7e51dbcebcd48f265245dd7 Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Tue, 7 Apr 2026 10:03:28 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20hyperopt=20preload=20buffer=5Fsize=3D1?= =?UTF-8?q?=20=E2=86=92=20batch=5Fsize=20(PER=20capacity=20floor)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The data preload created a dummy DQNTrainer with buffer_size=1, which fails the GPU PER capacity check (capacity must be >= batch_size). This caused the preload to fail silently, falling back to per-trial data loading from disk — 50 × 5s = 250s wasted. Fix: set buffer_size = max(batch_size, 1024) so the PER allocation succeeds. The preload trainer doesn't train — it just loads data into a shared Arc for all trials. Co-Authored-By: Claude Opus 4.6 (1M context) --- crates/ml/src/hyperopt/adapters/dqn.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/ml/src/hyperopt/adapters/dqn.rs b/crates/ml/src/hyperopt/adapters/dqn.rs index 9799b35bc..35a049315 100644 --- a/crates/ml/src/hyperopt/adapters/dqn.rs +++ b/crates/ml/src/hyperopt/adapters/dqn.rs @@ -878,7 +878,10 @@ impl DQNTrainer { let mut preload_hyperparams = DQNHyperparameters::default(); preload_hyperparams.mbp10_data_dir = self.mbp10_data_dir.clone().unwrap_or_default(); preload_hyperparams.trades_data_dir = self.trades_data_dir.clone().unwrap_or_default(); - preload_hyperparams.buffer_size = 1; + // Buffer size must be >= batch_size for GPU PER allocation. + // Preload doesn't train — just loads data — but the trainer + // constructor still creates a PER buffer. + preload_hyperparams.buffer_size = preload_hyperparams.batch_size.max(1024); let mut loader = InternalDQNTrainer::new_with_device(preload_hyperparams, self.device.clone()) .map_err(|e| MLError::TrainingError(format!("Failed to create data loader: {e}")))?;