PyTorch DDP 多进程训练在 Kaggle 笔记本中的正确启动方式


在 kaggle 等基于 jupyter 的环境中直接运行 pytorch ddp(distributeddataparallel)多进程代码会因 `__main__` 模块序列化失败而报错;根本解决方案是将 ddp 主逻辑写入独立 `.py` 文件,并通过命令行方式执行,避开 notebook 的模块上下文限制。

PyTorch 的 torch.multiprocessing.spawn 要求被启动的函数(如 main)必须可被子进程通过 pickle 反序列化——这在标准 Python 脚本中自然成立,因为 if __name__ == "__main__": 块内定义的函数属于顶层模块 __main__。但在 Kaggle 或 Jupyter Notebook 中,整个 cell 代码实际运行在 这一动态、不可序列化的内置模块中,导致子进程无法定位 main 函数,从而抛出:

AttributeError: Can't get attribute 'main' on 

✅ 正确做法:分离定义与执行
将 DDP 训练逻辑封装为标准 .py 文件,而非在 notebook cell 中直接调用 mp.spawn()。

✅ 实施步骤(Kaggle 环境)

  1. 使用 %%writefile 魔法命令创建独立脚本
    在 notebook 新建 cell,粘贴并保存完整 DDP 代码(参考 PyTorch 官方示例),顶部添加 %%writefile ddp.py:
%%writefile ddp.py
import torch
import torch.nn as nn
import torch.optim as optim
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
from torch.utils.data import DataLoader, DistributedSampler
import torch.multiprocessing as mp
from torchvision import datasets, transforms
import os

def main(rank, world_size, epochs=5, batch_size=32, lr=1e-3):
    # 初始化进程组
    dist.init_process_group(
        backend="nccl",
        init_method="env://",
        world_size=world_size,
        rank=rank
    )

    # 设置设备
    torch.cuda.set_device(rank)
    device = torch.device(f"cuda:{rank}")

    # 构建模型、数据集、优化器等(此处省略细节)
    model = nn.Sequential(nn.Linear(784, 128), nn.ReLU(), nn.Linear(128, 10)).to(device)
    model = DDP(model, device_ids=[rank])

    train_dataset = datasets.MNIST("./data", train=True, download=True,
                                    transform=transforms.ToTensor())
    sampler = DistributedSampler(train_dataset, num_replicas=world_size, rank=rank)
    train_loader = DataLoader(train_dataset, batch_size=batch_size, sampler=sampler)

    optimizer = optim.Adam(model.parameters(), lr=lr)

    for epoch in range(epochs):
        model.train()
        sampler.set_epoch(epoch)  # 关键:确保每个 epoch 数据打乱一致
        for data, target in train_loader:
            data, target = data.to(device), target.to(device)
            optimizer.zero_grad()
            output = model(data.view(data.size(0), -1))
            loss = nn.functional.cross_entropy(output, target)
            loss.backward()
            optimizer.step()

    dist.destroy_process_group()

if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("--world_size", type=int, default=torch.cuda.device_count())
    args = parser.parse_args()

    # 注意:Kaggle 中需显式设置环境变量(spawn 自动读取)
    os.environ["MASTER_ADDR"] = "127.0.0.1"
    os.environ["MASTER_PORT"] = "29500"

    mp.spawn(main, args=(args.world_size, 5, 32, 1e-3), nprocs=args.world_size, join=True)
  1. 在另一个 cell 中执行脚本
    使用系统命令运行,绕过 notebook 解释器上下文:
!python -W ignore ddp.py
⚠️ 注意事项:务必设置 MASTER_ADDR 和 MASTER_PORT:spawn 依赖这些环境变量初始化 NCCL 后端,Kaggle 默认未设置。避免在 notebook 中直接调用 mp.spawn():即使加了 if __name__ == "__main__":,notebook 的 __main__ 仍不可序列化。-W ignore 是可选的:用于抑制 PyTorch 分布式警告(如 UserWarning: ... is deprecated),提升日志可读性。单节点多卡适用:本方案专为 Kaggle 提供的 2×T4 场景设计;跨节点需额外配置 MASTER_ADDR 和网络互通。

