CEP 3 - 在 conda 中使用 Mamba 求解器
标题 | 在 conda 中使用 Mamba 求解器 |
状态 | 已接受 |
作者 | Jannis Leidel <jleidel@anaconda.com>, Jaime Rodríguez-Guerra <jrodriguez@quansight.com> |
创建时间 | 2021年7月20日 |
更新时间 | 2021年7月22日 |
讨论 | https://github.com/conda/ceps/pulls/2 |
实现 | NA |
摘要
Conda 目前默认的基于 pycosat 的依赖求解器有许多缺点,这促使社区努力编写一个更快更现代的基于 libsolv 的求解器。其结果是替代性 conda 实现 Mamba 的基础。
本 CEP 的目的是提议为 conda 增加一个实验性功能,以支持 Mamba 中使用的求解器,最终基于 CEP 2 中提议的插件架构。
动机
Conda 的功能和可用性取决于其底层依赖求解器的运行时特性,因为它是其架构的主要组成部分 —— 其次是命令行界面的代码基础设施、环境管理以及仓库和频道数据的处理。
速度、准确性、可调试性以及对用户体验的其他影响都严重依赖于求解器的底层功能以及 conda 将其解释并传达给用户的能力。例如,长时间运行 `conda install` 命令来解析复杂的环境和依赖树会直接影响用户对包管理器的实际体验。
此外,社区为改进 conda 的可用性问题做出了广泛的努力,但这发生在常规 conda 代码项目之外,这使得保持一致的技术和社区路线图更加困难。因此,Mamba 求解器的实验性集成应被考虑,但这只是影响 conda 社区持久变革的第一步,并认可社区成员一直在努力的创新解决方案。
规范
Conda 在 `conda.resolve` 模块中包含一个求解器注册表,目前 (4.10.x) 列出了三个求解器
- pycosat (默认),PicoSAT 求解器的包装器
- pycryptosat,CryptoMiniSat 求解器的包装器
- pysat,多个 SAT 求解器的通用包装器,使用 Glucose4
这些求解器暴露了一个纯 SAT 接口:它们与 conda 无关,并且只理解由 `Clauses` 类生成的 SAT 子句。`libsolv` 和 `mamba` 不暴露纯 SAT 接口,因此添加对此求解器的支持需要在抽象树的更高层进行修改。
`conda.core.solve` 位于 conda 逻辑的较高层,紧挨着 `install`、`update`、`remove` 和 `create` 命令的命令行界面之下。在那里,一个名为 `Solver` 的类负责收集索引元数据、前缀状态和其他变量,然后将所需的 `MatchSpec` 对象列表发送到底层的 `conda.resolve.Resolve` 实例。
`Resolve` 类与 `Clauses` 类过于紧密相关,并且它的一些抽象概念对于 `libsolv` 来说并不成立。因此,我们需要在 `Solver` 级别进行操作。我们必须子类化 `Solver` 并替换其 `Solver.solve_final_state()` 方法,这只需要我们返回一个 `PackageRecord` 对象的可迭代对象,然后该对象与初始环境状态进行比较,并通过基类中的其他方法转换为事务。
生成的子类将存在于一个单独的项目 conda-libmamba-solver 中,并且仅依赖于 `libmambapy` (Mamba 的 Python 包装器) 和 `conda` 本身。为了启用实验性求解器,我们在 `Context` 类中添加了一个新键 (`experimental_solver`) 和一个命令行标志 (`--experimental-solver`),它可以接受添加到 `conda.base.constants` (`ExperimentalSolverChoice`) 中新 `Enum` 的任何值。一旦 `context` 初始化,合适的求解器类将由添加到 `conda.core.solve` (`_get_solver_class()`) 的辅助函数返回。
在某种程度上,这意味着新的求解器类被*预注册*为插件,但必须单独安装。将来,当 CEP 2 中描述的插件系统完全实现后,这种手动集成可以被必要的插件钩子取代。
只要 Mamba 求解器插件被标记为实验性的,求解器类的默认选择必须保持不变。只有在经过大量的函数和集成测试以验证性能和求解改进之后,它才有可能被视为默认候选者 —— 并且只能在 conda 的新主要版本中。
定义此实验成功的指标将在本 CEP 的工作范围内确定,并与关于最小可行求解行为和相关测试套件的单独 CEP 的工作相协调。
向后兼容性
考虑到已支持的求解器之间在实现和算法上的差异,可以预料到 Mamba 的求解器也会产生略微不同的解决方案,具体取决于所请求的依赖项集。
为了保证与 `conda` 行为的可接受的向后兼容性,我们需要使实验性求解器符合现有的 `conda` 集成测试套件。
作为这项工作的一部分发现的任何潜在的向后不兼容性都需要正式文档,以便与 conda 用户共享,并为围绕实验性求解器状态的决策提供信息。
未来,作者希望看看是否有可能编写一个基本的技术规范和关于最小可行求解器逻辑的散文文档,并可能附带一个预期结果的自动测试套件。考虑到现有逻辑的复杂细微之处和隐含行为,这项任务被推迟到尚未起草的新 CEP 中。
参考
- conda:conda 包管理器
- CEP 2:为 conda 添加插件架构
- Libsolv:Mamba 在幕后使用的 SAT 求解器
- PicoSAT:由 pycosat 包装的 SAT 求解器
- Mamba:conda 社区的重新实现
- conda-libmamba-solver:实验性的 libmamba 求解器集成,单独打包
版权
所有 CEP 均明确采用 CC0 1.0 通用许可。