Poetry配置Torch多环境安装失效,如何保留版本升级便利性?
问题描述
我用Poetry配置Torch安装时编写了如下依赖配置:
torch = [ # Mac with apple silicon { markers = "sys_platform == 'darwin'", version = "^2.0.1", source = "pypi" }, # Mac with arm docker container { markers = "sys_platform == 'linux' and platform_machine == 'aarch64'", version = "^2.0.1", source = "pypi" }, # Mac with x86_64 container with cpu version only { markers = "sys_platform == 'linux' and platform_machine != 'aarch64'", version = "^2.0.1+cpu", source = "pytorch" } ]
执行命令 poetry export -f requirements.txt --output requirements.txt 后,生成的requirements内容不符合预期,所有平台都被指定为2.0.1+cpu版本:
torch==2.0.1+cpu ; python_version >= "3.10" and python_version < "3.11" and (sys_platform == "darwin" or sys_platform == "linux")
手动指定whl文件URL的配置能解决这个问题:
torch = [ # Mac apple silicon { markers = "sys_platform == 'darwin'", url = "https://download.pytorch.org/whl/cpu/torch-2.0.1-cp310-none-macosx_11_0_arm64.whl" }, # Mac docker arm container { markers = "sys_platform == 'linux' and platform_machine == 'aarch64'", url = "https://download.pytorch.org/whl/torch-2.0.1-cp310-cp310-manylinux2014_aarch64.whl" }, # Mac with x86_64 container { markers = "sys_platform == 'linux' and platform_machine == 'x86_64'", url = "https://download.pytorch.org/whl/cpu/torch-2.0.1%2Bcpu-cp310-cp310-linux_x86_64.whl" }, ]
但这种方式无法通过Poetry便捷升级版本,每次都需要手动更新URL,想问哪里操作有误?
问题原因与解决方案
核心问题
- 版本约束冲突:混用了普通版本号(
^2.0.1)和带后缀的版本号(^2.0.1+cpu),Poetry在导出时会优先选择更具体的+cpu版本,并合并所有平台标记,导致所有环境都匹配这个版本。 - 源的元数据差异:PyPI和Pytorch官方源的包元数据格式不同,Poetry无法正确识别不同平台的版本变体,进而错误合并依赖条件。
正确配置方式
方式1:统一使用Pytorch官方源并明确平台标记
首先在pyproject.toml中添加Pytorch官方CPU源:
[[tool.poetry.source]] name = "pytorch" url = "https://download.pytorch.org/whl/cpu"
然后修改Torch的依赖配置,去掉版本后缀,让源自动匹配对应平台的包:
torch = [ { markers = "sys_platform == 'darwin' and platform_machine == 'arm64'", version = "^2.0.1", source = "pytorch" }, { markers = "sys_platform == 'linux' and platform_machine == 'aarch64'", version = "^2.0.1", source = "pytorch" }, { markers = "sys_platform == 'linux' and platform_machine == 'x86_64'", version = "^2.0.1", source = "pytorch" } ]
这样Poetry会根据标记从官方源拉取对应平台的包,导出requirements时也会保留正确的平台条件,后续升级版本只需修改version字段即可。
方式2:按平台分组配置依赖
通过tool.poetry.group按平台分组管理Torch依赖,需要激活对应组才能安装,但导出时可以指定包含所有组:
[tool.poetry.group.macos_arm.dependencies] torch = { version = "^2.0.1", source = "pytorch", markers = "sys_platform == 'darwin' and platform_machine == 'arm64'" } [tool.poetry.group.linux_arm.dependencies] torch = { version = "^2.0.1", source = "pytorch", markers = "sys_platform == 'linux' and platform_machine == 'aarch64'" } [tool.poetry.group.linux_x86.dependencies] torch = { version = "^2.0.1", source = "pytorch", markers = "sys_platform == 'linux' and platform_machine == 'x86_64'" }
导出命令:
poetry export --with macos_arm,linux_arm,linux_x86 -f requirements.txt --output requirements.txt
关键注意事项
- 不要混用带后缀(如
+cpu)和不带后缀的版本约束,Pytorch官方源会根据平台自动分发对应变体,无需手动指定后缀。 - 优先使用Pytorch官方源而非PyPI,PyPI上的Torch包不一定包含所有平台的完整变体,容易导致解析错误。
- 确保每个依赖项的平台标记互斥且明确,避免Poetry在导出时错误合并条件。
内容的提问来源于stack exchange,提问作者Pavan K
相关产品推荐
相关产品推荐

