使用 Conda + 诗歌有意义吗?

在机器学习项目中使用 Conda + 诗歌有意义吗?请允许我分享我的(新手)理解,并请纠正或启发我:

据我所知,康达诗歌有不同的用途,但基本上是多余的:

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

我的想法是使用和划分他们的角色: 让孔达是环境经理和诗歌的包管理。我的理由是(听起来像是) Conda 最适合管理环境,可以用于编译和安装非 Python 包,特别是 CUDA 驱动程序(用于 GPU 功能) ,而作为一个 Python 包管理器,Song 比 Conda 更强大。

我已经设法使这个工作相当容易通过使用在康达环境中的诗歌。诀窍是不要使用适用于 Python 环境的 Song: 我不使用诸如 poetry shellpoetry run之类的命令,只使用 poetry initpoetry install等命令(在激活 Conda 环境之后)。

为了充分披露,我的 环境保护署文件(针对 Conda)看起来如下:

name: N


channels:
- defaults
- conda-forge


dependencies:
- python=3.9
- cudatoolkit
- cudnn

我的 诗歌 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"

老实说,我这样做的原因之一是,我正在努力安装 CUDA (为 GPU 支持)没有 Conda。

你觉得这个项目的设计合理吗?

22252 次浏览

我有一个康达 + 诗歌设置的经验,它一直运行良好。我的大部分依赖项都是在 pyproject.toml中指定的,但是如果 PyPI 中有不可用的东西,或者使用 Conda 安装它比较容易,我就将它添加到 environment.yml中。此外,Conda 作为一个虚拟环境管理器使用,这与诗歌很好地工作: 没有必要使用 poetry runpoetry shell,它足以激活正确的 Conda 环境。

创建可再生环境的技巧

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

例子

返回文章页面

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

virtual-packages.yml(当我们希望 conda-lock生成支持 CUDA 的锁文件时,即使在没有 CUDA 的平台上也可以使用) :

subdirs:
linux-64:
packages:
__cuda: 11.5

第一次安装

如果您已经在目标环境之外安装了 conda-lockmambapoetry,那么您可以避免使用引导环境并简化下面的示例。

# 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

用法

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

创造环境

conda create --name my_project_env --file conda-linux-64.lock
conda activate my_project_env
poetry install

激活环境

conda activate my_project_env

更新环境

# 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

任何人使用 @ michau’s的答案,但有问题,包括在 environment.yml的诗歌。目前,诗歌版本1.2或更高版本不是 由 Conda-Forge 公司支持。您仍然可以在 .yml中包含诗歌 v1.2,以下内容可供选择:

dependencies:
- python=3.9.*
- mamba
- pip
- pip:
- "poetry>=1.2"