El Portal de las Tecnologías para la Innovación

Acelere Apache Spark ML en GPU NVIDIA con Cambio de Código Cero

Acelera lo existente Apache Spark SQL y DataFrame aplicaciones basadas en GPU NVIDIA por más de 9 veces sin requerir un cambio en sus consultas o código fuente.

El Acelerador NVIDIA RAPIDS para Apache Spark el plug-in de software fue pionero en una experiencia de usuario de cambio de código cero (UX) para el procesamiento de datos acelerado por GPU. Acelera lo existente Apache Spark SQL y DataFrameaplicaciones basadas en GPU NVIDIA por más de 9 veces sin requerir un cambio en sus consultas o código fuente.    

Esto llevó a lo nuevo Spark RAPIDS ML Biblioteca de Python, que puede acelerar las aplicaciones en más de 100x, y también invocado MLlib, biblioteca de aprendizaje automático escalable de Apache Sparkwards.

Hasta hace poco, la aceleración de Spark RAPIDS MLias MLlib aún necesitaba un pequeño cambio para que Python usara la implementación acelerada.Específicamente, necesitabas reemplazar pyspark.ml con spark_rapids_ml en las declaraciones de importación de Python para las clases de ML que deseabas acelerar.Por ejemplo, para usar KMeans acelerados en lugar de los KMeans de referencia, tenía que reemplazar la importación pyspark.ml.classication.KMeans con importación spark_rapids_ml.classication.KMeans a lo largo de su código.En el lado positivo, no se necesitaron más cambios de código para usar la versión acelerada de KMeans.  

En esta publicación de blog, describimos la nueva funcionalidad en Spark RAPIDS ML desde el 25.02 liberación eso le permite omitir incluso los cambios en la instrucción de importación mencionados anteriormente, para una experiencia de aceleración de cambio de código verdaderamente cero de extremo a extremo tanto en Spark SQL como en DataFrame y en código MLlib.

Considere el siguiente código de aplicación simple de PySpark:

frompyspark.ml.clustering importKMeansfrompyspark.ml.functions importarray_to_vectordf =spark.read.parquet("/data/embedding_vectors")df =df.select(array_to_vector(df.features).alias("features"))kmeans_estim =( KMeans()   .setK(100)   .setFeaturesCol("features")   .setMaxIter(30) )kmeans_model =kmeans_estim.fit(df)transformed =kmeans_model.transform(df)transformed.write.parquet("/data/embedding_vectors_clusters")

Este código lee un archivo de incrustaciones vectoriales, previamente calculado utilizando un modelo de lenguaje de aprendizaje profundo y almacenado en formato de parquet utilizando array tipo.Luego utiliza el algoritmo KMeans en Spark MLlib para agrupar los vectores.   

Combinando la nueva funcionalidad de cambio de código cero de Spark RAPIDS ML con el complemento de software RAPIDS Accelerator for Apache Spark, puede acelerar este código PySpark totalmente compatible sin ningún cambio: Incluyendo descompresión y decodificación de parquet al leer en el archivo en read.parquet(), los KMeans agrupando cálculos numéricos en fit() y transform()y la codificación y compresión al guardar los vectores con clusters en otro archivo de parquet en write.parquet()

A continuación, describimos cómo puede activar la ejecución acelerada utilizando nuevas variantes de las formas familiares de iniciar aplicaciones Spark: Interfaces de línea de comandos (CLI), portátiles Jupyter localmente y portátiles Jupyter en servicios Spark alojados en proveedores en la nube.

Interfaces de línea de comandos

Supongamos que el código de aplicación de ejemplo anterior estaba en un archivo llamado app.py.Convencionalmente, youidd utiliza el conocido Spark CLI spark-submit para lanzar app.py en diferentes tipos de clústeres (local/test, autónomo, hilo, kubernetes, etc.):

spark-submit <options> app.py

