解决在Docker或者Kubernetes中使用PyTorch训练深度学习模型共享内存不足的问题

简介: 异常信息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。

参考文档

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
984 108
|
4月前
|
机器学习/深度学习 算法 PyTorch
125_训练加速:FlashAttention集成 - 推导注意力优化的独特内存节省
2025年,大型语言模型的训练面临着前所未有的挑战。随着模型参数量和序列长度的不断增加,传统注意力机制的内存瓶颈问题日益突出。FlashAttention作为一种突破性的注意力算法,通过创新的内存访问模式和计算优化,显著提升了训练效率和内存利用。
|
5月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
2001 10
|
4月前
|
存储 机器学习/深度学习 PyTorch
119_LLM训练的高效内存管理与优化技术:从ZeRO到Flash Attention
大型语言模型(LLM)的训练面临着前所未有的计算和内存挑战。随着模型规模达到数百亿甚至数千亿参数,高效的内存管理成为训练成功的关键因素之一。2025年,LLM训练的内存优化技术已经取得了显著进展,从ZeRO优化器到Flash Attention等创新技术,为训练超大规模模型提供了可能。
|
4月前
|
Java 大数据 Go
从混沌到秩序:Java共享内存模型如何通过显式约束驯服并发?
并发编程旨在混乱中建立秩序。本文对比Java共享内存模型与Golang消息传递模型,剖析显式同步与隐式因果的哲学差异,揭示happens-before等机制如何保障内存可见性与数据一致性,展现两大范式的深层分野。(238字)
121 4
|
5月前
|
机器学习/深度学习 存储 PyTorch
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
Neural ODE将神经网络与微分方程结合,用连续思维建模数据演化,突破传统离散层的限制,实现自适应深度与高效连续学习。
373 3
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
|
4月前
|
边缘计算 人工智能 PyTorch
130_知识蒸馏技术:温度参数与损失函数设计 - 教师-学生模型的优化策略与PyTorch实现
随着大型语言模型(LLM)的规模不断增长,部署这些模型面临着巨大的计算和资源挑战。以DeepSeek-R1为例,其671B参数的规模即使经过INT4量化后,仍需要至少6张高端GPU才能运行,这对于大多数中小型企业和研究机构来说成本过高。知识蒸馏作为一种有效的模型压缩技术,通过将大型教师模型的知识迁移到小型学生模型中,在显著降低模型复杂度的同时保留核心性能,成为解决这一问题的关键技术之一。
|
6月前
|
PyTorch 算法框架/工具 异构计算
PyTorch 2.0性能优化实战:4种常见代码错误严重拖慢模型
我们将深入探讨图中断(graph breaks)和多图问题对性能的负面影响,并分析PyTorch模型开发中应当避免的常见错误模式。
382 9
|
5月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
384 1