【问题标题】:How to utilize host caches in a singularity build?如何在奇点构建中利用主机缓存?
【发布时间】:2020-09-13 13:35:02
【问题描述】:

我正在寻找优化奇点 HPC 容器构建时间的方法。我知道我可以通过逐层构建它们来节省一些时间。但仍有优化空间。

我感兴趣的是在主机系统上使用/缓存任何有意义的东西。

  1. CCache 用于 C++ 构建工件缓存
  2. git repo 克隆
  3. APT 包下载

我做了一些实验,但都没有成功。

到目前为止我发现了什么:

缓存

我在容器中安装 ccache 并指示构建系统使用它。我知道因为我使用 sudo 运行 singularity build,所以缓存将在 /root 下。但是在运行构建之后,/root/.ccache 是空的。我验证了生成的 CMake 构建文件,它们肯定使用了 ccache。

我什至创建了一个包含 %post 的测试配方

touch "$HOME/.ccache/test"

但测试文件没有出现在主机系统的任何地方(不在/root 中,也不在我用户的家中)。构建步骤是否将容器支持的目录挂载到 /root 而不是主机的根目录?

要使用 ccache,还需要做些什么吗?

Git

人们建议跑步,例如git-cache-http-server (https://stackoverflow.com/a/43643622/1076564) 并使用git config --global url."http://gitcache:1234/".insteadOf https://

由于奇异性可以读取主机文件系统的部分内容,我认为甚至可以在没有代理程序的情况下让它工作。但是,如果主机 git repos 不在 $HOME/tmp 内,那么在构建过程中,奇异性如何访问它们? singularity build 没有 --bind 标志来指定额外的挂载目录。并且在配方中使用%files 部分听起来效率很低 - 每次运行构建时都复制所有内容。

APT

人们建议使用例如鱿鱼-deb-代理 (https://gist.github.com/dergachev/8441335)。同样,由于奇异性能够读取主机文件系统文件,我只想使用主机的/var/cache/apt。但是/var 默认没有挂载到容器中。所以再次出现同样的问题 - 我如何在容器构建期间挂载/var/cache/apt。总的来说这是个好主意吗?主机和容器都是基于相同版本的 Ubuntu 和架构,不会损坏主机的 APT 缓存吗?

或者奇点本身会做一些聪明的 APT 缓存吗?我刚刚注意到它在 25 秒内下载了 420 MB 的包,这在我的连接上是可能的,但考虑到 ubuntu 镜像的标准速度,这不太可能。


编辑:我在奇异性回购中创建了一个问题:https://github.com/hpcng/singularity/issues/5352

【问题讨论】:

    标签: caching singularity-container ccache


    【解决方案1】:

    据我所知,从定义文件构建时,没有缓存奇点构建的机制。您可以缓存基础映像的下载,仅此而已。

    有一个GitHub issue关于这个,其中一位奇点的主要开发人员给出了以下回复:

    您可以从磁盘上的现有容器构建 Singularity 容器。因此,您可以构建基础容器并保存它,然后修改 def 文件以从现有容器构建,以节省原型制作时间。

    但由于 Singularity 不创建层,因此确实无法像 Docker 那样实现这一点。

    关于您的问题的一点:

    我知道我可以通过逐层构建它们来节省一些时间

    Singularity 没有层的概念,所以这里不适用。 Docker 使用层,并且这些层被缓存。

    在构建 Singularity 映像时,我通常遵循的工作流程是首先从 Dockerfile 创建 Docker 映像,然后将其转换为 Singularity 映像。 Docker 构建步骤具有缓存,因此可能对您有用。

    # Build Docker image
    docker build --tag my_image:latest .
    # Convert to Singularity format
    sudo singularity build my_image.sif docker-daemon://my_image:latest
    

    【讨论】:

    • 通过逐层构建,我实际上是指您建议的创建基础容器并从中构建以下容器。那么如何设置构建环境,以便我至少可以使用 ccache 之类的东西?
    【解决方案2】:

    这听起来像是不必要的优化。如前所述,您可以从可以利用某些层缓存的 Docker 映像构建。如果您计划进行大量迭代,您可以对基础 docker 容器执行此操作,也可以将奇点映像创建为沙箱,并在它按您喜欢的方式工作后将其写入只读 SIF。如果你经常修改代码,你可以在运行镜像的时候挂载源码,直到完成。


    Singularity 在主机操作系统上进行一些缓存,默认为$HOME/.singularity/cache(通常在/root,因为大多数时候它是sudo singularity build ...)。您可以使用singularity --verbosesingularity --debug 查看更多详细信息。我相信这主要用于缓存其他格式的图像/图层,但我并没有深入研究它。

    据我所知,Building 不会挂载主机文件系统并且无法这样做。这是为了重现性而设计的。您可以将文件(例如,apt 缓存)复制到%files 块中的图像中,但这似乎很不合时宜,最终会怀疑它是否会更快,同时可能会出现一些奇怪的错误。

    %post 步骤是独立构建的,容器中,没有任何内容被挂载,因此它无法利用主机操作系统上的任何缓存。

    【讨论】:

    • 我希望奇异点更“独立”......但是如果在奇异点中获得好的特性的最好方法是使用 docker,那么...... :( 无论如何,docker->singularity 转换是不是 100% 成功,而且在我的容器中,我知道当我尝试过一次时,它失败了。将带有代码的本地文件夹安装到正在运行的容器正是我想要避免的重现性杀手。我真的很想成为能够从配方从头开始重建容器,因此“运行时”编辑不是一个好方法。您可以将我的容器想象成一种 CI,您想在其中验证系统构建。
    • 它是独立的。如果你想要 docker 风格的缓存,你必须使用 docker。我从来没有遇到过从 docker 镜像构建的任何错误,如果你遇到了一些错误,我建议你向奇异点的人提出一个 github 问题。安装在代码中是一种开发实践,而不是用于生成最终图像。您不需要重新安装操作系统来测试程序更改。如果您的应用程序更改了操作系统状态,只读奇点图像可能不是您的解决方案。
    【解决方案3】:

    它表明有一种方法可以利用主机上的一些缓存。作为stated by one of the singularity developers,主机的/tmp 在构建的%post 阶段挂载。并且无法挂载任何其他目录。

    因此,利用主机的缓存就是让数据可以从/tmp 访问。

    缓存

    在运行构建命令之前,将ccache目录挂载到/tmp

    sudo mkdir /tmp/ccache
    sudo mount --bind /root/.ccache /tmp/ccache
    

    然后将以下行添加到您的食谱的%post 中,您就完成了:

    export CCACHE_DIR=/tmp/ccache
    

    我不确定如何与您的用户共享缓存而不是root,但我认为documentation on sharing caches 会有所帮助(尤其是为ccache 设置umask)。

    APT

    在主机上,绑定apt缓存目录:

    sudo mkdir /tmp/apt
    sudo mount --bind /var/cache/apt /tmp/apt
    

    在您的%setup%post 中,使用以下内容创建容器文件/etc/apt/apt.conf.d/singularity-cache.conf

    Dir{Cache /tmp/apt}
    Dir::Cache /tmp/apt;
    

    Git

    git-cache-http-server 应该可以无缝工作 - 主机端口应该在构建期间可以访问。我只是最后没有使用它,因为它不支持 SSH 身份验证。另一种方法是手动将所有 repos 克隆到 /tmp,然后在构建过程中使用 --reference 标志进行克隆,这应该会加快克隆速度。

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2014-12-22
      • 1970-01-01
      • 2018-06-27
      • 2021-06-01
      相关资源
      最近更新 更多