GATK avec Spark

Bonjour à vous tous
J'ai une centaine de fichiers Bam d'une taille moyenne de 60 Go mais allant jusqu'à 120 Go pour lesquels je cherche à produire des fichiers gvcf avec gatk HaplotypeCaller afin de faire un génotypage joint ensuite. J'ai installé sur mon serveur la version 4.1.2.0 de GATK via bioconda. Le traitement des fichiers est extrêmement lent, prenant 3-4 jours pour chacun, alors que j'ai des ressources significatives à disposition pour ce projet (56 CPU et 504 Go de RAM) mais GATK HaplotypeCaller sous-utilise ces ressources. Je cherche une meilleure solution que de lancer en parallèle une douzaine de tâches en parallèle en dispatchant mes fichiers dans différents dossiers.
Apparemment, pour faire du multithreading avec GATK, il faut utiliser les options Spark. Il y a toutefois un avertissement que la version HaplotypeCallerSpark est beta et que les résultats peuvent ne pas être identiques à ceux obtenus avec HaplotypeCaller standard.
Est-ce que l'un d'entre vous à de l'expérience avec GATK et Spark, aussi bien en ce qui concerne la gestion des erreurs et des configurations (pour l'instant, cela ne marche pas pour moi, message d'erreur à disposition si quelqu'un peut m'éclairer sur son sens), que pour ce qui est de la robustesse du génotypage qui en découle?
Merci à vous
Thierry

Ping EBAI team: @ctn @mariabernard @nadia @egirard @olivier.rue :+1:

Je n'ai pas d'expérience avec Spark

Voilà la réponse que Olivier, Elodie et moi avons faite par mail (pour le reste de la communauté).

Olivier m’a transmis ta demande de conseil pour optimiser le temps de calcule du calling GATK sur tes très gros fichiers.

Personnellement je n’ai pas eu d’aussi gros fichier à traiter, et Elodie Girard que j’ai contacté non plus.

La stratégie de travailler par chromosome (ou groupe de chromosome) peut te permettre de paralléliser plus les calculs, c’est une utilisation un peu détournée de l’option –L : https://software.broadinstitute.org/gatk/documentation/article?id=4133

Il faudra ensuite ajouter une étape de concaténation (des VCF, il semble que ce soit plus efficace que des GVCF mais les deux peuvent être fait) avec : https://software.broadinstitute.org/gatk/documentation/tooldocs/4.0.0.0/picard_vcf_GatherVcfs.php

Bonjour Thierry,

Je n'ai pas d'expérience avec GATK mais je voulais juste apporter quelques éléments.

Souvent la façon la plus simple et efficace pour paralléliser est de lancer en parallèle pls tâches sur des sous-jeux de données (mais je conçois aussi que ce soit parfois plus complexe ou impossible).

Depuis la version 4, pour utiliser pls CPU, il faut en effet utiliser l'option "Spark cluster".
L'IFB core cluster, n'est pas un cluster Spark mais on on peut quand même utiliser l'option --spark-master avec local. Par exemple, pour utliser deux coeurs: --spark-master local[2]
https://software.broadinstitute.org/gatk/documentation/article?id=11245

Quel est votre message d'erreur (et votre commande) ?

Merci David de votre réponse.

Ma commande lancée est

for file in .Cat_9-0_RG.q30.bam; do gatk HaplotypeCallerSpark -I $file -O ${file%%.Cat_9-0_RG.q30.bam}.raw.snps.indels.g.vcf -R ~/Genomes/cat/Felis_catus_9.0.fa --min-base-quality-score 15 -ERC GVCF --spark-master local[]; done > GATK_gvcf-log 2>&1 &

Mon log d’erreur est ci-joint.

C’est lancé sur mon cluster personnel, pas sur celui de l’IFB, installé en CentOs7 et sur lequel j’ai installé GATK avec conda.

