Skip to main content

Singularity 基本使用

Singularity容器技术在功能上类似于Docker,使用上与Docker略有不同。Docker用户可以轻松上手使用。由于Docker 在安全、权限、高速网络支持、MPI并行支持等各方面天生且无法修补的缺陷,导致 Docker 在超算上不适合使用,为了适应超算特有的平台环境,出现了一些专门为超算环境开发的容器软件,在目前适合于超算的容器软件里,Singularity 的兼容性最好,对超算特性支持最完整,运行性能也是最好的。用户可以访问Singularity 官方用户文档了解详细使用方法。

一. Singularity 的几个重要概念

  • 容器: 是指一个包含用户软件和依赖的镜像系统,可独立运行某一条或者多条命令。Singularity没有镜像的概念,用户创建和运行的都是一个一个容器。
  • SIF(Singularity Image File):压缩后的只读的Singularity镜像文件,是生产使用的主要形式。
  • Sandbox :可写的容器存在形式,是文件系统中的一个目录,常用于开发或者创建自己的容器,是开发使用的主要形式。
  • 宿主机:指运行singularity的机器,如北鲲云平台的Linux工作站。

二. 使用镜像库

现在有很多计算软件已经将容器镜像制作好了,存储在一些云平台上,用户只需要直接下载使用即可。在需要使用容器的时候,用户可以先在云平台上搜索是否已经有制作好的镜像,如果没有,再考虑自行制作容器镜像。

Singularity 支持很多云平台,用户可以在云平台上搜索,并下载所需镜像

Sylabs Cloud

singularity pull ubuntu.sif library://library/default/ubuntu:21.04

Docker Hub 是 Docker 的镜像云平台,singularity 程序会将 docker 格式转换为 singularity 使用的 .sif 格式

singularity pull ubuntu.sif docker://ubuntu:latest

Singularity Hub

singularity pull singularity-images.sif shub://vsoch/singularity-images

支持 ORAS 的 OCI 镜像云平台

singularity pull image.sif oras://registry/namespace/image:tag

三. 自行制作镜像

当镜像库平台没有找到适用的现成镜像,用户可以在北鲲云平台将软件打包成镜像,或者在本地制作镜像,到北鲲云平台上运行。

#登录北鲲云网页控制台,点击左侧菜单栏'SSH连接',启动一台SSH节点,并连接进入管理节点
#查看平台已安装singularity版本
singularity version

#切换到root用户,并进入opt目录
sudo -i
cd /opt

# 创建sandbox;
# 这里将创建的sandbox命名为ubuntu20_lammps,并使用docker hub上现有的容器 ubuntu:20.04 作为基础镜像。
singularity build --sandbox ./ubuntu20_lammps docker://ubuntu:20.04

# 进入创建好的sandbox,并进行修改;
# 其中-w表示可写。进入后singularity会自动挂载的HOME目录,如果是用root用户进入,则会挂载/root目录
singularity shell -w ./ubuntu20_lammps

# Ubuntu下安装LAMMPS并行版需要安装必要的依赖包
apt update && apt upgrade -y
apt install openmpi-bin openmpi-doc libopenmpi-dev -y
apt install gcc g++ gfortran make wget vim -y

# 安装fftw
wget http://www.fftw.org/fftw-3.3.9.tar.gz
tar zxvf fftw-3.3.9.tar.gz
cd fftw-3.3.9
./configure --prefix=/opt/software/fftw_3.3.9 --enable-shared --enable-static --enable-fma
make -j && make install

# 设置临时fftw环境变量
export PATH=/opt/software/fftw_3.3.9/bin:$PATH
export LD_LIBRARY_PATH=/opt/software/fftw_3.3.9/lib:$LD_LIBRARY_PATH

# 安装lammps
wget https://download.lammps.org/tars/lammps-4May2022.tar.gz
tar zxvf lammps-4May2022.tar.gz
cd lammps-4May2022
cd src
vim MAKE/OPTIONS/Makefile.g++_openmpi # 修改如下行
FFT_INC = -DFFT_FFTW -I/opt/software/fftw_3.3.9/include
FFT_PATH = -L/opt/software/fftw_3.3.9/lib
FFT_LIB = -lfftw3

make g++_openmpi

mkdir /opt/software/lammps
cp ./lmp_g++_openmpi /opt/software/lammps/

# 设置临时lammps环境变量
export PATH=/opt/software/lammps:$PATH

# 验证(容器内)
cd /root
cp /opt/lammps-10Feb21/bench/in.lj .
mpirun --allow-run-as-root lmp_g++_openmpi -in M-1.in

# 退出容器,设置永久环境变量(宿主机)
vim ./ubuntu20_lammps/environment
# 加入下面两行
export PATH=/opt/software/fftw_3.3.9/bin:/opt/software/lammps:$PATH
export LD_LIBRARY_PATH=/opt/software/fftw_3.3.9/lib:$LD_LIBRARY_PATH

# 验证(宿主机)
singularity exec /root/singularity/ubuntu20_lammps mpirun --allow-run-as-root lmp_g++_openmpi -in M-1.in

# 把修改好的sandbox打包成sif格式;
# 删除不必要的安装包, 如 fftw-3.3.9.tar.gz lammps-10Feb21.tar.gz
# 使用前面创建的sandbox目录生成singularity image file格式镜像。
singularity build ubuntu20_lammps.sif ./ubuntu20_lammps

四. 运行容器

运行一个程序

用户可通过singularity exec命令运行一个容器内的程序,程序执行完毕,容器退出。类似于docker run命令。

singularity exec lammps.sif bash -c  "pwd && id"

运行容器中默认命令

用户运行singularity run 命令会执行singularity 镜像默认的 runscript 命令

singularity run lammps.sif 

交互式启动容器运行命令

用户运行singularity shell命令可以交互式的方式运行容器,执行一系列命令。这种执行方式与docker run -it类似。例如:

singularity shell lammps.sif 

如何映射和访问存储卷

Singularity容器与Docker容器最大区别是生产使用的SIF格式容器是只读的。容器启动的时候,singularity命令自动挂载一些主机的目录到容器($HOME , /sys:/sys , /proc:/proc, /tmp:/tmp, /var/tmp:/var/tmp, /etc/resolv.conf:/etc/resolv.conf, /etc/passwd:/etc/passwd, 和 $PWD)。如果需要访问主机上的其它目录或者挂载的存储卷,用户需要使用--bind选项映射主机目录到容器内。

sudo singularity shell --bind /home/cloudam:/home/cloudam lammps.sif

五. 在 Slurm 作业中使用容器

通过SSH连接创建并连接管理节点

Step 1. 创建作业目录并进入;

mkdir lammpsJob1
cd lammpsJob1

Step 2. 通过文件传输上传所需的输入文件,详情请查看Linux数据传输

Step 3. 在该文件夹下创建如下执行脚本lammps.sh

#!/bin/bash
singularity exec --bind /home/cloudam/singularity/lammps:/home/cloudam/singularity/lammps lammps.sif mpirun lmp_mpi -in M-1.in

Step 5. 提交作业;

1个4核心节点启动4个并行任务。

sbatch -N 1 -p c-4-1 -n 4 -c 1 lammps.sh

查看作业运行情况及参数详细介绍请点击查看slurm命令

结果文件下载请查看Linux数据传输