训练代码中num_worker的设置

num_workers在深度学习训练中影响数据加载速度,理论上越大越好,但实际效果受CPU核心数、batchsize和图像尺寸等因素影响。实验表明,最佳num_workers值可能随batchsize变化。例如,batchsize为64时最佳值为12,而batchsize为128时为8。选择合适值能提高训练效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


num_workers 的作用与具体体现

num_workers 通常是用于控制数据加载和预处理的并行工作进程数量。主要体现在在进行一次epoch训练之前,加载一个批次图片所需的时间(若batchsize设置的比较大,如64,将num_workers设为0,就会发现进行一次epoch迭代训练之前所花费的时间很长;若batchsize设置的比较小,如8,则不是很明显)


如何选择合适的num_workers

num_workers和batchsize一样,在硬件允许的条件下,理论上越大越好。但实际应该设置为多少,目前都没有一个确定的说法。在此给出一个参考代码,通过设置的batchsize、图片尺寸与数据集的制作与加载,来查看哪个num_worker最快

代码如下(示例):

from dataset import trainIC_dataset
from torch.utils.data import DataLoader
import logging
import time

logger = logging.getLogger()

cropsize = (448,448)
image_path = 'lastdata/20231016'


ds = trainIC_dataset(image_path, paste_dir='', size=cropsize, mode='train')
dsval = trainIC_dataset(image_path, paste_dir='', size=cropsize, mode='val')

print(f"num of CPU: {mp.cpu_count()}")
for num_workers in range(2, mp.cpu_count(), 2):
    dl = DataLoader(ds,
                    batch_size=128,
                    shuffle=True,
                    num_workers=num_workers,
                    pin_memory=False,
                    drop_last=False
                    )

    dlval = DataLoader(dsval,
                       batch_size=128,
                       shuffle=True,
                       pin_memory=False,
                       # sampler = sampler_val,
                       num_workers=1,
                       drop_last=False)

    start = time.time()
    for epoch in range(1, 3):
        for i, data in enumerate(dl, 0):
            pass
    end = time.time()
    print("Finish with:{} second, num_workers={}".format(end - start, num_workers))

  上述代码是测试训练集的num_worker,先得到cpu的最大核心数,再把num_worker从2、4、6、8…一直到最大核心数,来记录加载数据集的时间。(这里将验证集的num_workers 设置为1是为了确保可重现性和避免潜在的并发问题; 当然也可以为了效率设置其他值)。
  经实验发现,并不是num_worker越大,它的时间越少;并且,batchsize或图像尺寸的改变,也会改变其时间最少的num_worker值(如当batchsize=64,时间最少的num_worker为12;当batchsize=128时,时间最少的num_worker为8)。当然,这个时间仅供参考

### Flink 架构组成框架图 #### 1. 主要组成部分概述 Flink 的架构设计旨在支持高效的大规模数据处理。该架构主要由以下几个核心组件构成: - **JobManager**: 负责协调和管理作业的执行过程,包括调度任务、协调checkpoint等[^4]。 - **TaskManager (Worker)**: 执行实际的任务单元(subtasks),每个 TaskManager 可能会运行多个 task 实例。 - **Client**: 用户提交 job 到集群的方式之一;负责准备 JobGraph 并将其发送给 JobManager 进行后续处理. - **Source 和 Sink**: 数据流入流出系统的接口。Source 作为输入源读取外部系统如 Kafka 中的数据,而 Sink 将处理后的结果写入目标存储系统中[^3]. #### 2. 多并行度 DataFlow 视角下的 Subtask 分布 在一个典型的 Flink 应用程序中,不同类型的算子(Operators)可以有不同的并行度设置。例如 Source、Map 或 KeyBy 等操作可能配置较高的并行度以加速数据摄入速度或中间转换效率,而某些特定阶段如最终聚合则可能会降低至单一实例完成输出. 对于上述提到的应用场景,假设存在两个并行度为2的操作以及一个并行度为1的sink,则整个应用程序的最大并行度即为2. ```plaintext +-------------------+ | Client | +--------+----------+ | Submit Job Graph v +--------v----------+ | JobManager | +--------+----------+ | Schedule Tasks v +--------v--------------------+ +-------------+ | Multiple TaskManagers(Wokers)|<----->| External Systems| | Each runs multiple subtasks | | e.g., Kafka, HDFS| +------------------------------+ +-------------+ ``` 此简化版图表展示了 Flink 如何通过各个节点间的协作来构建完整的流式处理管道,并且体现了从客户端提交job直至在worker上具体执行的过程.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要躺平的一枚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值