TensorFlow2运行TF1程序并解决GPU无法使用的问题

TensorFlow2运行TF1程序并解决GPU无法使用的问题

实验室机器预装了CUDA11.0,可以兼容最新的PyTorch1.8和TensorFlow2,但因为复现一些论文,需要运行TensorFlow1的代码。

环境:

  • Ubuntu18.04
  • CUDA11.0
  • TensorFlow2.4.1

在上述背景下先后出现三个问题:

  1. TF2相较TF1修改了一系列接口,TF1代码所使用的接口很多在TF2被废弃
  2. 出现报错:RuntimeError:tf.placeholder() is not compatible with eager execution
  3. TF1本身并不能兼容CUDA11.0,导致无法使用GPU

问题1.新版本废弃了旧版本接口

首先,TensorFlow官方给出了TF2运行TF1程序的旧版本接口:

// 在引入模块时,将原本的
import tensorflow as tf
// 改为
import tensorflow.compat.v1 as tf

这样旧版本接口都可以使用。


问题2.RuntimeError:tf.placeholder() is not compatible with eager execution

这一类错误的原因是虽然使用了TF1的接口,但底层部分代码的运行逻辑仍然是新版本的TF2,因此有下面两个解决办法:(此处参考了这篇博客)

  1. 小范围解决,仅针对RuntimeError:tf.placeholder() is not compatible with eager execution报错。找到报错所在的代码行,在其上方添加这样一行代码:
    tf.disable_eager_execution()
    
    关闭紧急执行后上面的报错就可以消失。
  2. 大范围解决,针对所有因为TF2底层运行特性不兼容旧版本接口的问题。在引入模块之后加入禁用TF2新特性:
    import tensorflow.compat.v1 as tf
    tf.disable_v2_behavior()
    
    但这种方式的缺陷在于,可能引入开篇提到的第三个问题,即TF1无法兼容CUDA11.0导致不能使用GPU。

问题3.改用TF1后无法使用GPU

如上文分析,TF1无法兼容CUDA11.0,此时有两种解决方案,一是直接安装TF1能够兼容的CUDA版本,在Ubuntu下不同的CUDA版本可以并存,通过修改软连接可以切换。详细的步骤请自行查阅其他博客,在此不叙述。

比较简单的方法二,非常魔幻,只需要在TF1程序运行前使用TF2接口调用GPU检查即可,具体原理不详:

import tensorflow.compat.v1 as tf
import tensorflow as tf2
tf2.test.is_gpu_available()

开头会打印一些GPU的信息,而整个程序里TF1代码也开始使用GPU运行。

你可能感兴趣的:(杂记,tensorflow)