共享內存簡介及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.pswp.cn/news/532506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532506.shtml
英文地址,請注明出處:http://en.pswp.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…