# Optimizing GATK HaplotypeCaller Performance in the Cloud

The single most common cause of a slow GATK HaplotypeCaller run in the cloud is a single-task, single-thread invocation on an instance that was sized for memory rather than for parallel work. HaplotypeCaller spends most of its runtime inside the PairHMM likelihood calculation and local reassembly of active regions, and neither step benefits from more RAM. It benefits from more cores applied to independent intervals and from more parallel samples running at the same time. The first thing to check is therefore not your instance size but your command line and your workflow structure: are you running per-sample calling in GVCF mode, are you scattering over intervals, and are the PairHMM threads actually set?

This guide walks through the causes of poor HaplotypeCaller performance in cloud environments, from the most common to the rarest, gives you a diagnostic sequence you can follow in under an hour, and closes with prevention practices drawn from production genomics platforms that routinely process thousands of whole genomes per month [1].

## What HaplotypeCaller Actually Computes, and Why It Is Slow

Understanding the compute profile of the tool explains almost every optimization in this article. HaplotypeCaller is a local assembly-based caller. For each active region it:

1. Builds a De Bruijn graph from the k-mers in the region to assemble candidate haplotypes.
2. Realigns each read against each candidate haplotype using the PairHMM forward algorithm, a floating-point-intensive dynamic programming calculation.
3. Evaluates the likelihoods to call genotypes.

The PairHMM step dominates runtime on most datasets. The hardware accelerator literature identifies it as one of the main contributors to compute time in the pipeline because of its high floating-point operation count. This is why the tool responds to thread parallelism (multiple PairHMM evaluations at once) and interval parallelism (many independent regions processed simultaneously), and why it responds poorly to simply adding memory.

A second structural fact matters: variant calling is embarrassingly parallel across samples. Two unrelated BAM files share nothing. Population-scale projects exploit this. A cloud pipeline for 2,535 human genomes completed joint variant calling in five days at a compute cost of 7.33 dollars per sample by running samples in parallel on the Amazon cloud [3]. The Broad-led All of Us infrastructure named Celeste processes fluctuating workloads of up to 9,000 whole-genome samples per month using serverless technology and container orchestration within a single AWS Region [1]. Both designs rest on the same principle: never run one big job when you can run thousands of small, independent jobs.

## The 60-Minute Diagnostic Sequence

![Six-step checklist: PairHMM time fraction, GVCF mode, interval count, CPU utilization, engine logs, throughput comparison.](/article-images/illustrations/gatk-haplotypecaller-cloud-optimization-diagnostic-sequence.webp)

Run this checklist before changing any infrastructure. It resolves most slow-run complaints without spending a dollar on bigger instances.

1. **Check the tool log for the PairHMM report.** GATK prints the fraction of time spent in PairHMM. If it exceeds roughly half of total runtime, thread and scatter optimizations will pay off. If it does not, your bottleneck is I/O or the workflow engine, not the caller.
2. **Confirm GVCF mode.** The command should include `-emit-ref-confidence GVCF` (or the equivalent `-ERC GVCF` in older syntax). Per-sample GVCF output is the prerequisite for cheap joint genotyping later, and it lets you call once per sample rather than re-calling the whole cohort.
3. **Count your intervals.** If you launched one HaplotypeCaller task per sample over the whole genome, you are using one core per sample at best. Whole-genome calling should be scattered across hundreds of interval shards.
4. **Check actual CPU utilization.** In AWS CloudWatch, Azure Monitor, or GCP Monitoring, look at CPU utilization on the running instances. Sustained utilization near 100 percent on all vCPUs means compute-bound and worth optimizing. Low utilization with high network or disk wait means an I/O problem.
5. **Check the workflow engine logs, not just the tool logs.** Long gaps between tasks, jobs waiting in queue, or repeated retries indicate scheduler or spot-interruption problems that have nothing to do with HaplotypeCaller itself.
6. **Compare wall-clock time against expected per-base throughput.** GATK4 Spark tools were benchmarked at a median rate of ten million processed bases per second on a 12-core workstation for BQSR and calling stages [4]. If you are orders of magnitude below comparable throughput, something is serializing your pipeline.

## Troubleshooting Table

