diff --git a/crates/ml-dqn/src/gpu_replay_buffer.rs b/crates/ml-dqn/src/gpu_replay_buffer.rs index 607caf604..c6c1caf9c 100644 --- a/crates/ml-dqn/src/gpu_replay_buffer.rs +++ b/crates/ml-dqn/src/gpu_replay_buffer.rs @@ -256,6 +256,12 @@ impl GpuReplayBuffer { let update_batch_max = a32f(stream, 1, "update_batch_max")?; let update_max_merge = a32f(stream, 1, "update_max_merge")?; + // Pre-initialize cast kernels while CUDA context is clean. + // OnceLock + cuModuleLoadData requires a current CUDA context. + // If deferred to first PER update (after graph capture), the context + // may be in a state that blocks cuModuleLoadData on H100 CUDA 13. + get_cast_kernels(stream)?; + Ok(Self { config, stream: Arc::clone(stream), kernels: k, states: s, next_states: ns, actions: a, rewards: r, dones: d, priorities: p,