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

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

笔记合集,点击直达

相关文章
|
7月前
|
Kubernetes Linux Go
使用 Uber automaxprocs 正确设置 Go 程序线程数
`automaxprocs` 包就是专门用来解决此问题的,并且用法非常简单,只需要使用匿名导入的方式 `import _ "go.uber.org/automaxprocs"` 一行代码即可搞定。
348 78
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
2111 1
|
10月前
|
存储 IDE Java
java设置栈内存大小
在Java应用中合理设置栈内存大小是确保程序稳定性和性能的重要措施。通过JVM参数 `-Xss`,可以灵活调整栈内存大小,以适应不同的应用场景。本文介绍了设置栈内存大小的方法、应用场景和注意事项,希望能帮助开发者更好地管理Java应用的内存资源。
524 4
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
354 57
|
12月前
|
运维 监控 Ubuntu
【运维】如何在Ubuntu中设置一个内存守护进程来确保内存不会溢出
通过设置内存守护进程,可以有效监控和管理系统内存使用情况,防止内存溢出带来的系统崩溃和服务中断。本文介绍了如何在Ubuntu中编写和配置内存守护脚本,并将其设置为systemd服务。通过这种方式,可以在内存使用超过设定阈值时自动采取措施,确保系统稳定运行。
436 4
|
监控 Java
线程池大小如何设置
在并发编程中,线程池是一个非常重要的组件,它不仅能够提高程序的响应速度,还能有效地利用系统资源。合理设置线程池的大小对于优化系统性能至关重要。本文将探讨如何根据应用场景和系统资源来设置线程池的大小。
|
弹性计算 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:
1593 2
|
监控 Java 数据库连接
线程池在高并发下如何防止内存泄漏?
线程池在高并发下如何防止内存泄漏?
431 6
|
监控 Java 数据库连接
使用线程池时,如何避免内存泄漏的问题?
使用线程池时,如何避免内存泄漏的问题?
线程池设置原则
线程池设置原则
332 5

热门文章

最新文章