GATK4丨如何设置线程数和内存大小?

简介: GATK4丨如何设置线程数和内存大小?

GATK4 实用技巧

前言

前天分享了GATK提高线程与内存效率的方法,虽然文章的内容很简单,在生信圈子里属于小菜一碟,但还是获得了70多位朋友的转发,而且大部分朋友都看完了整篇内容。

从后台数据来看,阅读量的来源大部分是通过推荐获得,说明现在公众号的推送机制是与内容质量挂钩,好的内容系统会自动推荐给更多适合的人,形成良性循环机制,莫愁沿路高歌无人应和

这是一个分享学习笔记的公众号,创建不到一年,根本算不上什么,能有人愿意来读,已经是莫大的鼓励。

笔者也只是一个非专业的生信爱好者,抽出休闲娱乐的时间来整理笔记,仅靠兴趣驱动产生更新动力,有时候笔记内也有小错误,感谢大家后台私信提醒和建议。

传播知识本身是一件好事,很多人在这个方面做的比笔者好,如同黑暗中的灯塔一样,照亮生信麻瓜的学习之旅,这种良好的氛围需要共同维护,感谢每一位不讲套路的生信创作者。


言归正传,今天分享的笔记还是关于GATK4使用上的一些技巧和提示,下面开始正式进入笔记正文。

GATK MarkDuplicates

在测序过程中由于PCR反应或者光学检测失误等原因会造成结果的误差,通过MarkDuplicates处理后能去除这种重复误差,这一步主要代码如下:

gatk --java-options "-Djava.io.tmpdir=./temp -Xms60G -Xmx60G" MarkDuplicatesSpark \
  -I /lscratch/$SLURM_JOBID/bwa.bam \
  -O /lscratch/$SLURM_JOBID/bwa_markdup.bam \
  --spark-master local[12]

该程序在运行时不同线程也会对速度造成影响,当超过20个线程后,随着线程增多速度不会有明显变化,因此在实际运算过程中根据服务器配置,选择20个线程以下,这样效率最高。

下图展示的是内存限制对该程序运行的影响,可以看出80GB和140GB内存对运行时间几乎没什么影响,因此实际操作是尽量不要浪费太多内存在这个阶段。

在运行按染色体编号进行排序时,CPU在8个线程时效率最高,之后随着线程数增加速度不会显著变换,因此最佳设置为8线程。

同样,在增加内存后也没有提高效率。

那么排不排序对运算速度有影响吗?下图中橙色线表示输入文件经过排序处理的运行速度,青色线表示没有经过处理,很明显排序后速度更快。

GATK HaplotypeCaller

这一步是GATK的核心功能,HaplotypeCaller用于计算每个样本的潜在变异位点并保存结果为GVCF格式,以便后续进行多样本联合分析,该步骤示例代码如下:

gatk --java-options "-Djava.io.tmpdir=/$JOBID -Xms20G -Xmx20G -XX:ParallelGCThreads=2" HaplotypeCaller \
  -R /genome.fa \
  -I NA12878_markdup_bqsr.bam \
  -O NA12878.g.vcf.gz \
  -ERC GVCF

因为计算情况复杂,通常这步需要耗时好几天,通过下图可以看出不同线程数下程序运行速度的关系。很明显提高线程数并没有什么用处啊,因为这个算法本质是单线程运行,提高线程也只是用于内存垃圾回收,这一步推荐使用两个线程足矣。

举个栗子:工地上有一个工人在干活,这时候来了几十个领导,工程进度能飞快提升吗?很明显不行,一人干活,其余围观罢了哈哈哈哈哈。

增加内存有用吗?对于HaplotypeCaller来说最低需要内存20G左右,可以发现就算增加3倍,计算速度也没什么提升效果。

GATK GenomicsDBImport

以前这个功能叫CombineGVCFs,现在为了适应大群体重测序数据分析,解决几千个样品的GVCF合并问题,开发了CombineGVCFs,示例代码如下:

#! /bin/bash
sed -e
for j in {1..22} X Y M; do cd data/; \
mkdir -p /lscratch/$SLURM_JOBID/tmp; \
gatk --java-options "-Djava.io.tmpdir=/lscratch/$SLURM_JOBID -Xms2G -Xmx2G -XX:ParallelGCThreads=2" GenomicsDBImport \
  --genomicsdb-workspace-path /lscratch/${SLURM_JOB_ID}/chr${j}_gdb \
  -R /fdb/igenomes/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa \
  -V NA12878.g.vcf.gz \
  -V NA12891.g.vcf.gz \
  -V NA12892.g.vcf.gz \
  --tmp-dir "/lscratch/${SLURM_JOB_ID}/tmp" \
  --max-num-intervals-to-import-in-parallel 3 \
  --intervals chr${j}; \

下图展示了不同线程数对于GenomicsDBImport运行速度的影响,很明显2个线程和56个线程没什么差距,因此该步骤也无需过多线程。

增加内存也没有变化,4GB内存是速度是最快的,太多反而慢了。

GATK GenotypeGVCFs

这一步是用来产生等位变异和非等位变异信息,也是GATK流程的首尾步骤,生成一个VCF文件,以下是示例代码:

gatk --java-options "-Djava.io.tmpdir=/lscratch/$SLURM_JOBID -Xms2G -Xmx2G -XX:ParallelGCThreads=2" GenotypeGVCFs \
  -R /fdb/igenomes/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa \
  -V gendb://chr1_gdb 
  -O chr1.vcf.gz

GenotypeGVCFs这个工具本质上还是一个单线程工具,通过并行计算不同区域来提升速度,随着线程数增加并没什么用处,建议实际操作设置为2个线程就行。

内存也别设置的太高,增加内存反而影响计算性能,建议设置到正常范围。

参考资料:

https://www.jianshu.com/p/21a64ea61792

https://hpc.nih.gov/training/gatk_tutorial

END

© 素材来源于网络,侵权请联系后台删除

笔记合集,点击直达

相关文章
|
15天前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
|
27天前
|
监控 Java 数据库连接
线程池在高并发下如何防止内存泄漏?
线程池在高并发下如何防止内存泄漏?
|
29天前
|
监控 Java 数据库连接
使用线程池时,如何避免内存泄漏的问题?
使用线程池时,如何避免内存泄漏的问题?
|
1月前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
41 2
|
2月前
|
Java Spring
spring多线程实现+合理设置最大线程数和核心线程数
本文介绍了手动设置线程池时的最大线程数和核心线程数配置方法,建议根据CPU核数及程序类型(CPU密集型或IO密集型)来合理设定。对于IO密集型,核心线程数设为CPU核数的两倍;CPU密集型则设为CPU核数加一。此外,还讨论了`maxPoolSize`、`keepAliveTime`、`allowCoreThreadTimeout`和`queueCapacity`等参数的设置策略,以确保线程池高效稳定运行。
268 10
spring多线程实现+合理设置最大线程数和核心线程数
|
1月前
|
Java
线程池设置原则
线程池设置原则
|
2月前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
29天前
|
监控 数据可视化 Java
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
|
1月前
|
缓存 Java 编译器
【多线程-从零开始-伍】volatile关键字和内存可见性问题
【多线程-从零开始-伍】volatile关键字和内存可见性问题
33 0
|
2月前
|
Arthas 监控 Java
监控线程池的内存使用情况以预防内存泄漏
监控线程池的内存使用情况以预防内存泄漏