Slurm集群使用基础

Introduction

我们在做生物信息分析时,对于大规模的上游数据的处理,一般需要在大型服务器或集群上进行。我最早接触并使用的是一个基于SLURM调度系统的集群,在此记录一下基础使用方法。

高性能计算集群(High-Performance Computing Cluster,简称HPC集群)是一种计算系统,通过将多台计算机(通常称为节点)连接在一起,协同工作来解决需要大量计算资源的问题。这些集群被广泛应用于科学研究、工程计算、金融建模、大数据分析等领域。

SLURM(Simple Linux Utility for Resource Management)是一种开放源码的资源管理和任务调度系统,广泛应用于高性能计算(HPC)集群。SLURM负责分配计算资源、调度作业、监控系统状态和用户任务等工作,是HPC集群中不可或缺的一部分。

主要功能

  1. 资源分配:SLURM能够根据用户需求和集群资源情况,动态分配计算节点、CPU、内存和其他资源,确保资源的高效利用。

  2. 任务调度:SLURM可以将用户提交的计算任务按照优先级、依赖关系和资源需求进行调度,决定何时在何处执行这些任务。

  3. 任务管理:用户可以通过SLURM提交、监控和管理他们的任务,包括查看任务状态、取消任务、重新排队等操作。

  4. 负载均衡:SLURM通过智能调度算法,尽量均衡各节点的负载,避免资源浪费,提高集群的整体效率。

  5. 作业依赖管理:支持复杂的作业依赖关系管理,例如在一个作业完成后再启动另一个作业,或多个作业之间的依赖关系管理。

工作流程

  1. 提交作业:用户通过sbatch命令提交编写好的作业脚本,描述作业的资源需求(如节点数、CPU数、内存等)和执行命令。
  2. 资源分配:SLURM的调度器(slurmctld)根据当前的资源可用情况和作业队列中的优先级,分配资源给新提交的作业。
  3. 作业执行:分配到资源的作业通过srun命令在指定的节点上启动并运行。
  4. 作业监控:运行中的作业由slurmd守护进程进行监控,用户可以使用squeue命令查看作业的执行状态。
  5. 结果处理:作业完成后,输出结果通常会被保存到用户指定的文件中,用户可以通过slurm提供的命令查看和管理这些结果。

优势

  • 高可扩展性:能够管理从几台到上百万台计算节点的集群。
  • 开源和社区支持:丰富的文档和活跃的用户社区,便于问题解决和功能扩展。
  • 灵活性和可配置性:支持多种调度策略和配置,适应不同的工作负载和需求。

基础使用

常用命令

  1. sinfo: 查看队列状态和信息

    • 用途: 显示集群的分区和节点状态信息。
    • 选项:
      • -s 简要格式输出
      • -N 显示每个节点的信息
      • -p <partition> 只显示特定分区的信息
    • 输出字段:
      • PARTITION: 分区名称
      • AVAIL: 节点可用性状态(up/down)
      • TIMELIMIT: 分区的时间限制
      • NODES: 分区中的节点数量
      • STATE: 节点状态:drain(节点故障),alloc(节点在用),idle(节点可用),down(节点下线),mix(节点被占用,但仍有剩余资源)
      • NODELIST: 节点名称列表
  2. sacct: 显示用户作业历史

    • 用途: 查询作业历史记录,显示已完成和正在进行的作业信息。
    • 选项:
      • -j <jobid> 查询特定作业
      • -S <YYYY-MM-DD> 查询指定开始日期的作业
      • -u <username> 查询特定用户的作业
    • 输出字段:
      • JobID: 作业ID
      • JobName: 作业名称
      • Partition: 分区名称
      • Account: 用户账户
      • State: 作业状态(COMPLETED、FAILED、CANCELLED等)
      • Elapsed: 作业运行时间
  3. squeue: 显示当前作业状态

    • 用途: 显示当前在队列中排队和运行的作业状态。
    • 选项:
      • -u <username> 只显示特定用户的作业
      • -p <partition> 只显示特定分区的作业
    • 输出字段:
      • JOBID: 作业ID
      • PARTITION: 分区名称
      • NAME: 作业名称
      • USER: 用户名
      • ST: 作业状态(PD排队;R运行;S挂起;CG正在退出)
      • TIME: 作业运行时间
      • NODES: 作业使用的节点数量
      • NODELIST(REASON): 作业所在节点或排队原因
  4. sbatch: 提交作业

    • 用途: 提交批处理作业脚本。
    • 示例:
      sbatch my_job_script.sh
      
    • 常用选项:
      • --job-name=<name> 设置作业名称
      • --partition=<partition> 指定作业提交的分区
      • --time=<time> 设置作业运行时间限制
  5. scancel: 取消指定作业

    • 用途: 取消一个或多个作业。
    • 示例:
      scancel 12345
      
    • 选项:
      • -u <username> 取消特定用户的所有作业
      • -p <partition> 取消特定分区中的作业
  6. pestat: 节点使用信息

    • 用途: 显示集群节点的使用情况和状态信息(此命令可能是集群特定的,或者通过管理员定义的别名)。
    • 示例:
      pestat
      
  7. sacct -j <jobid>: 检查已完成作业的信息

    • 用途: 查看特定作业的详细信息,包括如何完成或失败。
    • 示例:
      sacct -j 12345
      
  8. seff <jobid>: 查看已完成任务的资源使用情况

    • 用途: 显示特定作业的资源使用效率,包括CPU、内存等。
    • 示例:
      seff 12345
      
  9. scontrol show job <jobid>: 显示作业细节

    • 用途: 提供有关特定作业的详细信息,包括作业配置和当前状态。
    • 示例:
      scontrol show job 12345
      

