当前位置: 首页 > news >正文

纯CPU场景下C++的分布式模型训练框架设计思路

0. 参数分配

  • 稠密参数MPI 集合通信(All-Reduce / Broadcast / Reduce-Scatter)。
  • 稀疏参数brpc Parameter Server 异步推拉。
    完全去掉 NCCL/GPU 相关部分。

1. 整体拓扑

┌----------------┐         ┌----------------┐
│ Worker-0       │         │ PS-0           │
│ Worker-1       │◄------► │ PS-1           │
│ ...            │  brpc   │ ...            │
│ Worker-N       │         │ PS-M           │
└----------------┘         └----------------┘▲│MPI(TCP/InfiniBand)▼
MPI_COMM_WORLD(稠密参数)
  • 稠密梯度:通过 MPI 标准集合操作(MPI_AllreduceMPI_Bcast 等)实现同步。
  • 稀疏参数:Worker 与 PS 之间用 brpc + protobuf 通信,异步推拉。

2. 关键模块(C++)

cpu_dist/
├── common/
│   ├── tensor.h            // 纯 CPU 张量(FP32/FP64)
│   └── mpi_context.h       // MPI_Init / Finalize 封装
├── dense/
│   ├── mpi_allreduce.h     // MPI All-Reduce 封装
│   └── optimizer.h         // 本地 SGD / AdamW
├── sparse/
│   ├── ps_server.h/cc      // brpc Parameter Server
│   ├── ps_client.h/cc      // brpc Client
│   └── table.h             // 稀疏表(unordered_map + 锁)
├── proto/
│   └── message.proto       // protobuf 消息
└── launcher.cc             // 主进程入口

3. MPI 通信层(稠密参数)

3.1 封装 MPI All-Reduce

// dense/mpi_allreduce.h
class MPIAllReduce {public:explicit MPIAllReduce(MPI_Comm comm) : comm_(comm) {}template <typename T>void AllReduceSum(std::vector<T>& buf) {std::vector<T> recv(buf.size());MPI_Allreduce(buf.data(), recv.data(), buf.size(),GetMPIType<T>(), MPI_SUM, comm_);buf.swap(recv);}private:MPI_Comm comm_;
};
  • 支持 float / double / int
  • 支持 In-place All-ReduceMPI_IN_PLACE)。

4. brpc Parameter Server(稀疏参数)

与之前设计一致,仅通信后端为 brpc

  • proto 定义不变(PullRequest, PushRequest)。
  • PS 端 实现 brpc::Service,用 brpc::Server 启动。
  • Worker 端brpc::Channel 连接 PS,支持 轮询/一致性哈希 负载均衡。

5. 主进程结构(launcher.cc)

int main(int argc, char* argv[]) {MPI_Init(&argc, &argv);int rank, size;MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);bool is_ps = (rank >= FLAGS_worker_num);if (!is_ps) {// WorkerMPIAllReduce ar(MPI_COMM_WORLD);PSClient ps(FLAGS_ps_list);WorkerLoop(ar, ps);} else {// Parameter ServerPSServer server;server.Start(FLAGS_ps_port);}MPI_Finalize();
}

6. Worker 主循环

void WorkerLoop(MPIAllReduce& ar, PSClient& ps) {Model model;DataLoader dl(FLAGS_data_path);for (int step = 0; step < FLAGS_max_step; ++step) {auto batch = dl.Next();std::vector<float> dense_grad;std::vector<int64_t> sparse_keys;std::vector<float> sparse_grad;// 前向 & 反向model.Backward(batch, &dense_grad, &sparse_keys, &sparse_grad);// 1. 稠密梯度 MPI All-Reducear.AllReduceSum(dense_grad);// 2. 稀疏梯度异步 Pushps.PushAsync(0, sparse_keys, sparse_grad);// 3. 稀疏参数 Pullstd::vector<float> sparse_emb;ps.Pull(0, sparse_keys, &sparse_emb);// 4. 参数更新model.Update(dense_grad, sparse_emb);}
}

7. 部署与运行

7.1 启动脚本(OpenMPI)

# 4 worker + 2 ps
mpirun -np 6 \-x LD_LIBRARY_PATH \./launcher \--worker_num 4 \--ps_list "0.0.0.0:8000,0.0.0.0:8001"
  • worker_numrank 0~3 为 Worker,后 rank 4~5 为 PS。
  • MPI 负责稠密通信,brpc 负责稀疏通信,两者互不干扰。

8. 性能调优

建议
MPI使用 OpenMPI 4.xIntel MPI(CPU 亲和、NUMA 优化)。
brpc配置 轮询 + 批处理(64~256 key/RPC),开启 8bit 量化压缩
线程MPI 与 brpc 线程分离,brpc 用 bthread,避免与 MPI 线程冲突。

至此,“CPU + MPI(稠密) + brpc Parameter Server(稀疏)” 的完整框架已就绪。

http://www.dtcms.com/a/294311.html

相关文章:

  • 2025.7.20 文献阅读-基于深度神经网络的半变异函数在 高程数据普通克里格插值中的应用
  • go语言数据结构与排序算法
  • 【C++】C++ 的入门知识2
  • Android 持久化存储原理与使用解析
  • MATLAB | 绘图复刻(二十二)| 带树状图的三角热图合集
  • 个性化网页计数器
  • C 语言介绍
  • 【数据结构】二叉树的链式结构--用C语言实现
  • 嵌入式linux下的NES游戏显示效果优化方案:infoNES显示效果优化
  • 我用EV-21569-SOM评估来开发ADSP-21569(十三)-SigmaStudio Plus做开发(4)
  • Web前端开发:JavaScript遍历方法详解与对比
  • 安全防护-FCW
  • [HarmonyOS] HarmonyOS LiteOS-A 设备开发全流程指南
  • Linux第三天Linux基础命令(二)
  • 服务器对kaggle比赛的数据集下载
  • SAP-ABAP:SELECT语句验证字段和验证方法详解
  • OSPF路由协议——上
  • 28. 找出字符串中第一个匹配项的下标
  • vue3中el-table表头筛选
  • Flink 状态管理设计详解:StateBackend、State、RocksDB和Namespace
  • 谷粒商城篇章13--P340-P360--k8s/KubeSphere【高可用集群篇一】
  • 抖音集团基于Flink的亿级RPS实时计算优化实践
  • k8s pvc是否可绑定在多个pod上
  • 飞算JavaAI:从“工具革命”到“认知革命”——开发者如何借力AI重构技术竞争力
  • SpringBoot 内嵌 Tomcat 的相关配置
  • MySQL binlog解析
  • linux c语言进阶 - 线程,通信方式,安全方式(多并发)
  • Linux中常见的中英文单词对照表
  • 低代码中的统计模型是什么?有什么作用?
  • 第一二章知识点