由conda-forge打包的sentencepiece补丁

bgibtngc  于 2个月前  发布在  其他
关注(0)|答案(3)|浏览(32)

你好 - 我帮助为conda-forge打包很多包,这是一个非常庞大的生态系统,尤其是在数据科学和机器学习/人工智能方面。它最初主要关注Python,但也包括许多其他语言。
一个强大的点(特别是与pip相比)是,我们能够合理地重新分发非Python制品。我们可以跟踪一个包的相关ABI,并在必要时重建其后代包。这使我们能够(几乎)仅分发共享库,从而降低包的足迹,并带来其他一些好处。
我们已经通过所谓的feedstock分发了sentencepiece大约3年了,包可以通过以下方式安装:

conda install -c conda-forge sentencepiece  # or mamba instead of conda

我们有针对linux-{64, aarch64, ppc64le},osx-{64, arm64},win-64以及CPython 3.8-3.11和PyPy 3.8 & 3.9的构建。
在想要packagetorchtext(这取决于sentencepiece - 但实际上只有C++部分)的情况下,我想将一个单独的“输出”/“包”称为libsentencepiece,torchtext可以构建它,而无需为每个python版本不必要地重新构建它(实际上在每种情况下都是一样的)。
此外,至关重要的是,我们绝对需要依赖我们自己的abseil和protobuf构建,这成为一个相当大的障碍。我终于设法在去年完成了这个split(那里有对我非常冗长的先前尝试的引用;最终我放弃了尝试在windows上构建共享库,因为它变得太疯狂了)。
然而,当时我没有动力在这里提出问题,并讨论如何 - 如果可能的话 - 将这些更改上游化。这更加重要,因为我提出的一些补丁绝对不是这里准备好的。我对thirdparty/absl中的代码既不是第三方的也不是abseil本身感到非常沮丧,所以我最终完全替换了它。当然,这并不意味着我建议在这里逐字照搬。
然而,abseil的情况可能是最大的障碍之一。有一个变量叫做SPM_USE_EXTERNAL_ABSL,但它实际上并没有像它说的那样做,因为所有的包含路径仍然指向third_party/absl,而不是abseil本身。这个问题也被其他人遇到了:#869
自从我提出了我的初始补丁以来,sentencepiece不再强制使用MSVC运行时的静态链接(太好了!)。对我们来说的其他必要的更改列表:

  • 允许关闭构建静态库(我们真的不想在任何地方都有它们)
  • 使用外部protobuf和abseil(包括可能的共享构建,这需要设置PROTOBUF_USE_DLLS等)
  • 强制使用C++17(我们需要这个,因为abseil的ABI取决于标准版本,我们需要在所有地方保持一致)
  • 尊重CMAKE_INSTALL_PREFIX
  • 为库添加cmake和pkg-config元数据
  • 允许在已安装的libsentencepiece上构建python绑定(在我们的情况下,这将始终与底层版本1:1匹配,尽管sentencepiece的ABI保证或缺乏保证是可以知道的)

我已经根据0.1.99重新调整了我补丁(branch),目前正在重新构建我们的再分发recipe,针对protobuf 3.21和4.23(之后还会运行测试套件以捕获回归)。如果我们能找到一种方法让这些改进流回上游就好了。🙃
(我完全理解有些更改是我们特定需求的一部分,如果我们保留一些补丁也是可以的;但是任何减少都会有帮助,我相信其中一些更改也会对其他人有好处)
我很乐意为个别更改准备专用的PRs,但想先讨论一下这里维护者感兴趣的哪些部分,以及我们如何使它们容易合并到这里(例如基于符号或CMake响应环境变量的切换)。

脚注

1.到那时我已经在修补由protobuf生成的输出以解决一些愚蠢的constexpr错误↩
2.正如用实际的abseil替换它会导致构建错误一样,因为在我的理解中,它包含了sentencepiece特定的粘合代码,但位于absl命名空间中。↩
3.至少随着protobuf 23的到来应该会变得更容易,因为autotools已经消失了,而且我们对于CMake / pkgconfig有更好的元数据。↩

pb3s4cty

pb3s4cty1#

@taku910,你已经抽出时间看这个问题了吗?有没有可能在这个项目上进行合作,例如从abseil的情况开始?

brccelvz

brccelvz2#

温柔的平@taku910 -有没有办法我可以贡献一些例如abseil的变化(真正地针对外部abseil)的方式,这样它会对你来说是可以接受的?

h43kikqp

h43kikqp3#

我已经将我的补丁(branch)基于0.1.99进行了重定基,并目前正在基于protobuf 3.21和4.23重新构建我们的再分发(recipe)(这之后还会运行测试套件以捕获回归)。
我已将针对0.1.99的补丁转换为一个 tag ,并将我们的补丁的 branch 基于当前主分支进行重定基。由于最近的更改,补丁集已经缩小了很多,这是非常好的!感谢您努力解决这些棘手的问题!🙏
在剩余的补丁中,我们感兴趣的主要上游形式是:

  • 不要混合静态库和共享库的构建;要么 SPM_ENABLE_SHARED 应该只构建静态库,要么应该有一个类似的 SPM_DISABLE_STATIC 选项
  • 为CMake和pkg-config安装关于 libsentencepiece.so 的元数据

您对此感兴趣吗 @taku910?
从长远来看,支持针对共享abseil和protobuf(以及在Windows上的共享sentencepiece构建)的构建会很好。

相关问题