关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题

关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题

如果我们想要在 Pytorch 中同时迭代两个 dataloader 来处理数据,会有两种情况:一是我们按照较短的 dataloader 来迭代,长的 dataloader 超过的部分就丢弃掉;二是比较常见的,我们想要按照较长的 dataloader 来迭代,短的 dataloader 在循环完一遍再循环一遍,直到长的 dataloader 循环完一遍。

两个dataloader的写法及问题的出现

第一种情况很好写,直接用 zip 包一下两个 dataloader 即可:

# ...
dataloaders1 = DataLoader(DummyDataset(0, 100), batch_size=10, shuffle=True)
dataloaders2 = DataLoader(DummyDataset(0, 200), batch_size=10, shuffle=True)
num_epochs = 10for epoch in range(num_epochs):for i, data in enumerate(zip(dataloaders1, dataloaders2)):print(data)# 开始写你的训练脚本

第二种情况笔者一开始时参考的一篇博客的写法,用 cycle 将较短的 dataloader 包一下:

from itertools import cycle
# ...
dataloaders1 = DataLoader(DummyDataset(0, 100), batch_size=10, shuffle=True)
dataloaders2 = DataLoader(DummyDataset(0, 200), batch_size=10, shuffle=True)
num_epochs = 10for epoch in range(num_epochs):for i, data in enumerate(zip(cycle(dataloaders1), dataloaders2)):print(data)# 开始写你的训练脚本

是可以运行,但是这样出现了明显显存泄漏的问题,在笔者自己的实验中,显存占用量会随着训练的进行,每轮增加 20M 左右,最终导致显存溢出,程序失败。

解决方法

笔者找了半天,终于在 StackOverflow 的一篇贴子中找到了解决方法,该贴的一个答案指出:cyclezip 的方法确实可能会造成显存泄漏(memory leakage)的问题,尤其是在使用图像数据集时,可以通过以下写法来迭代两个 dataloader 并避免这个问题:

# ...
dataloaders1 = DataLoader(DummyDataset(0, 100), batch_size=10, shuffle=True)
dataloaders2 = DataLoader(DummyDataset(0, 200), batch_size=10, shuffle=True)
num_epochs = 10for epoch in range(num_epochs):dataloader_iterator1 = iter(dataloaders1)for i, data2 in enumerate(dataloaders2):try:data1 = next(dataloader_iterator1)except StopIteration:dataloader_iterator1 = iter(dataloaders1)data1 = next(dataloader_iterator1)print(data1, data2)# 开始你的训练脚本

笔者亲测这种方式是可以正常运行且不会有显存泄漏问题的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neovim及coc.nvim自动补全初探

neovim及coc.nvim自动补全初探 安装 # mac # 安装 brew install neovim # 查看neovim安装路径 brew list nvim# ubuntu apt install neovim习惯了打开 vi/vim 的方式,可以用个 alias 在 ~/.zshrc 中设置一下: alias vi"nvim"插件 vim-plug…

sed 简明教程

sed 简明教程 转自:https://coolshell.cn/articles/9104.html awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了。所以 林妹妹跳了个Topless,他的哥哥sed坐不住了&#xf…

awk 简明教程

awk 简明教程 转自:https://coolshell.cn/articles/9070.html 有一些网友看了前两天的《Linux下应该知道的技巧》希望我能教教他们用awk和sed,所以,出现了这篇文章。我估计这些80后的年轻朋友可能对awk/sed这类上古神器有点陌生了&#xff0c…

应该知道的LINUX技巧

应该知道的LINUX技巧 转自:https://coolshell.cn/articles/8883.html 这篇文章来源于Quroa的一个问答《What are some time-saving tips that every Linux user should know?》—— Linux用户有哪些应该知道的提高效率的技巧。我觉得挺好的,总结得比较好…

[深度][PyTorch] DDP系列第一篇:入门教程

[深度][PyTorch] DDP系列第一篇:入门教程 转自:[原创][深度][PyTorch] DDP系列第一篇:入门教程 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:实现原理与源代码解析

[深度][PyTorch] DDP系列第二篇:实现原理与源代码解析 转自:https://zhuanlan.zhihu.com/p/187610959 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:实战与技巧

[深度][PyTorch] DDP系列第三篇:实战与技巧 转自:https://zhuanlan.zhihu.com/p/250471767 零. 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I do! – – …

