我正在尝试使用TF预先构建的C_API将TF2.Keras模型交付给用户计算机(Win / Linux / Mac)作为大型现有应用程序的一部分(不想为C ++重新编译TF2)。最初仅针对CPU,尽管最终需要GPU。
该代码必须能够按需以任何顺序快速运行许多不同的神经网络之一。 (实时代码是多线程的;我假设它们将必须贯穿关键部分,或者必须转换为单个启动器线程)
我正在努力学习TF2并弄清楚交付TF2模型的过程是什么,因为似乎没有使用有用且众所周知的TF1冻结模型方法。
SaveModel似乎是当前建议,尽管它保存到文件的整个目录,这对于几乎每个度量标准都是不希望的。 我需要能够从内存或至多单个外部文件中加载模型。
如何将训练模型转换为推理模型?重建它并将权重作为常量而不是变量进行传递?对此有任何TF2帮助吗?
能否对模型进行充分的处理,以使SaveModel仅生成.pb文件?
如何强制输入和输出张量始终具有预定义的名称? (即不基于图层类型。)代码必须独立于模型,以便可以为特定功能选择不同的网络,而无需知道其内部结构是什么。并且可以随时替换模型。
似乎您应该使用@ tf.function和AutoGraph来简化用法(来自C_API)?
如果是这样,@ tf.function可以使用Model.predict()吗?或者我该如何从模型各层通用地生成该函数?
要在C_API中驱动网络,必须执行哪些操作?我将在CPU内存中放置TF_Tensors来驱动模型并接收输出。从概念上讲,它就像一个函数调用。
预编译的C_API库使用哪些编译器选项?需要哪种机器功能,或者库在内部选择合适的代码路径? (例如,对于AVX和非AVX机器。)
对于GPU库...存在CUDA10依赖性,但CUDA10已被取代。最终用户可能正在使用需要其他版本CUDA的其他软件。这些可以并排吗?有没有合理的方法来提供带有GPU支持的TF?即使从理论上讲,为不同的机器/ CUDA版本编译TF2并为应用程序的多个变体中的每一个提供不同的版本都是不可行的。
如果使用C_API GPU版本,那么如果存在GPU,API会做任何事情来利用GPU吗?一个以上呢?即是库处理将模型放到GPU上,还是应用程序必须注意到GPU并决定如何使用它们?