Il me semble qu’il utilise le spark local come indiqué sur la doc, mais qu’il y a quelque chose qui se ferme trop tôt. Problème d’autorisation ou autre ? Je ne vois pas dans le message d’erreur quelque chose qui m’éclaire pour chercher une solution (voir en fin de message).

J’ai effectivement contourné le problème pour l’instant en multipliant les tâches parallèles en faisant une douzaine de paquets de fichiers.

Bonne journée

Thierry

Using GATK jar /home/grange/miniconda2/envs/paleogenomic_python2_2019/share/gatk4-4.1.2.0-1/gatk-package-4.1.2.0-local.jar
Running:
java -Dsamjdk.use_async_io_read_samtools=false -Dsamjdk.use_async_io_write_samtools=true -Dsamjdk.use_async_io_write_tribble=false -Dsamjdk.compression_level=2 -jar /home/grange/miniconda2/envs/paleogenomic_python2_2019/share/gatk4-4.1.2.0-1/gatk-package-4.1.2.0-local.jar HaplotypeCallerSpark -I Baby_Spice.Cat_9-0_RG.q30.bam -O Baby_Spice.raw.snps.indels.g.vcf -R /home/grange/Genomes/cat/Felis_catus_9.0.fa --min-base-quality-score 15 -ERC GVCF --spark-master local[*]
18:56:43.196 WARN SparkContextFactory - Environment variables HELLBENDER_TEST_PROJECT and HELLBENDER_JSON_SERVICE_ACCOUNT_KEY must be set or the GCS hadoop connector will not be configured properly
18:56:43.573 INFO NativeLibraryLoader - Loading libgkl_compression.so from jar:file:/home/grange/miniconda2/envs/paleogenomic_python2_2019/share/gatk4-4.1.2.0-1/gatk-package-4.1.2.0-local.jar!/com/intel/gkl/native/libgkl_compression.so
Jun 02, 2019 6:56:45 PM shaded.cloud_nio.com.google.auth.oauth2.ComputeEngineCredentials runningOnComputeEngine
INFO: Failed to detect whether we are running on Google Compute Engine.
18:56:45.364 INFO HaplotypeCallerSpark - ------------------------------------------------------------
18:56:45.365 INFO HaplotypeCallerSpark - The Genome Analysis Toolkit (GATK) v4.1.2.0
18:56:45.365 INFO HaplotypeCallerSpark - For support and documentation go to https://software.broadinstitute.org/gatk/
18:56:45.365 INFO HaplotypeCallerSpark - Executing as grange@neptune.ijm.univ-paris-diderot.priv on Linux v3.10.0-957.12.1.el7.x86_64 amd64
18:56:45.366 INFO HaplotypeCallerSpark - Java runtime: OpenJDK 64-Bit Server VM v1.8.0_192-b01
18:56:45.367 INFO HaplotypeCallerSpark - Start Date/Time: 2 juin 2019 18:56:43 CEST
18:56:45.367 INFO HaplotypeCallerSpark - ------------------------------------------------------------
18:56:45.367 INFO HaplotypeCallerSpark - ------------------------------------------------------------
18:56:45.368 INFO HaplotypeCallerSpark - HTSJDK Version: 2.19.0
18:56:45.368 INFO HaplotypeCallerSpark - Picard Version: 2.19.0
18:56:45.368 INFO HaplotypeCallerSpark - HTSJDK Defaults.COMPRESSION_LEVEL : 2
18:56:45.368 INFO HaplotypeCallerSpark - HTSJDK Defaults.USE_ASYNC_IO_READ_FOR_SAMTOOLS : false
18:56:45.368 INFO HaplotypeCallerSpark - HTSJDK Defaults.USE_ASYNC_IO_WRITE_FOR_SAMTOOLS : true
18:56:45.368 INFO HaplotypeCallerSpark - HTSJDK Defaults.USE_ASYNC_IO_WRITE_FOR_TRIBBLE : false
18:56:45.368 INFO HaplotypeCallerSpark - Deflater: IntelDeflater
18:56:45.368 INFO HaplotypeCallerSpark - Inflater: IntelInflater
18:56:45.368 INFO HaplotypeCallerSpark - GCS max retries/reopens: 20
18:56:45.369 INFO HaplotypeCallerSpark - Requester pays: disabled
18:56:45.369 WARN HaplotypeCallerSpark -

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Warning: HaplotypeCallerSpark is a BETA tool and is not yet ready for use in production

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

