ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm).
报错
ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm).
问题原因
在 PyTorch 中使用 DataLoader 加载数据集的时候,由于使用多进程加载数据能够提升模型训练的速度。在物理机上面运行没有任务问题,但是在 Docker 容器或者 Kubernetes 的 Pod 中运行就会出现上面的异常情况。
具体原因
PyTorch 使用共享内存在进程之间共享数据,因此如果使用 torch 多进程(例如,对于多进程加载数据的程序),则容器运行时使用的默认共享内存段大小是不够的,默认情况下,Docker 容器(或 Kubernetes 的 Pod )共享内存大小为 64M,你应该使用 --ipc=host 或 --shm size 命令行选项增加共享内存大小,以运行 nvidia-docker。
DataLoader说明
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=default_collate, pin_memory=False, drop_last=False)
参数说明:
- dataset:加载的数据集(Dataset对象)
- batch_size:batch size
- shuffle:是否将数据打乱
- sampler: 样本抽样,后续会详细介绍
- num_workers:使用多进程加载的进程数,0代表不使用多进程
- collate_fn: 如何将多个样本数据拼接成一个batch,一般使用默认的拼接方式即可
- pin_memory:是否将数据保存在pin memory区,pin memory中的数据转到GPU会快一些
- drop_last:dataset中的数据个数可能不是batch_size的整数倍,drop_last为True会将多出来不足一个batch的数据丢弃
方案一:加载数据使用单进程
我们可以将 num_workers 设置为 0。这样的确可以解决多进程通信使用共享内存不足的问题,但是这也大大降低了训练的速度。
方案二:修改Docker容器或者Kubernetes的Pod的共享内存
修改 Docker 容器的 shm-size
启动 Docker 容器时,指定 --shm-size。
# 启动docker容器,并进入交互模式
docker run \
--cpus=16 \
--memory=64g \
--gpus '"device=1"' \
--shm-size 8G \
-v /home/junzhi.fan:/junzhi.fan
-it harbor.gd.io/test/ocr_:v1.0 \
/bin/bash
验证是否生效:
# 再docker容器的交互式命令行查看共享内存
df -h | grep shm
# 结果如下:
shm 8.0G 0 8.0G 0% /dev/shm
修改 Kubernetes 中 Pod 的共享内存
使用emptyDir卷来设置共享内存。
apiVersion: v1
kind: Pod
metadata:
name: test-pd-shm
spec:
containers:
- image: centos
name: centos
command: [ "sleep", "1000000" ]
imagePullPolicy: "IfNotPresent"
volumeMounts:
- mountPath: /dev/shm
name: cache-volume
volumes:
- emptyDir:
medium: Memory
sizeLimit: 512Mi
name: cache-volume
验证是否生效:
# 进入kubernetes集群的pod的交互模式
kubectl exec -it test-pd-shm-cbc944c56-xlbbc /bin/bash
# 查看共享内存
df -h
# 结果如下:
Filesystem Size Used Avail Use% Mounted on
overlay 500G 180G 321G 36% /
tmpfs 64M 0 64M 0% /dev
tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/sda3 50G 11G 40G 21% /etc/hosts
/dev/sda6 500G 180G 321G 36% /etc/hostname
shm 512M 0 64M 0% /dev/shm
总结
在机器学习训练或需要高效率运行的其他应用场景中,应该根据实际情况调整shm的大小。设置太小,不能够满足高效率的要求,但是,一味地设置过大,容易导致宿主机内存被占用过大,严重时会出现集群雪崩的问题。
因此,在生产环境中,在前期设计的过程中需要好好考虑,建议 shm 设置为容器分配内存的 1/2。
原文链接:https://juejin.cn/post/7031684646114951181
ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm).的更多相关文章
- c程序中出现segment error 和 bus error 的原因
在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下 段错误: 对一个NULL指针解引用. 访问程序进程以外的内存空间. 实际上,第 ...
- baksmali反编译出现:UNEXPECTED TOP-LEVEL ERROR:....Too many open files
解包大型apk文件,可能会出现例如以下错误, UNEXPECTED TOP-LEVEL ERROR: java.util.concurrent.ExecutionException: java.io. ...
- linux 报错 bash ‘/bin/sh: Syntax error: “(” unexpected
今天用make 编译 蹦到 bash ‘/bin/sh: Syntax error: “(” unexpected 和 /bin/sh: [[: not found 这种莫名奇妙的错误 原因是是lin ...
- 【Xamarin报错】 COMPILETODALVIK : UNEXPECTED TOP-LEVEL error java.lang.OutOfMemoryError: Java heap space
Xamarin Android 编译报错: COMPILETODALVIK : UNEXPECTED TOP-LEVEL error java.lang.OutOfMemoryError: Java ...
- 解决centos7重启后出现ata bus error
昨天把centos7装在电脑上了,还把win7系统格掉了,从此电脑上只装centos,有一种弃暗投明的感觉. 装完重启后欣赏了一番成果,一个halt命令想把系统关掉,却发现屏幕没黑,机器不转了,电源灯 ...
- ubuntu.sh: 113: ubuntu.sh: Syntax error: "(" unexpected
在ubuntu电脑上安装lnmp环境,执行下面命令时 sudo sh ubuntu.sh 报错误:ubuntu.sh: 113: ubuntu.sh: Syntax error: "(&qu ...
- php出现“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误的一种情况,及解决方法
PHP中的“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误,可能是因为美元符号$的误用,看下面一种情况 class Test{ s ...
- SHELL syntax error:unexpected end of file 提示错误
SHELL syntax error:unexpected end of file 提示错误 if [ -n "$1" ] then " else " fi e ...
- ERROR (ClientException): Unexpected API Error
- Parse error: syntax error, unexpected T_PUBLIC in 问题解决
class 类中 public function _getInfo($sn){ $title = ''; $_array = explode('~', $sn); ...
随机推荐
- [转]OpenCV使用之-----BruteForceMatcher无法使用
最近Opencv升级比较快,从2.4.0到2.4.1到2.4.2,使得我这个还在使用2.3.1的人很不好意思,而且听说新版本里添加了tbb并行功能,急着想用这些功能的我赶紧下了2.4.2. 按部就班的 ...
- 2022 年数据科学研究综述:重点介绍 ML、DL、NLP 等
2022 年数据科学研究综述:重点介绍 ML.DL.NLP 等 当我们在 2022 年底临近时,我对许多著名研究小组完成的所有惊人工作感到振奋,他们将 AI.机器学习.深度学习和 NLP 的状态扩展到 ...
- 给DevOps加点料:融入安全性的DevSecOps
从前,安全防护只是特定团队的责任,在开发的最后阶段才会介入.当开发周期长达数月.甚至数年时,这样做没什么问题:但是现在,这种做法现在已经行不通了.采用 DevOps 可以有效推进快速频繁的开发周期(有 ...
- 一问一答学习PyQT6,对比WxPython和PyQt6的差异
在我的基于WxPython的跨平台框架完成后,对WxPython的灵活性以及强大功能有了很深的了解,在跨平台的桌面应用上我突然对PyQt6的开发也感兴趣,于是准备了开发环境学习PyQt 6,并对比下W ...
- atomic 包底层实现原理
一.概念介绍(一)volatile关键字 Java 因为指令重排序,优化我们的代码,让程序运行更快,也随之带来了多线程下,指令执行顺序的不可控. 1.volatile关键字的作用: 内存可见性,修饰的 ...
- SpringCloud(1)---入门篇
SpringCloud理解篇 一.微服务概述 1.什么是微服务 目前的微服务并没有一个统一的标准,一般是以业务来划分将传统的一站式应用,拆分成一个个的服务,彻底去耦合,一个微服务就是单功能业务,只做一 ...
- Linux 提权指南
知屋漏者在宇下,知政失者在草野,知经误者在诸子. 导航 壹 - 密码搜寻 贰 - Sudo 命令 叁 - SUID/SGID 特权 肆 - 计划任务 伍 - 文件/目录 陆 - Linux 内核 柒 ...
- 一个基于 Roslyn 和 AvalonEdit 的跨平台 C# 编辑器
前言 今天大姚给大家分享一个基于 Roslyn 和 AvalonEdit 开源.轻量.跨平台的 C# 编辑器:RoslynPad. Roslyn介绍 Roslyn是一个强大的.NET编译器实现,为C# ...
- GIS数据合集:作物、植被数据下载平台整理
本文对目前主要的作物类型与产量.植被物候与指数数据产品的获取网站加以整理与介绍. 目录 4 植被农业数据 4.1 作物产量数据 4.1.1 SPAM 4.1.2 Aerial Intelligen ...
- 【译】.NET 升级助手现在支持升级到集中式包管理
原文 | McKenna Barlow 翻译 | 郑子铭 最近,.NET 升级助手引入了一些有用的新功能和一种新的中央包管理 (CPM) 升级类型. .NET 升级助手可帮助您将解决方案升级到较新版本 ...