其他有用的SLURM命令

  1. srun: 直接运行并行作业

    • 用途: 在分配的资源上运行一个并行任务,通常用于交互式会话。
    • 示例:
      srun --partition=short --ntasks=4 my_program
      
  2. scontrol: 管理SLURM系统

    • 用途: 用于查询和更改SLURM系统的配置和状态。
    • 常用命令:
      • scontrol show partition 显示分区信息
      • scontrol update NodeName=<node> State=RESUME 恢复节点
  3. sreport: 生成使用报告

    • 用途: 生成有关作业、用户和账户的资源使用报告。
    • 示例:
      sreport cluster utilization
      

作业参数

  • #SBATCH --job-name 作业名称
  • #SBATCH --output 标准输出文件:如/share/home/pengchen/work/%x_%A_%a.out
  • #SBATCH --error ERROR输出文件:如/share/home/pengchen/work/%x_%A_%a.err
  • #SBATCH --partition 工作分区,我们用cpu之类的
  • #SBATCH --nodelist 可以制定在哪个节点运行任务
  • #SBATCH --exclude 可以设置不放在某个节点跑任务
  • #SBATCH --nodes 使用nodes数量
  • #SBATCH --ntasks tasks数量,可能分配给不同node
  • #SBATCH --ntasks-per-node 每个节点的tasks数量,由于我们只有1 node,所以ntasks和ntasks-per-node是相同的
  • #SBATCH --cpus-per-task 每个task使用的core的数量(默认 1 core per task),同一个task会在同一个node
  • #SBATCH --mem 这个作业要求的内存 (Specified in MB,GB)
  • #SBATCH --mem-per-cpu 每个core要求的内存 (Specified in MB,GB)

在SLURM中,一个任务(task)被理解为一个进程(process),一个多进程(multi-process)程序由多个任务组成。相反,多线程(multithreaded)程序只有一个任务,但这个任务使用多个logical CPU。更好的理解ntasks,参考what does the ntasks or n tasks does in slurm

例子:

#!/bin/bash
#SBATCH --job-name=myjob
#SBATCH --output=/share/home/pengchen/work/%x_%A_%a.out
#SBATCH --error=/share/home/pengchen/work/%x_%A_%a.err
#SBATCH --partition=cpu
#SBATCH --nodes=1
#SBATCH --tasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --mem-per-cpu=2g
#SBATCH --time=14-00:00:00
echo start: `date +'%Y-%m-%d %T'`
start=`date +%s`
####################do something####################
echo end: `date +'%Y-%m-%d %T'`
end=`date +%s`
echo TIME:`expr $end - $start`s

把上面的内容保存为myjob.sh文件,然后使用sbatch即可提交排队。

tmux+srun

tmux是一个 terminal multiplexer(终端复用器),它可以启动一系列终端会话。

在我们使用命令行时,打开一个终端窗口,会话开始,执行某些命令如sleep 100,关闭此终端窗口,会话结束,sleep命令会话随之被关闭而非等到正常结束。

