Singularity——HPC环境的绝佳容器解决方案

vm_vs_container

高性能计算可以应用在非常多的领域,例如科学计算、深度学习、视频渲染、气象预测等等,各个行业使用完全不同的应用环境,相关的配套软件又可能只存在于各种不同的平台之上,这样的场景在HPC应用环境下非常常见。如何解决这样的问题呢?容器技术肯定是不二之选。但是HPC环境和传统的应用环境又有一些区别,比起Docker,Singularity才是HPC环境下的绝佳容器解决方案。

为什么不用Docker?

Docker绝对是目前最热的容器技术,但是它却不特别适合HPC环境。有几个重要的原因:

  1. 调度管理器的资源限制无法施加到容器中
  2. 多用户(非root用户)使用时的权限问题
  3. Docker包含了不必要的资源开销

集群中的资源使用通常需要由调度管理器来进行分配,例如Slurm/PBS等系统负责资源分配。调度管理器根据用户需求为每个作业分配一定的资源,实质上是利用cgroups针对每个作业进行配置实现的。而Docker镜像的启动实际上是由Docker Daemon去执行的,如此一来资源限制自然会失效。并且Docker Daemon是由root用户启动的,无论是为普通用户设置sudoer还是将普通用户添加到docker用户组中都不是一个安全的方式。

Singularity的优势

Singularity拥有容器技术所包含的大多数优势,例如启动迅速、资源开销小、轻松的迁移和扩展等等。除此之外,相较于Docker这样的容器技术,它还有一些独特的优势:

  • 更加轻松的环境打包迁徙:Singularity所依赖的东西都在镜像文件中,不需要再单独打包/导入,直接拷贝走镜像即可。没有复杂的缓存机制,并且该镜像已经过压缩,只需占用非常少的磁盘空间。

  • 和现有系统无缝整合:系统用户权限、网络等均直接继承宿主机配置,并且无需进入某个镜像后再执行命令,可以直接在外部调用镜像内的指令,就像执行一个本地安装的指令一样。

  • 无需运行daemon进程:Singularity提供的完全是一个运行时的环境,在不使用时不需要单独的进程,不占用任何资源。不由daemon进程代为执行指令,资源限制和权限问题也得以解决。

除了这些优势之外,Singularity还支持多种镜像和容器文件格式,甚至可以直接使用Docker提供的镜像,就像从Docker Hub去pull一个镜像一样简单。Singularity可以轻易的现有的HPC系统整合,几乎无需任何额外的开发就能让现有的HPC变成一个轻量级的容器云。

Singularity的缺点

上面提到了很多优势,但singularity也并非绝对完美的。

  • 缺少网络虚拟化的支持
  • 目前未实现PID Namespace
  • 认知度较低
  • 由于众所周知的原因在国内下载镜像比较困难

Singularity应该是为了解决HPC环境下的软件不兼容而设计的应用容器,所以它并没有像Docker那样提供非常完善的隔离和虚拟化,例如没有PID namespace隔离、没有网络虚拟化。并且它的知名度远不如Docker,社区支持较少,在国内也没有镜像源导致下载镜像速度非常慢甚至失败。

总结

总的来说Singularity目前是绝佳的HPC环境下的容器解决方案,它的一些缺点也可以通过其他方式去克服,另外上面提到的Docker的缺点事实上也有一些特殊的方法去解决。我将在后续的文章中进行介绍。

坚持原创技术分享,您的支持将鼓励我继续创作!