跳转至

Singularity/Apptainer

Singularity为劳伦斯伯克利国家实验室开发专门用于高性能计算场景的容器技术,Singularity完全基于可移植性进行虚拟化,更加轻量级,部署更快,Singularity目前被广泛地各高性能计算中心。 Apptainer是Singularity的社区版,它是Singularity项目的正式继承者。随着时间的推移,Singularity的开发与维护逐渐由商业公司Sylabs主导,而社区需要一个更加开放的开发环境,因此Apptainer项目由Linux Foundation管理,旨在确保社区对这一容器平台的控制权和贡献。

容器的优缺点

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

容器的优势

  1. 可移植性,通过容器部署好计算环境后,可以直接上传到计算集群使用,也可以直接将容器镜像分享给课题组的其他成员直接使用,大大减少了部署环境的时间。
  2. 可复现性,有些软件依赖不同的计算工具,换个人安装,虽然安装的软件版本相同,但是依赖的计算工具版本不同,都可能导致计算结果存在差异,而容器的使用可以很好的避免这个问题。
  3. 易管理,不同容器相互隔绝,不存在依赖冲突等问题。

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

容器的缺点

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

使用指南

平台安装有3.8.7版本的singularity

$ singularity --version
singularity version 3.8.7-1.el8

镜像格式

 格式                    创建命令                                 优势
 sif               singularity pull                        压缩格式、只读
                   singularity build
 sandbox           singularity build --sandbox             可写,需要对镜像更新时使用

格式转换

     功能                              命令行
 sif 转 sandbox        singularity build --sandbox centos7 centos7.sif
 sandbox 转 sif        singularity build centos7.sif centos7

常用命令

       命令                                 用法说明
 singularity pull       用于从远程地址拉取镜像并保存为sif格式。
 singularity build      可以从本地镜像仓库,或者远程镜像仓库创建得到本地镜像,也可以用于镜像格式转换
 singularity shell      用于以交互方式进入镜像,如果镜像为sandbox格式加上-w参数可以对镜像进行修改
 singularity exec       用于以非交互方式运行镜像中的命令

构建容器镜像

Singularity/Apptainer容器有两种存在形式:SIF和sandbox。SIF只读,主要用来执行用户程序;sandbox可修改,可用来开发和创建新容器。用户可以通过三种方式创建自己需要的容器。

构建容器镜像的三种方式

  1. 从仓库中拉取已经构建好的容器镜像;
  2. 个人Linux主机上构建容器镜像;
  3. 通过Definition文件制作容器镜像。

从仓库中拉取已经构建好的容器镜像

用户可通过singularity pullsingularity build命令从外部容器仓库下载容器到本地,存储为SIF文件。用户通过指定不同的容器的URI,从不同的源下载容器。
Singularity镜像库:https://cloud.sylabs.io/library
Docker Hub镜像源:hub.docker.com
例如用户可以通过如下的命令从Docker Hub(存储标准的Docker镜像)下载容器,自动转换成Singularity容器,存储为SIF格式:

singularity pull centos7.sif docker://centos:7
# 或者
singularity build centos7.sif library://library/default/centos:7

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

每个人不可能都有一个linux主机,但Windows10/11电脑绝大多数人都拥有。
要使用WSL支持的Apptainer功能,需要先确认电脑BIOS中是否开启CPU虚拟化(步骤:开机按Delete键进入BIOS界面,找到Advanced中的CPU选项。如果是Intel CPU,就找CPU下面的"Intel Virtual Technology"选项,启用;如果是AMD CPU,就找CPU下面的"AMD-V"或"SVM",启用。然后保存后重启即可开启CPU虚拟化。)

以Windows10/11电脑为例,先在任务栏左下角开始里找到微软商店(Microsoft Store),然后在商店里搜寻Ubuntu,再安装Ubuntu 22.04.3 LTS。
安装后,打开开始菜单栏中的Ubuntu 22.04.3 LTS,如果出现"WslRegisterDistribution failed with Error: 0x8007019e"此错误提示,其原因是:Windows功能中未启用“适用于Linux的Windows子系统”。
在开始菜单栏找到Windows PowerShell,以管理员身份运行,然后执行:

# 启用 Microsoft-Windows-Subsystem-Linux (WSL)
dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 启用 VirtualMachinePlatform
dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
启用成功后,再点击开始菜单栏中的Ubuntu 22.04.3 LTS图标,一般就没问题。
在Windows PowerShell中执行wsl -l -v,VERSION下出现1代表是WSL1版本,出现2代表是WSL2版本。要使用Apptainer完整功能,需要用WSL2版本。Windows11,一般默认安装的就是WSL2版本。
个别Windows10版本,会出现WSL1版本,要想升级为WSL2版本,可按此链接执行。

如果按照上面的操作始终没有成功,还有就是电脑C盘空间剩余空间很小了(如果是Windows11,C盘空间太小了也不行),那就安装个VMWare虚拟机吧,VMware Workstation 17.6 Pro百度云盘链接。然后百度搜索下怎么用Vmware安装Ubuntu系统就行。

1. 安装Apptainer
Apptainer是Singularity的社区版,安装了Apptainer,singularity的命令也一样使用。
如果实在要安装Singularity,可以参看SingularityCE官网的安装步骤。
下面是在Windows10 WSL的Ubuntu 22.04.3 LTS下的安装Apptainerde 步骤:

# 更新软件包信息安装依赖
userA@userA-PC:~$ sudo apt-get update

# 安装apptainer所需依赖
userA@userA-PC:~$ sudo apt-get install -y fakeroot