当我们希望运行的程序不会受会话窗口的关闭而随之消失,我们会使用到类似于nohup这样的方式将运行的命令后台化的。

但集群并不可以如此:当我们申请节点资源后到该节点去执行nohup时看上去程序已经后台运行了,但当会话窗口关闭后作业将会被视为结束,节点则会运行相应的清理动作结束掉后台运行的程序;此时tmux的功能便显现出优势。

  1. 申请节点资源(使用SLURM调度器):

    salloc -N 1 -n 1 --time=01:00:00
    

    这条命令申请一个节点,时间为1小时。

  2. 在节点上启动tmux会话

    tmux new-session -s myjob # 新建一个名称为myjob的会话
    
  3. 运行任务

    ./run_my_simulation.sh
    
  4. 分离会话
    可以在不影响任务运行的情况下关闭终端窗口或断开连接:

    # Ctrl+b,然后按 d 
    # 或者
    tmux detach
    
  5. 重新连接到会话(如有需要):

    tmux ls # 查看所有的会话
    tmux attach-session # 默认进入第一个会话
    tmux attach-session -t myjob # 进入到名称为myjob的会话
    
  6. 关闭会话

会话的使命完成后是一定要关闭的;可以使用exit退出,快捷键Ctrl+d

或者使用tmux配合srun申请资源:

tmux
srun -n 1 --pty /bin/bash
tmux detach

此窗口作业会一直运行,直到手动退出/作业时间限制。

module

在SLURM集群环境中,模块管理系统(如LmodEnvironment Modules)常用于管理和切换不同的软件环境。模块系统可以简化软件依赖和版本控制,允许用户动态加载或卸载软件包和库。

模块系统使用模块文件来描述如何设置环境变量(如PATHLD_LIBRARY_PATH等),以便使用特定的软件包或库。常用命令包括module loadmodule unloadmodule list等。

  1. 查看可用模块

    module avail
    

    这将列出所有可用的模块。

  2. 加载模块

    module load module_name
    

    例如,加载GCC编译器:

    module load gcc
    
  3. 卸载模块

    module unload module_name
    

    例如,卸载GCC编译器:

    module unload gcc
    
  4. 显示已加载模块

    module list
    

    这将显示当前会话中已加载的模块。

  5. 显示模块信息

    module show module_name
    

    例如,查看GCC模块的详细信息:

    module show gcc
    

在SLURM作业脚本中使用模块

在提交到SLURM的作业脚本中,可以使用模块命令来设置所需的软件环境。以下是一个示例SLURM作业脚本:

#!/bin/bash
#SBATCH --job-name=myjob            # 作业名称
#SBATCH --output=myjob.out          # 标准输出和错误日志
#SBATCH --error=myjob.err           # 错误日志文件
#SBATCH --ntasks=1                  # 运行的任务数
#SBATCH --time=01:00:00             # 运行时间
#SBATCH --partition=compute         # 作业提交的分区# 加载模块
module load gcc
module load python# 打印加载的模块
module list# 运行命令
python my_script.py

在这个脚本中,module load gccmodule load python 用于加载所需的GCC编译器和Python环境。module list命令将打印当前加载的模块,方便调试。

conda

集群上一般用户都没有root权限,无法使用普通服务器的sudo安装软件方法,也无法使用docker(但是可以用singularity,下次可以讲讲这个)。建议使用conda进行环境配置和软件安装:

Conda 是一个开源的软件包管理和环境管理系统,支持跨平台使用,包括Linux、macOS和Windows。Conda 可以用于安装、运行和更新各种软件包和依赖,并能在不同环境之间轻松切换。用户可以在自己的家目录中安装Miniconda,这是Conda的一个轻量级版本,只包含包管理系统和Python。

  • 安装Miniconda
  1. 下载Miniconda安装脚本

    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
    
  2. 运行安装脚本

    bash Miniconda3-latest-Linux-x86_64.sh
    
  3. 按照提示完成安装。安装完成后,您可能需要重启终端或运行以下命令来激活Conda:

    source ~/.bashrc
    
  • 使用Conda创建和管理环境
  1. 创建新环境

    conda create --name myenv python=3.8
    

    这将创建一个名为myenv的新环境,并安装Python 3.8。

  2. 激活环境

    conda activate myenv
    

    激活后,所有在此环境下运行的命令都将使用该环境中的软件和库。

  3. 安装软件包

    conda install numpy scipy
    

    这将在当前激活的环境中安装NumPy和SciPy。

  4. 列出已安装环境

    conda env list
    
  5. 停用环境

    conda deactivate
    
  6. 删除环境

    conda remove --name myenv --all
    

