纯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.pswp.cn/news/915742.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

训练日志7.21

conda环境&#xff0c;服务器原因无法使用&#xff0c;需重新搭建 学习一下预训练和微调相关内容&#xff0c;对于预训练整体的流程&#xff0c;还不太清楚&#xff0c;自己估计是训练不动&#xff0c;只能微调

Java 高频算法

Java高频算法面试题 以下是Java面试中常见的高频算法题目&#xff0c;涵盖了数据结构、算法思想和实际应用场景。 一、数组与字符串 1. 两数之和 public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map new HashMap<>();for (int i 0; i <…

汽车控制系统——CAPL脚本

CAPL (Communication Access Programming Language) 是一种专门用于嵌入式系统和汽车电子测试领域的编程语言&#xff0c;特别是在 CAN (Controller Area Network) 总线和汽车网络通信系统中被广泛使用。它由 Vector 公司开发&#xff0c;主要用于编写与汽车控制单元 (ECU) 进行…

深入解析Hive SQL转MapReduce的编译原理:从AST抽象语法树到Operator执行树

Hadoop与Hive SQL简介Hadoop生态系统的核心架构作为大数据处理领域的基石&#xff0c;Hadoop生态系统采用分布式架构设计&#xff0c;其核心组件构成了一套完整的解决方案框架。HDFS&#xff08;Hadoop Distributed File System&#xff09;作为底层存储系统&#xff0c;采用主…

在 React 中实现全局防复制hooks

用于防止页面内容被复制、剪切或通过右键菜单操作。它接受三个可配置参数&#xff1a;disableCopy&#xff08;禁用复制&#xff0c;默认true&#xff09;、disableCut&#xff08;禁用剪切&#xff0c;默认true&#xff09;和 disableContextMenu&#xff08;禁用右键菜单&…

InfluxDB HTTP API 接口调用详解(一)

引言 ** 在当今数字化时代&#xff0c;时间序列数据无处不在&#xff0c;从物联网设备产生的传感器数据&#xff0c;到金融领域的交易记录&#xff0c;再到系统运维中的监控指标&#xff0c;这些数据蕴含着丰富的信息&#xff0c;对于企业的决策制定、业务优化以及问题排查等…

使用JMeter进行压力测试(以黑马点评为例、详细图解)

目录 一、前言 二、使用JMeter进行压力测试 一、前言 本博客主要记录如何使用JMeter进行压力测试&#xff0c;以黑马点评P44利用互斥锁解决缓存击穿问题课程为例。至于如何完成JMeter的安装配置及创建桌面快捷方式可以看我的另一篇博客&#xff0c;链接如下&#xff1a; 压测…

旧手机部署轻量级服务器

将旧手机改造为Linux系统设备&#xff0c;不仅能赋予闲置设备新生&#xff0c;还能作为轻量级服务器、开发环境或学习平台使用。以下是三种主流方案&#xff0c;涵盖不同技术需求和安全等级&#xff0c;附操作步骤与避坑指南&#xff1a; ⚙️ 一、三种安装方案对比与选择 方法…

micro avg、macro avg 和 weighted avg 的区别

问题描述&#xff1a; 在多分类任务的评估报告中&#xff0c;经常看到 micro avg、macro avg 和 weighted avg 三种平均指标&#xff0c;请解释它们的区别以及各自的适用场景。&#x1f3af; 参考答案&#xff1a; 这三种平均指标是用来评估多分类模型性能的不同方式&#xff0…

Kafka灰度方案

一、kafka灰度方案架构设计方案&#xff1a;1、外部生产-内部消费场景&#xff1a;&#xff08;外部生产-内部消费&#xff09;解决方案&#xff1a;先通过kdis分流服务---消费外部生产的消息&#xff0c;然后根据管理后台-灰度配置mcs-mimp-core应用默认的环境版本&#xff0c…

深入详解K近邻算法(KNN)在脑部疾病诊断中的应用与实现

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#,Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

黑马点评练习题-给店铺类型查询业务添加缓存(String和List实现)

目录 一、前言 二、需求 三、String实现 四、List实现 一、前言 这是黑马点评实战篇-商户查询缓存-0.3缓存练习题分析&#xff0c;练习给店铺类型查询业务添加缓存。这里我自己是通过String实现的&#xff0c;当然在网上查询也能够找到其他的实现方式。String实现我会展示自…

深度学习 pytorch图像分类(详细版)

目录 一、项目简介 二、模型训练验证保存 三、模型测试保存csv文件 四、单张图片预测 五、模型评估 六、ONNX导出 七、ONNX推理 八、网络结构与数据增强可视化 上篇我介绍了具体步骤&#xff0c;今天就以我实际开发的一个具体项目来讲&#xff1a; 一、项目简介 苯人的…

《AR眼镜上声学的应用与挑战》

《2025GAS声学大讲堂—音频产业创新技术公益讲座》智能眼镜专题讲座第3讲将于7月24日周四19点开讲&#xff0c;本次邀请了 珠海莫界科技有限公司 高级算法工程师 胡立天 演讲&#xff0c;讲座主题&#xff1a;《AR眼镜上声学的应用与挑战》&#xff08;点击观看直播&#xff09…

编译支持cuda硬件加速的ffmpeg

本来以为很简单&#xff0c;因为印象中自己在windows机器上使用过。 目前的实在一个docker环境下的ubuntu系统里。 官方操作文档 按照官方操作文档Using FFmpeg with NVIDIA GPU Hardware Acceleration - NVIDIA Docs的描述&#xff0c;步骤很简单&#xff1a; 1、安装nv-c…

在资源受限单片机中使用printf等可变参函数时的陷阱(2025年7月22日)

今天分享一个我最近在项目调试中遇到的“大坑”&#xff0c;这个坑来自一个我们既熟悉又依赖的朋友——printf函数。故事的主角&#xff0c;是一颗资源极其有限的STM32F030单片机&#xff0c;它只有区区4KB的RAM。 一切始于便利 项目初期&#xff0c;为了能方便地监控程序运行状…

大数据之Hive:Hive中week相关的几个函数

目录1.dayofweek函数2.weekday函数3.weekofyear函数1.dayofweek函数 功能&#xff1a;统计某天为星期几 dayofweek(date) - Returns the day of the week for date/timestamp (1 Sunday, 2 Monday, ..., 7 Saturday).dayofweek返回值为&#xff1a;1-7&#xff0c;1 星期…

基于深度学习Transform的steam游戏特征分析与可视化【词云-情感词典分析-主题分析-词频分析-关联分析】

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主一、项目背景与研究意义二、研究目标三、研究方法与实施流程第一阶段&#xff1a;数据采集与预处理第二阶段&#xff1a;多维度数据分析第三阶段&#xff1a;综合分析与策略建议输出四、预期…

Qwen3-8B 与 ChatGPT-4o Mini 的 TTFT 性能对比与底层原理详解

一、模型概述与上下文支持能力 1.1 Qwen3-8B 的技术特点 Qwen3-8B 是通义实验室推出的 80 亿参数大语言模型&#xff0c;支持 32,768 token 的上下文长度 。其核心优化点包括&#xff1a; FP8 量化技术&#xff1a;通过将权重从 32-bit 压缩至 8-bit&#xff0c;显著降低显存…

recvmsg函数的用法

recvmsg 是 Linux 网络编程中用于接收消息的高级系统调用&#xff0c;支持复杂数据结构和辅助数据的接收&#xff0c;适用于 TCP/UDP/UNIX 域套接字等场景‌。以下是其核心用法详解&#xff1a;‌1. 函数原型与参数‌#include <sys/socket.h> ssize_t recvmsg(int sockfd…