Una historia de RAPIDS, de ida y vuelta…

A history of RAPIDS, round trip...

Esta publicación del blog explora los desafíos de adquirir suficientes datos y las limitaciones planteadas por conjuntos de datos sesgados utilizando RapidsAI cuDF.

Por Kris Manohar & Kevin Baboolal

Nota del editor: Estamos encantados de anunciar que esta publicación ha sido seleccionada como la ganadora del concurso de escritura de blogs de Zepes y NVIDIA.

Introducción

El aprendizaje automático ha revolucionado varios dominios mediante el aprovechamiento de grandes cantidades de datos. Sin embargo, existen situaciones en las que adquirir suficientes datos se convierte en un desafío debido al costo o la escasez. En tales casos, los enfoques tradicionales a menudo tienen dificultades para proporcionar predicciones precisas. Esta publicación de blog explora las limitaciones que plantean los conjuntos de datos pequeños y revela una solución innovadora propuesta por TTLAB que aprovecha el poder del enfoque del vecino más cercano y un kernel especializado. Nos adentraremos en los detalles de su algoritmo, sus beneficios y cómo la optimización de GPU acelera su ejecución.

El desafío de los datos limitados

En el aprendizaje automático, tener una cantidad sustancial de datos es crucial para entrenar modelos precisos. Sin embargo, cuando nos enfrentamos a un conjunto de datos pequeño que comprende solo unas pocas cientos de filas, las deficiencias se hacen evidentes. Un problema común es el problema de frecuencia cero que se encuentra en algunos algoritmos de clasificación como el clasificador Bayes Ingenuo. Esto ocurre cuando el algoritmo se encuentra con un valor de categoría no visto durante la prueba, lo que lleva a una estimación de probabilidad cero para ese caso. De manera similar, las tareas de regresión enfrentan desafíos cuando el conjunto de prueba contiene valores que estaban ausentes en el conjunto de entrenamiento. Incluso puede encontrar que su elección de algoritmo mejora (aunque no sea óptima) cuando se excluyen estas características faltantes. Estos problemas también se manifiestan en conjuntos de datos más grandes con clases altamente desequilibradas.

Superar la escasez de datos

Aunque las divisiones de entrenamiento y prueba suelen mitigar estos problemas, sigue existiendo un problema oculto al tratar con conjuntos de datos más pequeños. Forzar a un algoritmo a generalizar en función de menos muestras puede llevar a predicciones subóptimas. Incluso si el algoritmo se ejecuta, sus predicciones pueden carecer de solidez y precisión. La solución simple de adquirir más datos no siempre es factible debido a limitaciones de costo o disponibilidad. En tales situaciones, un enfoque innovador propuesto por TTLAB resulta ser robusto y preciso.

El algoritmo TTLAB

El algoritmo de TTLAB aborda los desafíos planteados por conjuntos de datos sesgados y limitados. Su enfoque implica tomar el promedio ponderado de todas las filas en el conjunto de datos de entrenamiento para predecir el valor de una variable objetivo en una muestra de prueba. La clave radica en ajustar los pesos de cada fila de entrenamiento para cada fila de prueba, en función de una función no lineal parametrizada que calcula la distancia entre dos puntos en el espacio de características. Aunque la función de ponderación utilizada tiene un solo parámetro (la tasa de decaimiento de la influencia de una muestra de entrenamiento a medida que aumenta su distancia desde la muestra de prueba), el esfuerzo de cómputo para optimizar este parámetro podría ser grande. Al considerar todo el conjunto de datos de entrenamiento, el algoritmo ofrece predicciones sólidas. Este enfoque ha demostrado un éxito notable en mejorar el rendimiento de modelos populares como los bosques aleatorios y el Bayes Ingenuo. A medida que el algoritmo gana popularidad, se están llevando a cabo esfuerzos para mejorar aún más su eficiencia. La implementación actual implica ajustar el hiperparámetro kappa, lo que requiere una búsqueda en cuadrícula. Para acelerar este proceso, se está explorando una aproximación cuadrática sucesiva, que promete una optimización de parámetros más rápida. Además, se están realizando revisiones por pares en curso para validar y refinar el algoritmo para una adopción más amplia.

Para implementar el algoritmo TTLAB para la clasificación, los bucles y numpy resultaron ineficientes, lo que resultó en tiempos de ejecución muy largos. La implementación de CPU presentada en la publicación vinculada se centra en problemas de clasificación, demostrando la versatilidad y eficacia del enfoque. https://arxiv.org/pdf/2205.14779.pdf. La publicación también muestra que el algoritmo se beneficia enormemente de la vectorización, lo que sugiere más mejoras de velocidad que se pueden obtener con la aceleración de GPU con CuPy. De hecho, para realizar la sintonización de hiperparámetros y los K-fold aleatorios para la validación de resultados, habrían pasado semanas para la multitud de conjuntos de datos que se estaban probando. Al aprovechar el poder de las GPUs, los cálculos se distribuyeron de manera efectiva, lo que resultó en un rendimiento mejorado.

Acelerando la ejecución con GPUs

