{"id":13468,"date":"2020-05-25T13:31:10","date_gmt":"2020-05-25T11:31:10","guid":{"rendered":"https:\/\/www.hiberus.com\/crecemos-contigo\/?p=13468"},"modified":"2023-12-14T23:02:42","modified_gmt":"2023-12-14T22:02:42","slug":"mas-alla-de-pandas-y-apache-spark-para-la-manipulacion-de-datos-apache-arrow-y-gpu","status":"publish","type":"post","link":"https:\/\/www.hiberus.com\/crecemos-contigo\/mas-alla-de-pandas-y-apache-spark-para-la-manipulacion-de-datos-apache-arrow-y-gpu\/","title":{"rendered":"M\u00e1s all\u00e1 de Pandas y Apache Spark para la manipulaci\u00f3n de datos: Apache Arrow y GPU"},"content":{"rendered":"<p>Cuando nos enfrentamos a problemas de escalabilidad usualmente se piensa en cl\u00fasteres que permiten alcanzar distribuciones horizontales de carga y garant\u00edas de disponibilidad. Por ello, si venimos de usar <strong>Pandas<\/strong> y pasamos a<strong> Apache Spark<\/strong>, creemos que todos nuestros problemas han sido resueltos. Sin embargo, si definimos a la escalabilidad como la habilidad de un sistema para soportar carga creciente (Kleppmann, 2017, p\u00e1gs. 10, 11), podemos ver que existen diversas maneras alcanzar esta propiedad sin recurrir a entornos necesariamente distribuidos.<\/p>\n<p>Por esta raz\u00f3n, conviene pensar en las caracter\u00edsticas espec\u00edficas del problema al que nos enfrentamos, los <strong>cuellos de botella<\/strong> que lo afligen, y su estructura de programa.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13850\" style=\"width: 674px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13850\" class=\"size-full wp-image-13850\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/the-new-gpu.png\" alt=\"\" width=\"664\" height=\"351\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/the-new-gpu.png 664w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/the-new-gpu-300x159.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/the-new-gpu-360x190.png 360w\" sizes=\"auto, (max-width: 664px) 100vw, 664px\" \/><p id=\"caption-attachment-13850\" class=\"wp-caption-text\">Ilustraci\u00f3n 1: USANDO C\u00d3MPUTOS ACELERADOS POR EL GPU EN TODO EL FLUJO DE TRABAJO CON FORMATOS DE DATOS INTERPOPERADOS POR ARROW (FUENTE: HTTPS:\/\/GITHUB.COM\/RAPIDSAI\/CUDF)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Tomemos como ejemplo a Pandas. Wes McKinney, el autor de Pandas y coautor de <strong>Apache Arrow,<\/strong> afirm\u00f3 en un art\u00edculo publicado el 21 de septiembre de 2017 que los principales problemas de <strong>Pandas<\/strong> para la \u00e9poca eran el <strong>rendimiento pobre durante la ingesta y exportaci\u00f3n de datos<\/strong> provenientes de bases de datos y archivos, el <strong>soporte lento y limitado de algoritmos multin\u00facleo o paralelos, <\/strong>la falta de conjuntos de datos basados en mapas de memoria, entre otros.<\/p>\n<p>Este art\u00edculo, adem\u00e1s, resulta interesante en t\u00e9rminos hist\u00f3ricos pues describe brevemente cu\u00e1n dif\u00edcil resultaba analizar datos con Python antes de que \u00e9l empezara a trabajar con Pandas.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13851\" style=\"width: 359px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13851\" class=\"size-full wp-image-13851\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/wes-mckinney.jpg\" alt=\"\" width=\"349\" height=\"353\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/wes-mckinney.jpg 349w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/wes-mckinney-297x300.jpg 297w\" sizes=\"auto, (max-width: 349px) 100vw, 349px\" \/><p id=\"caption-attachment-13851\" class=\"wp-caption-text\">Ilustraci\u00f3n 2: Wes McKinney, el creador de Pandas y de Arrow (fuente: https:\/\/wesmckinney.com\/)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>A\u00f1os despu\u00e9s de haber creado a Pandas, luego de haber interactuado con proyectos como <strong>Apache Kudu, Apache Spark, Apache Impala<\/strong> y otros, todos com\u00fanmente usados por ingenieros de datos, McKinney reconoci\u00f3 que estas herramientas eran afligidas por problemas similares y que se necesitaba un lugar com\u00fan para empezar a resolverlos.<\/p>\n<p>Por ello, en 2015 \u00e9l decidi\u00f3 empezar a dise\u00f1ar y especificar lo que luego se convertir\u00eda en <a href=\"https:\/\/arrow.apache.org\/blog\/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Apache Arrow<\/strong><\/a>: un est\u00e1ndar que permite <strong>unificar herramientas com\u00fanmente asociadas con dataframes<\/strong> y resolver sus problemas sin duplicar esfuerzos. (McKinney, 2020)<\/p>\n<h2>\u00bfQu\u00e9 es <strong>Apache Arrow<\/strong>?<\/h2>\n<p>Ahora bien, \u00bfqu\u00e9 es <strong>Apache Arrow<\/strong>? \u00c9sta es una plataforma pensada para aplicaciones anal\u00edticas de Big Data que necesitan procesar y mover datos entre s\u00ed r\u00e1pidamente. Para lograr esto, el est\u00e1ndar de Arrow define un <strong>formato de datos orientado a columnas<\/strong> que se caracteriza por la <strong>adyacencia de datos secuenciales<\/strong>, el <strong>acceso aleatorio en tiempo constante<\/strong>, el patr\u00f3n de programa <strong><em>Single Instruction Multiple Data<\/em><\/strong> y la <strong>relocalizaci\u00f3n de datos con punteros sin uso de copias<\/strong>. Todo esto al final se traduce en tiempos m\u00e1s r\u00e1pidos de ingesta, manipulaci\u00f3n, transformaci\u00f3n y exportaci\u00f3n de datos. (Apache Arrow Documentation, 2020)<\/p>\n<p>Sin embargo, tal vez la mayor ventaja de Apache Arrow no sea su capacidad de mejorar el rendimiento de herramientas ya existentes, sino su capacidad pr\u00e1ctica de <strong>unificar el ecosistema de ciencias de datos<\/strong>. Esto se debe a la gran popularidad de diversas implementaciones del modelo de datos basado en tablas o dataframes. \u00c9sta es una estructura de datos muy com\u00fan y se pueden encontrar implementaciones en m\u00faltiples languajes como Python, Scala y R, as\u00ed como en m\u00faltiples herramientas como <strong>Apache Spark, Pandas<\/strong> y <strong>Dask<\/strong>.<\/p>\n<p>En general, si bien los dataframes representan el mismo tipo de datos, sus implementaciones pueden variar sobremanera. Es por esto que la conversi\u00f3n de datos entre un formato y el otro requiere la creaci\u00f3n de una herramienta espec\u00edfica y las m\u00e1s de las veces esto implica un proceso de <strong>copia y conversi\u00f3n<\/strong> (Ilustraci\u00f3n 3) que en total se caracteriza por una complejidad lineal sobre los datos.<\/p>\n<p>Sin embargo, si todos estas implementaciones siguieran el mismo formato a bajo nivel, ser\u00eda posible simplemente <strong>mover apuntadores<\/strong> para poder pasar entre un formato y otro (Ilustraci\u00f3n 4). En efecto, esto es lo que hace precisamente Apache Arrow. (Sitio Web de Apache Arrow, 2020)<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13853\" style=\"width: 661px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13853\" class=\"size-full wp-image-13853\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Arrow.png\" alt=\"\" width=\"651\" height=\"351\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Arrow.png 651w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Arrow-300x162.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Arrow-360x194.png 360w\" sizes=\"auto, (max-width: 651px) 100vw, 651px\" \/><p id=\"caption-attachment-13853\" class=\"wp-caption-text\">Ilustraci\u00f3n 3: antes de Arrow, un m\u00e9todo que copia y convierte ha de hacerse por cada par de formatos basados en columnas (fuente: https:\/\/arrow.apache.org\/)<\/p><\/div>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13854\" style=\"width: 718px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13854\" class=\"size-full wp-image-13854\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Con-Arrow.png\" alt=\"\" width=\"708\" height=\"354\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Con-Arrow.png 708w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Con-Arrow-300x150.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Con-Arrow-360x180.png 360w\" sizes=\"auto, (max-width: 708px) 100vw, 708px\" \/><p id=\"caption-attachment-13854\" class=\"wp-caption-text\">Ilustraci\u00f3n 4: con Arrow, cada formato basado en columnas s\u00f3lo ha de seguir el est\u00e1ndar de Arrow (fuente: https:\/\/arrow.apache.org\/)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Si bien Apache Arrow ayuda sobremanera a mitigar el problema del bajo rendimiento durante la ingesta y exportaci\u00f3n de datos, as\u00ed como a mejorar la <strong>interoperabilidad<\/strong> entre distintos proyectos, a\u00fan se puede mejorar mucho desde el punto de vista de la concurrencia y paralelizaci\u00f3n de operaciones. Por esta raz\u00f3n, nace el proyecto <strong>cuDF<\/strong>, de RAPIDS (Ilustraci\u00f3n 5).<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13855\" style=\"width: 527px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13855\" class=\"size-full wp-image-13855\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Ecosistema-Rapid.png\" alt=\"\" width=\"517\" height=\"349\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Ecosistema-Rapid.png 517w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Ecosistema-Rapid-300x203.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Ecosistema-Rapid-360x243.png 360w\" sizes=\"auto, (max-width: 517px) 100vw, 517px\" \/><p id=\"caption-attachment-13855\" class=\"wp-caption-text\">Ilustraci\u00f3n 5: relaci\u00f3n entre los componentes del ecosistema de RAPIDS (fuente: https:\/\/github.com\/BlazingDB\/blazingsql)<\/p><\/div>\n<p>&nbsp;<\/p>\n<h2>Qu\u00e9 es\u00a0RAPIDS<\/h2>\n<p>En efecto, <a href=\"https:\/\/blog.blazingdb.com\/blazingsql-rapids-ai-now-free-on-google-colab-b8646f1ea948\" target=\"_blank\" rel=\"noopener noreferrer\">RAPIDS<\/a> es una organizaci\u00f3n que ofrece un conjunto de herramientas de c\u00f3digo abierto que permiten ejecutar proyectos de ciencias de datos y anal\u00edtica usando <strong>GPU<\/strong> de principio a fin teniendo como base a <strong>CUDA<\/strong> y tambi\u00e9n da soporte a despliegues distribuidos con m\u00faltiples GPU. (RAPIDS, 2020)<\/p>\n<p>Por su parte, <strong>cuDF<\/strong> es la principal implementaci\u00f3n de un dataframe <strong>basado en Apache Arrow<\/strong> y adaptado completamente para ejecutar operaciones de carga, uni\u00f3n, agregaci\u00f3n, filtrado y manipulaci\u00f3n de datos usando siempre GPU. Como es un dataframe, la principal ventaja que ofrece cuDF es un <strong>API bien conocido por los usuarios<\/strong> de herramientas como Apache Spark y Pandas mientras ofrece <strong>operaciones aceleradas por GPU<\/strong>. Es decir, es la <strong>combinaci\u00f3n perfecta entre Pandas y CUDA<\/strong>, sin las limitaciones del primero y sin los detalles de bajo nivel del segundo. (RAPIDS, cuDF GitHub Repository, 2020)<\/p>\n<p>Si bien Apache Arrow les permite a los dataframes basados en memoria principal el poder interoperar, tambi\u00e9n les permite lo mismo a los dataframes basados en memoria del GPU. Sin embargo, aqu\u00ed surge un <strong>cuello de botella<\/strong>: el <strong>ancho de banda del bus de memoria del GPU<\/strong> (Barlas, 2015, p\u00e1gs. 391, 392). Esto implica que la transmisi\u00f3n de datos entre memoria principal y el GPU ha de limitarse necesariamente a la entrada de datos y el retorno de los resultados, todo mientras se dejan los datos la mayor parte del tiempo en el GPU conforme son manipulados.<\/p>\n<p>Aunque la principal intenci\u00f3n del proyecto <strong>cuDF<\/strong> es la introducci\u00f3n de un dataframe con API bien conocido y parecido al encontrado en Pandas, el uso del GPU tras bambalinas exige un nuevo tipo de disciplina. Sin embargo, para poder entender esto, es menester comprender a <strong>CUDA<\/strong>.<\/p>\n<h2>Qu\u00e9 es\u00a0CUDA<\/h2>\n<p><strong>CUDA<\/strong>, o <em>Compute Unified Device Architecture<\/em>, es una arquitectura introducida por Nvidia en 2006 y es la <strong>piedra fundacional<\/strong> de muchos API y bibliotecas de nivel m\u00e1s alto que explotan el poder de c\u00f3mputo de los GPU. El modelo de programaci\u00f3n seguido por CUDA sigue el patr\u00f3n GSLP (globally sequential, locally parallel). Para poder implementar este patr\u00f3n, CUDA despliega todos los hilos que puede como un grupo y aplica una misma funci\u00f3n a todos ellos mientras var\u00eda los argumentos de \u00e9sta dependiendo del hilo. Esta funci\u00f3n es mejor conocida como el <strong>kernel<\/strong>. (Barlas, 2015, p\u00e1gs. 393, 394)<\/p>\n<p>Si usaramos <strong>CUDA<\/strong> directamente, el <strong>kernel<\/strong> se ver\u00eda como en la Ilustraci\u00f3n 6:<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13856\" style=\"width: 608px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13856\" class=\"size-full wp-image-13856\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Kernel-1.png\" alt=\"\" width=\"598\" height=\"151\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Kernel-1.png 598w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Kernel-1-300x76.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Kernel-1-360x91.png 360w\" sizes=\"auto, (max-width: 598px) 100vw, 598px\" \/><p id=\"caption-attachment-13856\" class=\"wp-caption-text\">Ilustraci\u00f3n 6: Ejemplo de kernel en CUDA (Barlas, 2015, p\u00e1g. 411)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Es decir, el <strong>kernel<\/strong> es una funci\u00f3n complicada, pues se aplica a todos los hilos y es responsabilidad de esta determinar, de ser necesario, en cu\u00e1l hilo est\u00e1 y con qu\u00e9 subconjunto de los datos est\u00e1 operando. En este ejemplo, el identificador del hilo es usado para obtener los datos apropiados de la <strong>memoria del GPU<\/strong>.<\/p>\n<p>Por suerte, para nosotros todos estos <strong>detalles permanecen ocultos<\/strong> si usamos <strong>cuDF<\/strong>:<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13857\" style=\"width: 842px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13857\" class=\"size-full wp-image-13857\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/API-de-cuDF.png\" alt=\"\" width=\"832\" height=\"332\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/API-de-cuDF.png 832w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/API-de-cuDF-300x120.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/API-de-cuDF-768x306.png 768w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/API-de-cuDF-360x144.png 360w\" sizes=\"auto, (max-width: 832px) 100vw, 832px\" \/><p id=\"caption-attachment-13857\" class=\"wp-caption-text\">Ilustraci\u00f3n 7: ejemplo del API de cuDF (fuente: https:\/\/github.com\/rapidsai\/cudf)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>En la Ilustraci\u00f3n 7 se puede ver c\u00f3mo <strong>unas pocas l\u00edneas de c\u00f3digo<\/strong> con <strong>cuDF<\/strong> son <strong>equivalentes<\/strong> a la ingesta de datos, transmisi\u00f3n de datos entre memoria principal y GPU, el uso de varios kernels y el retorno de resultados a memoria principal en <strong>CUDA<\/strong>.<\/p>\n<p>Sin embargo, no todo es color de rosas. Existen casos en los que resulta imprescindible bajar de nivel en <strong>cuDF<\/strong> y usar el concepto de <strong>kernel<\/strong>. Esto ocurre especialmente cuando el usuario ha de implementar funciones personalizadas, mejor conocidas como <strong>UDF<\/strong> o <strong>user defined functions<\/strong>. Un ejemplo de ello se puede apreciar en la Ilustraci\u00f3n 8:<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13858\" style=\"width: 441px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13858\" class=\"size-full wp-image-13858\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Kernel-en-cuDF.png\" alt=\"\" width=\"431\" height=\"168\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Kernel-en-cuDF.png 431w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Kernel-en-cuDF-300x117.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/Kernel-en-cuDF-360x140.png 360w\" sizes=\"auto, (max-width: 431px) 100vw, 431px\" \/><p id=\"caption-attachment-13858\" class=\"wp-caption-text\">Ilustraci\u00f3n 8: ejemplo de kernel en cuDF con UDF (fuente: https:\/\/docs.rapids.ai\/api\/cudf\/stable\/guide-to-udfs.html#DataFrame-UDFs)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Hemos visto que con <strong>cuDF<\/strong> se pueden aprovechar las <strong>ventajas<\/strong> de los <strong>GPU<\/strong>, pero resulta importante determinar <strong>cu\u00e1ndo es apropiado usar estas herramientas<\/strong>. Mientras los n\u00facleos de un CPU son poderosos y son adecuados para procesar tareas complicadas e intensivas en c\u00f3mputo, <strong>los n\u00facleos de un GPU son perfectos para procesar numerosas tareas simples<\/strong>. Esto se refleja en el bajo n\u00famero de n\u00facleos que tiene un CPU en contraste con el gran n\u00famero de los que dispone un GPU. (OMNISCI, 2020)<\/p>\n<p>Ahora bien, hemos visto todas las ventajas de Apache Arrow y los dataframes acelerados por GPU, pero tambi\u00e9n surge la inquietud de cu\u00e1nto del proceso ETL se puede mejorar gracias a estas herramientas. La respuesta es: todo. Un ejemplo de ello es el surgimiento de <strong>motores de SQL acelerados por GPU<\/strong>, como <strong>BlazingSQL<\/strong>. \u00c9sta herramienta fue construida sobre el <strong>cuDF<\/strong> y es <strong>interoperable<\/strong> con diversos formatos de dataframe gracias a su uso de <strong>Apache Arrow<\/strong>. (BlazingSQL Documentation, 2020)<\/p>\n<p>Un ejemplo de cu\u00e1n f\u00e1cil resulta usar <strong>BlazingSQL<\/strong> con <strong>cuDF<\/strong> lo podemos ver en la Ilustraci\u00f3n 9, donde se crea un contexto de trabajo. Esto resulta similar a c\u00f3mo se trabaja con Apache Spark.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13859\" style=\"width: 467px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13859\" class=\"size-full wp-image-13859\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/9-1.png\" alt=\"\" width=\"457\" height=\"66\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/9-1.png 457w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/9-1-300x43.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/9-1-360x52.png 360w\" sizes=\"auto, (max-width: 457px) 100vw, 457px\" \/><p id=\"caption-attachment-13859\" class=\"wp-caption-text\">Ilustraci\u00f3n 9: creaci\u00f3n de un contexto con BlazingSQL (BlazingSQL, 2020)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Luego de eso, se puede usar <strong>cuDF<\/strong> para cargar datos y crear una tabla en <strong>BlazingSQL<\/strong> (Ilustraci\u00f3n 10). Otra vez, esto resulta similar a <strong>Apache Spark<\/strong> cuando se desea crear una tabla con <strong>Hive<\/strong>.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13860\" style=\"width: 565px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13860\" class=\"size-full wp-image-13860\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/10-1.png\" alt=\"\" width=\"555\" height=\"184\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/10-1.png 555w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/10-1-300x99.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/10-1-360x119.png 360w\" sizes=\"auto, (max-width: 555px) 100vw, 555px\" \/><p id=\"caption-attachment-13860\" class=\"wp-caption-text\">Ilustraci\u00f3n 10: creaci\u00f3n de una tabla en BlazingSQL (BlazingSQL, 2020)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Finalmente, se pueden ejecutar consultas con SQL:<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13861\" style=\"width: 630px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13861\" class=\"size-large wp-image-13861\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/11-1-1024x301.png\" alt=\"\" width=\"620\" height=\"182\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/11-1-1024x301.png 1024w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/11-1-300x88.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/11-1-768x226.png 768w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/11-1-1140x336.png 1140w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/11-1-360x106.png 360w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/11-1.png 1144w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><p id=\"caption-attachment-13861\" class=\"wp-caption-text\">Ilustraci\u00f3n 11: consulta de SQL con BlazingSQL (BlazingSQL, 2020)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>BlazingSQL no est\u00e1 solo, pues existen otras bases de datos cuyo prop\u00f3sito es acelerar operaciones b\u00e1sicas usando GPU. Un ejemplo de ello es <strong>OmniSciDB<\/strong>, un motor de SQL que ofrece operaciones de anal\u00edtica aceleradas por GPU. Su arquitectura est\u00e1 basada en la conjunci\u00f3n de tres capas que se concentran en el uso de recursos del GPU, CPU y SSD (Ilustraci\u00f3n 12).<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13862\" style=\"width: 329px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13862\" class=\"size-full wp-image-13862\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/12-1.png\" alt=\"\" width=\"319\" height=\"320\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/12-1.png 319w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/12-1-300x300.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/12-1-150x150.png 150w\" sizes=\"auto, (max-width: 319px) 100vw, 319px\" \/><p id=\"caption-attachment-13862\" class=\"wp-caption-text\">Ilustraci\u00f3n 12: capas de memoria y c\u00f3mputo de OMNISCI (fuente: https:\/\/www.omnisci.com\/platform\/omniscidb)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Una caracter\u00edstica importante de este motor es su modelo h\u00edbrido de c\u00f3mputo, pues en todo momento trata de ejecutar al mismo tiempo operaciones distintas tanto en CPU como en GPU. Adicionalmente, tambi\u00e9n se permite la escalabilidad horizonal de alta disponibilidad, pues ofrece un modelo de memoria de tipo shared-nothing entre distintos GPU: cada vez que m\u00e1s de un nodo es usado, cada uno s\u00f3lo tiene acceso a un subconjunto de los datos. Los datos al final del c\u00f3mputo son recogidos por el CPU. Finalmente, promote tener a futuro una excelente interoperabilidad con herramientas como <strong>TensorFlow<\/strong> y <strong>PyTorch<\/strong> debido al soporte de <strong>Apache Arrow<\/strong>. (OMNISCI, 2020)<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13863\" style=\"width: 739px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13863\" class=\"size-full wp-image-13863\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/13-1.png\" alt=\"\" width=\"729\" height=\"354\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/13-1.png 729w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/13-1-300x146.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/13-1-360x175.png 360w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><p id=\"caption-attachment-13863\" class=\"wp-caption-text\">Ilustraci\u00f3n 13: ejemplo de reporte acelerado por GPU de OMNISCI (fuente: https:\/\/www.omnisci.com\/demos\/ships)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Un ejemplo de cu\u00e1n poderosa puede ser la aceleraci\u00f3n por <strong>GPU<\/strong> en los <strong>problemas de anal\u00edtica<\/strong> es el <em>benchmark<\/em> hecho por el consultor Mark Litwintschik en el a\u00f1o 2017 en el que determina el tiempo que le toma a <strong>BrytlytDB <\/strong>ejecutar consultas comunes, siendo esta una base de datos similar a <strong>OmniSciDB<\/strong>, pero privada. Para su experimento descarg\u00f3 50 GB de datos sobre carreras de taxi y los carg\u00f3 sobre esta base de datos. Como resultado obtuvo <strong>tiempos de ejecuci\u00f3n<\/strong> que <strong>no tomaban m\u00e1s de un segundo<\/strong> para diversas tareas de agrupaci\u00f3n. (Litwintschik, 2020)<\/p>\n<p>En respuesta al reporte de Litwintschik, Richard Heyns de Brytlyt, decidi\u00f3 comparar esta base de datos con <strong>Apache Spark<\/strong>. A pesar del <strong>costo superior de usar GPU<\/strong>, el tiempo de c\u00f3mputo fue tan corto que <strong>result\u00f3 ser mucho m\u00e1s barato<\/strong> <strong>que mantener un cl\u00faster de Apache Spark<\/strong>:<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_13864\" style=\"width: 630px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-13864\" class=\"size-large wp-image-13864\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/14-1-1024x172.png\" alt=\"\" width=\"620\" height=\"104\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/14-1-1024x172.png 1024w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/14-1-300x50.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/14-1-768x129.png 768w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/14-1-360x61.png 360w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2020\/04\/14-1.png 1302w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><p id=\"caption-attachment-13864\" class=\"wp-caption-text\">Ilustraci\u00f3n 14: comparaci\u00f3n entre Apache Spark y BrytlytDB (fuente: https:\/\/www.brytlyt.com\/blog\/apache-spark-and-brytlyt\/)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>En definitiva, <strong>m\u00e1s all\u00e1 de Pandas<\/strong> existen herramientas que permiten afrontar los cuellos de botella que t\u00edpicamente encontramos durante las tareas de an\u00e1lisis y procesamiento de datos. Desde problemas de serializaci\u00f3n y cambio de formato, hasta el uso de algoritmos paralelos, todo se ha venido resolviendo con el surgir de nuevos proyectos y cambios de paradigma. Si bien esto exige un dominio mucho m\u00e1s amplio de las herramientas que ofrece el \u00e1rea del c\u00f3mputo<strong> de alto desempe\u00f1o<\/strong>, todo esto se hace necesario a medida que se va redefiniendo qu\u00e9 significa ser un ingeniero de datos.<\/p>\n<p>Si desean m\u00e1s informaci\u00f3n sobre estas herramientas recomiendo ver estos v\u00eddeos:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=uZA55cGDaBQ\"><em>Wes McKinney &#8211; Apache Arrow: Leveling Up the Data Science Stack<\/em><\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=UteAyQStPyQ\"><em>Supercharging Analytics with GPUs: OmniSci\/cuDF vs Postgres\/Pandas\/PDAL &#8211; Masood Krohy<\/em><\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=dXPvlocXo34\"><em>Accelerating Tensorflow with Apache Arrow on Spark (Holden Karau)<\/em><\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=gQszQcFHcZc\"><em>End to End Data Science Without Leaving The GPU &#8211; Randy Zwitch<\/em><\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Si quieres conocer m\u00e1s de cerca nuestro \u00e1rea de <a href=\"https:\/\/www.hiberus.com\/data-ia\/data-insights\" target=\"_blank\" rel=\"noopener noreferrer\">Data &amp;\u00a0 Analytics de Hiberus<\/a>, no dudes en contactar con nosotros. \u00a1Estaremos encantados de ayudarte!<\/p>\n        <div class=\"row\">\n            <div class=\"block-cta-form\" style=\"background-color: #003664;\">\n                <div class=\"content-cta-form\">\n                    <div class=\"text-cta-form\">\n                        <p class=\"title-cta-form\">\u00bfQuieres m\u00e1s informaci\u00f3n sobre nuestros servicios de Data &amp; Analytics?<\/p>\n                        <p>Contacta con nuestro equipo de expertos en Data &amp; Analytics<\/p>\n                    <\/div>\n                    <div class=\"form-fields\">\n                        \n<div class=\"wpcf7 no-js\" id=\"wpcf7-f33973-o1\" lang=\"es-ES\" dir=\"ltr\" data-wpcf7-id=\"33973\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/13468#wpcf7-f33973-o1\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Formulario de contacto\" novalidate=\"novalidate\" data-status=\"init\">\n<fieldset class=\"hidden-fields-container\"><input type=\"hidden\" name=\"_wpcf7\" value=\"33973\" \/><input type=\"hidden\" name=\"_wpcf7_version\" value=\"6.1.5\" \/><input type=\"hidden\" name=\"_wpcf7_locale\" value=\"es_ES\" \/><input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f33973-o1\" \/><input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/><input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/><input type=\"hidden\" name=\"_wpcf7_recaptcha_response\" value=\"\" \/>\n<\/fieldset>\n<div id=\"responsive-form\" class=\"clearfix\">\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"nombre\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Nombre *\" value=\"\" type=\"text\" name=\"nombre\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"apellido\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Apellido *\" value=\"\" type=\"text\" name=\"apellido\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"correo\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-email wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-email\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Correo corporativo *\" value=\"\" type=\"email\" name=\"correo\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"telf-contacto\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-tel wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-tel\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Tel\u00e9fono *\" value=\"\" type=\"tel\" name=\"telf-contacto\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"compania\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Compa\u00f1ia *\" value=\"\" type=\"text\" name=\"compania\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-full\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"mensaje\"><textarea cols=\"40\" rows=\"10\" maxlength=\"2000\" class=\"wpcf7-form-control wpcf7-textarea wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Mensaje *\" name=\"mensaje\"><\/textarea><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-full color-acceptance\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"politica\"><span class=\"wpcf7-form-control wpcf7-acceptance\"><span class=\"wpcf7-list-item\"><label><input type=\"checkbox\" name=\"politica\" value=\"1\" aria-invalid=\"false\" \/><span class=\"wpcf7-list-item-label\">He le\u00eddo y acepto la <a href=\"https:\/\/www.hiberus.com\/politica\" target=\"_blank\"><u>Pol\u00edtica de privacidad<\/u><\/a><\/span><\/label><\/span><\/span><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-full color-acceptance\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"marketing\"><span class=\"wpcf7-form-control wpcf7-acceptance optional\"><span class=\"wpcf7-list-item\"><label><input type=\"checkbox\" name=\"marketing\" value=\"1\" aria-invalid=\"false\" \/><span class=\"wpcf7-list-item-label\">Me gustar\u00eda recibir comunicaciones de marketing de Hiberus y sobre sus productos, servicios y eventos.<\/span><\/label><\/span><\/span><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><input class=\"wpcf7-form-control wpcf7-submit has-spinner\" type=\"submit\" value=\"Contacta con nosotros\" \/>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div id=\"campos_ocultos\" class=\"hidden\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new1\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new1\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new1\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new2\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new2\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new2\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new3\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new3\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new3\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new4\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new4\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new4\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new_p\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new_p\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new_p\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n\n<!--end responsive-form--><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div>\n<\/form>\n<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n","protected":false},"excerpt":{"rendered":"<p>Cuando nos enfrentamos a problemas de escalabilidad usualmente se piensa en cl\u00fasteres que permiten alcanzar distribuciones horizontales de carga y garant\u00edas de&#8230;<\/p>\n","protected":false},"author":176,"featured_media":13865,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_ayudawp_aiss_exclude":false,"footnotes":""},"categories":[7],"tags":[17,29],"class_list":{"0":"post-13468","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-next-tech","8":"tag-big-data","9":"tag-data-analytics"},"acf":[],"_links":{"self":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/13468","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/users\/176"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/comments?post=13468"}],"version-history":[{"count":3,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/13468\/revisions"}],"predecessor-version":[{"id":39144,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/13468\/revisions\/39144"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/media\/13865"}],"wp:attachment":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/media?parent=13468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/categories?post=13468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/tags?post=13468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}