![Decision path from CPU pegged on few cores through scatter stragglers, I/O wait and engine gaps to the matching fix.](/article-images/illustrations/gatk-haplotypecaller-cloud-optimization-cause-triage.webp)

| Symptom | Likely cause | How to confirm | Fix |
|--|--|--|--|
| One sample takes many hours, CPU pegged on 1 to 4 cores | PairHMM running single-threaded or with default thread count | PairHMM time fraction in the tool log, `top` showing few busy cores | Set `-native-pair-hmm-threads` to the available core count, or split the genome into intervals and run one task per shard |
| A scatter-gather WGS run finishes hours after most shards | Straggler intervals with high heterozygosity or repeats | Per-shard runtimes in the workflow log, one or two outliers | Rebalance intervals by expected work, split the slowest intervals further, use a larger instance only for stragglers |
| Tasks start slowly, low CPU, high disk or network wait | I/O bottleneck, BAM or CRAM read over network from cold storage | CloudWatch disk and network metrics, Cromwell or Snakemake task timing | Keep inputs on the same region, use instance-local NVMe scratch, pre-index reference files |
| Jobs die intermittently, pipeline restarts from scratch | Spot instance reclamation without checkpointing | Workflow retry and failure logs | Make every task resumable, pin checkpoint files, or use spot only for stateless steps |
| Whole pipeline slow despite fast per-task times | Workflow engine overhead, queueing, or data movement between stages | Time stamps between task start events in the engine log | Consolidate steps into containers, reduce data shuffling, or adopt an orchestration design proven at scale [1] |
| Costs scale linearly with sample count and never improve | Fixed-cost design, no spot, no right-sizing | Cost explorer breakdown by service | Right-size instances from measured peak memory, use spot for stateless tasks, batch samples to amortize fixed costs |
| Calls differ after an infrastructure change | Non-reproducible software stack, drifting dependencies | Re-run a reference sample and compare with hap.py or vcfeval [5] | Pin container digests, freeze tool versions, benchmark on reference samples after every change [5] [6] |

## Cause 1, Most Common: Under-threaded PairHMM and Serial Execution

### The mechanism

The standard (non-Spark) HaplotypeCaller is single-threaded for most work, with one explicit exception. The `-native-pair-hmm-threads` argument controls how many threads the native PairHMM implementation uses inside the tool. The default is conservative, and many cloud tutorials and templates never change it. The result is an instance with 32 or 64 vCPUs where four of them are doing useful work. You pay for the idle cores, and the run takes the same time it would on a much cheaper machine.

### How to fix it

Set the PairHMM thread count to match the instance, and reduce the memory per task so the instance is not oversized for no reason:

```
gatk HaplotypeCaller \
  -R Homo_sapiens_assembly38.fasta \
  -I sample.bam \
  -O sample.g.vcf.gz \
  -ERC GVCF \
  --native-pair-hmm-threads 16
```

A more powerful fix is structural. Instead of one task per sample, scatter each sample over intervals. On a 32-core instance, run 32 shard tasks in parallel, each with a few PairHMM threads, or run each shard on a small instance with full core allocation. Interval parallelism almost always beats intra-process threading because it scales without contention and because a failed shard can be retried alone. This is the design behind production WDL pipelines on AWS that carry a sample from alignment through [GATK variant calling](/knowledge/bioinformatics/variant-calling-gatk) with every step optimized for the elastic compute cloud environment [7].

A caveat from the hardware accelerator literature applies here. Even in the Spark-distributed version of HaplotypeCaller, profiling shows that compute bottlenecks shift as you add resources, and the best configuration is often a hybrid that exploits different resource types rather than maximum parallelism everywhere. Measure before and after every change.

## Cause 2: Interval Scattering Done Badly

### The mechanism

Scatter-gather parallelizes HaplotypeCaller by splitting the genome into intervals, calling each interval independently, and merging the output. The speedup equals the number of shards only if the work per shard is uniform. It never is. Regions rich in segmental duplications, high GC content, or heterozygosity generate more active regions and more PairHMM work. A uniform split by chromosome or by megabase position produces one or two stragglers that determine the total wall clock time of your run.

### How to fix it

