Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
d52a4ec
Fix ZenFlow NaN under PyTorch-style backward via backward_prologue
Antlera Jun 1, 2026
1d9f3cc
Add fused multi-tensor CPU Adam for ZenFlow overlap step
Antlera Jun 10, 2026
790a83a
Let CPU Adam kernel run serially without OpenMP
Antlera Jun 10, 2026
1640828
Add ZenFlowAdam: in-process overlapped CPU Adam
Antlera Jun 10, 2026
d60c777
Run ZenFlow stage 1/2 overlapped optimizer in-process
Antlera Jun 10, 2026
40491c9
Run ZenFlow stage 1/2 overlapped optimizer in a separate native process
Antlera Jun 10, 2026
4164f14
Run ZenFlow stage 3 overlapped optimizer in the native process
Antlera Jun 10, 2026
60181d9
Fail fast if the ZenFlow optimizer process does not start
Antlera Jun 10, 2026
59daa9e
Stream ZenFlow optimizer copyback in chunks to bound the GPU memory peak
Antlera Jun 10, 2026
2f9590b
Remove ZenFlow's superseded in-process overlapped optimizer path
Antlera Jun 10, 2026
13ce892
Recognize ZenFlowCPUAdam as a supported ZeRO optimizer
Antlera Jun 10, 2026
1c58221
Apply clang-format formatting to ZenFlowAdam definitions
Antlera Jun 10, 2026
3a0d10a
Fail loudly if the ZenFlow optimizer process dies mid-step
Antlera Jun 10, 2026
2b7f088
Copy ZenFlow optimizer results back to the GPU without staging fp32
Antlera Jul 5, 2026
b3b52df
Unit-test ZenFlow's zf/pt core-affinity split
Antlera Jul 5, 2026
f935f58
Remove the orphaned fused multi-tensor CPU Adam op
Antlera Jul 6, 2026
667b8f2
Tidy ZenFlowAdam control block: drop redundant modulo, name the hp st…
Antlera Jul 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions csrc/adam/cpu_adam.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,45 @@

PYBIND11_MODULE(TORCH_EXTENSION_NAME, m)
{
using namespace pybind11::literals;
m.def("adam_update", &ds_adam_step, "DeepSpeed CPU Adam update (C++)");
m.def("adam_rollback", &ds_adam_rollback, "DeepSpeed CPU Adam rollback (C++)");
m.def("create_adam", &create_adam_optimizer, "DeepSpeed CPU Adam (C++)");
m.def("destroy_adam", &destroy_adam_optimizer, "DeepSpeed CPU Adam destroy (C++)");

// ZenFlowAdam: the native CPU Adam backing ZenFlow's overlapped optimizer step. create /
// register_group / destroy set up the handle-indexed pinned pool (used by the worker process).
m.def("zenflow_adam_create", &zenflow_adam_create, "ZenFlowAdam create (C++)");
m.def("zenflow_adam_register_group",
&zenflow_adam_register_group,
"ZenFlowAdam register a parameter group (C++)");
m.def("zenflow_adam_destroy",
&zenflow_adam_destroy,
"ZenFlowAdam destroy (C++)",
pybind11::call_guard<pybind11::gil_scoped_release>());

#if defined(__linux__)
// The optimizer runs in a separate process, coordinated through a shared-memory semaphore
// control block. submit/wait/run_worker release the GIL so the optimizer process overlaps
// the Python training thread.
m.def(
"zenflow_adam_ctrl_size", &zenflow_adam_ctrl_size, "ZenFlowAdam control block size (C++)");
m.def("zenflow_adam_ctrl_init", &zenflow_adam_ctrl_init, "ZenFlowAdam control init (C++)");
m.def("zenflow_adam_run_worker",
&zenflow_adam_run_worker,
"ZenFlowAdam optimizer-process worker loop (C++)",
pybind11::call_guard<pybind11::gil_scoped_release>());
m.def("zenflow_adam_submit",
&zenflow_adam_submit,
"ZenFlowAdam submit an overlapped step (C++)",
pybind11::call_guard<pybind11::gil_scoped_release>());
m.def("zenflow_adam_wait",
&zenflow_adam_wait,
"ZenFlowAdam wait for a submitted step (C++)",
pybind11::call_guard<pybind11::gil_scoped_release>());
m.def("zenflow_adam_ctrl_exit",
&zenflow_adam_ctrl_exit,
"ZenFlowAdam cross-process exit (C++)",
pybind11::call_guard<pybind11::gil_scoped_release>());
#endif
}
Loading
Loading