跳转至

Singularity

何为容器

容器技术是一种以应用软件为中心的虚拟化技术。以应用软件为单元,将软件及所有的依赖打包成容器镜像,打包后的容器镜像可直接拷贝到不同的 Linux 主机上运行。通过容器技术,可以很好的解决安装软件时,依赖库的安装问题、软件环境的隔离以及软件环境的移植问题。

Singularity 为劳伦斯伯克利国家实验室开发专门用于高性能计算场景的容器技术,Singularity 完全基于可移植性进行虚拟化,更加轻量级,部署更快,Singularity 目前被广泛地各高性能计算中心。

使用步骤

使用容器部署和使用软件环境的步骤如下:

1. 构建容器镜像,构建容器镜像的方式有三种:

1). 在本地拥有 root 权限的 Linux 主机上安装 Singularity, 并使用 Singularity 部署容器镜像;

2). 在支持 fakeroot 的服务器上,使用 Singularity 部署容器镜像;

3). 直接从仓库中拉取已经构建好的容器镜像;

2. 将容器镜像上传到集群,通过 singularity 指令使用构建好的容器镜像。

构建容器镜像

想要构建 Singularity 容器镜像的方式有几种,1:个人 Linux 主机上安装 Singularity,并部署容器镜像;2. 配置好 fakeroot 的远程服务器上部署容器镜像;3. 直接拉取仓库中已经构建好的容器镜像。

个人 LInux 主机上构建容器镜像

1. 在拥有 root 权限的个人 Linux 主机上 安装 Singularity

下面是在 centos 8 或 rocky 8 下的安装步骤,其他 Linux 发行版请参考 官网

singularity-ce 4.1
# 安装路径
export PREFIX=/opt/singularity-ce/4.1.1

# 安装依赖 Centos 8
yum groupinstall -y 'Development Tools'
yum install -y autoconf automake squashfs-tools wget zlib-devel git
yum install -y crun cryptsetup fuse3-devel glib2-devel libseccomp-devel libtool

# 安装 GO

export VERSION=1.21.0 OS=linux ARCH=amd64   
wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz 
tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz
rm -f go$VERSION.$OS-$ARCH.tar.gz
echo "export PATH=/usr/local/go/bin:\$PATH" >> /etc/profile
source /etc/profile

# 安装Singularity CE
wget https://github.com/sylabs/singularity/releases/download/v4.1.1/singularity-ce-4.1.1.tar.gz
tar xf singularity-ce-4.1.1.tar.gz
cd singularity-ce-4.1.1
./mconfig --prefix=$PREFIX
cd builddir
make && make install

# 添加环境变量
echo "export PATH=$PREFIX/bin:\$PATH" >> /etc/profile

2. 构建容器镜像,以软件 Molspin 为例,部署容器镜像,并在容器镜像中安装 Molspin 软件

# 拉取 docker 镜像创建 sandbox 格式容器
singularity build --sandbox molspin library://library/default/centos:7

# 进入容器镜像,进行软件的安装
singularity shell -w molspin

# 安装依赖
yum install epel-release centos-release-scl -y
yum install devtoolset-7 armadillo-devel -y
source /opt/rh/devtoolset-7/enable
echo "source /opt/rh/devtoolset-7/enable" >> /environment

# 注册并下载 MolSpin 安装包, 解压后进入
unzip -d molspin molspin-v1.0.120819.zip
cd molspin && make
cp molspin /usr/local/bin/

# 在安装软件完后退出镜像
exit

# 生成sif文件
singularity build molspin.sif molspin/

3. 将创建好的软件镜像上传到高性能计算集群

加载 singularity 软件环境后运行镜像,其中 example.msd 为输入文件

# 加载 singularity 
module load singularity

# 使用镜像中安装好的 molspin 指令
singularity exec molspin.sif molspin -p 2 -a example.msd

附: SIF 和 sandbox 两种格式的镜像是可以相互转换的;

# 1. 将SIF格式的容器转换成sandbox;
singularity build --sandbox centos76 centos76.sif

