- 如果在启动TensorFlow程序时获得CUDA_ERROR_OUT_OF_MEMORY,可能会发生什么? 你能为这个做什么?
当TensorFlow进程启动时,它抓取所有可见的GPU设备上的所有可用内存,
因此,如果在启动TensorFlow程序时获得CUDA_ERROR_OUT_OF_MEMORY,则可能意味着正在运行的其他进程已经占用了至少一个可见GPU设备上的所有内存(很可能是另一个TensorFlow进程)。
要解决此问题,一个简单的解决方案是停止其他进程并再试一次。然而,如果你需要同时运行所有进程,
-
一个简单的选择是通过为每个设备适当地设置
CUDA_VISIBLE_DEVICES
环境变量,为每个进程专用不同的设备。 -
另一种选择是通过创建
ConfigProto
,将其gpu_options.per_process_gpu_memory_fraction
设置为应该抓取的总内存的比例(例如,0.4),并使用TensorFlow来仅抓取部分GPU内存而不是全部内存。并在打开会话时使用此ConfigProto
。 -
最后一个选项是告诉TensorFlow仅在需要时通过将
gpu_options.allow_growth
设置为True
来获取内存。
但是,通常不建议使用最后一个选项,因为TensorFlow抓取的任何内存都不会被释放,并且更难保证可重复的行为(可能存在竞争条件,具体取决于首先开始的进程,训练期间需要多少内存,等等)。
- 在设备上固定操作和在设备上放置操作之间有什么不同?
通过在设备上固定操作,你告诉TensorFlow,这是你希望放置此操作的位置。但是,某些约束可能会阻止TensorFlow尊重你的请求。
-
例如,该操作可能没有针对该特定类型的设备的实现(称为内核)。在这种情况下,默认情况下,TensorFlow会引发异常,但你可以将其配置为回退到CPU(这称为软放置)。
-
另一个例子是可以修改变量的操作; 此操作和变量需要并置。
因此,固定操作和放置操作之间的区别在于
- 固定是你请求TensorFlow(“Please place this operation on GPU #1”),
- 放置是TensorFlow实际上最终做的事情(““Sorry, falling back to the CPU””) )。
- 如果你在支持GPU的TensorFlow安装上运行,并且只使用默认位置,那么所有操作都将放在第一个GPU上吗?
-
如果你在支持GPU的TensorFlow安装上运行,并且你只使用默认位置,那么如果所有操作都具有GPU内核(即,GPU实现),是的,它们都将被放置在第一个GPU上。
-
但是,如果一个或多个操作没有GPU内核,则默认情况下TensorFlow将引发异常。
-
如果你将TensorFlow配置为回退到CPU(软放置),那么除了没有GPU内核的所有操作以及必须与它们并置的所有操作之外,所有操作都将放置在第一个GPU上(参见上一练习的答案)。
- 如果将变量固定为“/ gpu:0”,是否可以将其放在/ gpu:1上的操作中使用?
或者通过“/ cpu:0”上的操作? 或者通过固定到位于其他服务器上的设备的操作?
是的,如果将变量固定为“/ gpu:0”,则可以将其放在/ gpu:1上的操作中使用。 TensorFlow将自动负责添加适当的操作以跨设备传输变量的值。位于不同服务器上的设备也是如此(只要它们是同一集群的一部分)。
- 同一设备上的两个操作可以并行运行吗?
是的,放在同一设备上的两个操作可以并行运行:
-
只要没有操作依赖于另一个操作,TensorFlow自动并行处理运行操作(在不同的CPU内核或不同的GPU线程上)只要没有操作依赖于另一个操作的输出。
-
此外,你可以在并行线程(或进程)中启动多个会话,并评估每个线程中的操作。
由于会话是独立的,因此TensorFlow将能够与来自另一个会话的任何操作并行地评估来自一个会话的任何操作。
- 什么是控件依赖关系以及何时使用它?
当你想要推迟对操作X
的评估时,使用控制依赖关系,直到运行其他一些操作之后,即使这些操作不需要计算X
.
当X
占用大量内存并且稍后只需要在计算图中,或者如果X
占用大量I / O时,这非常有用(例如,它需要位于不同设备或服务器上的大变量值)并且你不希望它与其他 I/O-hungry 操作同时运行,以避免带宽饱和。
- 假设你在TensorFlow集群上训练了几天的DNN,并且在你的训练计划结束后立即意识到你忘记使用Saver保存模型。 你训练的模x型丢了吗?
你很幸运! 在分布式TensorFlow中,变量值存在于由集群管理的容器中,因此即使关闭会话并退出客户端程序,模型参数仍然存在并且在集群上很好。
你只需要打开一个新的会话到集群并保存模型(确保你没有调用变量初始化器或恢复以前的模型,因为这会破坏你宝贵的新模型!)。
网友评论