18:56:45.369 INFO HaplotypeCallerSpark - Initializing engine
18:56:45.369 INFO HaplotypeCallerSpark - Done initializing engine
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
19/06/02 18:56:45 INFO SparkContext: Running Spark version 2.2.0
19/06/02 18:56:46 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/06/02 18:56:46 INFO SparkContext: Submitted application: HaplotypeCallerSpark
19/06/02 18:56:46 INFO SecurityManager: Changing view acls to: grange
19/06/02 18:56:46 INFO SecurityManager: Changing modify acls to: grange
19/06/02 18:56:46 INFO SecurityManager: Changing view acls groups to:
19/06/02 18:56:46 INFO SecurityManager: Changing modify acls groups to:
19/06/02 18:56:46 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(grange); groups with view permissions: Set(); users with modify permissions: Set(grange); groups with modify permissions: Set()
19/06/02 18:56:47 INFO Utils: Successfully started service 'sparkDriver' on port 33784.
19/06/02 18:56:47 INFO SparkEnv: Registering MapOutputTracker
19/06/02 18:56:47 INFO SparkEnv: Registering BlockManagerMaster
19/06/02 18:56:47 INFO BlockManagerMasterEndpoint: Using org.apache.spark.storage.DefaultTopologyMapper for getting topology information
19/06/02 18:56:47 INFO BlockManagerMasterEndpoint: BlockManagerMasterEndpoint up
19/06/02 18:56:47 INFO DiskBlockManager: Created local directory at /tmp/blockmgr-96f43ecb-665e-4643-9e2e-58b34a590e2d
19/06/02 18:56:47 INFO MemoryStore: MemoryStore started with capacity 15.8 GB
19/06/02 18:56:47 INFO SparkEnv: Registering OutputCommitCoordinator
19/06/02 18:56:47 INFO Utils: Successfully started service 'SparkUI' on port 4040.
19/06/02 18:56:47 INFO SparkUI: Bound SparkUI to 0.0.0.0, and started at http://172.25.7.36:4040
19/06/02 18:56:47 INFO Executor: Starting executor ID driver on host localhost
19/06/02 18:56:47 INFO Utils: Successfully started service 'org.apache.spark.network.netty.NettyBlockTransferService' on port 45620.
19/06/02 18:56:47 INFO NettyBlockTransferService: Server created on 172.25.7.36:45620
19/06/02 18:56:47 INFO BlockManager: Using org.apache.spark.storage.RandomBlockReplicationPolicy for block replication policy
19/06/02 18:56:47 INFO BlockManagerMaster: Registering BlockManager BlockManagerId(driver, 172.25.7.36, 45620, None)
19/06/02 18:56:47 INFO BlockManagerMasterEndpoint: Registering block manager 172.25.7.36:45620 with 15.8 GB RAM, BlockManagerId(driver, 172.25.7.36, 45620, None)
19/06/02 18:56:47 INFO BlockManagerMaster: Registered BlockManager BlockManagerId(driver, 172.25.7.36, 45620, None)
19/06/02 18:56:47 INFO BlockManager: Initialized BlockManager: BlockManagerId(driver, 172.25.7.36, 45620, None)
18:56:47.756 INFO HaplotypeCallerSpark - Spark verbosity set to INFO (see --spark-verbosity argument)
19/06/02 18:56:47 INFO GoogleHadoopFileSystemBase: GHFS version: 1.6.3-hadoop2
19/06/02 18:56:49 INFO MemoryStore: Block broadcast_0 stored as values in memory (estimated size 240.0 KB, free 15.8 GB)
19/06/02 18:56:49 INFO MemoryStore: Block broadcast_0_piece0 stored as bytes in memory (estimated size 19.5 KB, free 15.8 GB)
19/06/02 18:56:49 INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on 172.25.7.36:45620 (size: 19.5 KB, free: 15.8 GB)
19/06/02 18:56:49 INFO SparkContext: Created broadcast 0 from newAPIHadoopFile at PathSplitSource.java:96
18:56:49.984 INFO HaplotypeCallerSpark - ********************************************************************************
18:56:49.984 INFO HaplotypeCallerSpark - The output of this tool DOES NOT match the output of HaplotypeCaller.
18:56:49.984 INFO HaplotypeCallerSpark - It is under development and should not be used for production work.
18:56:49.984 INFO HaplotypeCallerSpark - For evaluation only.
18:56:49.984 INFO HaplotypeCallerSpark - Use the non-spark HaplotypeCaller if you care about the results.
18:56:49.984 INFO HaplotypeCallerSpark - ********************************************************************************
19/06/02 18:56:49 INFO SparkContext: Added file /home/grange/Genomes/cat/Felis_catus_9.0.fa at file:/home/grange/Genomes/cat/Felis_catus_9.0.fa with timestamp 1559494609986
19/06/02 18:56:49 INFO Utils: Copying /home/grange/Genomes/cat/Felis_catus_9.0.fa to /tmp/spark-a0511bc4-641b-4349-a12d-606e7a17671e/userFiles-fe214bbc-893a-4242-b7bd-9c410c0a36cc/Felis_catus_9.0.fa
19/06/02 18:56:55 INFO SparkContext: Added file file:///home/grange/Genomes/cat/Felis_catus_9.0.fa.fai at file:///home/grange/Genomes/cat/Felis_catus_9.0.fa.fai with timestamp 1559494615771
19/06/02 18:56:55 INFO Utils: Copying /home/grange/Genomes/cat/Felis_catus_9.0.fa.fai to /tmp/spark-a0511bc4-641b-4349-a12d-606e7a17671e/userFiles-fe214bbc-893a-4242-b7bd-9c410c0a36cc/Felis_catus_9.0.fa.fai
19/06/02 18:56:55 INFO SparkContext: Added file file:///home/grange/Genomes/cat/Felis_catus_9.0.dict at file:///home/grange/Genomes/cat/Felis_catus_9.0.dict with timestamp 1559494615779
19/06/02 18:56:55 INFO Utils: Copying /home/grange/Genomes/cat/Felis_catus_9.0.dict to /tmp/spark-a0511bc4-641b-4349-a12d-606e7a17671e/userFiles-fe214bbc-893a-4242-b7bd-9c410c0a36cc/Felis_catus_9.0.dict
19/06/02 18:56:55 INFO MemoryStore: Block broadcast_1 stored as values in memory (estimated size 438.1 KB, free 15.8 GB)
19/06/02 18:56:56 INFO MemoryStore: Block broadcast_1_piece0 stored as bytes in memory (estimated size 34.2 KB, free 15.8 GB)
19/06/02 18:56:56 INFO BlockManagerInfo: Added broadcast_1_piece0 in memory on 172.25.7.36:45620 (size: 34.2 KB, free: 15.8 GB)
19/06/02 18:56:56 INFO SparkContext: Created broadcast 1 from broadcast at AbstractBinarySamSource.java:82
19/06/02 18:56:56 INFO MemoryStore: Block broadcast_2 stored as values in memory (estimated size 240.0 KB, free 15.8 GB)
19/06/02 18:56:56 INFO MemoryStore: Block broadcast_2_piece0 stored as bytes in memory (estimated size 19.5 KB, free 15.8 GB)
19/06/02 18:56:56 INFO BlockManagerInfo: Added broadcast_2_piece0 in memory on 172.25.7.36:45620 (size: 19.5 KB, free: 15.8 GB)
19/06/02 18:56:56 INFO SparkContext: Created broadcast 2 from newAPIHadoopFile at PathSplitSource.java:96
18:56:56.548 INFO HaplotypeCallerEngine - Tool is in reference confidence mode and the annotation, the following changes will be made to any specified annotations: 'StrandBiasBySample' will be enabled. 'ChromosomeCounts', 'FisherStrand', 'StrandOddsRatio' and 'QualByDepth' annotations have been disabled
19/06/02 18:56:57 INFO MemoryStore: Block broadcast_3 stored as values in memory (estimated size 9.9 MB, free 15.8 GB)
19/06/02 18:56:57 INFO SparkUI: Stopped Spark web UI at http://172.25.7.36:4040
19/06/02 18:56:57 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
19/06/02 18:56:57 INFO MemoryStore: MemoryStore cleared
19/06/02 18:56:57 INFO BlockManager: BlockManager stopped
19/06/02 18:56:57 INFO BlockManagerMaster: BlockManagerMaster stopped
19/06/02 18:56:57 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
19/06/02 18:56:57 INFO SparkContext: Successfully stopped SparkContext
18:56:57.524 INFO HaplotypeCallerSpark - Shutting down engine
[2 juin 2019 18:56:57 CEST] org.broadinstitute.hellbender.tools.HaplotypeCallerSpark done. Elapsed time: 0.23 minutes.
Runtime.totalMemory()=2859466752
Exception in thread "main" java.lang.StackOverflowError
at sun.reflect.generics.parser.SignatureParser.parseTypeArgument(SignatureParser.java:415)
at sun.reflect.generics.parser.SignatureParser.parseTypeArguments(SignatureParser.java:396)
at sun.reflect.generics.parser.SignatureParser.parsePackageNameAndSimpleClassTypeSignature(SignatureParser.java:346)
at sun.reflect.generics.parser.SignatureParser.parseClassTypeSignature(SignatureParser.java:310)
at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:289)
at sun.reflect.generics.parser.SignatureParser.parseFieldTypeSignature(SignatureParser.java:283)
at sun.reflect.generics.parser.SignatureParser.parseTypeSignature(SignatureParser.java:485)
at sun.reflect.generics.parser.SignatureParser.parseTypeSig(SignatureParser.java:188)
at sun.reflect.generics.repository.FieldRepository.parse(FieldRepository.java:52)
at sun.reflect.generics.repository.FieldRepository.parse(FieldRepository.java:42)
at sun.reflect.generics.repository.AbstractRepository.(AbstractRepository.java:74)
at sun.reflect.generics.repository.FieldRepository.(FieldRepository.java:48)
at sun.reflect.generics.repository.FieldRepository.make(FieldRepository.java:66)
at java.lang.reflect.Field.getGenericInfo(Field.java:105)
at java.lang.reflect.Field.getGenericType(Field.java:247)
at com.esotericsoftware.kryo.serializers.FieldSerializer.newCachedField(FieldSerializer.java:360)
at com.esotericsoftware.kryo.serializers.FieldSerializer.createCachedFields(FieldSerializer.java:331)
at com.esotericsoftware.kryo.serializers.FieldSerializer.rebuildCachedFields(FieldSerializer.java:261)
at com.esotericsoftware.kryo.serializers.FieldSerializer.rebuildCachedFields(FieldSerializer.java:182)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:508)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)

Puis répétition ad nauseam du motif:
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)

Malheureusement, ce type d'erreur (Exception in thread "main" java.lang.StackOverflowError) me dépasse.
On retrouve des signalement (issues) sur le dépôt de GATK (par exemple: https://github.com/broadinstitute/gatk/issues/5869) mais sans réponses.
Je ne peux que vous inviter à contacter les développeurs en ouvrant une issue par exemple.

Bon après-midi quand même.