# 2. 将sandbox容器镜像转化成SIF格式;
singularity build centos76.sif centos76

基于 fakeroot 构建容器镜像

北京大学高性能计算校级公共平台上,专门部署了节点用于构建 Singularity 软件镜像,可以在该节点上通过 fakeroot 权限,使用 singularity 指令安装软件镜像,具体方式如下:

1. 登录到支持 fakeroot 构建镜像的服务器

# 登录专用节点
ssh <user_id>@162.105.133.209

2. 构建容器镜像,在构建时加入参数 --fakeroot

# 拉取docker镜像创建sandbox格式容器
# 创建容器时加入参数--fakeroot
singularity build --fakeroot --sandbox molspin library://library/default/centos:7

# 通过交互的方式进入容器镜像,修改容器镜像
# 加入参数--fakeroot
singularity shell --fakeroot -w molspin

# 安装依赖
yum install epel-release centos-release-scl -y
yum install devtoolset-7 armadillo-devel -y
source /opt/rh/devtoolset-7/enable
echo "source /opt/rh/devtoolset-7/enable" >> /environment

# 注册并下载MolSpin安装包, 解压后进入
unzip -d molspin molspin-v1.0.120819.zip
cd molspin && make
cp molspin /usr/local/bin/

# 在安装软件完后退出镜像
exit

# 生成sif文件
singularity build --fakeroot molspin.sif molspin/

3. 将创建好的软件镜像上传到高性能计算集群

加载 singularity 软件环境后运行镜像,其中 example.msd 为输入文件

# 加载 singularity 
module load singularity

# 使用镜像中安装好的 molspin 指令
singularity exec molspin.sif molspin -p 2 -a example.msd

4. 删除平台上基于 fakeroot 生成的 sandbox 镜像

在上述过程中生成的名为 molspin sandbox 镜像因为是通过 fakeroot 创建的,所以不能直接通过 rm -rf 进行删除,为此,平台构建了删除指令用于删除基于 fakeroot 生成的 sandbox 镜像。

# molspin 为之前通过 fakeroot 创建的 sandbox 镜像
srm molspin

容器的优势和缺点

相比于编译安装以及 conda 安装管理软件,容器有几个十分明显的优势

容器的优势

  1. 可移植性,通过容器部署好计算环境后,可以直接上传到 "未名一号"、"未名生科一号"、"未名二号",甚至社会上其他高性能计算集群上使用,也可以直接将容器镜像分享给课题组的其他成员直接使用,大大减少了部署环境的时间。
  2. 可复现性,尤其是一些生信软件,依赖不同的计算工具,换个人安装,虽然安装的软件版本相同,但是依赖的计算工具版本不同,都可能导致计算结果存在差异,而容器的使用可以很好的避免这个问题。
  3. 易管理,不同容器相互隔绝,不存在依赖冲突等问题,比如平台上使用 conda 打包了 ncl、nco 和 ncview,因为这些工具在安装的时候同时也打包了 netcdf 库,如果用户在编译如 cesm 和 wrf 等依赖 netcdf 环境的软件,可能会导致编译和使用过程出现冲突。

容器有着这么多的优点,性能损耗还低,有时候甚至还优于裸机性能,是否就代表所用计算软件环境都适合用容器部署?答案是否定的,容器其实也存在一些缺点需要用户留意:

容器的缺点

  1. 使用难度高,相比于裸机上安装和使用软件,容器概念的理解、接受还有使用还是需要一定门槛的
  2. 跨节点应用由于要调用宿主机的 mpi ,兼容性有一定的要求,可移植性需要验证。当然,平台也在致力于跨节点应用容器化的测试和打包
  3. 优化问题,比如为了让软件运行更快,Intel 编译软件过程中可能会使用 -Host 参数,让编译器根据主机 CPU 型号进行指令优化,或者编译过程中加入 AVX512 的支持,这时候如果将镜像移植到老款架构的 CPU 主机上,可能会导致镜像无法正常运行软件环境