【问题标题】:requirements.txt - How to mark alternative packagesrequirements.txt - 如何标记替代包
【发布时间】:2018-11-15 09:17:44
【问题描述】:

我正在编写一个依赖于tensorflow 的项目,但这可以由两个pip 包中的任何一个提供:tensorflowtensorflow-gpu。我的项目可以正常工作,但我不希望人们在没有 gpu 支持的机器上运行它必须安装额外的开销,但我仍然希望在支持 gpu 的机器上运行的人能够利用它。有没有办法在我的 requirements.txt 文件中标记我需要 either tensorflow tensorflow-gpu 但不是两者都需要?

编辑:

在这种特定情况下,我应该注意,从程序员的的角度来看,tensorflowtensorflow-gpu 是相同的,因为它们都提供了一个具有相同功能的模块tensorflow /classes/methods 等,唯一的区别在于tensorflow-gpu 受益于 GPU 加速。我遇到的问题是,如果我将tensorflow 放在requirements.txt 中,那么为了使用GPU 加速运行,用户将不得不使用pip install -r requirements.txt && pip uninstall tensorflow && pip install tensorflow-gpu,这并不理想,如果我将tensorflow-gpu 放在@ 中987654336@,那么它将需要一堆不必要的系统库(CUDNN 等),并且对于非 gpu 用户无法开箱即用。

再次编辑

作为一种变通方法,我决定提供两个不同的需求文件,requirements.txtrequirements-gpu.txt,它们都包含一个共享的 -r .requirements-core.txt,并添加了各自版本的 tensorflow。这样,需要 GPU 支持的人可以pip install -r requirements-gpu.txt,但标准的pip install -r requirements.txt 仍然适用于所有人。

【问题讨论】:

  • 没办法。 pip 是一个相当简单的包管理器,requirements.txt 只是一个简单的依赖项列表。 requirements.txt 中的条件可以为 Python 版本或架构设置,仅此而已。完全没有改动。

标签: python tensorflow pip


【解决方案1】:

您不能使用requirements.txt 调节下载包,但您可以执行以下解决方案之一:

1 - 将 tensorflow 和 tensorflow-gpu 包安装为依赖项,然后尝试 / except 以选择实际使用的包,例如:

tensorflow = null

try:
  tensorflow = __import__("tensorflow-gpu")
  tensorflow.operation_that_requires_gpu()
except:
  tensorflow = __import__("tensorflow")
enter code here

2 - 在您的项目中,您要求客户将依赖项直接传递给您:

def my_function_that_uses_tensorflow(tensorflow):
  # do stuff

from my_module import my_function_that_uses_tensorflow
import tensorflow # or tensorflow = __import__("tensorflow-gpu")
my_function_that_uses_tensorflow(tensorflow)

3 - 如果 tensorflow-gpu 和 tensorflow 都在您的站点包上使用相同的 tensorflow 名称安装它们的包,那么我的建议是尝试 /except 正如我在选项 1 中所说的那样,但不包括tensorflow-gpu 或 tensorflow 作为包的依赖项(将其视为“对等依赖项”,使用包的代码应将其作为依赖项包含在内):

try:
  import tensorflow
except:
  raise ImportError('You need to include tensorflow or tensorflow-gpu as a dependency in order to use this package')

【讨论】:

  • 在这种特定情况下,这些步骤没有用,因为从程序员的角度来看,tensorflowtensorflow-gpu 的作用相同(即它们都提供了一个具有相同功能/类的模块 tensorflow /方法/等)。但是,这对于一般情况很有用。
  • @phsyron 我的第二个建议比可行,要求用户包含正确的 tensorflow lib 作为依赖项(就像您的 lib 的对等依赖项)并将其作为参数传递给您或者只是尝试import tensorflow 在你的 lib 上使用 try / except 并说如果缺少正确的 tensorflow 作为他的依赖项,用户必须包含它
【解决方案2】:

已经有一些关于此类功能的提案,但目前 pip 环境变量中不存在此功能:

...目前 PEP 508 不提供环境 GPU / CUDA可用性的标记,这会导致问题 想要为具有和的环境提供分发的项目 没有 GPU 支持。

据我所知,有很多建议可以带这个 向 distutils-sig 提出问题,但实际上没有人这样做。

相关问题:

有一个专门用于 TensorFlow 的第三方库,但它有自己的一套注意事项:

现在有一个第三方项目试图修改这个 tensorflow (https://github.com/akatrevorjay/tensorflow-auto-detect) 但这种方法有些脆弱(取决于版本号是否同步),不能直接扩展到所有类似的项目,并且需要给定项目的维护者维护三个单独的项目,而不仅仅是一个。

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2010-10-28
    相关资源
    最近更新 更多