Incluso con optimizaciones como la vectorización y la refactorización de .apply, el tiempo de ejecución sigue siendo poco práctico para aplicaciones del mundo real. Sin embargo, con la optimización de GPU, el tiempo de ejecución se reduce drásticamente, reduciendo los tiempos de ejecución de horas a minutos. Esta notable aceleración abre posibilidades para usar el algoritmo en escenarios donde los resultados rápidos son esenciales.

Siguiendo las lecciones aprendidas de la implementación de la CPU, intentamos optimizar aún más nuestra implementación. Para esto, subimos de nivel a los marcos de datos de CuDF. La vectorización de cálculos en la GPU es muy fácil con CuDF. Para nosotros, fue tan simple como cambiar la importación de pandas por la importación de CuDF (debe vectorizar correctamente en pandas).

train_df["sum_diffs"] = 0
train_df["sum_diffs"] = train_df[diff_cols].sum(axis=1).values
train_df["d"] = train_df["sum_diffs"] ** 0.5
train_df["frac"] = 1 / (1 + train_df["d"]) ** kappa
train_df["part"] = train_df[target_col] * train_df["frac"]
test_df.loc[index, "pred"] = train_df["part"].sum() / train_df["frac"].sum()

Más adelante en nuestra investigación, necesitamos confiar en los núcleos de Numba. En este punto, las cosas se complican. Recordemos por qué las predicciones del algoritmo son robustas porque cada predicción utiliza todas las filas del marco de datos de entrenamiento. Sin embargo, los núcleos de Numba no admiten el paso de marcos de datos CuDF. En este momento, estamos experimentando con algunos trucos sugeridos en Github para manejar este caso. ( https://github.com/rapidsai/cudf/issues/13375 )

Por ahora, al menos podemos pasar el cálculo crudo a un núcleo de numba a través de .apply_rows

def predict_kernel(F, T, numer, denom, kappa):
    for i, (x, t) in enumerate(zip(F, T)):
        d = abs(x - t)  # the distance measure
        w = 1 / pow(d, kappa)  # parameterize non-linear scaling
        numer[i] = w
        denom[i] = d


_tdf = train_df[[att, target_col]].apply_rows(
    predict_kernel,
    incols={att: "F", "G3": "T"},
    outcols={"numer": np.float64, "denom": np.float64},
    kwargs={"kappa": kappa},
)

p = _tdf["numer"].sum() / _tdf["denom"].sum()  # prediction - weighted average

En este punto, no eliminamos todos los bucles, pero simplemente empujamos la mayoría del cálculo numérico a Numba, reduciendo el tiempo de ejecución de CuDf > 50%, lo que nos lleva a alrededor de 2 a 4 segundos para la división de entrenamiento y prueba estándar del 80-20.

Conclusión

Ha sido un viaje emocionante y agradable explorar las capacidades de las bibliotecas rapids, cupy y cudf para diversas tareas de aprendizaje automático. Estas bibliotecas han demostrado ser fáciles de usar y comprensibles, lo que las hace accesibles para la mayoría de los usuarios. El diseño y mantenimiento de estas bibliotecas son encomiables, lo que permite a los usuarios profundizar en las complejidades cuando sea necesario. En solo unas pocas horas al día durante una semana, pudimos progresar desde ser novatos hasta empujar los límites de la biblioteca implementando un algoritmo de predicción altamente personalizado. Nuestro próximo objetivo es lograr una velocidad sin precedentes, apuntando a romper la barrera de microsegundos con grandes conjuntos de datos que oscilan entre 20K y 30K. Una vez que se alcance este hito, planeamos lanzar el algoritmo como un paquete pip impulsado por rapids, lo que lo hace disponible para una adopción y uso más amplios.

Kris Manohar es un director ejecutivo en ICPC, Trinidad y Tobago.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Transmisión de respuestas de modelos de lenguaje amplios en Amazon SageMaker JumpStart

Estamos emocionados de anunciar que Amazon SageMaker JumpStart ahora puede transmitir respuestas de inferencia de mod...

Inteligencia Artificial

Una inmersión profunda en las implicaciones de seguridad de la personalización y afinación de grandes modelos de lenguaje.

En un esfuerzo colaborativo revolucionario, IBM Research, Princeton University y Virginia Tech han arrojado luz sobre...

Inteligencia Artificial

Generación rápida y precisa de hologramas acústicos utilizando un marco basado en aprendizaje profundo

El equipo liderado por el profesor Hwang Jae-Yoon del Departamento de Ingeniería Eléctrica y Ciencias de la Computaci...

Inteligencia Artificial

Tendencias futuras en la integración de datos

Explorando el futuro de la integración de datos, desde soluciones en la nube y análisis en tiempo real hasta aprendiz...

Inteligencia Artificial

Determinístico vs Estocástico - Fundamentos de Aprendizaje Automático

Los modelos determinísticos y estocásticos son enfoques utilizados en varios campos, incluyendo el aprendizaje automá...

Ciencia de Datos

Creando increíbles visualizaciones de árbol de decisiones con dtreeviz.

Ser capaz de visualizar modelos de árboles de decisión es importante para la explicabilidad del modelo y puede ayudar...