多机多卡、单机单卡、单机多卡训练mmsegmentation

 

如果是单机,直接看附件操作即可!!!



 

一、规定主节点和从节点(例如:主节点10.1.4.146,次节点10.1.4.168)

二、次节点备份主节点模型文件、数据文件,保证所有路径在各台机器一致
三、保证各节点cuda版本、torch版本 、python、MMCV版本环境一致

cuda11.8+ torch2.0.0 +python 3.8 +MMCV2.0.0rc4 +mmsegmentation1.2.2

四、设置主节点、从节点之间可以实现ssh无密码访问

1. 确保SSH服务正常运行(在两台机器上分别执行)

sudo systemctl start sshd    # 启动SSH服务
sudo systemctl enable sshd  # 设置开机自启

2. 生成SSH密钥对(在两台机器上分别执行)


ssh-keygen -t rsa -b 4096

执行后会提示:

Enter file in which to save the key (/home/username/.ssh/id_rsa): [直接回车]
Enter passphrase (empty for no passphrase): [直接回车]
Enter same passphrase again: [直接回车]

 

3. 将公钥复制到对方机器

机器A上执行:

ssh-copy-id username@machineB_IP

机器B上执行:

ssh-copy-id username@machineA_IP
五、开放29500端口,保证主、从节点之间数据访问传输(在两台机器上分别执行)
sudo ufw allow 29500/tcp
sudo ufw disable 关闭防火墙

验证端口是否真正开放

在10.1.4.146 上监听端口:

nc -l 29500

在另一台机器测试连接:

ping 10.1.4.146 
nc -zv 10.1.4.146 29500
六、NCCL 网络通信

1. 显式指定网卡接口

NCCL 无法自动选择网卡时,需要手动指定:

# 查看可用网卡名称
ip -br a


# 设置环境变量(以 enp0s31f6为例)
export NCCL_SOCKET_IFNAME=enp0s31f6
export GLOO_SOCKET_IFNAME=enp0s31f6

2. 禁用 InfiniBand(非IB环境)

如果未使用 InfiniBand 网络,强制禁用:

export NCCL_IB_DISABLE=1

3.整体代码(如果后续报NCLL网络问题,执行一下这几行命令即可)

export NCCL_SOCKET_IFNAME=enp0s31f6
export GLOO_SOCKET_IFNAME=enp0s31f6
export NCCL_IB_DISABLE=1
export NCCL_DEBUG=INFO
export NCCL_P2P_DISABLE=1 
七、临时共享文件夹.dist_test 创建(用于主节点从次节点取相关模型结果)

方法 :使用 NFS

1. 在主机(Server)上配置 NFS

假设主机 IP 为 10.1.4.146,共享目录为 /mnt/mmsegmentation/my_project/.dist_test

# 安装 NFS 服务端(Ubuntu/Debian)
sudo apt update
sudo apt install nfs-kernel-server

# 创建共享目录并设置权限
sudo mkdir -p /mnt/mmsegmentation/my_project/.dist_test
sudo chmod 777 /mnt/mmsegmentation/my_project/.dist_test # 临时放宽权限,生产环境建议细化权限


# 编辑 NFS 导出配置
sudo nano /etc/exports

/etc/exports 中添加:

/mnt/mmsegmentation/my_project/.dist_test *(rw,sync,no_subtree_check,no_root_squash)

保存后重启 NFS 服务:

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

2. 在从机(Client)上挂载 NFS

在每台从机(如 10.1.4.168)执行:

# 安装 NFS 客户端
sudo apt update
sudo apt install nfs-common


# 创建本地挂载点
sudo mkdir -p /mnt/mmsegmentation/my_project/.dist_test


# 挂载 NFS 共享目录
sudo mount -t nfs 10.1.4.146:/mnt/mmsegmentation/my_project/.dist_test /mnt/mmsegmentation/my_project/.dist_test


# 验证是否挂载成功
df -h | grep .dist_test
ls /mnt/mmsegmentation/my_project # 应看到主机共享的文件

3. 设置开机自动挂载(在从节点执行)

编辑 /etc/fstab

sudo nano /etc/fstab

添加以下行:

10.1.4.146:/mnt/mmsegmentation/my_project/.dist_test /mnt/mmsegmentation/my_project/.dist_test nfs rw,hard,intr 0 0

测试挂载:

sudo mount -a
八、mmsegmentation代码改动(主节点、从节点都改)

1、vi /home/li/anaconda3/envs/torch/lib/python3.8/site-packages/mmengine/dist/dist.py

collect_results_cpu函数

2、vi /home/li/anaconda3/envs/torch/lib/python3.8/site-packages/mmengine/evaluator/metric.py

3、tools/dist_train.sh

主节点

从节点

九、命令提交

主节点:NCCL_DEBUG=INFO NCCL_IB_DISABLE=1  bash ../tools/dist_train.sh

从节点:NCCL_DEBUG=INFO NCCL_IB_DISABLE=1  bash ../tools/dist_train.sh




附件:搭建mmsegmentation训练自己的数据基本操作(segformer为例)

1. 新建my_project->segformer_rail

将segformer参与训练的全部config文件放在segformer_rail文件下,根据想要训练的网络,在configs目录选取网络模型及输入尺寸,迭代次数等