Split into many more intervals than you have parallel slots, for example several hundred shards for a whole genome, so that a scheduler can load-balance by assigning the next shard to the next free worker. For stubborn stragglers, split the offending interval further. Keep a small interval padding consistent with GATK recommendations so that calls at shard boundaries remain consistent, and remember that the merged GVCF must be joined by a downstream GenotypeGVCFs step, which is far cheaper than calling because it operates on the summarized GVCFs rather than the reads.

The same rebalancing principle extends to very large cohorts in a different form. For joint calling across thousands of genomes, a binning approach that partitions samples as well as genomic regions scaled to over 5,000 WGS samples, and the CHARGE freeze 3 analysis jointly called, phased, and imputed more than 5,300 whole genomes in under six weeks using a hybrid cloud and supercomputer infrastructure [8]. The lesson for a smaller lab is that sample-level parallelism plus sensible region binning solves scaling better than ever-larger single instances.

## Cause 3: Wrong Instance Shape and Memory Waste

### The mechanism

HaplotypeCaller per-shard memory needs are modest compared with alignment or BWA-MEM tasks. Teams routinely launch memory-optimized instances out of habit, then run a single-threaded caller on them. The opposite mistake also occurs, launching compute-optimized instances while the bottleneck is actually disk or network. Either way, cost per sample inflates without a corresponding speedup.

### How to fix it

Profile one representative shard. Record peak memory with `time -v` or the workflow engine's resource report, then pick the smallest instance that fits peak memory times your parallel task count, with headroom. Modern compute-optimized families on AWS, Azure, and GCP all work well for PairHMM-heavy workloads. On AWS specifically, the genomics ecosystem is mature enough that complete pipeline templates for EC2-based calling are published and reusable, which reduces the guesswork in instance selection [7]. Right-sizing plus spot capacity for stateless tasks is the standard cost lever. In the 2,535-genome study, parallel execution on spot-friendly cloud infrastructure brought per-sample compute cost down to 7.33 dollars at 2015 prices, and the authors note that near-linear scalability makes clouds economical for even larger studies [3]. Treat that number as a historical benchmark for what aggressive parallelism achieves, not as a current price quote.

The tuning framework literature reinforces the same discipline from the accuracy side. An Optuna-based hyperparameter optimization framework integrated into the Terra cloud platform was used to tune the GATK Variant Extract-Train-Score filtration pipeline, showing that cloud pipelines benefit from systematic parameter search rather than ad hoc settings, and that the framework generalizes across organisms and callsets [9]. Budget for tuning experiments the same way you budget for production runs.

## Cause 4: I/O and Data Movement

### The mechanism

Cloud object storage is durable and cheap, but it is not a local disk. If your workflow reads BAM files, reference sequences, and indexes over the network at the start of every task, and writes intermediate files back, task startup and file transfer can dominate runtime for small shards. This is the classic failure of cloud bioinformatics pipelines that were ported unchanged from a shared filesystem cluster.

### How to fix it

Three practices cover most cases:

1. Keep the reference bundle, known sites, and any persistent databases in the same cloud region as the compute, and copy them to fast instance-local storage at task start when tasks reuse them.
2. Use CRAM rather than BAM for long-term storage where the pipeline supports it, and rely on region-level queries so a shard task reads only the slices it needs.
3. Avoid moving data between stages unnecessarily. Consolidate [preprocessing](/blog/data-analysis/what-is-data-preprocessing) steps (mark duplicates, BQSR) into a single container task so intermediate files never leave the instance.

The VCPA pipeline for the Alzheimer's Disease Sequencing Project is a useful reference architecture here. It is written in WDL, fully optimized for the Amazon elastic compute cloud environment, and paired with a tracking database that stores more than 100 quality metrics per processed genome so that operators can monitor production and diagnose problems as they arise [7]. Building the monitoring side early is what makes I/O and performance regressions visible instead of mysterious.

## Cause 5: Workflow Engine and Orchestration Overhead

### The mechanism

When per-task times are good but end-to-end time is bad, the orchestration layer is the suspect. Common patterns include long queue waits, one big monolithic task that cannot be scattered, excessive data shuffling between steps, and workflow engines that serialize on file localization. At population scale, coordination itself becomes a first-order cost. The Celeste platform reports that in 12 months of production within a single AWS Region, around 200 million serverless functions and over 20 million messages coordinated 1.8 million bioinformatics, quality control, and clinical reporting jobs [1]. That figure exists because coordination at that scale had to be engineered deliberately, not inherited from a script.