该方法严格遵循 Python 多进程的“spawn”启动方式语义,确保每个子进程从干净的 .py 文件入口重新导入模块,彻底规避 AttributeError。这是在受限 notebook 环境中安全启用 PyTorch DDP 的工业级实践。


# python  # 后端  # ai  # 环境变量  # pytorch 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何高效识别并拦截拼接式恶意域名 spam  c++怎么用jemalloc c++替换默认内存分配器【性能】  Python路径拼接规范_跨平台处理说明【指导】  Python列表推导式与字典推导式教程_简化代码高效写法  如何在 VS Code 中正确配置并使用 NumPy  Windows10如何删除Windows.old_Win10磁盘清理系统文件选项  Windows10电脑怎么设置电源按钮_Win10按电源键关机或休眠  Windows10系统更新错误0x80070002_Win10自动更新失败手动修复  Django 测试数据库表缺失与字段未创建问题的完整解决方案  Mac如何解压zip和rar文件?(推荐免费工具)  Win11怎么更改电脑密码_Windows 11修改本地账户密码【步骤】  c++协程和线程的区别 c++异步编程模型对比【核心】  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Python项目回滚策略_发布安全说明【指导】  如何使用Golang管理跨项目依赖_Golang多模块项目依赖实践  php订单日志怎么按金额排序_php按订单金额排序日志方法【方法】  c++中的可变参数模板(variadic templates)怎么用_c++模板编程黑魔法【C++11】  Python迭代器生成器进阶教程_节省内存与懒加载实战  Windows10电脑怎么连接蓝牙设备_Win10蓝牙配对失败解决方法  php打包exe如何加密代码_防反编译保护方法【技巧】  C++如何获取CPU核心数?(std::thread::hardware_concurrency)  Win11怎么卸载Photos应用_Win11卸载Photos应用方法【教程】  Linux怎么设置磁盘配额_Linux系统Quota安装与用户空间限制【教程】  C++中引用和指针有什么区别?(代码说明)  Windows 11无法安全删除U盘提示设备正在使用中怎么办_Windows 11找出占用设备进程  Win10如何更改电脑休眠时间_Windows10电源和睡眠选项调整  Windows怎样关闭开始菜单推荐广告_Windows关闭开始菜单推荐设置【步骤】  Win11怎么设置虚拟内存最佳大小_Windows11性能选项自定义分页文件  Windows10系统怎么查看显卡驱动_Win10设备管理器驱动更新  Python网页解析流程_html结构说明【指导】  Win11怎样安装剪映专业版_Win11安装剪映教程【步骤】  Windows资源管理器总是卡顿或重启怎么办?(修复方法)  php订单日志怎么记录发货_php记录订单发货操作日志指南【指南】  Python文件管理规范_工程实践说明【指导】  Win10怎么卸载金山毒霸_Win10彻底卸载金山毒霸方法【步骤】  Win11开机Logo怎么换_Win11自定义启动画面工具【高级】  php怎么下载安装后无法解析php文件_服务器配置检查【解答】  php485函数怎么捕获异常_php485错误处理机制设置技巧【操作】  Python包结构设计_大型项目组织解析【指导】  Python文件操作优化_大文件与流处理解析【教程】  如何在 Windows 11 中使用 AlomWare 工具箱  Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】  Win11如何添加/删除输入法 Win11切换中英文输入法快捷键【设置】  如何在 PHP 单元测试中正确模拟带方法的图像处理门面(Facade)  如何在Golang中实现自定义Benchmark_Golang testing.B自定义性能测量示例  Win11如何设置系统语言_Win11系统语言切换教程【攻略】  Win11怎么设置按流量计费_Win11限制后台流量消耗【网络】  Win11 explorer.exe频繁崩溃_修复Win11资源管理器无限重启【步骤】  如何在Golang中定义接口_抽象方法和多态实现  Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.