Ir al contenido principal

Simplificación de pipelines de genómica a escala con Databricks Delta

SimplifyGenPipes_Social_Tile

Publicado: March 7, 2019

Código abierto11 min de lectura

 <a href="https://www.databricks.com/resources/ebook/delta-lake-running-oreilly?itm_data=simplifyinggenomicspipelinesdelta-blog-oreillydlupandrunning">Obtén un avance del nuevo ebook de O'Reilly</a> con la guía paso a paso que necesitas para empezar a usar 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">Pruebe este notebook en Databricks</a><br><em>Este blog es el primero de nuestra serie “Genomics Analysis at Scale”. En esta serie, demostraremos cómo la </em><a href="https://www.databricks.com/product/genomics"><em>Plataforma de Analítica Unificada para Genómica de Databricks</em></a><em> permite a los clientes analizar datos genómicos a escala poblacional. A partir de los resultados de nuestro </em><a href="https://www.databricks.com/blog/2018/09/10/building-the-fastest-dnaseq-pipeline-at-scale.html"><em>pipeline de genómica</em></a><em>, esta serie proporcionará un tutorial sobre el uso de Databricks para ejecutar el control de calidad de las muestras, la genotipificación conjunta, el control de calidad de cohortes y análisis avanzados de genética estadística.</em></p><hr><p>Desde la finalización del <a href="https://www.genome.gov/human-genome-project/What">Proyecto Genoma Humano</a> en 2003, ha habido una explosión de datos impulsada por una drástica caída en el costo de la secuenciación de ADN, de 3000 millones de dólares<sup>1</sup> para el primer genoma a menos de 1000 dólares en la actualidad.</p><blockquote><p>[1] <a href="https://www.genome.gov/human-genome-project/What">El Proyecto del Genoma Humano</a> fue un proyecto de $3 mil millones liderado por el Departamento de Energía y los Institutos Nacionales de Salud que comenzó en 1990 y se completó 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="Costo por genoma" height="525"></a></p><p class="text-align-center">Fuente: <a href="https://www.genome.gov/about-genomics/fact-sheets/DNA-Sequencing-Costs-Data">Costos de la secuenciación de ADN: Datos</a></p><p>En consecuencia, el campo de la genómica ha madurado hasta un punto en el que las empresas han comenzado a realizar la secuenciación de ADN a escala de población. Sin embargo, la secuenciación del código de ADN es solo el primer paso; los datos en bruto luego deben transformarse a un formato adecuado para el análisis. Generalmente, esto se hace uniendo una serie de herramientas de <a href="https://www.databricks.com/glossary/bioinformatics">bioinformática</a> con scripts personalizados y procesando los datos en un solo nodo, una muestra a la vez, hasta obtener una colección de variantes genómicas. &nbsp;Los científicos de <a href="https://www.databricks.com/glossary/bioinformatics">bioinformática</a> dedican hoy en día la mayor parte de su tiempo a construir y mantener estos pipelines. A medida que los conjuntos de datos genómicos se han expandido a la escala de petabytes, se ha vuelto un desafío responder de manera oportuna incluso las siguientes preguntas simples:</p><ul><li>¿Cuántas muestras hemos secuenciado este mes?</li><li>¿Cuál es el número total de variantes únicas detectadas?</li><li>¿Cuántas variantes vimos en las diferentes clases de variación?</li></ul><p>Para agravar aún más este problema, los datos de miles de personas no se pueden almacenar, rastrear ni versionar y, a la vez, mantenerse accesibles y consultables. En consecuencia, los investigadores suelen duplicar subconjuntos de sus datos genómicos al realizar sus análisis, lo que provoca que el espacio de almacenamiento general y los costos aumenten. &nbsp;En un intento por aliviar este problema, hoy en día los investigadores emplean una estrategia de “congelamiento de datos”, por lo general de seis meses a dos años, en la que detienen el trabajo con datos nuevos y, en su lugar, se centran en una copia congelada de los datos existentes. No existe una solución para desarrollar análisis de forma incremental en períodos de tiempo más cortos, lo que ralentiza el progreso de la investigación.</p><p>Existe una necesidad imperiosa de contar con un software robusto que pueda procesar datos genómicos a escala industrial, al tiempo que conserve la flexibilidad necesaria para que los científicos puedan explorar los datos, iterar en sus procesos analíticos y obtener nuevos conocimientos.</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="Arquitectura para el análisis genómico de extremo a extremo con Databricks" height="212"></a></p><p class="text-align-center">Fig. 1. Arquitectura para el análisis genómico de extremo a extremo con Databricks</p><p>Con <a href="https://www.youtube.com/watch?v=gg-lEJ4sBaA">Databricks Delta: A Unified Management System for Real-time Big Data Analytics</a>, la plataforma Databricks ha dado un paso importante para resolver los problemas de gobernanza, acceso y análisis de datos que enfrentan los investigadores en la actualidad. Con <a href="https://www.databricks.com/product/delta-lake-on-databricks">Databricks Delta Lake</a>, puede almacenar todos sus datos genómicos en un solo lugar y crear análisis que se actualicen en tiempo real a medida que se ingieren datos nuevos. En combinación con las optimizaciones de nuestra <a href="https://www.databricks.com/product/genomics">Unified Analytics Platform for Genomics</a> (UAP4G) para leer, escribir y procesar formatos de archivo de genómica, ofrecemos una solución integral para los flujos de trabajo de los pipelines de genómica. La arquitectura UAP4G ofrece flexibilidad, lo que permite a los clientes integrar sus propias canalizaciones y desarrollar sus propios análisis terciarios. Como ejemplo, hemos destacado el siguiente panel que muestra métricas de control de calidad y visualizaciones que se pueden calcular y presentar de forma automatizada y personalizada para satisfacer sus requisitos específicos.</p><p>https://www.youtube.com/watch?v=73fMhDKXykU</p><p>En el resto de este blog, repasaremos los pasos que seguimos para crear el panel de control de calidad anterior, que se actualiza en tiempo real a medida que las muestras terminan de procesarse. Al usar un pipeline basado en Delta para procesar datos genómicos, nuestros clientes ahora pueden operar sus pipelines de una manera que proporciona visibilidad en tiempo real, muestra por muestra. Con los notebooks de Databricks (y las integraciones como GitHub y MLflow), pueden hacer un seguimiento y versionar los análisis de una manera que garantizará que sus resultados sean reproducibles. Sus bioinformáticos pueden dedicar menos tiempo al mantenimiento de pipelines y más tiempo a realizar descubrimientos. Vemos el UAP4G como el motor que impulsará la transformación de los análisis ad hoc a la genómica de producción a escala industrial, lo que permitirá una mejor comprensión del vínculo entre la genética y las enfermedades.</p><h2>Leer datos de muestra</h2><p>Comencemos por leer los datos de variación de una pequeña cohorte de muestras; la siguiente instrucción lee los datos de un sampleId específico y los guarda usando el formato Delta de Databricks (en la carpeta 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>Ten en cuenta que la carpeta annotations_etl_parquet contiene anotaciones generadas a partir del <a href="https://www.internationalgenome.org/">conjunto de datos de 1000 genomas</a> almacenados en formato parquet. &nbsp;&nbsp;El ETL y el procesamiento de estas anotaciones se realizaron utilizando <a href="https://www.databricks.com/product/genomics">la plataforma analítica unificada para genómica de Databricks</a>.</p></blockquote><h2>Iniciar el streaming de la tabla Delta de Databricks</h2><p>En la siguiente instrucción, estamos creando el DataFrame de Apache Spark de exomas, que lee una transmisión (a través de readStream) de datos con el formato Delta de Databricks. &nbsp;Este es un DataFrame dinámico o de ejecución continua, es decir, el DataFrame de exomas cargará datos nuevos a medida que se escriban en la carpeta delta_stream_output. &nbsp;&nbsp;Para ver el DataFrame de exomas, podemos ejecutar una consulta de DataFrame para encontrar el recuento de variantes agrupadas por el 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", "variantes")) </pre><p>Al ejecutar la instrucción <code>display</code>, el notebook de Databricks proporciona un panel de streaming para monitorear los trabajos de streaming. &nbsp;Inmediatamente debajo del trabajo de streaming se encuentran los resultados de la instrucción de visualización (es decir, el recuento de variantes por sample_id).</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>Continuemos respondiendo a nuestro conjunto inicial de preguntas ejecutando otras consultas de DataFrame basadas en nuestro DataFrame <code>exomes</code>.</p><h2>Recuento de variantes de un solo nucleótido</h2><p>Para continuar con el ejemplo, podemos calcular rápidamente el número de variantes de un solo nucleótido (SNV), como se muestra en el siguiente gráfico.</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>Ten en cuenta que el comando <code>display</code> es parte del espacio de trabajo de Databricks que te permite ver tu DataFrame usando las visualizaciones de Databricks (es decir, sin necesidad de codificar).</p></blockquote><h2>Recuento de variantes</h2><p>Dado que hemos anotado nuestras variantes con efectos funcionales, podemos continuar nuestro análisis observando la distribución de los efectos de las variantes que vemos. La mayoría de las variantes detectadas flanquean regiones que codifican proteínas; estas se conocen como variantes no codificantes.</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>Mapa de calor de sustitución de aminoácidos</h2><p>Continuando con nuestro DataFrame <code>exomes</code>, calculemos los recuentos de sustitución de aminoácidos con el siguiente fragmento de código. &nbsp;Al igual que los DataFrames anteriores, crearemos otro DataFrame dinámico (<code>aa_counts</code>) para que, a medida que el DataFrame exomes procese nuevos datos, estos se reflejen posteriormente también en los recuentos de sustitución de aminoácidos. &nbsp;También estamos escribiendo los datos en la memoria (es decir, <code>.format(“memory”)</code>) y procesando lotes cada 60 s (es decir, <code>trigger(processingTime=’60 seconds’)</code>) para que el código del mapa de calor de Pandas posterior pueda procesar y visualizar el mapa de calor.</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>El siguiente fragmento de código lee la tabla de Spark <code>amino_acid_substitutions</code> anterior, determina el recuento máximo, crea una nueva tabla dinámica de Pandas a partir de la tabla de Spark y, luego, grafica el mapa de calor.</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>Migración a un proceso continuo</h2><p>Hasta este momento, los fragmentos de código y las visualizaciones anteriores representan una sola ejecución para un solo <code>sampleId</code>. &nbsp;Pero como estamos usando Structured Streaming y Databricks Delta, este código se puede usar (sin ningún cambio) para construir una canalización de datos de producción que calcule estadísticas de control de calidad de forma continua a medida que las muestras pasan por nuestra canalización. Para demostrar esto, podemos ejecutar el siguiente fragmento de código que cargará todo nuestro conjunto de datos.</p><pre style="font-size:10pt;">import time parquets = "dbfs:/databricks-datasets/genomics/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>Como se describe en los fragmentos de código anteriores, el origen del DataFrame <code>exomes</code> son los archivos cargados en la carpeta <code>delta_stream_output</code>. &nbsp;Inicialmente, habíamos cargado un conjunto de archivos para un solo <code>sampleId</code> (es decir, <code>sampleId = “SRS000030_SRR709972”</code>). &nbsp;&nbsp;El fragmento de código anterior ahora toma todas las muestras parquet generadas (es decir, <code>parquets</code>) y carga de forma incremental esos archivos por <code>sampleId</code> en la misma carpeta <code>delta_stream_output</code>. &nbsp;&nbsp;El siguiente GIF animado muestra la salida abreviada del fragmento de código anterior.</p><p>https://www.youtube.com/watch?v=JPngSC5Md-Q</p><h2>Visualización de su pipeline de genómica</h2><p>Cuando se desplace de nuevo a la parte superior de su notebook, notará que el DataFrame <code>exomes</code> ahora está cargando automáticamente los nuevos <code>sampleIds</code>. &nbsp;Como el componente de streaming estructurado de nuestro pipeline de genómica se ejecuta continuamente, procesa los datos tan pronto como se cargan nuevos archivos en la carpeta <code>delta_stream_outputpath</code>. &nbsp;Al utilizar el formato Delta de Databricks, podemos garantizar la consistencia transaccional de los datos que se transmiten por streaming al DataFrame de exomas.</p><p>https://www.youtube.com/watch?v=Q7KdPsc5mbY</p><p>A diferencia de la creación inicial de nuestro DataFrame <code>exomes</code>, observe cómo el panel de supervisión de Structured Streaming ahora está cargando datos (es decir, la “tasa de entrada vs. procesamiento” fluctuante, la “duración del lote” fluctuante y un aumento de claves distintas en el “estado de las agregaciones”). &nbsp;Mientras se procesa el DataFrame <code>exomes</code>, observe las nuevas filas de <code>sampleIds</code> (y los recuentos de variantes). &nbsp;Esta misma acción también se puede observar en la <em>consulta de agrupación por tipo de mutación</em> asociada.</p><p>https://www.youtube.com/watch?v=sT179SCknGM</p><p>Con Databricks Delta, los nuevos datos son transaccionalmente consistentes en cada paso de nuestro pipeline de genómica. &nbsp;Esto es importante porque garantiza que su canalización sea consistente (mantiene la consistencia de sus datos, es decir, asegura que todos los datos sean “correctos”), confiable (la transacción se completa con éxito o falla por completo) y pueda gestionar actualizaciones en tiempo real (la capacidad de gestionar muchas transacciones simultáneamente, y que ninguna interrupción o falla afecte a los datos). &nbsp;&nbsp;Así, incluso los datos en nuestro mapa de sustitución de aminoácidos descendente (que tuvo una serie de pasos de ETL adicionales) se actualizan sin problemas.</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>Como último paso de nuestro pipeline genómico, también estamos monitoreando las distintas mutaciones revisando los archivos parquet de Databricks Delta dentro de DBFS (es decir, el aumento de mutaciones distintas a lo largo del tiempo).</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>Resumen</h2><p>Usando como base la plataforma de análisis unificado de Databricks, con especial atención en Databricks Delta, los bioinformáticos e investigadores pueden aplicar análisis distribuidos con consistencia transaccional mediante la <a href="https://www.databricks.com/product/genomics">plataforma de análisis unificado de Databricks para genómica</a>. Estas abstracciones permiten a los profesionales de datos simplificar las canalizaciones de genómica. &nbsp;Aquí hemos creado una canalización de control de calidad de muestras genómicas que procesa datos de forma continua a medida que se procesan nuevas muestras, sin intervención manual. &nbsp;Ya sea que esté realizando ETL o análisis sofisticados, sus datos fluirán a través de su canalización de genómica rápidamente y sin interrupciones. Pruébelo hoy mismo descargando el notebook <a href="https://pages.databricks.com/rs/094-YMS-629/images/Simplifying%20Genomics%20Pipelines%20at%20Scale%20with%20Databricks.html">Simplificación de canalizaciones de genómica a escala con Databricks Delta</a>.</p><p>Empiece a analizar la genómica a escala:</p><ul><li>Lea nuestra <a href="https://www.databricks.com/product/genomics">guía de soluciones</a>de Unified Analytics for Genomics</li><li>Descarga el <a href="https://pages.databricks.com/rs/094-YMS-629/images/Simplifying%20Genomics%20Pipelines%20at%20Scale%20with%20Databricks.html">notebook para simplificar los pipelines genómicos a escala con Databricks Delta</a></li><li>Regístrese para obtener una <a href="https://pages.databricks.com/genomics-preview.html">prueba gratuita </a>de Databricks Unified Analytics for Genomics</li></ul><p>&nbsp;</p><h2>Agradecimientos</h2><p>Gracias a Yongsheng Huang y a Michael Ortega por sus contribuciones.<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>¿Te interesa Delta Lake de código abierto?</strong><br><a href="https://delta.io?utm_source=delta-blog" rel="noopener noreferrer" target="_blank">Visita el centro en línea de Delta Lake</a> para obtener más información, descargar el código más reciente y unirte a la comunidad de Delta Lake.</div><p>&nbsp;</p>

No te pierdas ninguna publicación de Databricks.

Suscríbete a nuestro blog y recibe las últimas publicaciones en tu bandeja de entrada.

¿Qué sigue?

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