### How to fix it

Choose a workflow engine with proven cloud behavior and use its scatter features natively. Cromwell is the reference engine for GATK WDL workflows and has been used to build scalable pipelines on Azure, including a full production pipeline for long-read PacBio and clinical FHIR data [10]. Snakemake with Docker containers is equally established for modular cloud workflows, and the CIMAC-CIDC cancer immunotherapy network used exactly that combination on Google Cloud Platform to run harmonized WES and RNA-seq pipelines across multiple clinical sites, with benchmarking showing improved reproducibility, precision, and recall after the migration [6]. Serverless coordination is the other proven pattern at the highest scale [1]. Whichever you choose, the fix is the same in kind: measure inter-task gaps, eliminate data movement between co-scheduled steps, and let the engine's scatter and retry semantics do the load balancing.

## Cause 6: Ignoring the Parallel-Native Variants of the Tooling

### The mechanism

GATK4 rebuilt core tools, including HaplotypeCaller, on Apache Spark. The Spark-native versions change the parallelism profile fundamentally compared with GATK3. In a workstation benchmark on a modest 12-core hyperthreaded CPU, Spark-enabled BQSR and HaplotypeCaller produced roughly an order of magnitude reduction in processing time to analysis-ready variants compared with GATK3.8, with HaplotypeCallerSpark and BQSRPipelineSpark together about 86 percent faster than their standard GATK4 equivalents, and MarkDuplicateSpark about 42 percent faster [4]. The called variants matched, meaning the speedup came without a variant output penalty in that evaluation.

If you are running GATK3 anywhere, or running GATK4 standard tools in a setting where the Spark versions fit, you are leaving a large, measured speedup on the table.

### How to fix it

For targeted and small-genome workloads on single large instances, evaluate HaplotypeCallerSpark with local Spark mode. For whole genomes, the interval scatter approach with standard HaplotypeCaller remains the mainstream production pattern because it is simpler to make fault-tolerant, but the benchmark shows that tool choice is a legitimate optimization lever rather than a fixed cost [4]. Beyond Spark, specialized accelerators exist. A GPU-accelerated HaplotypeCaller design with load-balanced multi-process optimization targets the same PairHMM bottleneck [11], and an open-source FPGA accelerator for PairHMM on the Amazon AWS F1 platform achieved up to a 15-fold speedup against the software implementation when used in-pipeline [2]. These are advanced options that require engineering investment, and the FPGA work itself concludes that a hybrid CPU-FPGA solution best exploits the resources because new bottlenecks emerge once the original one is removed.

For teams considering deep-learning callers, the same cloud orchestration principles apply. DeepVariant-on-Spark packages a GPU-capable deployment on Google Cloud Platform that a user can bring up following published instructions within about 20 minutes and run on multiple WGS datasets, and it is positioned for pilot-scale work while preserving flexibility for larger studies [12]. The orchestration lessons transfer directly back to HaplotypeCaller projects.

## Cause 7: Configuration Choices That Cost Accuracy, Not Just Time

Performance optimization has a boundary: the variants must be right. Two documented findings show why tuning should be deliberate.

First, parameter defaults are not sacred. In an optimized GATK4 pipeline for Plasmodium falciparum whole-genome sequencing, researchers leveraged control strains with PacBio assemblies to tune the parameters controlling heterozygosity, local assembly region size, ploidy, mapping, and base quality in both HaplotypeCaller and GenotypeGVCFs. On high-quality samples with 250 bp reads, the optimized pipeline reached 86.6 plus or minus 1.7 percent SNP sensitivity and 82.2 plus or minus 5.9 percent indel sensitivity, compared with 77.7 plus or minus 1.3 percent and 73.1 plus or minus 5.1 percent for the default GATK4 pipeline, with precision high and comparable across pipelines [13]. Two lessons follow for any organism or assay that deviates from the human germline defaults: validate against truth sets, and expect that the right parameters for your data may differ substantially from defaults.

Second, pipeline consistency affects downstream science, not just call quality. An investigation of rare-variant association tests using public controls found that inflated test statistic distributions decreased substantially when the same variant caller and filtering pipelines were employed across datasets, while differences in library prep kits and sequencers did not drive inflation [14]. For cloud operations this means that changing callers, versions, or filtering between batches to chase speed can quietly invalidate case-control comparisons. Freeze the calling configuration before analysis, and treat any mid-study change as a batch effect to be evaluated.