Para acelerar las piezas de MLlib, después de instalar la biblioteca Spark RAPIDS ML a través de la instalación de pip spark-rapids-ml, simplemente puede reemplazar la spark-submit comando con una contraparte CLI acelerada recién incluida (mientras se incluyen las configuraciones y la configuración de ruta de clase, como antes, para la aceleración SQL y DataFrame):

spark-rapids-submit <options> app.py

Si prefiere ejecutar código similar a app.py interactivamente en un shell PySpark usando el CLI pyspark, también puede acelerar esto, con cero cambios de código, utilizando la CLI de contraparte recién incluida pyspark-rapids para lanzar un shell PySpark acelerado en su lugar.

Cuadernos Jupyter: clústeres de Spark en las instalaciones

Las aplicaciones de Spark también se ejecutan comúnmente de forma interactiva en portátiles Jupyter que ejecutan núcleos unidos a clústeres de Spark.

Como se explica en el Spark RAPIDS ML documentación, para comenzar en una estación de trabajo con una GPU NVIDIA, puede iniciar Jupyter con Spark acelerado en modo local utilizando el pyspark-rapids comando:

PYSPARK_DRIVER_PYTHON=jupyter \PYSPARK_DRIVER_PYTHON_OPTS='notebook --ip=0.0.0.0'\pyspark-rapids --master local[*] <options>

Y luego conéctese al servidor de portátiles Jupyter en la URL registrada.Luego podría ejecutar código similar a app.py interactivamente en una o más celdas de cuaderno.

Puede agregar el frasco del complemento RAPIDS Accelerated Spark y spark.plugins configuración para aceleración de extremo a extremo.

Con configuraciones adecuadas para --master, puede usar el mismo comando para habilitar la aceleración de notebook de cambio de código cero en otras implementaciones de clúster de Spark (como independiente, hilo). 

Cuadernos Jupyter: Proveedor en la nube alojado Spark

Para el cambio de código cero UX en los portátiles Spark Jupyter alojados en la nube, el Spark RAPIDS ML repos muestra cómo configurar scripts de inicialización y arranque de ejemplo al iniciar clústeres de GPU Spark, para habilitar la aceleración de SQL/Dataframe y la aceleración de MLlib.Se proporcionan ejemplos para Databricks, GCP Dataproc y AWS EMR.

Los scripts init inyectan modificaciones simples en los respectivos entornos Spark alojados que dan como resultado que los portátiles Jupyter se inicien con la aceleración de cambio de código cero habilitada.

Cómo funciona

La aceleración de cambio de código cero de Spark MLlib habilitada por los CLI anteriores y las implementaciones de portátiles Jupyter se alimenta bajo el capó importando o ejecutando el nuevo spark_rapids_ml.install módulo en la biblioteca Spark RAPIDS ML Python.  

Este nuevo módulo se basa en gran medida en una funcionalidad similar en el RÁPIDOS cudf.pandas El paquete Python se lanzó en el GTC del año pasado, que trajo un UX acelerado por GPU de cambio de código cero a los usuarios de la popular biblioteca Pandas Data Analysis.

Importar o ejecutar el nuevo spark_rapids_ml.install el módulo anula los mecanismos de importación del módulo Pythonhats para redirigir transparentemente las importaciones de pyspark.ml estimadores en código de aplicación a acelerado spark_rapids_ml contrapartes, cuando estén disponibles.Un aspecto difícil es evitar hacer esto cuando las importaciones son de PySpark o Spark RAPIDS ML código en sí, como en estos casos es crucial para importar el real pyspark.ml estimadores.

Próximos pasos

Puede probar la nueva funcionalidad acelerada Spark MLlib de cambio de código cero, aumentando el acelerador RAPIDS original para Apache Spark, instalando el paquete spark-rapids-ml Python y documentación de referencia en el Spark RAPIDS ML Repo gitHub para cambio de código cero CLI y cuadernos y ejecutando un cambio de código cero script de prueba, también en el repositorio.

Recursos relacionados

NVIDIA Blog. E. O. Traducido al español

Artículos relacionados

Scroll al inicio