如何在奇点构建中利用主机缓存?

How to utilize host caches in a singularity build?

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

我感兴趣的是 using/caching 在主机系统上有意义的任何东西。

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

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

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

CCache

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

我什至创建了一个包含 %post

的测试食谱
touch "$HOME/.ccache/test"

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

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

Git

人们建议 运行ning 例如git-cache-http-server () 并使用 git config --global url."http://gitcache:1234/".insteadOf https://.

由于奇点可以读取主机文件系统的一部分,我认为甚至可以有一种方法让它在没有代理程序的情况下工作。但是,如果主机 git 存储库不在 $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 .

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

关于这个有一个 GitHub issue,Singularity 的主要开发者之一给出了以下回复:

You can build a Singularity container from an existing container on disk. So you could build your base container and save it and then modify the def file to build from the existing container to save time while you prototype.

But since Singularity does not create layers there is really no way to implement this as Docker does.

关于你的问题的一点:

I know that I can save some time by building them layer by layer

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

构建 Singularity 图像时我通常遵循的工作流程是首先从 Docker 文件创建 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

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


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

据我所知,构建不会挂载主机文件系统,也无法挂载。这是为了重现性而设计的。您 可以 将文件(例如,apt 缓存)复制到 %files 块中的图像,但这似乎非常骇人听闻,最终值得怀疑的是,在打开可能性的同时它会更快对于一些奇怪的错误。

%post步骤是在容器中隔离构建的,没有安装任何东西,所以它再次无法利用任何缓存主持人 OS.

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

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

CCache

在运行构建命令之前,将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 身份验证。另一种方法是手动将所有存储库克隆到 /tmp,然后在构建过程中使用 --reference 标志进行克隆,这会加快克隆速度。