【推荐系统】深度学习训练框架(一):深入剖析Spark集群计算中Master与Pytorch分布式计算Master的区别

Master地址和端口:Driver vs Executor

问题的核心

在Spark cluster模式下,有两个层面的"master":

  1. Spark的Driver(主节点)
  2. DDP的Master进程

它们完全不同

两套Master系统

1. Spark的Driver(与我们的DDP无关)

复制代码
Spark集群架构:
┌─────────────────────────────────────────────┐
│ Driver (主节点)                             │
│ - 运行在集群的某个节点上                    │
│ - IP: 192.168.1.100                         │
│ - 负责提交任务和管理资源                    │
│ - 与Executor通信                            │
└─────────────────────────────────────────────┘
                ↓ (提交任务)
┌─────────────────────────────────────────────┐
│ Executor (工作节点)                         │
│ - 动态分配到集群                           │
│ - IP: 10.0.0.5 (每次可能不同)              │
│ - 执行具体的训练任务                       │
└─────────────────────────────────────────────┘

2. DDP的Master(我们当前配置的)

复制代码
Executor内部(Executor IP = 10.0.0.5):
┌─────────────────────────────────────────────┐
│ torchrun Master                            │
│ - 运行在Executor内部                       │
│ - 地址: localhost                          │
│ - 端口: 23456                              │
│ - 协调DDP进程间的通信                      │
└─────────────────────────────────────────────┘
            ↓ (DDP通信)
┌─────────────────────────────────────────────┐
│ Process 0 (rank 0) ←─┐                    │
│ Process 1 (rank 1) ←─┼──→ 连接到           │
│ Process 2 (rank 2) ←─┤    localhost:23456  │
│ Process 3 (rank 3) ←─┘                    │
└─────────────────────────────────────────────┘

关键答案

master_addrmaster_port是指Executor内部的DDP Master,与Spark Driver无关!

详细解释

Spark架构(Driver-Executor通信)

复制代码
Driver (主节点)
├─ 功能:提交任务、管理资源、收集结果
├─ 通信:与Executor通过Spark RPC通信
└─ 地址:由Spark自动管理,我们不需要关心
    ↓
Executor (工作节点)
├─ 功能:执行任务
├─ 通信:接收Driver的命令,发送结果给Driver
└─ 地址:动态分配,我们不需要知道

DDP架构(进程间通信)

复制代码
Executor内部(只有这里用master_addr/master_port)
├─ torchrun启动Master进程
│  └─ 监听 localhost:23456
├─ Process 0 连接 localhost:23456
├─ Process 1 连接 localhost:23456
├─ Process 2 连接 localhost:23456
└─ Process 3 连接 localhost:23456

关键点

  • master_addr = localhost(Executor内部的地址)
  • master_port = 23456(Executor内部的端口)
  • 与Driver无关
  • 与Executor的外部IP无关

为什么使用localhost?

层级结构

复制代码
┌─────────────────────────────────────────┐
│ Spark Driver                            │
│ - 管理整个Spark应用                     │
│ - 不参与DDP训练                         │
└──────────┬──────────────────────────────┘
           │ Spark提交任务
           ↓
┌─────────────────────────────────────────┐
│ Executor (独立容器)                     │
│ IP: 10.0.0.5 (外部)                    │
│                                         │
│  ┌─────────────────────────────────┐   │
│  │ DDP Master (torchrun)          │   │
│  │ 监听: localhost:23456          │   │
│  │                                 │   │
│  │ ┌─────────┐                    │   │
│  │ │ Process │ ←─连接到localhost   │   │
│  │ │  0-3    │   :23456           │   │
│  │ └─────────┘                    │   │
│  └─────────────────────────────────┘   │
│                                         │
│  所有DDP通信在Executor内部进行         │
│  使用localhost,不涉及外部网络         │
└─────────────────────────────────────────┘

localhost的作用域

复制代码
Executor外部:
├─ Spark集群看到 Executor IP = 10.0.0.5
└─ 但与DDP无关

Executor内部:
├─ DDP使用 localhost (127.0.0.1)
├─ 所有进程在同一台机器上
└─ 通过本地回环接口通信

配置的位置

当前配置分析

python 复制代码
# spark_train_ddp_wrapper.py
# 这个脚本运行在哪里?→ Executor上!

def main():
    # 在Executor上运行的代码
    torchrun_cmd = [
        '--master_addr', 'localhost',    # Executor内部地址
        '--master_port', '23456',       # Executor内部端口
    ]

运行位置

  1. Spark将spark_train_ddp_wrapper.py提交到Executor
  2. 脚本在Executor上执行
  3. master_addr和master_port用于Executor内部的DDP通信
  4. 与Driver完全无关

执行流程

完整的执行链路

复制代码
┌──────────────────────────────┐
│ 你在本地机器上               │
│ $ ./spark_submit_hourly_ddp.sh
└──────────┬───────────────────┘
           ↓ spark-submit提交
┌──────────────────────────────┐
│ Spark Driver                 │
│ (某个节点的192.168.1.100)    │
│ - 接收任务                   │
│ - 分配资源                   │
│ - 提交到Executor             │
│ - (不参与DDP训练)            │
└──────────┬───────────────────┘
           ↓ 分配给Executor
