跳转至

857. 高性能计算在生信

一句话概述:HPC(高性能计算) = 把一台电脑干不完的活分给几百台电脑一起干——生信离不开它,因为一个WGS样本就有几十GB数据。

核心知识点速查表

概念说明类比
节点(Node)集群中的一台服务器一个工人
核心(Core)CPU中的计算单元工人的一只手
内存(RAM)临时数据存储工人的工作台
存储(Storage)持久数据保存仓库
调度器管理作业分配工头
队列(Queue)等待运行的作业池排队窗口
作业(Job)提交的计算任务一个工作订单

一、SLURM作业提交

# SLURM —— 最常用的HPC作业调度系统

# === 基本提交脚本 ===
#!/bin/bash
#SBATCH --job-name=bwa_align           # 作业名称
#SBATCH --partition=normal             # 队列名称
#SBATCH --nodes=1                      # 1个节点
#SBATCH --ntasks=1                     # 1个任务
#SBATCH --cpus-per-task=16             # 16个CPU核心
#SBATCH --mem=64G                      # 64GB内存
#SBATCH --time=24:00:00                # 最大运行时间24小时
#SBATCH --output=logs/%x_%j.out       # 标准输出(%x=作业名 %j=作业ID)
#SBATCH --error=logs/%x_%j.err        # 错误输出
#SBATCH --mail-type=END,FAIL          # 完成或失败时发邮件
#SBATCH --mail-user=your@email.com    # 邮箱地址

# 加载软件模块
module load bwa/0.7.17                 # 加载BWA
module load samtools/1.18              # 加载samtools

# 或者激活conda环境
source activate bioinfo                # 激活环境

# 运行分析
bwa mem -t ${SLURM_CPUS_PER_TASK} \   # 使用分配的CPU数
    ref.fa \                           # 参考基因组
    sample_R1.fq.gz sample_R2.fq.gz \ # 输入文件
    | samtools sort -@ 8 \             # 排序
    -o sample.sorted.bam               # 输出BAM

echo "Job finished at $(date)"        # 记录完成时间

# 提交作业
# sbatch align.sh

二、数组作业(批量处理)

# 数组作业 —— 一次提交处理100个样本

#!/bin/bash
#SBATCH --job-name=batch_align         # 作业名称
#SBATCH --array=1-100%20               # 数组1-100,最多同时20个
#SBATCH --cpus-per-task=8              # 每个子任务8核
#SBATCH --mem=32G                      # 每个子任务32GB
#SBATCH --time=8:00:00                 # 每个子任务最多8小时
#SBATCH --output=logs/align_%A_%a.out  # %A=主ID %a=数组索引

# 从样本列表文件读取对应行
SAMPLE=$(sed -n "${SLURM_ARRAY_TASK_ID}p" sample_list.txt)
echo "Processing sample: ${SAMPLE}"    # 打印当前样本

# 运行比对
bwa mem -t ${SLURM_CPUS_PER_TASK} \
    ref.fa \
    data/${SAMPLE}_R1.fq.gz \          # R1文件
    data/${SAMPLE}_R2.fq.gz \          # R2文件
    | samtools sort -@ 4 \
    -o results/${SAMPLE}.sorted.bam

samtools index results/${SAMPLE}.sorted.bam  # 建索引

echo "Sample ${SAMPLE} done"          # 完成标记

# 提交:sbatch batch_align.sh
# 管理:
# squeue -u username                  # 查看我的作业
# scancel 12345                       # 取消作业12345
# scancel --array=1-50 12345          # 取消部分数组

三、资源估算

# 生信常见任务的资源需求估算

resource_guide = {
    "BWA-MEM比对(WGS 30x)": {
        "cpu": "8-16核",               # CPU核心
        "memory": "32-64GB",           # 内存
        "time": "4-8小时",             # 运行时间
        "disk": "~100GB",             # 磁盘空间(输入+输出)
        "tips": "内存取决于参考基因组大小"
    },
    "GATK HaplotypeCaller(WGS)": {
        "cpu": "4-8核",
        "memory": "16-32GB",
        "time": "8-24小时",
        "disk": "~50GB",
        "tips": "可按染色体并行加速"
    },
    "STAR比对(RNA-seq)": {
        "cpu": "8-16核",
        "memory": "32-64GB",           # STAR需要较多内存加载索引
        "time": "1-2小时/样本",
        "disk": "~30GB",
        "tips": "共享内存模式可省内存"
    },
    "Cellranger(10x scRNA)": {
        "cpu": "16-32核",
        "memory": "64-128GB",          # 单细胞分析很吃内存
        "time": "4-12小时",
        "disk": "~200GB",
        "tips": "--localcores和--localmem控制资源"
    },
    "hifiasm(基因组组装)": {
        "cpu": "32-64核",
        "memory": "128-256GB",         # 组装需要大内存
        "time": "12-48小时",
        "disk": "~500GB",
        "tips": "HiFi数据组装比ONT快"
    },
    "Kraken2(宏基因组物种注释)": {
        "cpu": "8核",
        "memory": "64-128GB",          # 取决于数据库大小
        "time": "0.5-2小时",
        "disk": "~100GB(数据库)",
        "tips": "数据库必须放在快速存储上(SSD)"
    }
}

