DDP 与 Ring-AllReduce
本文是《dp 与 ddp 数据并行》的下篇,聚焦 DDP(DistributedDataParallel) 的使用方式、工作原理和 Ring-AllReduce 算法详解。上篇讲 DP 源码解析,见 dp-ddp。
1 DDP (DistributedDataParallel) 并行
1.1 使用方式
import argparse
import torch
from torch.nn.parallel import DistributedDataParallel as DDP
parser = argparse.ArgumentParser()
parser.add_argument("--save_dir", default='')
parser.add_argument(...
FSDP 并行策略
1 训练过程中显存的组成
在大模型训练中,显存大致被三类数据占用:
P (Parameters):模型参数
G (Gradients):反向传播时的梯度
OS (Optimizer States):优化器的状态(如 Adam 的动量和方差信息)
典型的 Adam 优化器中,这三者的比例大致为 1 : 1 : 6
之所以 Optimizer States 占比高,是因为 Adam 需要为每个参数维护一阶矩(动量)和二阶矩(方差)的额外信息
例如,在 PyTorch 中优化器的典型构造如下:
optimizer = optim.Adam(model.parameters(), lr=0.001)
反向传播与参数更新的过程:
loss.backward...
dp 与 ddp 数据并行
1 DP (DataParallel) 并行
1.1 使用方式
PyTorch 最原始的 DP 并行实现非常简单:
import torch.nn as nn
# 简单的DP使用
model = nn.DataParallel(model, device_ids=[0, 1, 2, 3])
参数说明:
device_ids: 指定使用的 GPU 设备,不指定时默认使用所有可见 GPU
output_device: 默认是 device_ids[0](主卡),很多关键工作发生在这张卡上
1.2 原理解析
1.2.1 Parameter Server 概念
单机多卡的 DP 并行和分布式训练中的 Parameter Server 架构类似。
相关...
为什么相比于SFT训练,RL训练更依赖推理引擎
在大模型的训练中,常见的 RL(Reinforcement Learning)训练框架往往对推理引擎(如 vLLM、SGLang)依赖更强,甚至会将其作为安装和运行的必选组件。
核心原因很简单:SFT 在训练时只需要一次性计算 logits(Prefill),而 RL 的 rollout 阶段必须走完整的 Prefill + Decode 推理流程
1. Prefill vs Decode
在 Transformer 推理中,我们可以把计算过程分为两种模式:
阶段
输入内容
输出内容
并行性
Prefill
一次性输入整个序列(prompt + 已知目标...
IB 原生 RDMA 与 以太网卡 + RoCE 对比
1. IB 原生 RDMA 方案(InfiniBand 网卡)
IB = InfiniBand,是一种高速、低延迟、高带宽的数据中心互连技术,原生支持 RDMA,无需额外协议封装。
典型带宽:40Gbps、100Gbps、200Gbps 及更高。
主要应用于 高性能计算(HPC)、人工智能训练集群、分布式存储 等对延迟和吞吐极度敏感的场景。
常见 IB 网卡型号:
Mellanox ConnectX-6 (CX6)
Mellanox ConnectX-7 (CX7)
NVIDIA BlueField 系列 DPU(带 IB 接口)
优势:
原生 RDMA:直接在节点间读写内存,绕过 CPU,延迟可达微秒级。
带宽利用率极高,吞吐稳定。
在 HPC、A...
云防火墙 与 WAF 产品上的区别
云防火墙(Cloud Firewall)和 WAF(Web Application Firewall)都属于网络安全产品,但防护层级和保护对象不同,经常作为互补方案同时部署。
一、云防火墙(Cloud Firewall)
定义
云防火墙是部署在云上的网络边界安全产品,相当于传统硬件防火墙的云化形态,用于保护云环境整体的网络流量。
主要功能
网络访问控制(ACL / 安全组增强)
状态检测、防入侵(IDS/IPS)
DDoS 防护(部分集成)
NAT、VPN 管理
跨 VPC 的东西向流量可视化与控制
出入口(南北向)及内网(东西向)防护
保护对象
云服务器实例(ECS)
子网/VPC 整体网络
非 Web 应用(数据库、SSH、...
lambda 与 bind ,类与模版
Lambda 底层:编译器生成闭包类
Lambda 不是模板,而是编译器生成的类
每个 lambda 表达式,编译器都会自动生成一个匿名的类(闭包类型),这个类重载了 operator()。
// 你写的 lambda
auto lambda = [x, &y](int a) -> int {
return x + y + a;
};
// 编译器实际生成类似这样的类
class __lambda_123 { // 编译器生成的匿名类名
private:
int x_; // 按值捕获的 x
int& y_; // 按引用捕获的 y
public:
// 构造函数:初始化捕获的变量
__la...
boost::bind 参数量限制与现代 C++ 替代方案
boost::bind 参数量限制与现代 C++ 替代方案
问题背景
在维护老代码时,遇到了一个使用 Boost 1.63 版本的 boost::bind 的问题:发现该函数无法传入超过 9 个参数(包括 this 指针)。这个限制其实是 C++03 时代的历史遗留问题。
根本原因:C++03 的”转发问题”
在 C++03 时代,由于缺乏可变参数模板和完美转发机制,boost::bind 面临一个被称为”转发问题”(forwarding problem)的根本性限制。
转发问题的本质
C++03 中,模板函数的参数通常写成 T&(非 const 左值引用)来”原样传递”对象,但这样的写法无法接受右值(临时对象、字面量):
template<class T&...
共计 188 篇文章,24 页。