首页 > 解决方案 > 有时会收到错误“err == cudaSuccess || err == cudaErrorInvalidValue Unexpected CUDA error: out of memory”

问题描述

我对如何解决我的特定问题非常迷茫,这就是为什么我遵循对象检测 API中的获取帮助指南并在 Stack Overflow 上发表了一篇文章。

一开始,我的目标是在 Azure 上运行分布式训练作业。我以前gcloud ai-platform jobs submit training非常轻松地使用过运行分布式作业,但在 Azure 上有点困难。

我从此处的 dockerfile 为对象检测 API 构建了 tf1 docker 映像。

我有一个包含以下节点的集群(Azure Kubernetes 服务/AKS 集群):

4x Standard_DS2_V2 nodes
8x Standard_NC6 nodes

在 Azure 中,NC6节点是每个由单个 K80 GPU 支持的 GPU 节点,而DS2_V2是典型的 CPU 节点。

我使用TFJob使用以下副本设置来配置我的作业:

Master (limit: 1 GPU) 1 replica
Worker (limit: 1 GPU) 7 replicas
Parameter Server (limit: 1 CPU) 3 replicas

这是我的难题:作业失败,因为其中一名工人抛出以下错误:

tensorflow/stream_executor/cuda/cuda_driver.cc:175] Check failed: err == cudaSuccess || err == cudaErrorInvalidValue Unexpected CUDA error: out of memory

我随机尝试减少工人的数量,令人惊讶的是,这项工作奏效了。只有当我有3 个或更少的 Worker 副本时它才有效。虽然花费了很多时间(一天多一点),但该模型可以在 1 个 Master 和 3 个 Workers 的情况下成功完成训练

这有点令人烦恼,因为即使集群分配了 8 个 GPU,我也最多只能使用 4 个 GPU。我又跑了一个测试:当我的集群有 3 个 GPU 节点时,我只能成功运行 1 个 Master 和 1 个 Worker 的作业!似乎由于某种原因我无法充分利用 GPU。

最后,我遇到了另一个问题。上述运行是使用非常少量的数据(约 150 Mb)完成的,因为它们是测试。后来我用更多的数据(大约 12 GiB)运行了一项适当的工作。尽管集群有 8 个 GPU 节点,但只有 1 个 Master 和 1 个 Worker 才能成功完成工作。

将 Worker 副本数增加到 1 以上会立即导致与上述相同的 cuda 错误。

我不确定这是基于对象检测 API 的问题,还是由 Kubeflow/TFJob 引起的,或者即使它是 Azure 特定的问题。我在 Kubeflow 页面上打开了一个类似的问题,但我现在也在看看是否可以从对象检测 API 社区获得一些指南。如果您需要任何进一步的详细信息(例如用于培训的 tfjob yaml 或 pipeline.config)或有任何疑问,请在评论中告诉我。

标签: tensorflowobject-detection

解决方案


它可能与 API 使用的批量大小有关。
尝试控制批量大小,可能如本答案所述: https ://stackoverflow.com/a/55529875/2109287


推荐阅读