# 资源估算公式
# 时间 ≈ 数据量(GB) × 单位时间 / CPU核数
# 内存 ≈ 固定开销 + 数据量相关开销
# 磁盘 ≈ 原始数据 × 膨胀系数(通常2-5倍)

四、SLURM常用命令

# SLURM日常管理命令

# 查看集群状态
sinfo                                  # 查看所有队列/分区状态
sinfo -N -l                           # 详细节点信息

# 提交作业
sbatch script.sh                      # 提交批处理作业
srun --cpus-per-task=4 command        # 交互式运行
salloc -n 4 --mem=16G                 # 申请交互式资源

# 查看作业
squeue -u $USER                       # 查看自己的作业
squeue -j 12345                       # 查看特定作业
sacct -j 12345 --format=JobID,State,Elapsed,MaxRSS  # 作业详情

# 管理作业
scancel 12345                         # 取消作业
scancel -u $USER                      # 取消所有作业
scontrol hold 12345                   # 暂停作业
scontrol release 12345                # 恢复作业

# 查看历史资源使用
sacct -j 12345 \
    --format=JobID,JobName,Elapsed,MaxRSS,MaxVMSize,State
# MaxRSS = 实际使用的最大内存
# 根据历史使用调整后续作业的资源请求

# 查看队列空闲资源
sinfo -p normal -o "%N %C %m %e"     # 节点 CPU 总内存 空闲内存

五、Snakemake与SLURM集成

# Snakemake + SLURM = 自动化集群分析

# 方法1:Snakemake SLURM profile(推荐)
# ~/.config/snakemake/slurm/config.yaml
# executor: slurm
# default-resources:
#   slurm_partition: normal
#   mem_mb: 16000
#   runtime: 120     # 分钟

# 运行(自动提交到SLURM)
snakemake \
    --executor slurm \                 # 使用SLURM执行器
    --default-resources \
        slurm_partition=normal \       # 默认队列
        mem_mb=16000 \                 # 默认内存16GB
    --jobs 50 \                        # 最多50个并行作业
    --latency-wait 60                  # 等待文件系统同步

# 方法2:在Snakefile中为每个规则指定资源
# rule bwa_align:
#     resources:
#         mem_mb=64000,               # 64GB内存
#         runtime=480,                # 8小时
#         cpus_per_task=16            # 16核
#     threads: 16

常见报错与解决

报错信息原因解决方法
oom-kill / OUT_OF_MEMORY内存不足被杀增加--mem或优化程序内存
TIMEOUT超过时间限制增加--time或优化计算
QOSMaxJobsPerUser超过用户作业数限制等待已有作业完成
Invalid partition队列名写错sinfo查看可用队列
No space left on device磁盘空间不足清理临时文件或换存储
Module not found软件模块未加载module avail查看可用模块

速查表

# SLURM关键参数
--partition=normal      # 队列
--nodes=1               # 节点数
--ntasks=1              # 任务数
--cpus-per-task=16      # CPU核数
--mem=64G               # 内存
--time=24:00:00         # 时间限制
--array=1-100%20        # 数组作业(最多20并行)
--gres=gpu:1            # GPU数量

# 常用命令
sbatch    提交作业
squeue    查看队列
scancel   取消作业
sacct     查看历史
sinfo     集群信息
srun      交互运行

# 资源估算经验
WGS比对:      16核 64GB 8小时
RNA-seq比对:  8核  32GB 2小时
单细胞:       16核 64GB 6小时
基因组组装:   32核 128GB 24小时
宏基因组:     16核 64GB 4小时

# 调试技巧
1. 先用小数据测试资源需求
2. 用sacct查看实际使用量
3. 请求比实际多20-30%的资源
4. 数组作业控制并行数(%N)