相关文章推荐

Singularity

因为 Docker 在安全、权限、高速网络支持、MPI并行支持等各方面天生且无法修补的缺陷,导致 Docker 在超算上不适合使用,为了适应超算特有的平台环境,出现了一些专门为超算环境开发的容器软件,在目前适合于超算的容器软件里,Singularity 的兼容性最好,对超算特性支持最完整,运行性能也是最好的。

Singularity 官方用户文档

  • 武大超算预装了 Singularity,请阅读 使用系统预装的软件

  • 用户应该在 scratch 目录下使用容器,以避免一些文件锁定功能带来的问题。

  • 用户的 ~/.singularity 目录受到 ~/ 目录的 1G 容量限制,可能会因此产生一些莫名其妙的错误,可以将此目录移动到 scratch 下并建立符号链接来解决问题

    mv ~/.singularity ~/scratch/
    ln -s ~/scratch/.singularity ~/.singularity
    

    一、使用镜像库

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

    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
    

    二、自行制作镜像

    当镜像库平台没有找到适用的现成镜像,用户可以在本地将软件打包成镜像,上传到武大超算上运行。

    请注意,用户只能在自己的计算机上制作镜像,不能在超算上制作镜像。

    1、安装singularity(本地计算机)

        首先需要在本地主机root权限安装singularity,以下为安装步骤。

    # 安装依赖
    yum install -y gcc libuuid-devel squashfs-tools openssl-devel
    # 安装go
    export VERSION=1.13 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,这里的安装版本为3.2.0 
    export VERSION=3.2.0 
    wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz 
    tar -xzf singularity-${VERSION}.tar.gz
    cd singularity
    ./mconfig
    cd builddir/
    make && make install
    cd ../..
    rm -rf singularity*
    

    2、制作镜像(本地计算机)

    # 创建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://lammps.sandia.gov/tars/lammps-10Feb21.tar.gz
    tar zxvf lammps-10Feb21.tar.gz
    cd lammps-10Feb21
    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 yes-std
    make no-lib
    make -j 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 -np 2 --mca btl ^openib lmp_g++_openmpi -in in.lj
    # 退出容器,设置永久环境变量(宿主机)
    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 ./ubuntu20_lammps mpirun --allow-run-as-root -np 2 --mca btl ^openib lmp_g++_openmpi -in in.lj
    # 把修改好的sandbox打包成sif格式;
    # 删除不必要的安装包, 如 fftw-3.3.9.tar.gz lammps-10Feb21.tar.gz
    # 使用前面创建的sandbox目录生成singularity image file格式镜像。
    singularity build ubuntu20_lammps.sif ./ubuntu20_lammps
    

    3、基本使用(超算平台)

  • 上传创建好的镜像到超算平台,并执行镜像中的软件

  • 在登录节点提交作业

  • 新建作业脚本 myjob.sbatch

    #!/bin/bash
    #SBATCH --partition=hpxg
    #SBATCH --nodes=1
    #SBATCH --ntasks-per-node=2
    #SBATCH --time=1:00:00
    # 加载超算平台预安装的 singularity
    module load singularity
    # 测试in.lj算例
    singularity exec ubuntu20_lammps.sif mpirun -np 2 --mca btl ^openib lmp_g++_openmpi -in in.lj
    
    sbatch myjob.sbatch
    

    目录映射 [ --bind 或 -B ]

    /test 是宿主机目录,/test1 是容器内部目录,容器内部目录不需要提前创建。

      singularity shell -B /test:/test1 ./myimage.sif
    

    在武大超算上运行容器,如果涉及到 projectscratch 目录,都需要将目录映射到容器里

    singularity exec --bind /project/`whoami`,/scratch/`whoami`
    

    启用 Nvidia GPU 支持 [ --nv ]

      singularity shell --nv ./myimage.sif
    

    在运行前清除环境变量 [ --cleanenv ]

      singularity shell --cleanenv ./myimage.sif
    

    更多请查询 Singularity Command Line Interface

  •  
    推荐文章