0

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

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

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

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

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

缓存

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

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

touch "$HOME/.ccache/test"

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

是否需要做更多的事情来利用 ccache?

吉特

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

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

易于

人们建议使用例如 squid-deb-proxy ( 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 。

4

3 回答 3

3

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

有一个GitHub issue与此相关,其中 Singularity 的主要开发人员之一给出了以下回复:

您可以从磁盘上的现有容器构建 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
于 2020-05-29T21:36:52.720 回答
1

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


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

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

这些%post步骤是在容器中独立构建的,并且没有安装任何内容,因此它再次无法利用主机操作系统上的任何缓存。

于 2020-06-09T13:57:04.640 回答
1

它表明有一种方法可以利用主机上的一些缓存。正如其中一位奇点开发人员所说,主机是在构建阶段/tmp安装的。%post并且不可能挂载任何其他目录。

因此,利用主机的缓存就是使数据可以从/tmp.

缓存

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

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

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

export CCACHE_DIR=/tmp/ccache

我不确定如何与您的用户共享缓存而不是如何root工作,但我认为有关共享缓存的文档可能会有所帮助(尤其是umask为 ccache 设置)。

易于

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

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

在您的%setupor%post中,创建包含/etc/apt/apt.conf.d/singularity-cache.conf以下内容的容器文件:

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

吉特

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

于 2020-06-15T15:25:11.267 回答