## Accuracy Verification Belongs in the Performance Loop

Every performance change should be followed by an accuracy check, because some optimizations can alter boundary behavior at shard edges or change numerical paths. The standard approach uses Genome in a Bottle (GIAB) reference samples with benchmarking tools such as hap.py and vcfeval, which compare your calls against benchmark calls and report precision and recall by variant type and region. A cloud-based benchmarking workflow designed for clinical laboratory-developed tests makes this assessment reproducible and independent of the underlying hardware and the technician executing it, which matters because benchmark results depend on the hardware, operating system, and software libraries, making repeat assessment unreliable when dependencies change [5]. Operationally: run your benchmark set before the optimization, apply the optimization, run it again, and confirm precision and recall are unchanged before rolling out.

Containerization is what makes this checkable. Pinned Docker images were central to the multi-site clinical pipeline work on GCP [6], and reproducibility over time despite evolving GATK best practices was an explicit design goal of the OVarFlow resource-optimized GATK4 workflow, which wraps the best practices in a generalized, parallelized architecture [15]. Pin tool versions by digest, record them with each batch of results, and the performance-versus-accuracy question stays answerable months later.

## Scaling to Cohort Size: Patterns That Hold at Population Scale

Three architectures have published evidence behind them, and they map to different scales.

**Per-sample scatter with joint genotyping**, the GATK best-practice shape, suits cohorts from tens to thousands of genomes. Call each sample independently in GVCF mode, scatter over intervals, then run GenotypeGVCFs on the combined GVCFs. The 2,535-genome project demonstrates the economics of this pattern on AWS through the DNAnexus platform [3].

**Platform orchestration with serverless coordination** suits ongoing production programs with fluctuating workloads. Celeste demonstrates the pattern at up to 9,000 WGS samples per month, using container orchestration for compute and serverless functions for coordination [1]. The design principle is elasticity: serverless components scale to zero when idle and absorb bursts without pre-provisioned capacity, which is what makes fluctuating monthly workloads economical.

**Hybrid and distributed approaches** suit extremes. For joint calling beyond what a single cloud environment handles economically, a hybrid strategy combining AWS, supercomputers, and local HPC with a binning approach scaled joint variant calling and imputation to over 10,000 samples [8]. At the opposite extreme of per-node acceleration, an MPI-based workflow called GenMPI streams compressed input data in parallel and distributes sorting, duplicate marking, and calling across nodes, demonstrating near-linear alignment scaling up to 64 nodes and 8,192 CPU cores on 300x coverage data while preserving variant accuracy [16]. Few labs need this, but it defines the ceiling of what distributed calling achieves.

A useful reference point for somatic work: the Broad's GATK-based somatic workflows were designed to be portable across local, on-prem, and cloud compute, optimized for cost reduction, and tunable to available compute, with standardized evaluation tracking both detection performance and runtime performance across versions [17]. Borrow that discipline for germline projects. Track runtime and cost metrics per version of your pipeline, the same way you track precision and recall.

## A Cost and Throughput Model You Can Defend

A defensible model for cloud calling has four terms: per-task compute cost, orchestration and storage overhead, retry and straggler overhead, and fixed pipeline overhead amortized over the batch. The published anchor for the per-sample economics of aggressive parallelism is the 7.33 dollars per sample compute cost of the 2,535-genome joint calling project, achieved in five days of parallel processing [3]. Your number will differ with instance prices, coverage, and reference size, but the shape of the optimization is identical, and the study's cost dependence analysis showed that near-linear scalability is what keeps cloud analysis cheap as studies grow [3].

Two levers dominate in practice. First, right-sizing, which requires measuring rather than guessing peak memory per shard. Second, elastic capacity, which the largest production platforms solve with serverless coordination and container orchestration [1] and which smaller programs approximate with spot instances for stateless scatter shards and on-demand capacity for stateful coordination. The GATK somatic workflow team explicitly engineered for cost reduction and compute tuning [17], which is a signal that this is expected practice rather than an afterthought.

