如何通过Poetry实现Torch与TorchVision的CPU/GPU版本切换安装?
问题根源
Poetry执行poetry lock时会解析所有分组(extras)的依赖,哪怕你只打算安装其中一组。你的配置中,cpu和gpu分组的torch版本范围完全重叠,但指定了不同的源——Poetry无法同时满足“从torchcpu源拉取torch”和“从torch_cuda121源拉取torch”这两个互斥要求,因此抛出冲突错误。
解决方案
方案一:用依赖标记实现互斥依赖
通过给torch和torchvision添加互斥的标记,让两个版本的依赖不会被同时解析,从而避免lock时冲突。
- 配置分组(extras):
[tool.poetry.extras] cpu = [] gpu = []
- 配置带标记的依赖(需预先配置好torchcpu和torch_cuda121源):
[tool.poetry.dependencies] python = "^3.10" boxmot = "10.0.71" # CPU版本:仅激活cpu分组且未激活gpu分组时生效 torch = { version = ">=2.2.1,<3.0.0", source = "torchcpu", markers = "extra == 'cpu' and not extra == 'gpu'" } torchvision = { version = ">=0.17.1,<1.0.0", source = "torchcpu", markers = "extra == 'cpu' and not extra == 'gpu'" } # GPU版本:仅激活gpu分组时生效 torch = { version = ">=2.2.1,<3.0.0", source = "torch_cuda121", markers = "extra == 'gpu'" } torchvision = { version = ">=0.17.1,<1.0.0", source = "torch_cuda121", markers = "extra == 'gpu'" }
- 重新生成lock文件:
poetry lock
- 安装对应版本:
- CPU版本:
poetry install --with cpu - GPU版本:
poetry install --with gpu
方案二:用独立lock文件分离环境
如果不想依赖标记,可为cpu和gpu环境分别生成独立的lock文件,彻底隔离两组依赖。
- 安装CPU版本并生成专属lock文件:
poetry install --with cpu --lockfile poetry-cpu.lock
- 安装GPU版本并生成专属lock文件:
poetry install --with gpu --lockfile poetry-gpu.lock
后续切换环境时,指定对应lock文件即可,例如再次安装CPU版本:
poetry install --with cpu --lockfile poetry-cpu.lock
注意事项
- 确保
torch和torchvision的版本与boxmot的要求兼容(你的场景中boxmot要求torch>=2.2.1,<3.0.0,当前配置的版本范围符合要求) - 把torch相关源的优先级设为
explicit,可确保Poetry从指定源拉取对应包,避免从PyPI下载错误版本
内容的提问来源于stack exchange,提问作者Mike B
相关产品推荐
相关产品推荐

