解决在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。

参考文档

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
20天前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
164 73
|
4天前
|
机器学习/深度学习 存储 人工智能
MNN:阿里开源的轻量级深度学习推理框架,支持在移动端等多种终端上运行,兼容主流的模型格式
MNN 是阿里巴巴开源的轻量级深度学习推理框架,支持多种设备和主流模型格式,具备高性能和易用性,适用于移动端、服务器和嵌入式设备。
41 18
MNN:阿里开源的轻量级深度学习推理框架,支持在移动端等多种终端上运行,兼容主流的模型格式
|
13天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
77 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
10天前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
63 19
|
21天前
|
人工智能 物联网 C语言
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
SVDQuant是由MIT研究团队推出的扩散模型后训练量化技术,通过将模型的权重和激活值量化至4位,显著减少了内存占用并加速了推理过程。该技术引入了高精度的低秩分支来吸收量化过程中的异常值,支持多种架构,并能无缝集成低秩适配器(LoRAs),为资源受限设备上的大型扩散模型部署提供了有效的解决方案。
43 5
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
|
23天前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品消费需求分析的深度学习模型
使用Python实现智能食品消费需求分析的深度学习模型
75 21
|
24天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费模式预测的深度学习模型
使用Python实现智能食品消费模式预测的深度学习模型
55 2
|
3月前
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
434 2
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
50 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
3月前
|
机器学习/深度学习 自然语言处理 监控
利用 PyTorch Lightning 搭建一个文本分类模型
利用 PyTorch Lightning 搭建一个文本分类模型
89 7
利用 PyTorch Lightning 搭建一个文本分类模型

热门文章

最新文章