ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

高性能计算容器Singularity实战:从安装部署到HPC集群应用

高性能计算容器Singularity实战:从安装部署到HPC集群应用 1. 先搞清楚“辛格”和“奇点”到底在争什么如果你在技术社区里看到“辛格 singularity 定义之争”这个说法第一反应可能是懵的。这到底是在讨论一个叫“辛格”的人还是在讨论“技术奇点”这个概念实际上这里存在一个典型的术语混淆和传播误读。“Singularity”在英文中是一个多义词在技术领域它最广为人知的含义是“技术奇点”即由雷·库兹韦尔等人提出的、关于人工智能超越人类智能后历史轨迹发生根本性改变的假说性未来时刻。然而在另一个非常具体的技术子领域——高性能计算和容器技术——里“Singularity”指的是一款由劳伦斯伯克利国家实验室开发的开源容器平台专门用于科学计算和HPC环境旨在简化软件部署保证计算的可重复性。那么“辛格”是谁这通常是“Singularity”容器的中文音译。在国内的技术讨论特别是高性能计算圈子的交流中开发者们习惯于用“辛格”来指代这款容器工具以区别于那个宏大的“技术奇点”概念。所以所谓的“定义之争”核心并不是学术界在辩论某个概念的哲学边界而更多是技术传播中的信息错位当一个对HPC容器不熟悉的开发者或爱好者看到“辛格(singularity)”这个词时很容易将其与“AI技术奇点”联系起来从而产生理解上的偏差和讨论上的鸡同鸭讲。这场“争论”的价值在于提醒我们在技术交流中明确语境和定义是高效沟通的第一步。对于想了解或使用相关技术的人来说首要任务就是分清你面对的“Singularity”究竟是指一个未来学的理论概念还是一个今天就能下载、编译、并用来打包和运行科学计算应用的实际工具。2. 作为工具的“辛格”它到底解决了什么实际问题我们先把那个遥不可及的“未来奇点”放在一边聚焦于作为工具的Singularity容器。如果你在生物信息、计算化学、物理模拟、机器学习模型部署等领域工作那么理解这个“辛格”的价值远比争论定义来得实在。它核心解决的是一个在科学计算和高性能计算中长期存在的痛点软件环境依赖的复杂性与计算环境稳定性、安全性的矛盾。传统的科研软件部署常常面临这些困境依赖地狱软件A需要GCC 7软件B需要GCC 9系统自带的库版本又不对手动编译安装依赖项极其繁琐且容易冲突。环境移植性差在你自己笔记本上跑通的分析流程放到学校的HPC集群上可能因为库文件缺失或版本差异而无法运行。权限与安全限制HPC集群通常不允许普通用户使用sudo权限而Docker这类容器运行时需要root权限这在共享的计算环境中是不被允许的。可重复性危机今天能跑出结果的流程三个月后因为系统更新可能就跑不通了论文中的结果无法被他人复现。Singularity容器正是针对这些痛点设计的无需root权限用户可以在没有管理员权限的情况下运行容器。这是它能在HPC集群中普及的关键。直接集成宿主环境与Docker将容器与宿主高度隔离不同Singularity容器可以方便地挂载用户家目录、集群的共享存储如Lustre, GPFS直接使用宿主机的InfiniBand网络和GPU设备如NVIDIA CUDA使得高性能计算成为可能。单一可执行文件一个.sifSingularity Image Format文件包含了完整的应用及其依赖可以像二进制程序一样被拷贝、分享和执行。强调可重复性通过定义文件Singularity或Singularity.def来构建镜像确保了构建过程的透明和可重复。因此当你在技术文档或讨论中看到“辛格”你应该立刻联想到的是一套用于打包、分发和运行科学计算工作流的实用工具链而不是一个哲学命题。3. 从零开始如何获取并运行你的第一个“辛格”容器理论说再多不如动手跑一个。下面我们以在Linux系统这是Singularity的主要运行环境上从零开始体验为例拆解整个过程。请注意由于HPC集群环境各异以下步骤更适用于个人工作站或拥有sudo权限的测试环境。集群上的使用请遵循所在机构的具体指南。3.1 环境准备与安装首先确认你的环境。Singularity主要支持Linux。如果你用的是Windows或macOS需要通过虚拟机如VirtualBox安装Linux或使用WSL2Windows Subsystem for Linux。安装方式主要有两种从源码编译安装最灵活适合定制# 1. 安装依赖 sudo apt-get update sudo apt-get install -y \ build-essential \ libssl-dev \ uuid-dev \ libgpgme-dev \ squashfs-tools \ libseccomp-dev \ wget \ pkg-config \ git # 2. 下载源码以3.11.0为例请检查官网获取最新版本 wget https://github.com/sylabs/singularity/releases/download/v3.11.0/singularity-ce-3.11.0.tar.gz tar -xzf singularity-ce-3.11.0.tar.gz cd singularity-ce-3.11.0 # 3. 编译与安装 ./mconfig make -C builddir sudo make -C builddir install编译安装能确保获得最新特性但过程稍长。使用包管理器安装最快捷但版本可能较旧# 对于Debian/Ubuntu (需要先添加仓库) wget -O- https://apt.repos.sylabs.io/sylabs.gpg | sudo apt-key add - echo deb https://apt.repos.sylabs.io/ubuntu $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/singularity.list sudo apt-get update sudo apt-get install singularity-ce # 对于RHEL/CentOS/Rocky/AlmaLinux sudo yum install -y epel-release sudo yum install -y singularity-ce安装完成后验证是否成功singularity --version # 应输出类似singularity-ce version 3.11.03.2 拉取与运行一个现成容器和Docker类似你可以从容器仓库拉取现成的镜像。Sylabs Cloud (library://) 和 Docker Hub (docker://) 是主要来源。运行一个简单的Ubuntu容器# 从Sylabs Library拉取一个轻量级Alpine Linux镜像并启动shell singularity pull library://alpine:latest # 这会下载一个 alpine_latest.sif 文件 singularity shell alpine_latest.sif # 进入容器内部执行命令如 cat /etc/os-release然后输入 exit 退出 # 直接从Docker Hub拉取并运行不保存本地sif文件 singularity exec docker://ubuntu:22.04 cat /etc/os-release这个singularity exec命令非常有用它直接从远程仓库拉取镜像缓存于~/.singularity/cache并执行一条命令适合快速测试。3.3 构建一个自定义容器要真正发挥Singularity的威力你需要学会构建包含自己工作流的镜像。这通过一个定义文件来完成。创建一个名为myapp.def的文件Bootstrap: docker From: ubuntu:22.04 %post # 这里是构建时执行的命令用于安装软件 apt-get update apt-get install -y \ python3 \ python3-pip \ wget \ curl pip3 install numpy pandas matplotlib %environment # 设置容器运行时的环境变量 export LC_ALLC.UTF-8 export MY_APP_HOME/opt/myapp %runscript # 当容器被直接运行时执行的命令 echo “欢迎使用我的自定义应用容器” python3 --version %labels # 镜像的元数据 Author YourName Version v1.0然后使用sudo权限构建镜像因为构建过程可能需要创建文件系统sudo singularity build myapp.sif myapp.def构建完成后你就拥有了一个独立的、可复现的myapp.sif文件。你可以将它复制到任何安装了Singularity的Linux系统上运行# 运行镜像中定义的%runscript ./myapp.sif # 或者进入交互式shell singularity shell myapp.sif # 或者在容器内执行特定命令 singularity exec myapp.sif python3 -c “import numpy; print(numpy.__version__)”4. 在HPC集群中实战关键配置与避坑指南在个人环境跑通只是第一步Singularity的主战场是HPC集群。这里的环境更复杂限制更多需要特别注意以下几点。4.1 理解集群的文件系统布局典型HPC集群的文件系统通常包括家目录 ($HOME)空间小用于存放配置文件和小型数据。你的Singularity缓存~/.singularity/cache默认在这里如果缓存大型镜像可能爆满。工作目录 ($WORK或/scratch)大容量、高性能存储用于计算中的临时数据。建议将镜像文件.sif和计算I/O放在这里。共享软件目录 (/software或/apps)管理员可能已预装了一些Singularity镜像。避坑点1缓存目录设置在作业提交脚本中最好显式设置一个位于工作目录的缓存路径避免家目录空间不足。# 在作业脚本中 export SINGULARITY_CACHEDIR/scratch/$USER/.singularity/cache4.2 在作业调度系统中使用假设集群使用Slurm作业调度系统。一个典型的提交脚本 (job.sh) 可能长这样#!/bin/bash #SBATCH --job-namesingularity-test #SBATCH --nodes1 #SBATCH --ntasks-per-node1 #SBATCH --cpus-per-task4 #SBATCH --mem8G #SBATCH --time01:00:00 #SBATCH --output%x-%j.out # 加载必要的模块根据集群配置 module load singularity/3.11.0 # 设置缓存目录到工作区 export SINGULARITY_CACHEDIR$WORK/.singularity_cache # 切换到工作目录这里I/O更快 cd $WORK/my_project # 1. 直接运行远程镜像中的命令首次会拉取 singularity exec docker://python:3.9-slim python -c “print(‘Hello from inside the container!’)” # 2. 或者如果已有本地sif文件 # singularity exec $WORK/images/my_python.sif python my_analysis_script.py # 3. 挂载特定数据目录-B /宿主机路径:/容器内路径 # 例如将当前项目目录挂载到容器的 /data # singularity exec -B $WORK/my_project:/data $WORK/images/my_python.sif python /data/script.py使用sbatch job.sh提交作业。关键在于理解-B或--bind挂载参数它让你能够将集群存储上的数据映射到容器内部。4.3 GPU与MPI支持对于深度学习和并行计算任务GPU和MPI集成是重中之重。GPU支持Singularity对NVIDIA GPU的支持非常直接只要宿主机安装了正确的NVIDIA驱动和CUDA并在运行容器时加上--nv参数容器内就能直接使用GPU。# 运行一个支持CUDA的容器 singularity exec --nv docker://tensorflow/tensorflow:latest-gpu python -c “import tensorflow as tf; print(tf.config.list_physical_devices(‘GPU’))”注意容器内通常不需要单独安装CUDA驱动但需要包含CUDA运行时库cuda-toolkit。大多数深度学习框架的官方镜像都已包含。MPI支持MPI消息传递接口的情况更复杂一些。有两种模式宿主MPI模式推荐容器内不安装MPI使用宿主机上由HPC系统模块提供的MPI。这要求容器内的应用与宿主机MPI如OpenMPI, Intel MPI的ABI兼容。通常使用科学计算基础镜像如library://sylabsed/examples/lammps能保证兼容性。运行时通过module load mpi加载MPI然后直接运行。module load openmpi/4.1.5 singularity mpirun -np 4 singularity exec $WORK/images/lammps.sif lmp -in in.script容器内MPI模式容器内自带一套完整的MPI。这需要确保容器内的MPI版本与宿主机的进程间通信如Infiniband驱动兼容配置更复杂一般不推荐新手使用。避坑点2权限与用户映射在容器内默认你会以和宿主机相同的用户ID运行。这意味着你在容器内创建的文件在宿主机上拥有相同的所有权。这通常是个好特性。但如果你的工作流需要在容器内以root执行某些操作尽管不推荐可以使用--fakeroot选项需要管理员配置支持。5. 性能、安全与最佳实践考量将Singularity用于实际生产工作流时除了功能还需关注性能、安全性和维护性。5.1 性能优化建议镜像层与构建优化在定义文件的%post部分将多个apt-get install或yum install命令合并并在最后清理缓存可以显著减小镜像体积。%post apt-get update apt-get install -y package1 package2 package3 \ apt-get clean \ rm -rf /var/lib/apt/lists/*使用本地SIF文件在计算节点上反复从远程仓库拉取镜像会浪费时间和网络。最佳实践是在作业开始前将所需的.sif文件预先拉取或复制到集群的共享工作文件系统如$WORK然后让作业脚本直接指向该本地文件。I/O性能对于数据密集型任务确保通过-B参数将高速存储如Lustre挂载到容器内而不是在容器镜像内进行大量读写。5.2 安全模型理解Singularity的安全哲学与Docker不同。它默认假设用户就是容器的用户因此用户隔离你在容器内能做的事情基本上就是你作为系统用户能做的事情。你不能通过容器提权。文件系统隔离是可选的你可以通过挂载-B将宿主目录暴露给容器。这意味着你需要信任容器内的软件不会恶意删除或修改你挂载的文件。只从可信来源如官方库、已验证的科研项目拉取镜像。SUID程序默认情况下容器内的SUID程序是无效的这防止了通过SUID二进制文件进行权限提升。5.3 维护与可重复性最佳实践版本控制定义文件将你的.def文件纳入Git等版本控制系统。这是实现可重复构建的基石。为镜像打上明确标签不要总是使用latest。构建时使用包含版本号或提交哈希的标签例如myapp_v1.2.sif。在定义文件中固定基础镜像版本使用From: ubuntu:22.04而不是From: ubuntu:latest以避免未来基础镜像更新导致的不确定性。记录构建环境在文档中记录构建镜像时使用的Singularity版本和宿主系统有时这有助于排查奇怪的兼容性问题。考虑使用Sandbox对于复杂的、需要多次调试的构建可以先构建一个沙盒目录singularity build --sandbox myapp/ myapp.def这是一个可写的目录结构方便你进入singularity shell --writable myapp/进行调试和修改调试完成后再将其构建为最终的SIF文件。6. 常见问题排查当事情不按预期工作时即使按照指南操作你也可能会遇到问题。下面是一个从简单到复杂的排查顺序。问题1singularity: command not found原因Singularity未安装或不在PATH中。排查执行which singularity或singularity --version确认。在HPC集群上通常需要通过module load singularity来加载环境模块。检查可用模块module avail。问题2拉取镜像失败报错Unable to pull docker://...或网络错误原因网络连接问题或Docker Hub速率限制。排查检查网络连通性。尝试从library://拉取看是否是特定仓库问题。对于Docker Hub可以考虑配置镜像加速器需在宿主机配置Docker Daemon代理对Singularity本身较复杂或者先在其他网络通畅的机器上用docker pull拉取再通过docker save和singularity build导入。使用singularity pull --disable-cache ...绕过缓存尝试。问题3运行容器时报错FATAL: kernel too old原因容器内的软件通常是glibc库需要比宿主机内核更新的系统调用支持。排查尝试使用基于更老基础镜像如centos:7构建的容器或者联系集群管理员升级内核通常不可行。问题4容器内无法访问挂载的目录或文件原因挂载路径错误或宿主机路径权限不足。排查使用singularity shell -B /host/path:/container/path image.sif进入容器手动检查/container/path是否存在及内容。确认宿主机上/host/path的权限确保你的用户有读取或写入权限。挂载路径使用绝对路径。问题5使用GPU时容器内检测不到GPU原因缺少--nv标志宿主机NVIDIA驱动/CUDA未安装容器内缺少CUDA运行时。排查确保命令中包含--nv。在宿主机运行nvidia-smi确认驱动正常。尝试运行一个已知良好的GPU镜像如singularity exec --nv docker://nvcr.io/nvidia/cuda:12.2.0-base nvidia-smi。如果这个能行问题出在你的自定义镜像上。问题6MPI作业运行失败或性能极差原因MPI兼容性问题或网络设备未正确传入容器。排查确认使用的是宿主MPI模式并且加载了正确的MPI模块。尝试使用一个简单的MPI测试程序如osu_bw来自OSU Micro-Benchmarks在容器内外分别测试对比性能。对于InfiniBandSingularity通常会自动处理设备映射。如果怀疑有问题可以尝试添加--bind /dev/infiniband进行显式绑定需管理员确认路径。当遇到复杂问题时启用--debug或--verbose标志运行Singularity命令会输出大量详细信息是定位问题的宝贵资源。回过头看“辛格 singularity 定义之争”其本质是技术术语在跨语境传播时产生的噪音。对于实践者而言更重要的是跳过名词的争论直接抓住工具的核心价值它是一款为科学计算而生的、安全且高效的容器化解决方案。评估它是否适合你的项目关键不是看它名字的哲学意味而是看它能否在你的HPC环境里稳定、便捷地封装并运行你的那些依赖复杂、对性能敏感的计算任务。从拉取第一个镜像到构建自定义环境再到集成进Slurm作业流每一步都踏实地解决一个具体问题这远比参与一场名词之争更有意义。
返回列表