tensorflow - tf.test.is_gpu_available() 在子进程中为 False,但在主进程中为 True
问题描述
我目前正在运行一个 pytorch 模型,该模型会定期调用 tensorflow 模型以进行基准测试。我希望这两个模型都支持 GPU 并在同一个脚本中运行。由于 tensorflow 基准测试代码要求 GPU 内存直到流程结束,我选择在运行基准测试代码时运行基准测试代码,multiprocessing.Process
以便我的 pytorch 模型可以在基准测试脚本运行后使用完整的 GPU 内存。
在此期间,我在 tensorflow 的 gpu 利用率中偶然发现了一个不寻常的错误(?)。似乎在子进程中运行的 tensorflow 不想使用已被父进程使用的 GPU。我可以在同一个 GPU 中拥有 tensorflow 模型和 pytorch 模型,并且进程没有问题,但是当我引入子进程时,tensorflow 表现不佳。
我
tensorflow-gpu==1.14.0
torch==1.1.0
cudatoolkit=10.0
在 NVIDIA 2080-Ti 上运行。
以下是截取的最小代码以重现:
import torch
import tensorflow as tf
from multiprocessing import Process
def f():
print(tf.test.is_gpu_available())
pa = Process(target=f, args=())
pa.start()
pa.join()
torch.ones(1).cuda()
pb = Process(target=f, args=())
pb.start()
pb.join()
>>> True
>>> False
解决方案
对于遇到此问题的任何人,您需要致电multiprocessing.set_start_method('spawn')
. Tensorflow 不是分叉安全的,全局变量/模块可能会发生一些奇怪的事情,这可能很难推理。请记住只在支票内调用一次if __name__ == '__main__':
。
推荐阅读
- javascript - 阻止我的网站在 Internet Explorer 中运行
- python - Pandas 将一个 df 与另一个部分匹配,并根据匹配返回一个代码
- google-sheets - 如何在谷歌电子表格中使用两个标准来计算?
- bots - 让我的 Telegram 机器人使用我的凭据转发消息
- python-imaging-library - 使用 Python 图像库进行 Discord.py 图像编辑仅适用于某些图片?
- git - Ubuntu 20 上的 SSH 密钥不适用于任何 Git Repo
- azure-devops - Azure 管道,多阶段 YAML 管道,在构建服务器上使用相同的工作目录。怎么不腐败
- r - 在带有表格的r中使用“for”循环
- fullcalendar - 单击事件时出现 FullCallendar 刷新页面的问题
- excel - Excel VBA:对于每一行,生成新工作表并将行复制到新工作表