使用 Conda + Poetry 有意义吗?

Seu*_*eub 163 python machine-learning package conda python-poetry

使用 Conda + Poetry 进行机器学习项目有意义吗?让我分享一下我(新手)的理解,请指正或赐教:

据我了解,CondaPoetry有不同的目的,但很大程度上是多余的:

  • Conda主要是一个环境管理器(实际上不一定是Python),但它也可以管理包和依赖项。
  • Poetry 主要是一个 Python 包管理器(例如pip的升级),但它也可以创建和管理 Python 环境(例如Pyenv的升级)。

我的想法是同时使用两者并划分它们的角色:让 Conda 担任环境管理器,让 Poetry 担任包管理器。我的推理是(听起来)Conda 最适合管理环境,可用于编译和安装非 python 包,尤其是 CUDA 驱动程序(用于 GPU 功能),而 Poetry 作为 Python 包管理器比 Conda 更强大。

通过在 Conda 环境中使用 Poetry,我成功地相当轻松地完成了这项工作。诀窍是不要使用 Poetry 来管理 Python 环境:我没有使用poetry shellor poetry run、 onlypoetry init等命令poetry install(激活 Conda 环境后)。

为了充分披露,我的environment.yml文件(针对Conda)如下所示:

name: N

channels:
  - defaults
  - conda-forge

dependencies:
  - python=3.9
  - cudatoolkit
  - cudnn
Run Code Online (Sandbox Code Playgroud)

我的诗歌.toml文件如下所示:

[tool.poetry]
name = "N"
authors = ["B"]

[tool.poetry.dependencies]
python = "3.9"
torch = "^1.10.1"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
Run Code Online (Sandbox Code Playgroud)

老实说,我这样做的原因之一是我在没有 Conda 的情况下很难安装 CUDA(用于 GPU 支持)。

您认为这个项目设计合理吗?

mic*_*hau 206

我有 Conda + Poetry 设置的经验,并且运行良好。我的绝大多数依赖项都在 中指定pyproject.toml,但是当 PyPI 中没有某些东西时,或者使用 Conda 安装它更容易时,我将其添加到 中environment.yml。而且,Conda 用作虚拟环境管理器,与 Poetry 配合良好:无需使用poetry runpoetry shell,激活正确的 Conda 环境就足够了。

创建可重现环境的技巧

  1. 添加 Poetry(可能带有版本号(如果需要))作为 中的依赖项environment.yml,以便在运行 时安装 Poetryconda create以及 Python 和其他非 PyPI 依赖项。
  2. Add conda-lock,它为您提供 Conda 依赖项的锁定文件,就像poetry.lockPoetry 依赖项的锁定文件一样。
  3. 考虑使用mamba通常与 兼容conda,但更能解决冲突,而且速度也快得多。另一个好处是,您的设置的所有用户都将使用相同的包解析器,独立于本地安装的 Conda 版本。
  4. 默认情况下,使用 Poetry 添加 Python 依赖项。如果有理由这样做(例如为了获得支持 CUDA 的版本),请通过 Conda 安装软件包。在这种情况下,最好在 中指定软件包的确切版本environment.yml,并在安装后,向 Poetry 添加具有相同版本规范的条目pyproject.toml(不带版本号^~在版本号之前)。这会让 Poetry 知道该软件包已经存在并且不应升级。
  5. 如果您使用提供相同软件包的不同渠道,则从哪个渠道下载特定软件包可能并不明显。一种解决方案是使用 :: 符号指定包的通道(请参阅pytorch下面的条目),另一种解决方案是启用严格的通道优先级。不幸的是,在 Conda 4.x 中,无法通过environment.yml.
  6. 请注意,Python 将用户站点包添加到sys.path,如果用户在 Conda 环境之外安装了 Python 包,则可能会导致缺乏重现性。一种可能的解决方案是确保PYTHONNOUSERSITE环境变量设置为True(或任何其他非空值)。

例子

environment.yml:

name: my_project_env
channels:
  - pytorch
  - conda-forge
  # We want to have a reproducible setup, so we don't want default channels,
  # which may be different for different users. All required channels should
  # be listed explicitly here.
  - nodefaults
dependencies:
  - python=3.10.*  # or don't specify the version and use the latest stable Python
  - mamba
  - pip  # pip must be mentioned explicitly, or conda-lock will fail
  - poetry=1.*  # or 1.1.*, or no version at all -- as you want
  - tensorflow=2.8.0
  - pytorch::pytorch=1.11.0
  - pytorch::torchaudio=0.11.0
  - pytorch::torchvision=0.12.0

# Non-standard section listing target platforms for conda-lock:
platforms:
  - linux-64
Run Code Online (Sandbox Code Playgroud)

virtual-packages.ymlconda-lock(例如,当我们想要生成启用 CUDA 的锁定文件时,即使在没有 CUDA 的平台上也可以使用):

