Keras 单机多卡,多机多卡的使用方式 笔记

单机多卡,多机多卡的使用方式

官方教程 :https://keras.io/guides/distributed_training/#singlehost-multidevice-synchronous-training

教程主要内容

  1. 分布式计算有两种,一种是数据并行,一种是模型并行
  2. 数据并行只需要修改少量代码
  3. 模型比较简单的话,并行数据即可
  4. 数据并行原理和实现

这里讨论数据并行实现原理

  1. 一个batch_size的数据分配到多个设备上面
  2. 每个设备独立计算,直到分配的数据计算完毕
  3. 合并各个设备上的模型参数,同步之后进行下一个epoch
  4. 用mirrored variable object 实现变量的同步,因此要把模型创建和编译的部分放在该类变量的作用域中

在这里插入图片描述

import tensorflow as tf
from tensorflow import keras


# Create a MirroredStrategy.
strategy = tf.distribute.MirroredStrategy()
print('Number of devices: {}'.format(strategy.num_replicas_in_sync))

# Open a strategy scope.
with strategy.scope():
  # Everything that creates variables should be under the strategy scope.
  # In general this is only model construction & `compile()`.
  model = Model(...)
  model.compile(...)

# Train the model on all available devices.
model.fit(train_dataset, validation_data=val_dataset, ...)

# Test the model on all available devices.
model.evaluate(test_dataset)

疑问

在局部数据训练完成之后进行的参数合并,是从得到的多个结果中,选择使loss变小的参数作为所有设备上的模型参数,再进入下一次epoch吗?

即是说,不同数据子集,相当于不同的数据分布,模型的初始参数位置不一样,得到的最低点(loss)不一样,选择使loss最小的参数作为这一个batch训练之后模型的参数

有点像mini_batch https://blog.youkuaiyun.com/qq_38343151/article/details/102886304

  1. 局部最优:如果是这样的话,是不是顺便解决了模型陷入局部最优的问题。
  2. 训练不充分:因为有多个初始化可能导致训练不充分?
### 单机训练命令 在单机环境下使用个 GPU 进行程序运行时,无论是 PyTorch 还是 TensorFlow 都提供了相应的支持。以下是针对这两种框架的具体实现方式。 #### PyTorch 的单机训练 对于 PyTorch 来说,可以利用 `torch.nn.DataParallel` 或者更推荐的方式——基于 `torch.distributed.launch` 和 `torch.multiprocessing.spawn` 实现分布式训练[^4]。下面是一个典型的启动命令: ```bash CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.run --nproc_per_node=4 train_script.py --arg1 value1 --arg2 value2 ``` - **解释**: - `CUDA_VISIBLE_DEVICES`: 设置可见的 GPU 设备号。 - `-m torch.distributed.run`: 调用 PyTorch 提供的分布式运行模块。 - `--nproc_per_node=4`: 表示每台器上启动 4 个进程(即使用 4 块 GPU)。 - `train_script.py`: 训练脚本文件名。 如果需要手动控制每个进程的行为,则可以在代码中设置环境变量并调用 `init_process_group()` 函数初始化分布式环境。 #### TensorFlow 的单机训练 TensorFlow 支持通过 Keras API 或原生 Estimator 接口完成单机训练。通常情况下,可以通过指定策略来管理模型分布。例如,使用 MirroredStrategy 可以轻松实现同步更新权重的目标。 ```python strategy = tf.distribute.MirroredStrategy() with strategy.scope(): model = create_model() # 创建模型函数 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(train_dataset, epochs=EPOCHS) ``` 当采用命令行形式启动 TensorFlow 程序时,可以直接定义 CUDA_VISIBLE_DEVICES 参数限制使用的显数量: ```bash CUDA_VISIBLE_DEVICES=0,1,2,3 python train_tf.py --arg1 value1 --arg2 value2 ``` 需要注意的是,在某些复杂场景下可能还需要额外配置诸如 NCCL 库版本等问题[^1]。 另外值得注意的一点是在非分布式环境中尝试调用部分特定功能如 barrier 方法可能会引发阻塞现象[^3],因此务必确认所处上下文是否适配这些操作逻辑。 ### 总结 综上所述,无论选用哪种深度学习框架来进行单机训练都需要合理规划资源分配情况,并依据具体需求调整相应参数设定。同时也要留意不同硬件平台间可能存在兼容性差异从而影响最终效果表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值