One caution from the hyperparameter optimization work: cloud pipelines embed many tunable choices, from filtration thresholds to resource requests, and unstructured manual tuning wastes compute while underperforming systematic search. The Optuna-based framework in Terra exists precisely because ad hoc tuning was the bottleneck, and it demonstrated improved artifact-detection accuracy on both human and malaria callsets [9]. If you find yourself re-running expensive pipelines to hand-tune parameters, a structured search over a cheap surrogate metric is the better investment.

## Prevention Practices

1. **Standardize on a scatter-gather WDL or Snakemake pipeline with GVCF mode** and per-shard resource requests measured from profiling, not guessed.
2. **Pin everything.** Container digests, GATK versions, reference bundle versions, and interval lists. Reproducibility over time was a stated design goal in the OVarFlow workflow [15], and multi-site clinical pipelines depend on it [6].
3. **Benchmark accuracy after every infrastructure or parameter change** using GIAB reference samples and hap.py or vcfeval, ideally in an automated cloud workflow so the check runs identically regardless of who triggers it [5].
4. **Track cost and runtime per batch** alongside quality metrics. VCPA's model of storing more than 100 quality metrics per genome in a queryable database turns production monitoring from guesswork into lookup [7].
5. **Keep the calling configuration frozen within any study** that will be compared across batches, because pipeline differences alone measurably inflate false-positive discovery in rare-variant analyses [14].
6. **Validate parameters for non-standard data** against truth sets before production, since defaults optimized for human germline data underperformed by roughly 9 percentage points of SNP sensitivity in the malaria WGS case until tuned against PacBio-verified controls [13].
7. **Design for retry.** Every task idempotent, every intermediate file checkpointed, spot interruptions expected and absorbed.
8. **Re-profile after each major change**, because removing one bottleneck (for example with an accelerator) relocates the bottleneck elsewhere in the pipeline, a result documented explicitly in the FPGA PairHMM work [2].

## Common Mistakes and Limitations

- **Confusing memory with speed.** HaplotypeCaller is core-bound, not memory-bound. Buying memory-optimized instances without parallelism changes your bill, not your wall clock.
- **Treating the default thread count as a constant.** The PairHMM thread setting and the scatter width are the two numbers that most affect HaplotypeCaller runtime, and both should be set deliberately per instance shape.
- **Scattering too coarsely.** Twenty interval shards on twenty workers guarantees stragglers. Use many more shards than slots and let the scheduler balance.
- **Measuring only the tool, not the pipeline.** End-to-end latency includes data movement, queueing, and engine overhead. The production platform that coordinates millions of jobs monthly succeeded by engineering the coordination layer, not by tuning the caller alone [1].
- **Optimizing speed without re-checking accuracy.** Every change to intervals, versions, or parameters needs a truth-set comparison [5]. The malaria re-parameterization improved sensitivity substantially, but only because truth data existed to prove it [13].
- **Assuming published cost figures transfer directly.** The 7.33 dollars per sample figure is a 2015 benchmark under that project's specific platform and pricing [3]. Use it to sanity-check your architecture's efficiency, not as a budget line.
- **Changing the pipeline mid-study.** Consistency of caller and filtering pipelines is measurably linked to association-test validity [14]. Version upgrades belong between studies or in explicitly validated batch boundaries.
- **Assuming one organism's defaults fit another.** Ploidy, heterozygosity, and read characteristics shift optimal parameters [13]. Non-model organisms and pooled or mixed samples need their own validation.

Finally, a limitation on scope: the configurations described here reflect published pipelines and benchmarks, not your specific data. Cohort characteristics, coverage, and assay design can shift the optimum. Teams facing regulatory or clinical requirements should validate their full pipeline on their own reference materials, as clinical laboratory-developed test pipelines do through structured cloud benchmarking [5], and unusual projects benefit from review by an experienced genomics infrastructure engineer before large spend is committed.

## Frequently Asked Questions

### How many CPU cores should I allocate to a single HaplotypeCaller task?

Fewer than you think, combined with many parallel tasks. HaplotypeCaller benefits from `-native-pair-hmm-threads` up to the cores available, but interval-level scatter scales better than intra-process threads. A common production shape is many small shards on modest instances rather than one giant task on one giant instance.

### Should I use HaplotypeCallerSpark in production?

