共享内存简介及docker容器的shm设置与修改

共享内存简介及docker容器的shm设置与修改

共享内存简介

共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。

实际上,共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

docker容器shm的设置与修改

问题

我们在 docker 容器来跑我们的 PyTorch 模型训练任务时如果设置不当,会遇到类似这样的报错:

RuntimeError: DataLoader worker (pid 1229) is killed by signal: Bus error. 
It is possible that dataloader's workers are out of shared memory. 
Please try to raise your shared memory limit.

可以看到,这是 DataLoader 的保存,我们在设置 DataLoader 时通常会给一个 num_workers 的值(该值推荐设置为本机的 CPU 核心数),但是在 docker 容器中训练任务时,或许我们的宿主机有很大内存空闲,但是却会报上面的共享内存不足的问题。

这就是由于我们在创建 docker 容器时没有给足够的共享内存(默认为 64MB)。共享内存的大小我们可以在容器内通过以下命令查看:

df -lh | grep shm
# 输出:
shm              64M     0   64M   0% /dev/shm

或者:

ipcs -al
# 输出:
------ Messages Limits --------
max queues system wide = 32000
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509465599
max total shared memory (kbytes) = 18014398509481980
min seg size (bytes) = 1------ Semaphore Limits --------
max number of arrays = 32000
max semaphores per array = 32000
max semaphores system wide = 1024000000
max ops per semop call = 500
semaphore max value = 32767

这种情况有三种解决方法。

解决方法

方法一

方法一就是直接不要设置 num_workers 了,让它为默认值 0,这时就不需要很大的共享内存了,任务可以正常跑起来。

该方法的问题是:我们跑训练任务时肯定是需要很大的 num_workers 的,不然数据运输太慢会导致 GPU 利用率很低。

因此该方法仅适用于我们在容器内 debug 训练代码时,此时不需要很大的 num_workers,只要保证代码无误,然后在正式开始跑训练时正常设置共享内存和 num_workers 即可。

方法二

那么,应该怎样正确设置共享内存的大小呢?其实很简单,只需要我们在启动容器时加一个参数 --shm-size 即可,如:

docker run -it \--gpus '"device=0,1"' \--shm-size 32g \--mount type=bind,source=/ssd1t/song/Datasets/coco,target=/master_data \adenialzz/bilibili-projects:tch-mmdet-py38-tch19

即可将共享内存设置为 32g。

但是,有时我们在容器内已经做了一些事情,不想新建容器,而就是想改变当前容器的共享内存该怎么办呢?

方法三

这种情况稍微麻烦一点,但也是可以实现的,步骤如下:

  1. 首先关闭 docker 服务:

    service docker stop
    
  2. 查看当前容器的 id:

    docker ps -a
    

    找到我们要修改的容器的 CONTAINER ID,就是第一列,长得像这样:685d249a0965 的一个序列,通常显示的是简短的版本(即完整 ID 的开头几个字符),实际这个 ID 很长。

  3. 找到该容器配置文件所在目录

    cd /var/lib/docker/containers
    ls
    cd 685d249a096569335605747977dcb3d705947b1049259de2e259dc4b9a7da3fa
    

    这时会显示出几个以当前存在的容器 ID 为名的目录,找到我们要修改共享内存的那个(开头匹配我们刚才记下的 CONTAINER ID),进入目录。

  4. 修改宿主机中的 host 配置文件(此步通常需要 root 权限)

    vim hostconfig.json
    

    然后会看到一堆东西,找到 "ShmSize":67108864,可以看到,现在就是 67108864 字节,即64MB,我们就是要修改该值,比如在后面填俩零就是扩大了一百倍,自己算一下需要的共享内存大小,按需扩大,保存退出。

  5. 重启 docker 服务

    // 停止docker服务
    systemctl stop docker  
    // 再开启
    systemctl start docker  //或者
    systemctl restatrt docker//或者
    service docker stop
    service docker start
    
  6. 再打开容器,进去看一下吧

Ref:

https://blog.csdn.net/gg864461719/article/details/112466585

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

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

相关文章

对Docker镜像layer的理解

对Docker镜像layer的理解 转自:https://blog.csdn.net/u011069294/article/details/105583522 FROM python:3.6.1-alpine RUN pip install flask CMD [“python”,“app.py”] COPY app.py /app.py上面是一个Dockerfile的例子,每一行都会生成一个新的l…

ssh免密登录配置方法及配置

ssh免密登录配置方法及配置 直接上步骤,记我们本机为机器A,而机器B、机器C等是我们的服务器,我们要配置的是A到B、C等的 ssh 免密登录。 1 在机器A上生成秘钥对 ssh-keygen会得到输出: Generating public/private rsa key pai…

机器学习系统:设计与实现 计算图

机器学习系统:设计与实现 计算图 转自:https://openmlsys.github.io/chapter_computational_graph/index.html 在上一章节中,我们展示了用户利用机器学习框架所编写的程序。这些用户程序包含了对于训练数据,模型和训练过程的定义。然而为了…

常见浮点数格式梳理

常见浮点数格式梳理 IEEE 754 标准 浮点数转换网站:https://www.h-schmidt.net/FloatConverter/IEEE754.html IEEE二进制浮点数算术标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值&am…

Python拾遗1:collections、itertools和内存io