在提交到SLURM的作业脚本中,可以激活Conda环境以确保作业在正确的软件环境中运行。以下是一个示例SLURM作业脚本:

#!/bin/bash
#SBATCH --job-name=myjob            # 作业名称
#SBATCH --output=myjob.out          # 标准输出和错误日志
#SBATCH --error=myjob.err           # 错误日志文件
#SBATCH --ntasks=1                  # 运行的任务数
#SBATCH --time=01:00:00             # 运行时间
#SBATCH --partition=compute         # 作业提交的分区# 加载Conda
source ~/miniconda3/etc/profile.d/conda.sh# 激活环境
conda activate myenv# 运行命令
python my_script.py

Conda与其他工具的比较

  1. Conda vs. Virtualenv

    • Conda不仅管理Python包,还能管理非Python软件包和库,如R、C++库等。
    • Virtualenv专注于Python环境,轻量级但功能不如Conda全面。
  2. Conda vs. Docker/Singularity

    • Conda在不需要root权限的情况下,为用户提供了灵活的软件管理方式。
    • Docker需要root权限,但提供更隔离的容器化环境。集群上通常不能使用。
    • Singularity与Docker类似,但更适合在HPC环境中使用,不需要root权限。将在后续讨论。

关注公众号,获取最新推送

关注公众号 ‘bio llbug’,获取最新推送。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/335863.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪心(临项交换)+01背包,蓝桥云课 搬砖

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0搬砖 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 将物品按照w[i] v[i]升序排序然后跑01背包就是答案 下面证明&#xff1a;&#xff08;不要问怎么想到的&#xff0c;做题多了就能想到&#xff…

氢燃料电池汽车行业发展

文章目录 前言 市场分布 整车销售 发动机配套 氢气供应 发展动能 参考文献 前言 见《氢燃料电池技术综述》 见《燃料电池工作原理详解》 见《燃料电池发电系统详解》 见《燃料电池电动汽车详解》 市场分布 纵观全球的燃料电池汽车市场&#xff0c;截至2022年底&#xff…

Git——pull request详细教程

当我们需要协助其他仓库完成更改时&#xff0c;往往会用到git中的Pull Request操作&#xff0c;从而方便团队的协作管理和代码持续集成。 下面是详细的教程步骤。 一. Fork目标项目 比如说我现在要fork以下Qwen-VL的项目&#xff0c;如图所示&#xff1a; 随后点击Create即可…

转行一年了

关注、星标公众号&#xff0c;直达精彩内容 ID&#xff1a;技术让梦想更伟大 整理&#xff1a;李肖遥 来公司一年了。 说是转行其实还是在半导体行业&#xff0c;熟悉我的朋友知道 &#xff0c;我在18年开始进入半导体行业&#xff0c;那个时候想着行业很重要&#xff0c;站对了…

【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)

一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码&#xff1a;打造高效便捷的预定体验 一、引言&#xff1a;数字化预定时代的来临 …

新火种AI|寻求合作伙伴,展开豪赌,推出神秘AI项目...苹果能否突破AI困境?

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年&#xff0c;伴随着AI技术的多次爆火&#xff0c;不仅各大科技巨头纷纷进入AI赛道展开角力&#xff0c;诸多智能手机厂商也纷纷加紧布局相关技术&#xff0c;推出众多AI手机。作为手机领域的龙头老大&#xff0c;苹果自然是…

LeetCode---链表

203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 代码示例1&#xff1a;(直接使用原来的链表来进行移除节点操作) //时间复杂度: O(n) //空间复杂度: O(1) class Solu…

啊哈!算法-第2章-栈、队列、链表

啊哈!算法-第2章-栈、队列、链表 第1节 解密qq号——队列第2节 解密回文——栈第3节 纸牌游戏——小猫钓鱼第4节 链表第5节 模拟链表 第1节 解密qq号——队列 新学期开始了&#xff0c;小哈是小哼的新同桌(小哈是个大帅哥哦~)&#xff0c;小哼向小哈询问 QQ 号&#xff0c; 小…

有限元之抛物型方程初边值问题解法