Evaluate it, especially for targeted or small-genome workloads. Benchmarks on a 12-core workstation showed Spark-enabled BQSR and HaplotypeCaller about an order of magnitude faster than GATK3.8, and roughly 86 percent faster combined than the standard GATK4 tools, with matching variant output [4]. For whole genomes, interval scatter with the standard tool remains the simpler fault-tolerant default.

### Does GVCF mode actually save money?

Yes, indirectly but substantially. Per-sample GVCF output means each sample is called exactly once regardless of how often the cohort is re-genotyped, and downstream GenotypeGVCFs is far cheaper than re-running HaplotypeCaller. Every large published cohort pipeline cited here builds on this separation.

### What should I look for when choosing cloud infrastructure for genomics?

Region co-location of data and compute, native scatter support in the workflow engine, spot capacity with retry semantics, and mature reference architectures. AWS genomics tooling includes published WDL pipelines optimized for EC2 [7], Azure has demonstrated Cromwell-based pipelines for long-read and clinical data integration [10], and GCP hosts containerized Snakemake pipelines used in multi-site clinical research [6].

### Why is my scattered run only as fast as its slowest piece?

Because gather waits for every shard. A few intervals with high heterozygosity or repeats produce disproportionate PairHMM work. Confirm with per-shard timings, then split the slow intervals further or run them on larger workers. Using many more shards than parallel slots also lets the scheduler absorb the imbalance.

### Can GPUs or FPGAs speed up HaplotypeCaller?

They can, with engineering effort. A GPU-accelerated design with load-balanced multi-process optimization targets the PairHMM bottleneck [11], and an open-source FPGA accelerator on AWS F1 achieved up to a 15-fold in-pipeline speedup against the software implementation, with the authors noting that a hybrid CPU-FPGA configuration extracts the most value [2]. These are specialist options, not drop-in defaults.

### How do I keep results reproducible when I change instance types or cloud providers?

Pin container digests and tool versions, and verify equivalence by running a GIAB reference sample through both configurations and comparing with hap.py or vcfeval. Cloud benchmarking workflows exist specifically to make this comparison independent of hardware and operator [5], and multi-site clinical pipelines rely on exactly this containerized approach for harmonization [6].

### How do I plan throughput for thousands of genomes per month?

Budget per-sample compute from a profiled pilot, multiply by your cohort, and provision elastic capacity rather than fixed clusters. Published anchors show the range: 2,535 genomes processed in five days with parallel cloud execution [3], and an ongoing production platform sustaining up to 9,000 WGS samples per month with serverless coordination and container orchestration [1]. Your variables are coverage, scatter width, and instance price, all measurable from a pilot batch before you commit.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How many CPU cores should I allocate to a single HaplotypeCaller task?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Fewer than you think, combined with many parallel tasks. HaplotypeCaller benefits from, native-pair-hmm-threads up to the cores available, but interval-level scatter scales better than intra-process threads. A common production shape is many small shards on modest instances rather than one giant task on one giant instance."
      }
    },
    {
      "@type": "Question",
      "name": "Should I use HaplotypeCallerSpark in production?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Evaluate it, especially for targeted or small-genome workloads. Benchmarks showed Spark-enabled GATK4 tools about an order of magnitude faster than GATK3.8 and roughly 86 percent faster combined than the standard GATK4 tools, with matching variant output. For whole genomes, interval scatter with the standard tool remains the simpler fault-tolerant default."
      }
    },
    {
      "@type": "Question",
      "name": "Does GVCF mode actually save money?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes, indirectly but substantially. Per-sample GVCF output means each sample is called exactly once regardless of how often the cohort is re-genotyped, and downstream GenotypeGVCFs is far cheaper than re-running HaplotypeCaller on the reads."
      }
    },
    {
      "@type": "Question",
      "name": "What should I look for when choosing cloud infrastructure for genomics?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Region co-location of data and compute, native scatter support in the workflow engine, spot capacity with retry semantics, and mature reference architectures. AWS has published WDL pipelines optimized for EC2, Azure supports Cromwell-based pipelines, and GCP hosts containerized Snakemake pipelines used in multi-site clinical research."
      }
    },
    {
      "@type": "Question",
      "name": "Why is my scattered run only as fast as its slowest piece?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Because gather waits for every shard. A few intervals with high heterozygosity or repeats produce disproportionate PairHMM work. Confirm with per-shard timings, split the slow intervals further, and use many more shards than parallel slots so the scheduler can balance the load."
      }
    },
    {
      "@type": "Question",
      "name": "Can GPUs or FPGAs speed up HaplotypeCaller?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "They can, with engineering effort. GPU-accelerated designs with load-balanced multi-process optimization target the PairHMM bottleneck, and an open-source FPGA accelerator on AWS F1 achieved up to a 15-fold in-pipeline speedup against the software implementation, with a hybrid CPU-FPGA configuration extracting the most value."
      }
    },
    {
      "@type": "Question",
      "name": "How do I keep results reproducible when I change instance types or cloud providers?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Pin container digests and tool versions, and verify equivalence by running a Genome in a Bottle reference sample through both configurations and comparing with hap.py or vcfeval in an automated cloud benchmarking workflow."
      }
    },
    {
      "@type": "Question",
      "name": "How do I plan throughput for thousands of genomes per month?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Budget per-sample compute from a profiled pilot batch, multiply by your cohort size, and provision elastic capacity rather than fixed clusters. Published projects range from 2,535 genomes in five days with parallel cloud execution to production platforms sustaining up to 9,000 whole-genome samples per month with serverless coordination."
      }
    }
  ]
}
</script>

