diff --git a/crates/ml/src/cuda_pipeline/gpu_dqn_trainer.rs b/crates/ml/src/cuda_pipeline/gpu_dqn_trainer.rs index 44aa51971..fdc543189 100644 --- a/crates/ml/src/cuda_pipeline/gpu_dqn_trainer.rs +++ b/crates/ml/src/cuda_pipeline/gpu_dqn_trainer.rs @@ -8219,12 +8219,9 @@ impl GpuDqnTrainer { 12 * std::mem::size_of::(), self.stream.cu_stream(), ).map_err(|e| MLError::ModelError(format!("q_out sample0 DtoD: {e}")))?; } - // Sync: populate_q_out + q_stats_reduce just launched — must wait for - // pinned memory writes to complete before CPU reads. - unsafe { - let rc = cudarc::driver::sys::cuStreamSynchronize(self.stream.cu_stream()); - assert_eq!(rc, cudarc::driver::sys::cudaError_enum::CUDA_SUCCESS, "q_stats stream sync"); - } + // No sync — one-step lag is fine for monitoring. populate_q_out + q_stats_reduce + // launched async; pinned memory becomes visible by the NEXT epoch's call. + // Epoch 1 reads zeros (expected), epoch 2+ reads real atom stats. self.update_q_mean_ema();