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); ...
随机推荐
- Qt编写安防视频监控系统40-onvif线程处理
一.前言 整个onvif模块大部分的功能都有了以后,除了在demo上点点按钮可以执行获取结果显示外,最终还是要应用到视频监控中,在按钮上点点和系统中后台自动运行是两码事,比如onvif校时和事件订阅, ...
- 开源即时通讯IM框架MobileIMSDK的微信小程序端开发快速入门
一.理论知识准备 您需要对微信小程序开发有所了解: 1)真正零基础入门学习笔记系列 2)从零开始的微信小程序入门教程 3)最全教程:微信小程序开发入门详解 您需要对WebSocket技术有所了解: 1 ...
- [Git][基本原理与命令]
引言 Git是工作中最常用的版本控制工具,本文中将介绍其常用的命令. 根据作用的不同,可以分为基本命令.撤销命令.合并命令与远程仓库命令,下面将依次介绍这些命令. 基本原理 git 中提供了底层api ...
- IntelliJ IDEA2020永久激活破解教程(无限试用)
IntelliJ IDEA2020激活破解教程(无限试用) 鉴于想拥有一个十分舒适的编程环境,我特意将自己的电脑运行内存从4G扩展到12G,加装一个256G的固态作为C盘,并且将系统升级为Window ...
- Index - 此处的诗
虚构往事 正篇 嗯--本来发过两篇,但深愧于仓促的处理和并未完善的细节设定,隐藏了. 大概会是一个中篇的科幻故事,世界设定已经完善了(Shaya 可以作证!),但近期可能没有精力动笔. 番外 ...
- python 控制流程
条件语句 if语法 if True: print("hello") print("world!") 输出: helloworld! 举例: "&quo ...
- moectf2023 web wp
gas!gas!gas! 直接跑脚本 import requests session=requests.Session() url="http://127.0.0.1:14447" ...
- h5移动端像素适配 postcss-pxtorem和amfe-flexible
Vant 中的样式默认使用px作为单位,如果需要使用rem单位,推荐使用以下两个工具: postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 rem; amfe-flexib ...
- 玩转云端 | AccessOne实用窍门之三步搞定门户网站防护与加速
随着互联网的飞速发展,网站建设已成为企事业单位推广.提供服务的重要途径之一.在数字技术快速迭代的当下,如何在保障网站安全的前提下提供高效服务,是企事业单位需要着重考虑的内容. 网站安全防护是网站建设后 ...
- [记录点滴] 小心 Hadoop Speculative 调度策略
[记录点滴] 小心 Hadoop Speculative 调度策略 目录 [记录点滴] 小心 Hadoop Speculative 调度策略 [0x00] 摘要 [0x01] 缘由 [0x02] 代码 ...