┌──────────────────────────────┐
│ Executor                     │
│ (随机IP,如10.0.0.5)         │
│ - 运行spark_train_ddp_       │
│   wrapper.py                 │
│                              │
│  torchrun启动DDP:           │
│  ├─ Master监听               │
│  │   localhost:23456         │
│  ├─ Process 0 → localhost:   │
│  │   23456                   │
│  ├─ Process 1 → localhost:   │
│  │   23456                   │
│  ├─ Process 2 → localhost:   │
│  │   23456                   │
│  └─ Process 3 → localhost:   │
│      23456                   │
│                              │
│  所有通信在Executor内部!     │
└──────────────────────────────┘

关键区别

Driver的Master vs DDP的Master

类别 Spark Driver Master DDP Master
作用 管理Spark任务 协调DDP进程
地址 Spark集群管理 localhost
端口 Spark默认(7077) 23456(我们指定)
运行位置 集群的某个节点 Executor内部
是否需要知道 不需要(Spark管理) 需要(我们配置)

网络通信

复制代码
Spark通信(Driver ↔ Executor):
┌──────────┐                      ┌──────────┐
│ Driver   │ ←── Spark RPC ──→   │ Executor │
│ IP: X.X  │                      │ IP: Y.Y  │
└──────────┘                      └──────────┘

DDP通信(Executor内部的进程间):
             ┌───────────┐
             │ Process 0 │
             └────┬──────┘
                  │
     ┌────────────┼────────────┐
     │            │            │
     ↓            ↓            ↓
┌───────────┐            ┌───────────┐
│ DDP Master│ ←─────────→│ Process 1 │
│ localhost │            └───────────┘
│   :23456  │                  │
└───────────┘                  │
     │                         │
     └────────────┬────────────┘
                  │
            ┌───────────┐
            │ Process 2 │
            └───────────┘
                  │
            ┌───────────┐
            │ Process 3 │
            └───────────┘

总结

答案

master_addrmaster_port是指Executor内部的DDP Master,与Driver无关!

具体说明

  1. Spark Driver的Master

    • ❌ 不是我们配置的
    • ✅ 由Spark自动管理
    • ✅ 我们不需要关心
  2. DDP的Master(我们配置的)

    • ✅ 运行在Executor内部
    • ✅ 地址:localhost(Executor内部)
    • ✅ 端口:23456(Executor内部)
    • ✅ 用于DDP进程间通信

当前配置是正确的

python 复制代码
'--master_addr', 'localhost',   # ✅ Executor内部的地址
'--master_port', '23456',       # ✅ Executor内部的端口

因为

  • 所有DDP进程在Executor内部
  • 使用localhost通信(本地回环)
  • 不需要知道Executor的外部IP
  • 不需要知道Driver的IP

常见误解

❌ 误解1:master_addr应该填Executor的IP

python 复制代码
# 错误理解
'--master_addr', '10.0.0.5',  # Executor的IP

为什么错误

  • DDP进程在同一executor上
  • 通过localhost通信即可
  • 不需要外部IP

❌ 误解2:master_addr应该填Driver的IP

python 复制代码
# 错误理解
'--master_addr', '192.168.1.100',  # Driver的IP

为什么错误

  • Driver不参与DDP训练
  • DDP的Master在Executor上运行
  • 使用localhost即可

✅ 正确理解:使用localhost

python 复制代码
# 正确配置
'--master_addr', 'localhost',  # Executor内部的本地地址

为什么正确

  • 所有DDP进程在同一executor上
  • 使用本地回环接口通信
  • 简单且可靠

实际操作

查看配置的地方

  1. spark_train_ddp_wrapper.py(在Executor上运行)

    python 复制代码
    torchrun_cmd = [
        '--master_addr', 'localhost',    # ← 这里
        '--master_port', '23456',       # ← 这里
    ]

    ✅ 这些配置用于Executor内部的DDP通信

  2. spark_submit_hourly_ddp.sh(在本机运行)

    bash 复制代码
    spark-submit \
        --master yarn \              # ← 这是Spark的Master
        --deploy-mode cluster \
        spark_train_ddp_wrapper.py

    ✅ 这是Spark的配置,与DDP无关

重要区别

配置 位置 作用
--master yarn spark-submit Spark的Master
--master_addr localhost torchrun DDP的Master
--master_port 23456 torchrun DDP的Master端口

它们是两套独立的系统!

相关推荐
LDG_AGI3 小时前
【推荐系统】深度学习训练框架(二):深入剖析Spark Cluster模式下DDP网络配置解析
大数据·网络·人工智能·深度学习·算法·机器学习·spark
ai智能获客_狐狐3 小时前
电商零售行业外呼优势
人工智能·算法·自然语言处理·语音识别·零售
算家云3 小时前
推理成本吞噬AI未来,云计算如何平衡速度与成本的难题?
人工智能·云计算·模型训练·算家云·租算力,到算家云·算家计算
tiger1194 小时前
FPGA在AI时代的定位?
人工智能·fpga开发
EMQX4 小时前
ESP32 + MCP over MQTT:实现智能设备语音交互
人工智能·mqtt·语言模型·智能硬件
DisonTangor6 小时前
MiniMax 开源一个为极致编码与智能体工作流打造的迷你模型——MiniMax-M2
人工智能·语言模型·开源·aigc
Giser探索家8 小时前
无人机桥梁巡检:以“空天地”智慧之力守护交通生命线
大数据·人工智能·算法·安全·架构·无人机
不会学习的小白O^O8 小时前
双通道深度学习框架可实现从无人机激光雷达点云中提取橡胶树冠
人工智能·深度学习·无人机
恒点虚拟仿真8 小时前
虚拟仿真实训破局革新:打造无人机飞行专业实践教学新范式
人工智能·无人机·ai教学·虚拟仿真实训·无人机飞行·无人机专业虚拟仿真·无人机飞行虚拟仿真