对于代码开发来说,组织包、箱、库和依赖项的好方法是什么?

对于代码开发来说,组织包、箱、库和依赖项的好方法是什么?

我正在寻找一种方法来管理不同编码项目所需的包和资源。我不确定这是否是提出这个问题的正确地方,但找不到一个看起来非常合适的地方,所以如果合适,请重定向。

本质上,我从事许多不同的项目,主要是用 Python,但有时也用 C++。我目前在 Ubuntu Linux 上工作。这些项目中的每一个都需要特定于语言的软件包,但有时也需要一些操作系统范围的资源(例如 GPU 驱动程序等)。我经常因为相互依赖、软件包更新等冲突而遇到很多麻烦。我希望有一种方法可以将每个项目的所有相关文件、软件包和编码环境关联起来并隔离它们,这样我就可以让操作系统处于在必要时运行每个项目的状态,并在不需要时停用它。

我知道有一些资源可用于此目的。我发现 python 或 anaconda 环境效果不佳,因为它们只能处理特定于 python 的包。我可以为每个项目创建一个单独的虚拟机,但这似乎有点过头了,而且会占用大量资源。我不完全了解 Docker 容器或 Kubernetes 是什么,但也许这些就是我正在寻找的解决方案。

简而言之,您建议使用什么系统将项目工作所需的所有必需品保存在干净、隔离的容器中,并且可以根据需要停用和激活该容器以避免冲突?

答案1

好吧,我花了大约一个月的时间思考这个问题,我想分享一些我学到的东西。我绝不是这方面的专家,所以请谨慎对待我所说的话,但我至少会提出一些我考虑过并学到的一些解决方案。我将按复杂程度的大致顺序讨论它们。

  1. 谷歌Colab- 如果您只是进行简单的 Python 编程,并且需要为不同的项目使用各种不同的软件包,Google Colab 是一个很好的资源。它本质上是一个在云上运行的 Jupyter Notebook 风格的环境,它甚至提供了 GPU(或 TPU)。这本质上是一个专用的 Linux 内核,安装了一组基本的 Python 软件包,并且可以轻松安装所需的软件包。这可以很好地解决安装一堆操作系统级别和 Python 级别软件包的问题(在我的情况下是 CUDA、ffmpeg、opencv、pytorch 和许多其他 Python 软件包,我花了整整一周的时间才正确集成,花了大约 15 分钟才在 Google Colab 中获得功能(几乎)等效的环境)。但是,如果除了启用 GPU 计算之外,您还需要执行大量操作系统级别的安装,这可能不是您的最佳选择,因为没有提供方便的终端。

  2. Pip 或 Anaconda 环境- 使用虚拟环境来安装和管理具有不同包的不同 python 环境稍微容易一些,但同样,这些虚拟环境不提供安装操作系统级别包的支持,因此如果不同的包需要不同版本的共享库等,您可能会遇到麻烦。

  3. Docker 容器- Docker 容器本质上是实例上所有库和包的镜像,但仍在主机内核中运行(与虚拟机不同)。因此,使用 docker 镜像的计算开销较小。您可以创建一个 docker 镜像(其操作和感觉就像 Linux 实例),进行必要的修改并下载和安装包,然后保存 docker 镜像以便将来轻松重新加载。有几个明显的限制。docker 不支持一些需要与主机内核紧密连接的程序(例如 CUDA)(尽管 Nvidia 确实提供了自己的一组支持 CUDA 计算的 docker 镜像,但您仍然需要独立于 docker 文件在主机内核上安装 CUDA)。其次,如果您习惯在 IDE 中编程,那么使用 docker 容器内的解释器获取 IDE 可能会很困难。一些 IDE 允许您通过 SSH 连接到远程解释器,这是一种潜在的解决方法,但这通常是一项付费功能。总体而言,docker 更多地被认为是一种部署工具,而不是开发工具。

  4. 虚拟机- 运行单独的内核。优点是您可以更自由地在虚拟机本身内安装操作系统级软件和 IDE,但您需要付出计算机开销增加的代价。

  5. 检查点- 如果您不想处理这些工具的潜在缺点,但又不想在新软件包安装出现严重问题时重新安装整个操作系统,那么一个简单而好用的解决方案就是定期检查系统。这实际上是所有系统(以及可选的用户)文件的完整映像。您可以定期设置检查点,或者在安装一堆软件时使用“尝试一下,如果有效则保存”的方法。Timeshift 是一款免费且易于使用的检查点软件,可在 Ubuntu 上使用。

对于我自己的个人项目,我选择了这些解决方案的混合。我在安装 CUDA 和各种其他软件包时使用 Timeshift 定期检查点。一旦我安装了所有软件包和库,我就会拍摄最终快照,如果我的安装中断,我可以恢复到该快照。每次安装新程序或软件包时,我都会再次检查点。我还使用 anaconda 虚拟环境来管理 python 软件包和多个环境。如果我正在处理不需要共享系统文件方面太小众的东西,我可能还会使用 Google Colab(它还有一个额外的优势,那就是我可以在任何地方工作),尽管我个人更喜欢 Spyder 而不是 Jupyter 风格的工作环境。

请随意对此进行更正或提出建议,因为我绝不是专家,但希望这至少能有所帮助。

相关内容