# 下载apptainer安装包,GitHub下载地址: https://github.com/apptainer/apptainer/releases
# 考虑到不少用户访问不了GitHub,将安装包上传到了百度云盘:https://pan.baidu.com/s/1faPoHuLkxqcWi8MGcUP35g?pwd=5f6g
# 假如把apptainer_1.3.3_amd64.deb下载到D盘的software目录下

# 安装 apptainer
userA@userA-PC:~$ sudo apt-get install -y /mnt/d/software/apptainer_1.3.3_amd64.deb

# 配置apptainer支持库,默认远端是配置公钥,但默认的cloud.apptainer.org又连接不上
userA@userA-PC:~$ sudo apptainer remote add --no-login SylabsCloud cloud.sycloud.io
INFO:    Remote "SylabsCloud" added.
userA@userA-PC:~$ sudo apptainer remote use SylabsCloud
INFO:    Remote "SylabsCloud" now in use.

# 使用apptainer remote list命令可查看默认的远端URI
userA@userA-PC:~$ sudo apptainer remote list

NAME           URI                  DEFAULT?  GLOBAL?  EXCLUSIVE?  SECURE?
DefaultRemote  cloud.apptainer.org                                SylabsCloud    cloud.sylabs.io                                    

2. 构建容器镜像,以软件MOMAP-2021B为例,部署容器镜像,并在容器镜像中安装MOMAP-2021B软件
MOMAP-2021B以前在Centos7系统上能正常运行,但系统升级为Rocky Linux 8后,由于库版本依赖问题而不能运行。
现制作Centos7容器镜像来运行MOMAP-2021B软件。

# 拉取镜像创建sandbox格式容器
userA@userA-PC:~$ sudo singularity build --sandbox MOMAP-2021B library://library/default/centos:7

# MOMAP-2021B.tar.gz文件在D盘software目录下,将其拷贝到WSL2的Ubuntu的/root目录下
userA@userA-PC:~$ sudo cp /mnt/d/software/MOMAP-2021B.tar.gz /root/

# 进入容器镜像,进行软件的安装
userA@userA-PC:~$ singularity shell -w MOMAP-2021B
Singularity> mkdir -p /opt/soft
Singularity> cd /opt/soft
Singularity> tar -zxvf /root/MOMAP-2021B.tar.gz

# 设置环境变量
Singularity> echo 'source /opt/soft/MOMAP-2021B/env.sh' >> /environment

# 退出镜像
Singularity> exit

# 生成sif文件,并拷贝回Windows主机的D盘software目录下
userA@userA-PC:~$ sudo singularity build MOMAP-2021B.sif MOMAP-2021B/
userA@userA-PC:~$ cp MOMAP-2021B.sif /mnt/d/software/

3. 将SIF镜像文件上传至集群,并制作Slurm作业提交脚本
将SIF镜像文件上传至$HOME/soft目录下,使用集群默认安装的singularity运行镜像。
下面是MOMAP-2021B.sif运行的Slurm提交脚本momap-test.slurm:

#!/bin/bash
# Job submission script for SLURM:
# Usage: sbatch <this_script>
##############脚本第一部分,声明SLURM作业管理系统的请求资源参数#####################
#SBATCH -p gy-grp
#SBATCH -J momap-test
#SBATCH -o momap-test.o%j
#SBATCH -N 1
#SBATCH --ntasks-per-node=8
#SBATCH -t 2021:02:00
########################请求资源参数的解释###################################
#    -J: 作业名称
#    -o: 标准输出stdout
#    -e: 标准错误stderr,不写-e,标准输出stdout和标准错误stderr合并到.ojobid文件中
#    -N: 请求的节点数目
#    -n: 请求的总核数,如果-N后为1,等同于--ntasks-per-node
#    -t: 时间限制
#    -p: 申请的分区
#    -w: 后面跟请求的指定节点名称
#############################################################################

#################脚本第二部分,定义要运行作业软件的环境变量#######################
# go to work dir
cd $SLURM_SUBMIT_DIR

########################脚本第三部分,运行作业的命令############################
# Generate mpd.hosts machinefile
srun hostname |sort |uniq -c |awk '{print $2 ":" $1}' > $SLURM_SUBMIT_DIR/mpd.hosts

echo "Starting MOMAP run at" `date`

# The program we want to execute,根据自己的作业,主要修改的也是下面这一行
singularity exec $HOME/soft/MOMAP-2021B.sif momap.py --input momap-test.inp --nodefile mpd.hosts > ${SLURM_SUBMIT_DIR}/momap-test.log

echo "Finished MOMAP run at" `date`
使用sbatch momap-test.slurm提交作业。

通过Definition文件制作容器镜像

创建Definition文件
创建pytorch.def文件,需要添加以下内容:

# 定义基础镜像
Bootstrap: docker
From: pytorch/pytorch:latest

# 安装其他依赖项
%post
    # 在此处可以安装其他器要的软件包或库
    apt-get update
    apt-get install -y <package_name>

# 定义容器启动时执行的命令
%runscript
    # 在此处可以添加容器启动时需要执行的命令
    python3 <script name>.py
在上面的代码中,首先指定了基础镜像为pytorch/pytorch:latest,这是一个包含PyTorch的官方像;
然后,在%post部分,可以根据自己的需求安装其他软件包或库;
最后,在%runscript部分,可以指定容器在启动时需要执行的命令。

构建容器
使用以下命令构建容器:

sudo singularity build pytorch.sif pytorch.def

本文阅读量  次
本站总访问量  次