You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PyTorch multiprocessing独立训练多个神经网络模型

torch.multiprocessing多独立模型训练适配说明与示例

场景适配结论

torch.multiprocessing完全适配你的使用场景。你需要的是基于同一数据集并行运行多个互不干扰的训练任务,不需要进程间参数同步,不需要用到分布式训练的通信机制,直接用该模块启动独立子进程即可,能充分利用多核CPU、多GPU资源大幅降低整体训练耗时。

核心注意事项

  • 启动方式显式指定为spawn,可规避Windows、macOS平台的兼容性问题
  • 主进程提前初始化的数据集在Linux系统下会通过写时复制机制共享,不会重复占用内存;Windows系统会为每个子进程复制一份数据集,内存充足的情况下不影响使用
  • 可根据硬件资源给每个子进程分配独立的GPU,避免资源竞争

简易可运行代码示例

import torch
import torch.multiprocessing as mp
from torch.utils.data import DataLoader, TensorDataset
import torch.nn as nn
import torch.optim as optim

# 自定义神经网络结构,可替换为你自己的模型
class SimpleMLP(nn.Module):
    def __init__(self, input_dim=10, hidden_dim=32, output_dim=1):
        super().__init__()
        self.layers = nn.Sequential(
            nn.Linear(input_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, output_dim),
            nn.Sigmoid()
        )
    
    def forward(self, x):
        return self.layers(x)

# 单模型训练逻辑,每个子进程独立执行,参数完全不共享
def train_single_model(model_idx, dataset, device_id, epoch_num=10):
    device = torch.device(f"cuda:{device_id}" if torch.cuda.is_available() else "cpu")
    # 每个进程初始化独立的模型、优化器、损失函数
    model = SimpleMLP().to(device)
    criterion = nn.BCELoss()
    optimizer = optim.Adam(model.parameters(), lr=1e-3)
    dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
    
    print(f"模型{model_idx}开始训练,运行设备: {device}")
    for epoch in range(epoch_num):
        total_loss = 0.0
        for x, y in dataloader:
            x, y = x.to(device), y.to(device)
            optimizer.zero_grad()
            pred = model(x)
            loss = criterion(pred, y)
            loss.backward()
            optimizer.step()
            total_loss += loss.item()
    
    # 训练完成后单独保存当前模型权重
    torch.save(model.state_dict(), f"./model_{model_idx}.pth")
    print(f"模型{model_idx}训练完成,权重已保存")

if __name__ == "__main__":
    # 显式指定进程启动方式,避免跨平台报错
    mp.set_start_method("spawn", force=True)
    
    # 主进程只加载一次公共数据集
    sample_num = 10000
    input_dim = 10
    x = torch.randn(sample_num, input_dim)
    y = torch.randint(0, 2, (sample_num, 1)).float()
    shared_dataset = TensorDataset(x, y)
    
    # 训练配置:训练4个模型,2块GPU每块跑2个任务,可根据自身硬件调整
    model_count = 4
    available_devices = [0, 0, 1, 1]
    
    # 批量启动子进程
    process_list = []
    for idx in range(model_count):
        device_id = available_devices[idx]
        p = mp.Process(
            target=train_single_model,
            args=(idx, shared_dataset, device_id)
        )
        p.start()
        process_list.append(p)
    
    # 等待所有训练任务完成
    for p in process_list:
        p.join()
    
    print("全部模型训练完成")

内容的提问来源于stack exchange,提问作者Xudong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:45:02