Python拾遗1:collections、itertools和内存io 转自:https://www.liaoxuefeng.com/wiki/1016959663602400 本系列旨在补充python中一些很好用但是并非常规课程主线中的知识。 collections collections是Python内建的一个集合模块,提供了许…

混合精度训练

混合精度训练 转自:https://zhuanlan.zhihu.com/p/441591808 通常我们训练神经网络模型的时候默认使用的数据类型为单精度FP32。近年来,为了加快训练时间、减少网络训练时候所占用的内存,并且保存训练出来的模型精度持平的条件下&#xff0…

拓扑排序C++

拓扑排序C 几个基本概念的介绍 入度和出度 图中的度:所谓顶点的度(degree),就是指和该顶点相关联的边数。在有向图中,度又分为入度和出度。 入度 (in-degree) :以某顶点为弧头,终止于该顶点的边的数目称为该顶点的…

C++面试常考题——编译内存相关

C面试常考题——编译内存相关 转自:https://leetcode-cn.com/leetbook/read/cpp-interview-highlights/e4ns5g/ C程序编译过程 编译过程分为四个过程:编译(编译预处理、编译、优化),汇编,链接。 编译预处…

C++遍历删除元素

C遍历删除元素 转自:http://zencoder.info/2019/10/11/erase-element-from-container/ 今天看到一个patch fix从std::map中遍历删除元素导致crash问题,突然意识到自己对如何正确地从map等C容器中删除元素也没有很牢固清醒的认知。重新梳理了下这块的正…

关键字库函数

关键字库函数 转自&#xff1a;https://leetcode-cn.com/leetbook/read/cpp-interview-highlights/ej3mx1/ sizeof和strlen的区别 strlen 是头文件<cstring> 中的函数&#xff0c;sizeof 是 C 中的运算符。 strlen 测量的是字符串的实际长度&#xff08;其源代码如下&…

memcpy和memmove的区别以及内存重叠问题

memcpy和memmove的区别以及内存重叠问题 转自&#xff1a;https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数&#xff0c;在头文件 string.h 中&#xff0c;作用是拷贝一定长度的内存的内容&#xff0c;原型分别如下&#xff1a; void…

从头搭建一个深度学习框架

从头搭建一个深度学习框架 转自&#xff1a;Build a Deep Learning Framework From Scratch 代码&#xff1a;https://github.com/borgwang/tinynn 当前深度学习框架越来越成熟&#xff0c;对于使用者而言封装程度越来越高&#xff0c;好处就是现在可以非常快速地将这些框架作为…

关于python import的sys.path路径问题

关于python import的sys.path路径问题 sys.path 先说一下 sys.path 这个变量&#xff0c;该变量需要导入 sys 官方库方可使用&#xff0c;它是一个列表&#xff0c;是当前 python 文件 import 库时会逐个搜索列表中的路径。 初始化 sys.path 从这些位置初始化&#xff1a; …

python pdb调试基本命令整理

python pdb调试基本命令整理 使用简介 启动调试 侵入式 在 py 文件内部设置&#xff1a; import pdb; pdb.set_trace()程序会在运行到这一行时停下来&#xff0c;进入 pdb 交互。 非侵入式 在运行 py 脚本时&#xff1a; python -m pdb main.py程序会在一启动时就进入 pdb 交…

Docker概念理解

Docker概念理解 本文非Docker命令大全&#xff0c;而是对Docker的概念、原理等作说明&#xff0c;适合有一定实操经验后来加深理解。 转自&#xff1a;docker从入门到实践 Docker简介 本章将带领你进入 Docker 的世界。 什么是 Docker&#xff1f; 用它会带来什么样的好处&a…

Dockerfile详解

Dockerfile详解 转自&#xff1a;https://yeasy.gitbook.io/docker_practice/ 使用Dockerfile定制镜像 从刚才的 docker commit 的学习中&#xff0c;我们可以了解到&#xff0c;镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操…

Dockerfile最佳实践

Dockerfile最佳实践 本文是原作者对 Docker 官方文档中 Best practices for writing Dockerfiles 的理解与翻译。 转自&#xff1a;附录四&#xff1a;Dockerfile 最佳实践 一般性指南和建议 容器应该是短暂的 通过 Dockerfile 构建的镜像所启动的容器应该尽可能短暂&#xf…

Linux内存背后的那些神秘往事

Linux内存背后的那些神秘往事 作者&#xff1a;大白斯基&#xff08;公众号&#xff1a;后端研究所&#xff09; 转自&#xff1a;https://mp.weixin.qq.com/s/l_YdpyHht5Ayvrc7LFZNIA 前言 大家好&#xff0c;我的朋友们&#xff01; CPU、IO、磁盘、内存可以说是影响计算机…

mmdeploy快速上手

mmdeploy快速上手 若要将使用 openmmlab 的框架&#xff08;如mmdet、mmcls&#xff09;等训练的模型进行快速部署&#xff0c;同样来自 openmmlab 的 mmdeploy 无疑是最合适的选择&#xff0c;本文将简单地完成一个 Faster RCNN 模型的部署。 配置 本文基于如下软硬件配置&…

精简CUDA教程——CUDA Driver API

精简CUDA教程——CUDA Driver API tensorRT从零起步迈向高性能工业级部署&#xff08;就业导向&#xff09; 课程笔记&#xff0c;讲师讲的不错&#xff0c;可以去看原视频支持下。 Driver API概述 CUDA 的多级 API CUDA 的 API 有多级&#xff08;下图&#xff09;&#xff…