V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ggp1ot2
V2EX  ›  程序员

关于 Docker 的内存恢复问题,求问,在线等

  •  
  •   ggp1ot2 · 163 天前 · 1388 次点击
    这是一个创建于 163 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    设备是 mbp m3 16G 内存的。

    因为 m 芯片并不好安装 xgboost 等库,经过一番搜索了解到可以使用 Docker

    通过摸索构建了一个基于 Python 的镜像(包含 xgb 等机器学习库)

    但是在训练模型的时候,经常报错,表现为 notebook 崩溃需要重来,或者是 python 脚本 killed

    相关设置

    经过进一步搜索,发现可能和内存、cpu 有关。

    我在创建容器的时候,并没有指定一些 cpu 、内存的参数,在 desktop 中已经将相关设置拉满了

    "CpuShares": 0,
    "Memory": 0,
    "NanoCpus": 0,
    "CgroupParent": "",
    "BlkioWeight": 0,
    "BlkioWeightDevice": [],
    "BlkioDeviceReadBps": [],
    "BlkioDeviceWriteBps": [],
    "BlkioDeviceReadIOps": [],
    "BlkioDeviceWriteIOps": [],
    "CpuPeriod": 0,
    "CpuQuota": 0,
    "CpuRealtimePeriod": 0,
    "CpuRealtimeRuntime": 0,
    

    docker

    https://imgur.com/a/oKDBMmh.jpg

    理论上这不就是可以随意使用 mbp 的内存和 cpu 了?

    进一步发现

    进一步在重现问的时候,使用 docker stats 发现,在数据读取和处理的时候,

    1 、cpu 和 内存使用都会涨,在数据读取完之后,cpu 立刻 0%,但是 mem usage 没有变化,还是 10G 左右,继续执行代码,马上就崩溃了,为啥内存不会恢复?

    2 、即使没有限制使用 cpu 核心数,但是数据处理的时候, 容器的 cpu 占比可能 200%,但是电脑还是有 50% 的 cpu 剩余,为啥用不满?

    3 、在建模的时候,容器的 cpu 可以飙升到 600%,但是内存使用居然没有用满?

    疑问

    实在是不怎么使用 docker ,总是感觉是不是容器不能很好的利用 mbp 的资源,理论上是比较好的设备了,居然跑个 xgb 跑不动

    还是是我的数据量太大了吗?(差不多 15w 行 x 1000 列)

    13 条回复    2024-07-08 21:05:35 +08:00
    ysc3839
        1
    ysc3839  
       163 天前 via Android
    不如直接用虚拟机
    javazero
        2
    javazero  
       163 天前
    建议上 Kaggle
    ggp1ot2
        3
    ggp1ot2  
    OP
       163 天前
    @javazero 公司的数据,肯定不能放在第三方平台

    @ysc3839 mac 还能开虚拟机?和 docker 有啥区别呢?
    ysc3839
        4
    ysc3839  
       163 天前 via Android
    @ggp1ot2 为什么不可以? Docker 也是用虚拟机跑的。
    ggp1ot2
        5
    ggp1ot2  
    OP
       163 天前
    @ysc3839 搜了下,你说的开虚拟机,是开个 Windows ?
    ysc3839
        6
    ysc3839  
       163 天前 via Android
    @ggp1ot2 那当然是 Linux 虚拟机,Docker 里面跑的也是 Linux 镜像
    ConfusedBiscuit
        7
    ConfusedBiscuit  
       163 天前   ❤️ 1
    我来详细解释一下:
    1. Docker 上流行的容器其实都是 Linux 容器(理论上也支持 Windows 容器,但是没见有人用过),这种容器在 Windows 和 Mac 上其实都是自动起了一个 Linux 虚拟机( Windows 上基于 WSL2 的也是虚拟机),然后在虚拟机里运行 Docker 。
    2. 基本认同 @ysc3839 的方案,我也采用自己跑个 Linux 虚拟机的方案,但是本质上区别不大。
    3. 关于内存问题,如果指的是整个 Docker 的内存占用(其实就是虚拟机的内存占用)确实有可能没法立马恢复(这要看他虚拟机的具体设计,我确实不太了解)。mac 上 Docker 这种实质上在虚拟机里跑的方案,天生就注定了不太适合做需要很高性能的事情。
    4. xgboost 我确实没研究过,但是经常报错可能有以下可能:
    ( 1 )内存不够,被 Linux 的 OOM kill ,我觉得最大的可能是这个(不可能占满 16G 的,你的 Mac 系统自身就占了不少)
    ( 2 ) arm 适配不足,可能适配了,但没完全适配,导致某些情况会报错

    总结:
    1. 用 arm 的 mac 做这个事情确实不太合适(兼容性、性价比)
    2. 性价比最高的可能是搞个 Linux 机器,退而求其次 Windows+WSL2 的方案也不错,我就试过在 WSL2+Docker 的环境调用 CUDA ,效果不错
    ConfusedBiscuit
        8
    ConfusedBiscuit  
       163 天前
    补充一下,我尝试 WSL2+Docker 的环境调用 CUDA 的时候,也有内存问题,但是由于我机器 64G 内存,跑模型的时候 WSL2 最高占用过 32G 。所以 OP 可以试着换 64G 内存的 mac 试试,16G 再套个虚拟机确实是有点儿不够。
    superchijinpeng
        9
    superchijinpeng  
       163 天前
    orbstack
    yinmin
        10
    yinmin  
       163 天前
    mac 跑 docker 和 linux 跑 docker 不一样。linux 跑 docker 是进程级别的隔离,默认可以用 linux 所有内存和 CPU ; mac 跑 docker 是用虚拟机,默认好像是分配 2GB 内存。

    你到 docker - preferences - resources 里看看是否可以调整内存量。
    ggp1ot2
        11
    ggp1ot2  
    OP
       163 天前
    @ConfusedBiscuit 非常感谢,我本以为,开虚拟机就需要 VMware 等软件,可能会更耗内存

    其次,我使用 docker 的原因是经常需要切换 python 和相关包的版本,可以通过 dockerfile 来控制,方便和同事交接

    看来确实可能是 16G 的内存的问题,因为切小数据集就可以跑动的了,本以为最新的 mbp 即使内存 16G 也很能打

    可能确实用 mac 做算法,不是一件高性价比的事情

    再次感谢
    yinmin
        12
    yinmin  
       163 天前
    docker - preferences - resources 的内存不能拉满的,建议改成 8GB 、10GB 、12GB 依次试试是否有改善。
    cdlnls
        13
    cdlnls  
       163 天前
    记得 macos 版本的 docker 是可以设置 vm 虚拟机的内存大小的,可以看看设置里面
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4707 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:00 · PVG 12:00 · LAX 20:00 · JFK 23:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.