## Sources

1. [Celeste: A cloud-based genomics infrastructure with variant-calling pipeline suited for population-scale sequencing projects.](https://pubmed.ncbi.nlm.nih.gov/40343041/)
2. [Acceleration of the Pair-HMM forward algorithm on FPGA with cloud integration for GATK](https://doi.org/10.1109/BIBM47256.2019.8983189)
3. [Inexpensive and Highly Reproducible Cloud-Based Variant Calling of 2,535 Human Genomes.](https://pubmed.ncbi.nlm.nih.gov/26110529/)
4. [Workstation benchmark of Spark Capable Genome Analysis ToolKit 4 Variant Calling](https://doi.org/10.1101/2020.05.17.101105)
5. [Benchmarking workflows to assess performance and suitability of germline variant calling pipelines in clinical diagnostic assays](https://pubmed.ncbi.nlm.nih.gov/33627090/)
6. [Modular and cloud-based bioinformatics pipelines for high-confidence biomarker detection in cancer immunotherapy clinical trials.](https://pubmed.ncbi.nlm.nih.gov/40857351/)
7. [VCPA: genomic variant calling pipeline and data management tool for Alzheimer’s Disease Sequencing Project](https://pubmed.ncbi.nlm.nih.gov/30351394/)
8. [A hybrid computational strategy to address WGS variant analysis in >5000 samples](https://pubmed.ncbi.nlm.nih.gov/27612449/)
9. [A framework for hyperparameter optimization of genomic cloud pipelines: improving the performance of GATK VETS variant filtration](https://doi.org/10.1109/BIBM62325.2024.10822323)
10. [A cloud-based pipeline for analysis of FHIR and long-read data.](https://pubmed.ncbi.nlm.nih.gov/36726729/)
11. [GPU-Accelerated GATK HaplotypeCaller with Load-Balanced Multi-Process Optimization](https://doi.org/10.1109/BIBE.2017.000-5)
12. [DeepVariant-on-Spark: Small-Scale Genome Analysis Using a Cloud-Based Computing Framework](https://pubmed.ncbi.nlm.nih.gov/32952600/)
13. [An optimized GATK4 pipeline for Plasmodium falciparum whole genome sequencing variant calling and analysis](https://pubmed.ncbi.nlm.nih.gov/37420214/)
14. [Inflated expectations: Rare-variant association analysis using public controls.](https://pubmed.ncbi.nlm.nih.gov/36696392/)
15. [OVarFlow: a resource optimized GATK 4 based Open source Variant calling workFlow](https://pubmed.ncbi.nlm.nih.gov/34388963/)
16. [GenMPI: Cluster Scalable Variant Calling for Short/Long Reads Sequencing Data](https://pubmed.ncbi.nlm.nih.gov/40811182/)
17. [Abstract 5108: Somatic small variant and copy number alteration calling with the Genome Analysis Toolkit](https://doi.org/10.1158/1538-7445.AM2019-5108)