Revenir au contenu principal

Simplifier les pipelines de génomique à grande échelle avec Databricks Delta

SimplifyGenPipes_Social_Tile

Publié: March 7, 2019

Open Source11 min de lecture

 <a href="https://www.databricks.com/resources/ebook/delta-lake-running-oreilly?itm_data=simplifyinggenomicspipelinesdelta-blog-oreillydlupandrunning">Obtenez un aperçu en avant-première du nouvel ebook d'O'Reilly</a> pour le guide pas à pas dont vous avez besoin pour commencer à utiliser Delta Lake.</p><hr><p><a class="dbce_cta" href="https://pages.databricks.com/rs/094-YMS-629/images/Simplifying%20Genomics%20Pipelines%20at%20Scale%20with%20Databricks.html" target="_blank">Essayer ce Notebook dans Databricks</a><br><em>Ce blog est le premier de notre série «&nbsp;Analyse génomique à grande échelle&nbsp;». Dans cette série, nous allons montrer comment la </em><a href="https://www.databricks.com/product/genomics"><em>plateforme d'analyse unifiée pour la génomique de Databricks</em></a><em> permet aux clients d'analyser des données génomiques à l'échelle de la population. À partir du résultat de notre </em><a href="https://www.databricks.com/blog/2018/09/10/building-the-fastest-dnaseq-pipeline-at-scale.html"><em>pipeline génomique</em></a><em>, cette série fournira un tutoriel sur l'utilisation de Databricks pour exécuter le contrôle qualité des échantillons, le génotypage conjoint, le contrôle qualité de la cohorte et des analyses statistiques génétiques avancées.</em></p><hr><p>Depuis l'achèvement du <a href="https://www.genome.gov/human-genome-project/What">Projet Génome Humain</a> en 2003, il y a eu une explosion des données alimentée par une baisse spectaculaire du coût du séquençage de l'ADN, passant de 3 milliards de dollars<sup>1</sup> pour le premier génome à moins de 1 000 $ aujourd'hui.</p><blockquote><p>[1] <a href="https://www.genome.gov/human-genome-project/What">Le Projet Génome Humain</a> était un projet de 3 milliards de dollars mené par le Département de l'Énergie et les National Institutes of Health, qui a débuté en 1990 et s'est achevé en 2003.</p></blockquote><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/costpergenome_2017.jpg"><img class="aligncenter wp-image-39985" style="width:700px;" src="https://www.databricks.com/wp-content/uploads/2019/03/costpergenome_2017.jpg" alt="Coût par génome" height="525"></a></p><p class="text-align-center">Source : <a href="https://www.genome.gov/about-genomics/fact-sheets/DNA-Sequencing-Costs-Data">Coûts du séquençage de l'ADN : données</a></p><p>Par conséquent, le domaine de la génomique a atteint un stade de maturité où les entreprises ont commencé à effectuer le séquençage de l'ADN à l'échelle de la population. Cependant, le séquençage du code ADN n'est que la première étape&nbsp;; les données brutes doivent ensuite être transformées dans un format adapté à l'analyse. Généralement, cette opération consiste à assembler une série d'outils de <a href="https://www.databricks.com/glossary/bioinformatics">bio-informatique</a> avec des scripts personnalisés et à traiter les données sur un nœud unique, un échantillon à la fois, jusqu'à l'obtention d'une collection de variants génomiques. &nbsp;Les scientifiques en <a href="https://www.databricks.com/glossary/bioinformatics">bio-informatique</a> consacrent aujourd'hui la majeure partie de leur temps à la création et à la maintenance de ces pipelines. Alors que les jeux de données génomiques ont atteint l'échelle du pétaoctet, il est devenu difficile de répondre rapidement, même aux questions simples suivantes&nbsp;:</p><ul><li>Combien d'échantillons avons-nous séquencés ce mois-ci ?</li><li>Quel est le nombre total de variantes uniques détectées ?</li><li>Combien de variants avons-nous observés dans les différentes classes de variation ?</li></ul><p>Pour aggraver encore ce problème, les données de milliers d'individus ne peuvent être ni stockées, ni suivies, ni versionnées, tout en restant accessibles et requêtables. Par conséquent, les chercheurs dupliquent souvent des sous-ensembles de leurs données génomiques lorsqu'ils effectuent leurs analyses, ce qui entraîne une augmentation de l'empreinte de stockage globale et des coûts. &nbsp;Pour tenter de pallier ce problème, les chercheurs emploient aujourd'hui une stratégie de « gel des données », généralement sur des périodes de six mois à deux ans, pendant lesquelles ils interrompent le traitement de nouvelles données pour se concentrer sur une copie gelée des données existantes. Il n'existe aucune solution pour construire des analyses de manière incrémentale sur des périodes plus courtes, ce qui ralentit la progression de la recherche.</p><p>Il existe un besoin impérieux d'outils robustes capables d'ingérer des données génomiques à l'échelle industrielle, tout en offrant aux scientifiques la flexibilité nécessaire pour explorer les données, itérer sur leurs pipelines analytiques et en tirer de nouveaux insights.</p><p><a href="https://www.databricks.com/wp-content/uploads/2019/06/genomics-reader-writer_image3.png"><img class="aligncenter wp-image-44884" style="width:698px;" src="https://www.databricks.com/wp-content/uploads/2019/06/genomics-reader-writer_image3.png" alt="Architecture pour l'analyse génomique de bout en bout avec Databricks" height="212"></a></p><p class="text-align-center">Fig 1. Architecture pour l'analyse génomique de bout en bout avec Databricks</p><p>Avec <a href="https://www.youtube.com/watch?v=gg-lEJ4sBaA">Databricks Delta&nbsp;: Un système de gestion unifié pour l'Analytique Big Data en temps réel</a>, la plateforme Databricks a fait un grand pas en avant pour résoudre les problèmes de gouvernance des données, d'accès aux données et d'analyse des données auxquels les chercheurs sont aujourd'hui confrontés. Avec&nbsp;<a href="https://www.databricks.com/product/delta-lake-on-databricks">Databricks Delta Lake</a>, vous pouvez stocker toutes vos données génomiques en un seul endroit et créer des analyses qui se mettent à jour en temps réel à mesure que de nouvelles données sont ingérées. Associé aux optimisations de notre <a href="https://www.databricks.com/product/genomics">plateforme d'analyse unifiée pour la génomique</a> (UAP4G) pour la lecture, l'écriture et le traitement des formats de fichiers génomiques, nous proposons une solution de bout en bout pour les workflows de pipelines génomiques. L'architecture UAP4G offre de la flexibilité, permettant aux clients d'intégrer leurs propres pipelines et de développer leur propre analytique tertiaire. À titre d'exemple, nous avons mis en évidence le tableau de bord suivant qui présente des métriques et des visualisations de contrôle qualité pouvant être calculées et présentées de manière automatisée et personnalisées pour répondre à vos besoins spécifiques.</p><p>https://www.youtube.com/watch?v=73fMhDKXykU</p><p>Dans la suite de ce blog, nous décrirons les étapes que nous avons suivies pour créer le tableau de bord de contrôle qualité ci-dessus, qui se met à jour en temps réel à mesure que le traitement des échantillons se termine. En utilisant un pipeline basé sur Delta pour le traitement des données génomiques, nos clients peuvent désormais exploiter leurs pipelines en bénéficiant d'une visibilité en temps réel, échantillon par échantillon. Avec les Notebooks Databricks (et des intégrations telles que GitHub et MLflow), ils peuvent suivre et versionner les analyses de manière à garantir la reproductibilité de leurs résultats. Leurs bio-informaticiens peuvent consacrer moins de temps à la maintenance des pipelines et passer plus de temps à faire des découvertes. Nous considérons l'UAP4G comme le moteur qui pilotera la transformation des analyses ad hoc vers la génomique de production à l'échelle industrielle, permettant ainsi de mieux comprendre le link entre la génétique et la maladie.</p><h2>Lire les données d'échantillon</h2><p>Commençons par lire les données de variation d'une petite cohorte d'échantillons&nbsp;; l'instruction suivante lit les données pour un sampleId spécifique et les enregistre au format Databricks Delta (dans le dossier delta_stream_output).</p><pre style="font-size:10pt;">spark.read. \ format("parquet"). \ load("dbfs:/annotations_etl_parquet/sampleId=" + "SRS000030_SRR709972"). \ write. \ format("delta"). \ save(delta_stream_outpath) </pre><blockquote><p>Remarque&nbsp;: le dossier annotations_etl_parquet contient des annotations générées à partir de <a href="https://www.internationalgenome.org/">l'ensemble de données 1000 génomes</a> et stockées au format Parquet. &nbsp;&nbsp;L'ETL et le traitement de ces annotations ont été effectués à l'aide de <a href="https://www.databricks.com/product/genomics">la plateforme d'analyse unifiée pour la génomique de Databricks</a>.</p></blockquote><h2>Start le streaming de la table Databricks Delta</h2><p>Dans l'instruction suivante, nous créons le DataFrame Apache Spark des exomes, qui lit un stream de données (via readStream) au format Databricks Delta. &nbsp;Il s'agit d'un DataFrame en exécution continue ou dynamique, c'est-à-dire que le DataFrame exomes chargera de nouvelles données au fur et à mesure de leur écriture dans le dossier delta_stream_output. &nbsp;&nbsp;Pour afficher le DataFrame exomes, nous pouvons exécuter une query de DataFrame pour trouver le nombre de variants regroupés par le sampleId.</p><pre style="font-size:10pt;"># Read the stream of data exomes = spark.readStream.format("delta").load(delta_stream_outpath) # Display the data via DataFrame query display(exomes.groupBy("sampleId").count().withColumnRenamed("count", "variants")) </pre><p>Lors de l'exécution de l'instruction <code>display</code>, le Notebook Databricks fournit un tableau de bord de streaming pour surveiller les tâches de streaming. &nbsp;Les résultats de l'instruction display (c'est-à-dire le nombre de variants par sample_id) se trouvent juste en dessous du job de streaming.</p><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/single_sample_display_variant_count_by_sampleid.png"><img class="aligncenter wp-image-39992" style="width:700px;" src="https://www.databricks.com/wp-content/uploads/2019/03/single_sample_display_variant_count_by_sampleid.png" alt height="282"></a></p><p>Continuons de répondre à notre série de questions initiale en exécutant d'autres queries DataFrame basées sur notre DataFrame <code>exomes</code>.</p><h2>Nombre de variants mononucléotidiques</h2><p>Pour poursuivre l'exemple, nous pouvons rapidement calculer le nombre de variants nucléotidiques uniques (SNV), comme l'illustre le Graphe suivant.</p><pre style="font-size:10pt;">%sql select referenceAllele, alternateAllele, count(1) as GroupCount from snvs group by referenceAllele, alternateAllele order by GroupCount desc </pre><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/single_nucleotide_variant_count_sorted.png"><img class="aligncenter wp-image-39994" style="width:699px;" src="https://www.databricks.com/wp-content/uploads/2019/03/single_nucleotide_variant_count_sorted.png" alt height="356"></a></p><blockquote><p>Notez que la commande <code>display</code> fait partie du workspace Databricks et vous permet de visualiser votre DataFrame à l'aide des visualisations Databricks (c'est-à-dire aucun codage requis).</p></blockquote><h2>Nombre de variantes</h2><p>Puisque nous avons annoté nos variants avec des effets fonctionnels, nous pouvons poursuivre notre analyse en examinant la répartition des effets des variants que nous observons. La majorité des variants détectés flanquent des régions qui codent pour des protéines&nbsp;; il s'agit de variants non codants.</p><pre style="font-size:10pt;">display(exomes.groupBy("mutationType").count()) </pre><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/mutation_type_donut.png"><img class="aligncenter wp-image-39996" style="width:650px;" src="https://www.databricks.com/wp-content/uploads/2019/03/mutation_type_donut.png" alt height="534"></a></p><h2>Carte thermique de substitution d'acides aminés</h2><p>Poursuivons avec notre DataFrame <code>exomes</code> et calculons les décomptes de substitutions d'aminoacides à l'aide du fragment de code suivant. &nbsp;Comme pour les DataFrames précédents, nous allons créer un autre DataFrame dynamique (<code>aa_counts</code>) de sorte que lorsque de nouvelles données sont traitées par le DataFrame exomes, elles soient également répercutées dans les décomptes de substitutions d'acides aminés. &nbsp;Nous écrivons également les données en mémoire (c'est-à-dire <code>.format("memory")</code>) et traitons les batches toutes les 60 secondes (c'est-à-dire <code>trigger(processingTime=’60 seconds’)</code>) afin que le code de la heatmap Pandas en aval puisse traiter et visualiser la heatmap.</p><pre style="font-size:10pt;"># Calculate amino acid substitution counts coding = get_coding_mutations(exomes) aa_substitutions = get_amino_acid_substitutions(coding.select("proteinHgvs"), "proteinHgvs") aa_counts = count_amino_acid_substitution_combinations(aa_substitutions) aa_counts. \ writeStream. \ format("memory"). \ queryName("amino_acid_substitutions"). \ outputMode("complete"). \ trigger(processingTime='60 seconds'). \ start() </pre><p>L'extrait de code suivant lit la table Spark <code>amino_acid_substitutions</code> précédente, détermine le nombre maximal, crée un nouveau tableau croisé dynamique Pandas à partir de la table Spark, puis trace la carte thermique.</p><pre style="font-size:10pt;"># Use pandas and matplotlib to build heatmap amino_acid_substitutions = spark.read.table("amino_acid_substitutions") max_count = amino_acid_substitutions.agg(fx.max("substitutions")).collect()[0][0] aa_counts_pd = amino_acid_substitutions.toPandas() aa_counts_pd = pd.pivot_table(aa_counts_pd, values='substitutions', index=['reference'], columns=['alternate'], fill_value=0) fig, ax = plt.subplots() with sns.axes_style("white"): ax = sns.heatmap(aa_counts_pd, vmax=max_count*0.4, cbar=False, annot=True, annot_kws={"size": 7}, fmt="d") plt.tight_layout() display(fig) </pre><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/single_sampleid_amino_acid_map.png"><img class="aligncenter wp-image-39998" style="width:701px;" src="https://www.databricks.com/wp-content/uploads/2019/03/single_sampleid_amino_acid_map.png" alt height="463"></a></p><h2>Migration vers un pipeline continu</h2><p>Jusqu'à présent, les extraits de code et les visualisations précédents représentent une seule exécution pour un seul <code>sampleId</code>. &nbsp;Mais comme nous utilisons Structured Streaming et Databricks Delta, ce code peut être utilisé (sans aucune modification) pour construire un pipeline de données de production qui calcule des statistiques de contrôle qualité en continu au fur et à mesure que les échantillons transitent par notre pipeline. Pour le démontrer, nous pouvons exécuter l'extrait de code suivant qui chargera l'ensemble de notre dataset.</p><pre style="font-size:10pt;">import time parquets = "dbfs:/databricks-datasets/génomique/annotations_etl_parquet/" files = dbutils.fs.ls(parquets) counter=0 for sample in files: counter+=1 annotation_path = sample.path sampleId = annotation_path.split("/")[4].split("=")[1] variants = spark.read.format("parquet").load(str(annotation_path)) print("running " + sampleId) if(sampleId != "SRS000030_SRR709972"): variants.write.format("delta"). \ mode("append"). \ save(delta_stream_outpath) time.sleep(10) </pre><p>Comme décrit dans les extraits de code précédents, la source du DataFrame <code>exomes</code> correspond aux fichiers chargés dans le dossier <code>delta_stream_output</code>. &nbsp;Initialement, nous avions chargé un ensemble de fichiers pour un seul <code>sampleId</code> (c'est-à-dire, <code>sampleId = “SRS000030_SRR709972”</code>). &nbsp;&nbsp;L'extrait de code précédent prend désormais tous les échantillons Parquet générés (c'est-à-dire <code>parquets</code>) et charge incrémentalement ces fichiers par <code>sampleId</code> dans le même dossier <code>delta_stream_output</code>. &nbsp;&nbsp;Le GIF animé suivant montre la sortie abrégée de l'extrait de code précédent.</p><p>https://www.youtube.com/watch?v=JPngSC5Md-Q</p><h2>Visualisation de votre pipeline génomique</h2><p>Lorsque vous revenez en haut de votre notebook, vous remarquerez que le DataFrame <code>exomes</code> charge désormais automatiquement les nouveaux <code>sampleIds</code>. &nbsp;Comme le composant de streaming structuré de notre pipeline de génomique s'exécute en continu, il traite les données dès que de nouveaux fichiers sont chargés dans le dossier <code>delta_stream_outputpath</code>. &nbsp;En utilisant le format Databricks Delta, nous pouvons garantir la cohérence transactionnelle des données de streaming dans le DataFrame exomes.</p><p>https://www.youtube.com/watch?v=Q7KdPsc5mbY</p><p>Contrairement à la création initiale de notre DataFrame <code>exomes</code>, remarquez comment le tableau de bord de monitoring du streaming structuré charge maintenant des données (c.-à-d., la fluctuation du «&nbsp;taux d'entrée/traitement&nbsp;», la fluctuation de la «&nbsp;durée de batch&nbsp;» et l'augmentation des clés distinctes dans l'«&nbsp;état des agrégations&nbsp;»). &nbsp;Pendant le traitement du DataFrame <code>exomes</code>, vous remarquerez l'apparition de nouvelles lignes de <code>sampleIds</code> (et le nombre de variants). &nbsp;Cette même action peut également être observée pour la associée <em>group by mutation type query</em>.</p><p>https://www.youtube.com/watch?v=sT179SCknGM</p><p>Avec Databricks Delta, toute nouvelle donnée est cohérente sur le plan transactionnel à chaque étape de notre pipeline de génomique. &nbsp;Ceci est important, car cela garantit que votre pipeline est cohérent (maintient la cohérence de vos données, c'est-à-dire garantit que toutes les données sont «&nbsp;correctes&nbsp;»), fiable (la transaction réussit ou échoue complètement) et peut gérer les mises à jour en temps réel (la capacité de gérer de nombreuses transactions simultanément et toute panne ou défaillance n'aura pas d'impact sur les données). &nbsp;&nbsp;Ainsi, même les données de notre carte de substitution d'acides aminés en aval (qui ont subi un certain nombre d'étapes ETL supplémentaires) sont actualisées de manière transparente.</p><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/amino-acid-map-all-files.png"><img class="aligncenter wp-image-40004" style="width:700px;" src="https://www.databricks.com/wp-content/uploads/2019/03/amino-acid-map-all-files.png" alt height="478"></a></p><p>En tant que dernière étape de notre pipeline de génomique, nous effectuons le monitoring des mutations distinctes en examinant les fichiers parquet Databricks Delta dans DBFS (c'est-à-dire l'augmentation des mutations distinctes au fil du temps).</p><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/distinct-mutations-multiple-files.png"><img class="aligncenter wp-image-40006" style="width:699px;" src="https://www.databricks.com/wp-content/uploads/2019/03/distinct-mutations-multiple-files.png" alt height="421"></a></p><h2>Résumé</h2><p>En s'appuyant sur les fondations de la Databricks plateforme d'analyse unifiée - et en particulier sur Databricks Delta - les bio-informaticiens et les chercheurs peuvent appliquer des analytiques distribuées avec une cohérence transactionnelle à l'aide de <a href="https://www.databricks.com/product/genomics">Databricks plateforme d'analyse unifiée pour la génomique</a>. Ces abstractions permettent aux praticiens des données de simplifier les pipelines génomiques. &nbsp;Ici, nous avons créé un pipeline de contrôle qualité des échantillons génomiques qui traite les données en continu au fur et à mesure que de nouveaux échantillons sont traités, sans intervention manuelle. &nbsp;Que vous effectuiez des opérations d'ETL ou des analyses sophistiquées, vos données circuleront dans votre pipeline génomique rapidement et sans disruption. Essayez-le vous-même dès aujourd'hui en téléchargeant le <a href="https://pages.databricks.com/rs/094-YMS-629/images/Simplifying%20Genomics%20Pipelines%20at%20Scale%20with%20Databricks.html">notebook Simplification des pipelines génomiques à grande échelle avec Databricks Delta</a>.</p><p>start l'analyse de la génomique à Monter en charge :</p><ul><li>Consultez notre <a href="https://www.databricks.com/product/genomics">guide de la solution</a>sur l'analyse unifiée pour la génomique</li><li>Téléchargez le <a href="https://pages.databricks.com/rs/094-YMS-629/images/Simplifying%20Genomics%20Pipelines%20at%20Scale%20with%20Databricks.html">Notebook&nbsp;: Simplification des pipelines génomiques à l'échelle avec Databricks Delta</a></li><li>Inscrivez-vous pour un <a href="https://pages.databricks.com/genomics-preview.html">essai gratuit </a>de Databricks Unified Analytics Platform pour la génomique</li></ul><p>&nbsp;</p><h2>Remerciements</h2><p>Merci à Yongsheng Huang et Michael Ortega pour leurs contributions.<br>&nbsp;</p><div style="border-radius:10px;border:medium solid #0CF;margin-left:auto;margin-right:auto;max-width:700px;padding:25px;text-align:left;"><strong>Delta Lake open source vous intéresse&nbsp;?</strong><br><a href="https://delta.io?utm_source=delta-blog" rel="noopener noreferrer" target="_blank">Visitez le hub en ligne de Delta Lake</a> pour en savoir plus, télécharger le dernier code et rejoindre la communauté Delta Lake.</div><p>&nbsp;</p>

Ne manquez jamais un article Databricks

Abonnez-vous à notre blog et recevez les derniers articles dans votre boîte mail.

Et ensuite ?

image

Data Science e ML

October 31, 2023/9 min de leitura

Anunciando as métricas de LLM-como-juiz do MLflow 2.8 e as Melhores Práticas para Avaliação de LLM de Aplicações RAG, Parte 2

Creating High Quality RAG Applications with Databricks

Anúncios

December 6, 2023/7 min de leitura

Criando aplicativos RAG de alta qualidade com a Databricks