PIL、OpenCV中resize算子实现不同的问题

PIL、OpenCV中resize算子实现不同的问题 测试图像:https://raw.githubusercontent.com/TropComplique/ssd-pytorch/master/images/dogs-and-cats.jpg (直接 wget 可获得) 测试版本: opencv-python 4.4.0.46Pillow 8.0.1 测试代…

mac X11 XQuartz的安装与使用

mac X11 XQuartz的安装与使用 本地系统:MacOS 12.4 远程主机系统:Ubuntu 18.04 命令说明 ssh命令 ssh 命令大家很熟悉了,这里仅介绍与 X11 forwarding 相关的几个选项。 本部分译自 ssh 命令手册,可见 man ssh -X &#xf…

机器学习:系统设计与实现 分布式训练

机器学习系统:设计与实现 分布式训练 转自:https://openmlsys.github.io/chapter_distributed_training/index.html 随着机器学习的进一步发展,科学家们设计出更大型,更多功能的机器学习模型(例如说,GPT-3)…

Linux命令行及各常用工具代理设置

Linux命令行及各常用工具代理设置 命令行代理设置 1 通过命令行指定 直接为当前命令行设置代理 对当前终端的全部工具(apt、curl、wget、git 等全都有效)以下仅以 http 代理为例,如果是其他协议(如 socks 等)自行改…

VimScript 五分钟入门(翻译)

VimScript 五分钟入门(翻译) 转自:https://zhuanlan.zhihu.com/p/37352209 译注:折腾 Vim 当然要能看懂和改写相关脚本,而中文资料匮乏,缺一个提纲挈领的教程。本文翻译自 Andrew Scala 的 《Five Minute V…

C++多线程推理、生产者消费者模式封装

C多线程推理、生产者消费者模式封装 tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下。 深度学习推理中的多线程知识概览 本章介绍的多线程主要是指算法部署时所涉及的多线程内容&a…

在Python中调用C/C++:cython及pybind11

在Python中调用C/C:cython及pybind11 转自:https://zhuanlan.zhihu.com/p/442935082 Python写起来非常方便, 但面对大量for循环的时候, 执行速度有些捉急. 原因在于, python是一种动态类型语言, 在运行期间才去做数据类型检查, 这样效率就很低(尤其是大规…

Pytorch导出onnx模型,C++转化为TensorRT并实现推理过程

Pytorch导出onnx模型,C转化为TensorRT并实现推理过程 前言 本文为旨在实现整个Python导出PyTorch模型,C转化为TensorRT并实现推理过程过程,只与模型推理,模型部署相关,不涉及模型训练。为突出整个部署过程而非具体模…

从零Makefile落地算法大项目,完整案例教程

从零Makefile落地算法大项目,完整案例教程 转自:从零Makefile落地算法大项目,完整案例教程 作者:手写AI 前言 在这里,你能学到基于Makefile的正式大项目的使用方式和考虑,相信我,其实可以很简单…

PyTorch扩展自定义PyThonC++(CUDA)算子的若干方法总结

PyTorch扩展自定义PyThon/C(CUDA)算子的若干方法总结 转自:https://zhuanlan.zhihu.com/p/158643792 作者:奔腾的黑猫 在做毕设的时候需要实现一个PyTorch原生代码中没有的并行算子,所以用到了这部分的知识,再不总结就要忘光了 &a…

给 Python 算法插上性能的翅膀——pybind11 落地实践

给 Python 算法插上性能的翅膀——pybind11 落地实践 转自:https://zhuanlan.zhihu.com/p/444805518 作者:jesonxiang(向乾彪),腾讯 TEG 后台开发工程师 1. 背景 目前 AI 算法开发特别是训练基本都以 Python 为主&…

chrome自动提交文件_收集文档及提交名单统计

知乎文章若有排版问题请见谅,原文放在个人博客中【欢迎互踩!】文叔叔文档收集使用动机在我们的学习工作中,少不了要让大家集体提交文件的情况,举个最简单的例子:收作业。 传统的文件收集流程大致是:群内发出…

Pytorch自定义C++/CUDA扩展

Pytorch自定义C/CUDA扩展 翻译自:官方文档 PyTorch 提供了大量与神经网络、张量代数、数据整理和其他操作。但是,我们有时会需要更加定制化的操作。例如,想要使用论文中找到的一种新型的激活函数,或者实现自己设计的算子。 在 Py…