目录 一、原方程的变分形式 二、有限元法进行空间半离散 三、差分法进行时间全离散 四、相关量的数值计算 五、编程时的说明 六、算例实现 6.1 C代码 6.2 计算结果 本节我们将采用有限元法联合差分法来数值求解抛物型方程的初边值问题&#xff1a; 其中常数。 一、原方…

Element-UI 入门指南:从安装到自定义主题的详细教程

Element-UI 是一个基于 Vue.js 的前端组件库&#xff0c;它提供了丰富的 UI 组件&#xff0c;可以帮助开发者快速构建高质量的用户界面。以下是使用 Element-UI 的快速入门指南&#xff1a; 安装 Element-UI Element-UI 是一个基于 Vue.js 的组件库&#xff0c;它提供了丰富的…

LangChain入门开发教程(一):Model I/O

官方文档&#xff1a;https://python.langchain.com/docs/get_started/introduction/ LangChain是一个能够利用大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能力进行快速应用开发的框架&#xff1a; 高度抽象的组件&#xff0c;可以像搭积木一样&a…

LeetCode2336无限集中的最小数字

题目描述 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。实现 SmallestInfiniteSet 类&#xff1a;SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest() 移除 并返回该无限集中的最小整数。void addBack(int num) 如果正整数 …

基于Python实现 HR 分析(逻辑回归和基于树的机器学习)【500010104】

介绍 数据集说明 此数据集包含与员工有关的综合属性集合&#xff0c;从人口统计细节到与工作相关的因素。该分析的主要目的是预测员工流动率并辨别导致员工流失的潜在因素。 在这个数据集中&#xff0c;有14,999行&#xff0c;10列&#xff0c;以及这些变量&#xff1a;满意度…

Python轻量级的插件框架库之pluginbase使用详解

概要 在软件开发中,插件系统是一个常见的需求。插件系统允许开发者动态加载和卸载功能模块,从而提高应用程序的灵活性和可扩展性。Python的pluginbase库是一个轻量级的插件框架,旨在简化插件系统的构建过程。pluginbase库提供了一套简单易用的API,使开发者能够快速集成插件…

leetCode-hot100-数组专题之子数组+二维数组

数组专题之子数组二维数组 子数组238.除自身以外数组的乘积560.和为K的子数组 二维数组48.旋转图像 子数组 数组的子数组问题是算法中常见的一类问题&#xff0c;通常涉及到数组的连续元素。在解决这类问题时&#xff0c;常用的方法有前缀和、滑动窗口、双指针&#xff0c;分治…

Sping源码(九)—— Bean的初始化(非懒加载)— getMergedLocalBeanDefinition

序言 前两篇文章介绍了Bean初始化之前的一些准备工作&#xff0c;包括设置BeanFacroty的ConversionService属性以及将Bean进行冻结。这篇文章将会进入到preInstantiateSingletons方法。进一步了解Bean的初始化流程。 preInstantiateSingletons public void preInstantiateSin…

一篇文章讲透排序算法之快速排序

前言 本篇博客难度较高&#xff0c;建议在学习过程中先阅读一遍思路、浏览一遍动图&#xff0c;之后研究代码&#xff0c;之后仔细体会思路、体会动图。之后再自己进行实现。 一.快排介绍与思想 快速排序相当于一个对冒泡排序的优化&#xff0c;其大体思路是先在文中选取一个…

装机必备——截图工具Snipaste安装教程

装机必备——截图工具Snipaste安装教程 软件下载 软件名称&#xff1a;Snipaste2.7 软件语言&#xff1a;简体中文 软件大小&#xff1a;15.37M 系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载通…

数据结构(七)查找

2024年5月26日一稿&#xff08;王道P291&#xff09; 7.1 查找的基本概念 7.2 顺序查找和折半查找 7.2.1 顺序查找 7.2.2 折半查找 7.2.3 分块查找 7.3 树形查找 7.3.1 二叉排序树(BST) 7.3.2 平衡二叉树 7.4 B树和B树 7.4.1 B树及其基本操作 7.4.2 B树的基本概念 7.5 散列&…

idea、datagrip注册记录下

一、DataGrip注册 DataGrip版本号&#xff1a;DataGrip 2023.2 访问地址&#xff1a;https://3.jetbra.in/ 点击“hardbin.com”&#xff0c;下载“jetbra.zip” 在vm里面添加上&#xff1a; -javaagent:D:\work\idea\jetbra\ja-netfilter.jarjetbrains重启datagrip 在刚刚…