在 Docker 中使用 Tensorflow 1.4 的 GAN 训练停止而不提示并且不释放通过 SSH 连接连接到 VM 的内存

Ahw*_*war 1 ssh nvidia python-2.7 docker tensorflow

项目详情

我正在运行基于 GAN 的研究论文的开源代码,名为“Investigating Generative Adversarial Networks based Speech Dereverberation for Robust Speech Recognition”
源代码:这里
的依赖项包括:

  • 蟒蛇 2.7
  • TensorFlow 1.4.0

我在我的 GPU 虚拟机上使用 python 2.7 拉了一个 TensorFlow 1.4.0 的 Docker 镜像,使用以下命令连接 ssh 连接:

docker pull tensorflow/tensorflow:1.4.0-gpu
Run Code Online (Sandbox Code Playgroud)

我在跑步

bash rsrgan/run_gan_rnn_placeholder.sh
Run Code Online (Sandbox Code Playgroud)

根据源代码的自述文件

问题详情

一切正常,模型正在训练,损失在减少,但只有一个问题,经过一些迭代终端显示没有输出,GPU仍然显示PID但没有释放内存,有时GPU-Utils变为0%。在 VM 的 GPU 和 CPU 上进行训练是相同的情况。这不是内存问题 因为按型号划分的 GPU 内存使用量为 11,000MB 中的 5400MB,而且 CPU 的 RAM 也非常大

nvidia-smi 输出

当我在本地计算机上运行 21 次迭代时,每次迭代用 0.09 小时使用第一代 i5 和 4GB RAM 执行所有迭代。但是每当我在 docker 中使用 ssh 运行它时,GPU 和 CPU 都会一次又一次地发生问题。请记住,问题发生在 docker 内部,计算机与 ssh 连接,ssh 也不会经常断开连接。

准确数字

如果迭代需要 1.5 小时,那么问题会在 2 到 3 次迭代后发生,如果单次迭代需要 0.06 小时,那么问题恰好在 25 次迭代中的 14 次之后发生

Ris*_* P. 5

在 Docker 容器内执行操作

您可以尝试的第一件事是构建 Docker 映像,然后通过在命令中指定-ti标志或/bin/bash参数来进入 Docker 容器docker run

克隆容器内的存储库,在构建映像时,您还应该将训练数据从本地复制到 docker 内。在那里运行训练和commit更改,以便您在退出容器后无需在以后的运行中重复这些步骤,如果未提交,所有更改都将丢失。

您可以在此处找到 docker commit 的参考。

$ docker commit <container-id> <image-name:tag>

在训练过程中检查 VM 的 GPU 和 CPU 利用率,看看是否一切都按预期工作。

在您的虚拟机上使用 Anaconda 环境

Anaconda 是一个很棒的包管理器。您可以安装 anaconda 并创建一个虚拟环境并在virtual environment.

$ wget <url_of_anaconda.sh>

$ bash <path_to_sh>

$ source anaconda3/bin/activate or source anaconda2/bin/activate

$ conda create -n <env_name> python==2.7.*

$ conda activate <env_name>

通过conda(推荐)或pip.

运行你的代码。

Q1:在 Docker 中使用 Tensorflow 1.4 进行的 GAN 训练在没有提示的情况下停止

尽管 Docker 在 Docker 内部提供了操作系统级别的虚拟化,但我们在运行一些在系统上轻松运行的进程时会遇到问题。因此,要调试问题,您应该进入图像并执行上述步骤以调试问题。

Q2:在没有释放通过 SSH 连接连接到 VM 的内存的情况下训练停止

是的,这也是我之前遇到的问题。释放内存的最佳方式是停止 Docker 容器。您可以在此处找到更多资源分配选项。

此外,早期版本的 TensorFlow 在正确分配和清除内存方面存在问题。你可以在这里这里找到一些参考。这些问题已在最新版本的 TensorFlow 中得到修复。


此外,检查 Nvidia 错误报告

步骤1:Nvidia-utils通过以下命令安装安装。您可以从 nvidia-smi 输出中找到驱动程序版本(问题中也提到了。)

$ sudo apt install nvidia-utils-<driver-version>

第二步:运行nvidia-bug-report.sh脚本

$ sudo /usr/bin/nvidia-bug-report.sh

日志文件将在您当前的工作目录中生成,名称为nvidia-bug-report.log.gz。此外,您可以在 访问安装程序日志/var/log/nvidia-installer.log

您可以在以下链接中找到有关 Nvidia 日志的其他信息:

希望这可以帮助。

  • 你好!我以为你已经创建了一个 Dockerfile 来执行所有步骤,然后你正在运行它。但实际上您是在手动进入容器后运行 bash 脚本,对吧?另外,您是否尝试过在 conda 环境中运行脚本? (2认同)
  • 你好!在答案中添加了有关 Nvidia 日志文件的一些详细信息。希望您会发现它很有用。欢迎在下面发表评论。 (2认同)