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)