Pytorch 尝试通过强化cpu使用加快训练和推理速度(二)

简介:这系列第一篇中讲了多线程和多进程的适用范围,写这篇的原因是遇到了进程池嵌套进程池的问题。(情况:我写的代码中使用了进程池,其中一个进程调用它他人写的使用进程池的函数。表现:他的函数直接跳过没有任何报错,最终定位到pool=Pool(x)。)

1. 先举个进程池嵌套进程池的代码例子.(参考后续文献)

import multiprocessing
import multiprocessing.pool
import time

from random import randint

def sleepawhile(t):
    print("Sleeping %i seconds..." % t)
    time.sleep(t)
    return t

def work(num_procs):
    print("Creating %i (daemon) workers and jobs in child." % num_procs)
    pool = multiprocessing.Pool(num_procs)

    result = pool.map(sleepawhile,
        [randint(1, 5) for x in range(num_procs)])
    
    pool.close()
    pool.join()
    return result

def test():
    print("Creating 5 (non-daemon) workers and jobs in main process.")
    pool = multiprocessing.Pool(5)

    result = pool.map(work, [randint(1, 5) for x in range(5)])

    pool.close()
    pool.join()
    print(result)

if __name__ == '__main__':
    test()

运行后报错如下:

AssertionError: daemonic processes are not allowed to have children

修改后如下代码就不报错了(python3.8,不通版本改法可能不同详见参考链接):

import multiprocessing
import multiprocessing.pool
import time

from random import randint
class NonDaemonPool(multiprocessing.pool.Pool):
    def Process(self, *args, **kwds):
        proc = super(NonDaemonPool, self).Process(*args, **kwds)

        class NonDaemonProcess(proc.__class__):
            """Monkey-patch process to ensure it is never daemonized"""
            @property
            def daemon(self):
                return False

            @daemon.setter
            def daemon(self, val):
                pass

        proc.__class__ = NonDaemonProcess
        return proc


def sleepawhile(t):
    print("Sleeping %i seconds..." % t)
    time.sleep(t)
    return t


def work(num_procs):
    print("Creating %i (daemon) workers and jobs in child." % num_procs)
    pool = multiprocessing.Pool(num_procs)

    result = pool.map(sleepawhile,
                      [randint(1, 5) for x in range(num_procs)])

    pool.close()
    pool.join()
    return result


def test():
    print("Creating 5 (non-daemon) workers and jobs in main process.")
    pool = NonDaemonPool(5)

    result = pool.map(work, [randint(1, 5) for x in range(5)])

    pool.close()
    pool.join()
    print(result)


if __name__ == '__main__':
    test()

 

参考:https://stackoverflow.com/questions/17223301/python-multiprocessing-is-it-possible-to-have-a-pool-inside-of-a-poolhttps://stackoverflow.com/questions/6974695/python-process-pool-non-daemonic/8963618#8963618https://www.cnpython.com/qa/262520

PyTorch是一个流行的深度学习框架,可以通过一些技巧来加快训练速度。以下是一些常用的方法: 1. GPU加速:PyTorch支持使用GPU进行计算,可以通过将模型和数据移动到GPU上来加速训练使用`torch.cuda.is_available()`检查是否有可用的GPU,并使用`to()`方法将模型和数据移动到GPU上。 2. 批量处理:在训练过程中,可以将数据分成小批量进行处理,而不是逐个样本处理。这样可以利用矩阵运算的并行性,提高训练速度。可以使用`torch.utils.data.DataLoader`来加载数据并生成批量。 3. 模型优化:选择合适的优化器和学习率调度器可以加快训练速度。常用的优化器包括SGD、Adam等,可以根据具体任务选择合适的优化器。学习率调度器可以根据训练进程自动调整学习率,例如使用`torch.optim.lr_scheduler`中的学习率衰减策略。 4. 数据增强:通过对训练数据进行增强操作,如随机裁剪、翻转、旋转等,可以增加数据的多样性,提高模型的泛化能力,并加快训练速度。 5. 模型剪枝:通过剪枝技术可以减少模型的参数量,从而减少计算量和内存占用,加快训练速度。可以使用一些开源的剪枝库,如`torch.nn.utils.prune`。 6. 分布式训练:如果有多台机器或多个GPU可用,可以使用分布式训练加快训练速度PyTorch提供了`torch.nn.DataParallel`和`torch.nn.parallel.DistributedDataParallel`等模块来支持分布式训练
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值