1) 这里训练的是segformer,所以选取 segfomer/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py,将其放在新建my_project->segformer_rail文件夹下,其中cityscapes是数据类型。

segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py文件中是这样的。

所以再将'./segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py'复制过来

segformer_mit-b0_8xb1-160k_cityscapes-1024x1024.py打开是这样的

所以再将../_base_/models/segformer_mit-b0.py',

 '../_base_/datasets/cityscapes_1024x1024.py',

   '../_base_/default_runtime.py',

'../_base_/schedules/schedule_160k.py'复制过来

因为都有文件都放在同一目录下,所以将以上文件的路径进行修改

2)、新建一个空白__init__.py文件

2.按照需求修改训练config (即新建my_project->segformer_rail文件夹下的文件)

1)修改cityscapes.py,因为使用的是自定义数据集,修改dataset_type = 'MyCityscapesDataset',并指定数据集的路径

3.在mmseg/datasets新建一个文件mycityscapes.py仿照cityscape.py

修改mycityscapes.py中的内容

4.mmseg/datasets/__init__.py中把自己的数据集添加进去:

5.修改segformer_mit-b0.py,需要修改num_classes  为自己的类别+1 算上背景 !!!!!

如果单卡,norm_cfg 修改为如下,norm_cfg = dict(type='BN', requires_grad=True)

6.修改mmseg/utils/classnames.py文件

key-mycityscapes 与mycityscapes_palette中的mycityscapes 对应

7.提交训练命令(单机单卡、单机多卡如下,多机多卡见上文)

python ../tools/train.py ./segformer_rail/segformer_mit-b5_8xb1-160k_cityscapes-1024x1024.py --work-dir=./train_logs

 

### 单机训练的配置与实现 #### TensorFlow 1.x 的单机训练 在 TensorFlow 1.x 中,可以通过 `tf.estimator` 和 `tf.train.MonitoredTrainingSession` 来实现单机训练。官方提供了一个脚本作为参考[^1]。主要思路是通过设置设备分配策略来利用GPU 并行处理数据。 以下是基于 TensorFlow 1.x 的简单实现框架: ```python import tensorflow as tf # 定义输入管道 def input_fn(): dataset = tf.data.Dataset.from_tensor_slices((features, labels)) dataset = dataset.shuffle(buffer_size).batch(batch_size) return dataset # 构建模型函数 def model_fn(features, labels, mode): predictions = ... loss = ... optimizer = tf.compat.v1.train.AdamOptimizer() # 使用分布式策略 with tf.device(tf.train.replica_device_setter(cluster=cluster_spec)): train_op = optimizer.minimize(loss) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) # 设置集群规格 cluster_spec = tf.train.ClusterSpec({ 'worker': ['localhost:2222', 'localhost:2223'] }) # 初始化 Estimator config = tf.estimator.RunConfig( session_config=tf.ConfigProto(log_device_placement=True), train_distribute=tf.contrib.distribute.MirroredStrategy()) estimator = tf.estimator.Estimator(model_fn=model_fn, config=config) # 开始训练 estimator.train(input_fn=input_fn) ``` #### PyTorch 的单机训练 PyTorch 提供了更灵活的方式来进行单机训练,通常使用 `torch.nn.DataParallel` 或者更为推荐的 `torch.nn.DistributedDataParallel`[^3]。为了确保不同进程间同步初始化完成,可以调用 `torch.distributed.barrier()` 函数。 下面是一个简单的 PyTorch 训练示例: ```python import torch import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP # 初始化进程组 dist.init_process_group(backend='nccl') # 加载模型到指定设备上 device = torch.device(f'cuda:{rank}') model = YourModel().to(device) # 将模型封装成分布式模式 ddp_model = DDP(model, device_ids=[rank]) # 数据加载器需配合 DistributedSampler train_sampler = torch.utils.data.distributed.DistributedSampler(dataset) train_loader = torch.utils.data.DataLoader( dataset, batch_size=batch_size_per_gpu, sampler=train_sampler ) # 训练循环 for epoch in range(num_epochs): for data, target in train_loader: output = ddp_model(data.to(device)) loss = criterion(output, target.to(device)) loss.backward() optimizer.step() optimizer.zero_grad() # 同步屏障 dist.barrier() ``` #### Baichuan-2 的 Hybrid Shard Zero2 策略 Baichuan-2 提出了 hybrid shard zero2 方法,这是一种结合 ZeRO-2 和其他分片技术的混合策略[^2]。ZeRO-2 主要用于减少内存占用的同时保持较高的计算效率。Hybrid shard zero2 可能进一步优化了参数、梯度以及优化状态的分布方式,在大规模模型训练中有显著优势。 #### 配置文件中的 DataLoader 设定 对于大数深度学习框架而言,调整 `dataloader` 是实现高效训练的重要部分之一。例如,在 MMDetection 或 MMCV 等库中,可以在配置文件里定义如下内容[^4]: ```yaml data: samples_per_gpu: 4 workers_per_gpu: 2 train: type: CustomDataset ann_file: path/to/train.json pipeline: - type: LoadImageFromFile - type: Normalize ``` 上述 YAML 文件片段展示了如何设定每张显上的样本数 (`samples_per_gpu`) 和工作线程数量 (`workers_per_gpu`)。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值