subdirs:
  linux-64:
    packages:
      __cuda: 11.5
Run Code Online (Sandbox Code Playgroud)

首次设置

conda-lock如果您有,mamba并且poetry已经安装在目标环境之外,您可以避免使用 bootstrap env 并简化下面的示例。

# Create a bootstrap env
conda create -p /tmp/bootstrap -c conda-forge mamba conda-lock poetry='1.*'
conda activate /tmp/bootstrap

# Create Conda lock file(s) from environment.yml
conda-lock -k explicit --conda mamba
# Set up Poetry
poetry init --python=~3.10  # version spec should match the one from environment.yml
# Fix package versions installed by Conda to prevent upgrades
poetry add --lock tensorflow=2.8.0 torch=1.11.0 torchaudio=0.11.0 torchvision=0.12.0
# Add conda-lock (and other packages, as needed) to pyproject.toml and poetry.lock
poetry add --lock conda-lock

# Remove the bootstrap env
conda deactivate
rm -rf /tmp/bootstrap

# Add Conda spec and lock files
git add environment.yml virtual-packages.yml conda-linux-64.lock
# Add Poetry spec and lock files
git add pyproject.toml poetry.lock
git commit
Run Code Online (Sandbox Code Playgroud)

用法

上面的设置可能看起来很复杂,但可以以相当简单的方式使用。

创造环境

conda create --name my_project_env --file conda-linux-64.lock
conda activate my_project_env
poetry install
Run Code Online (Sandbox Code Playgroud)

激活环境

conda activate my_project_env
Run Code Online (Sandbox Code Playgroud)

更新环境

# Re-generate Conda lock file(s) based on environment.yml
conda-lock -k explicit --conda mamba
# Update Conda packages based on re-generated lock file
mamba update --file conda-linux-64.lock
# Update Poetry packages and re-generate poetry.lock
poetry update
Run Code Online (Sandbox Code Playgroud)

  • @JamesOwers Poetry 正在安装到 Conda 环境中。[Poetry 检测 Conda env 何时被激活](https://github.com/python-poetry/poetry/blob/master/src/poetry/utils/env.py#L675),并且不会创建 venv 。这可能也适用于全局安装的 Poetry,但我认为最好在“environment.yml”中指定 Poetry 并将其安装在 Conda env 中,以便明确列出所有项目依赖项并可以跟踪它们的版本。 (13认同)
  • Poetry 是安装到 conda 环境中,还是它自己的虚拟环境中?我看到你没有改变`poetry config`,例如设置`poetry config virtualenvs.create false --local`,所以我假设诗歌会创建自己的venv?如果不是,是什么阻止了诗歌的发展?如果诗歌是全局安装的(而不是在 conda 环境中),这种行为是否会相同? (6认同)
  • 正如 @JamesOwers 指出的,在与项目相同的虚拟环境中安装 Poetry 通常是一个非常糟糕的主意,因为它最终会导致依赖关系问题。此信息显示在 Poetry 安装指南开头的[大红色警告](https://python-poetry.org/docs/#installation) 中。 (3认同)
  • @JamesOwers 它相当于 `conda install诗='1.*' -c conda-forge`。至于可能存在的依赖冲突,那么,这是实际中发生的问题吗?我没有遇到过这样的问题。在项目外部安装 Poetry 的缺点是,您无法强制执行特定版本,这意味着不同的项目贡献者可能会使用不同版本的 Poetry,其解析器、解析/更新 pyproject.toml/ 的方式略有不同诗歌.conf,不同的错误等。这是我在实践中遇到的。 (2认同)
  • FWIW,现在 Tensorflow 安装说明[建议使用 pip(例如诗歌)安装 Tensorflow](https://www.tensorflow.org/install/pip#step-by-step_instructions)。我按照这个答案中的描述使用 conda +诗歌设置对此进行了测试(除了使用诗歌而不是 conda 来安装“tensorflow”),并且它在 Nvidia GPU 加速下工作得很好!我只需要 conda 来安装 `cudatoolkit`,否则我可以完全摆脱 conda。 (2认同)
  • conda lock 已更新,将 `conda-lock -k显式 --conda mamba` 替换为以下 `conda-lock -fenvironment.yml -p linux-64 -p <if any> --conda mamba` (2认同)

小智 9

对于任何使用@michau 的答案但遇到包括诗歌在内的问题的人environment.yml。目前, conda-forge 不支持诗歌版本 1.2 或更高版本。您仍然可以将诗歌 v1.2 包含在.yml以下内容中作为替代:

dependencies:
  - python=3.9.*
  - mamba
  - pip 
  - pip:
    - "poetry>=1.2"
Run Code Online (Sandbox Code Playgroud)

  • `conda create -n <your_name> -c conda-forge python century=1.3` 对我有用。 (4认同)