为什么 HPC 喜欢 Singularity?
HPC 是 High Performance Computing,通常是很多服务器组成的集群。
Docker 很流行,为啥 HPC cluster 不喜欢?
运行 docker 首先要起 docker deamon,它需要 root 权限。用户运行的 CLI 是发给 docker daemon,由它来 run/start/stop 等管理 container。
User │ docker CLI │ docker daemon (root) │ Container
在大学超算中心、EDA Farm、Slurm 集群中:
- 几百甚至几千用户共用服务器
- 不希望用户获得 root 权限
- 需要严格资源隔离
Singularity 以当前用户身份运行 image
User │ singularity exec │ Container // example singularity exec image.sif my_app
Singularity 的 image 是单个文件,容易复制、校验和发布。
一句话总结:Docker 是为“部署应用”设计的,而 Singularity(Apptainer)是为“在共享 HPC 环境中安全运行应用”设计的。
Singularity 的发展
Singularity 由美国 Lawrence Berkeley National Laboratory (LBNL) 的 Gregory Kurtzer 发起开发,最早发布于 2015 年。
| 时间 | 事件 |
|---|---|
| 2015 | Singularity 首次发布,面向 HPC 集群 |
| 2016~2017 | 被越来越多超算中心采用 |
| 2018 | 成立 Sylabs 公司,发布 SingularityCE 和 SingularityPRO (收费) |
| 2021 | 社区担心被厂商控制,从 Singularity 分叉出 Apptainer(Linux Foundation 项目) |
| 2022 | Apptainer 1.0 正式发布 |
| 现在 | HPC 领域多数新项目优先使用 Apptainer,Sylabs 继续维护 SingularityPRO 商业产品 |
Singularity 的使用
安装 Singularity
Singularity 是专门为 Linux 设计的,需要 root 权限,参照官方文档安装。
Windows 不能直接安装,需要先安装这些:
Build SIF image
Singularity 有自己的 Definition File 格式,然后再 build 成一个 SIF image,类似 Dockerfile => image。
但是通常不这么用,很多企业同时用到 Docker 和 Singularity,统一使用 Dockerfile。
- Dockerfile build 后生成 Docker image。
- Singularity 从 Docker image 生成 SIF image。
从 Docker image 生成 SIF image 的命令:
// 1. remote docker image uri singularity build myapp.sif docker://myrepo.com/myapp:latest // 2. local docker image (docker daemon is running) singularity build myapp.sif docker-daemon://myapp:latest // 3. docker saved TAR image singularity build myapp.sif docker-archive://myapp.tar
Writable image (–sandbox)
先生成 folder,再从 folder 生成 SIF。类似在 docker container 里安装各种东西,然后从 container 生成 image。
公司内网 HPC Cluster 不能访问外网,apt update 执行失败。还是从 laptop 的 docker 生成需要的 image 方便些,然后传给 Singularity。
// 1.1 从 docker 生成 ubuntu-dev 目录 sudo singularity build --sandbox ubuntu-dev docker://ubuntu:24.04 // 1.2 从 SIF image 生成 ubuntu-dev 目录 sudo singularity build --sandbox myapp.sif // 2. 修改 ubuntu-dev sudo singularity shell --writable ubuntu-dev apt update apt install -y vim git openjdk-21-jdk // 3. build SIF iamge sudo singularity build myapp.sif ubuntu-dev
Foreground 运行 SIF
Foreground 运行 SIF image,就是起一个进程,退出了进程就结束了。
Singularity 默认会看到很多宿主目录(如 /home、/tmp、NFS 等),所以 HPC 场景特别喜欢用 exec.
// 1. interactive shell. Run 'exit' to quit. singularity shell ubuntu.sif // 2. run a command. It can access host machine mounted storage. singularity exec myapp.sif java -jar /opt/app/app.jar // 3. run image default CMD (Entry Point) singularity run myapp.sif
Background 运行 SIF
Instance 就是 Singularity 后台长期运行的 container。主要用于:
- Web Server
- Database
- REST API
- Jupyter Notebook
- 长时间运行的 Java 服务
普通 user 只能管理(看到)自己的 instance,root user 可以看到所有人的 instance。
// 1. 启动 instance singularity instance start myapp.sif myapp // 2. 查看 instance singularity instance list // 3. 进入 instance,执行 exit 退出,instance 还在 singularity shell instance://myapp // 4. 在 instace 中执行命令 singularity exec instance://myapp java -jar /opt/app/app.jar singularity exec instance://myapp ps -ef // 5. 停止 instance,停止后这个 instance 就不在了 singularity instance stop myapp
绑定宿主目录
Singularity 通常会自动绑定:
- $HOME
- /tmp
- /var/tmp
- /proc
- /sys
- /dev
- 当前工作目录
有些管理员还会配置 /nfs, /gpfs, /scratch 等。
但并不是所有机器配置都一样,为了保证命令在哪都能重复执行,就用 --bind / -B 映射 host 目录。
// foreground
singularity exec \
-B /data/project:/workspace \
myapp.sif
// background
singularity instance start \
--bind /nfs/data:/data \
myapp.sif \
myapp