Líderes de opinión

Evitar los peligros ocultos: Navegando por las trampas no obvias en ML en iOS

mm
Añade Unite.AI a tus fuentes preferidas en Google

¿Necesitas ML?

El aprendizaje automático es excelente para detectar patrones. Si logras recopilar un conjunto de datos limpio para tu tarea, generalmente solo es cuestión de tiempo antes de que puedas construir un modelo de ML con un rendimiento superior al humano. Esto es especialmente cierto en tareas clásicas como la clasificación, la regresión y la detección de anomalías.

Cuando estés listo para resolver algunos de tus problemas comerciales con ML, debes considerar dónde se ejecutarán tus modelos de ML. Para algunos, tiene sentido ejecutar una infraestructura de servidor. Esto tiene el beneficio de mantener tus modelos de ML privados, por lo que es más difícil para los competidores ponerse al día. Además, los servidores pueden ejecutar una variedad más amplia de modelos. Por ejemplo, los modelos GPT (hechos famosos con ChatGPT) actualmente requieren GPUs modernas, por lo que los dispositivos de consumo están fuera de consideración. Por otro lado, mantener tu infraestructura es bastante costoso, y si un dispositivo de consumo puede ejecutar tu modelo, ¿por qué pagar más? Además, también puede haber preocupaciones de privacidad donde no puedas enviar datos de usuario a un servidor remoto para su procesamiento.

Sin embargo, supongamos que tiene sentido utilizar los dispositivos iOS de tus clientes para ejecutar un modelo de ML. ¿Qué podría salir mal?

Limitaciones de la plataforma

Límites de memoria

Los dispositivos iOS tienen mucha menos memoria de video disponible que sus contrapartes de escritorio. Por ejemplo, el reciente Nvidia RTX 4080 Ti tiene 20 GB de memoria disponible. Los iPhones, por otro lado, tienen memoria de video compartida con el resto de la RAM en lo que llaman “memoria unificada”. Para referencia, el iPhone 14 Pro tiene 6 GB de RAM. Además, si asignas más de la mitad de la memoria, iOS es muy probable que mate la aplicación para asegurarse de que el sistema operativo permanezca respondiendo. Esto significa que solo puedes contar con tener 2-3 GB de memoria disponible para la inferencia de la red neuronal.

Los investigadores suelen entrenar sus modelos para optimizar la precisión sobre el uso de memoria. Sin embargo, también hay investigaciones disponibles sobre formas de optimizar para velocidad y huella de memoria, por lo que puedes buscar modelos menos exigentes o entrenar uno tú mismo.

Soporte de capas de red (operaciones)

La mayoría de los ML y las redes neuronales provienen de marcos de aprendizaje profundo bien conocidos y luego se convierten en CoreML con Core ML Tools. CoreML es un motor de inferencia escrito por Apple (AAPL ) que puede ejecutar varios modelos en dispositivos Apple. Las capas están bien optimizadas para el hardware y la lista de capas admitidas es bastante larga, por lo que este es un excelente punto de partida. Sin embargo, también están disponibles otras opciones como Tensorflow Lite.

La mejor manera de ver qué es posible con CoreML es mirar algunos modelos ya convertidos utilizando visores como Netron. Apple enumera algunos de los modelos admitidos oficialmente, pero también hay zoológicos de modelos impulsados por la comunidad. La lista completa de operaciones admitidas cambia constantemente, por lo que mirar el código fuente de Core ML Tools puede ser útil como punto de partida. Por ejemplo, si deseas convertir un modelo de PyTorch, puedes intentar encontrar la capa aquí.

Además, ciertas nuevas arquitecturas pueden contener código CUDA escrito a mano para algunas de las capas. En tales situaciones, no puedes esperar que CoreML proporcione una capa predefinida. Sin embargo, puedes proporcionar tu propia implementación si tienes un ingeniero capacitado familiarizado con la escritura de código de GPU.

En general, el mejor consejo aquí es intentar convertir tu modelo a CoreML temprano, incluso antes de entrenarlo. Si tienes un modelo que no se convirtió de inmediato, es posible modificar la definición de la red neuronal en tu marco de aprendizaje profundo o el código fuente del convertidor de Core ML Tools para generar un modelo de CoreML válido sin la necesidad de escribir una capa personalizada para la inferencia de CoreML.

Validación

Errores del motor de inferencia

No hay forma de probar todas las combinaciones posibles de capas, por lo que el motor de inferencia siempre tendrá algunos errores. Por ejemplo, es común ver convoluciones dilatadas que utilizan demasiada memoria con CoreML, lo que probablemente indica una implementación mal escrita con un kernel grande relleno de ceros. Otro error común es la salida de modelo incorrecta para algunas arquitecturas de modelo.

En este caso, el orden de las operaciones puede ser un factor. Es posible obtener resultados incorrectos dependiendo de si la activación con convolución o la conexión residual viene primero. La única forma real de garantizar que todo esté funcionando correctamente es tomar tu modelo, ejecutarlo en el dispositivo destinado y comparar el resultado con una versión de escritorio. Para esta prueba, es útil tener al menos un modelo semi capacitado disponible, de lo contrario, el error numérico puede acumularse para modelos mal inicializados aleatoriamente. Aunque el modelo capacitado final funcionará bien, los resultados pueden ser bastante diferentes entre el dispositivo y el escritorio para un modelo inicializado aleatoriamente.

Pérdida de precisión

El iPhone utiliza la precisión de media precisión extensivamente para la inferencia. Mientras que algunos modelos no tienen ninguna degradación de precisión notable debido a los bits más pequeños en la representación de punto flotante, otros modelos pueden sufrir. Puedes aproximar la pérdida de precisión evaluando tu modelo en el escritorio con media precisión y calculando una métrica de prueba para tu modelo. Un método aún mejor es ejecutarlo en un dispositivo real para descubrir si el modelo es tan preciso como se pretendía.

Perfiling

Los diferentes modelos de iPhone tienen capacidades de hardware variadas. Los más recientes tienen unidades de procesamiento de Neural Engine mejoradas que pueden elevar el rendimiento general significativamente. Están optimizados para ciertas operaciones, y CoreML puede distribuir inteligentemente el trabajo entre CPU, GPU y Neural Engine. Las GPU de Apple también han mejorado con el tiempo, por lo que es normal ver rendimientos fluctuantes en diferentes modelos de iPhone. Es una buena idea probar tus modelos en dispositivos con compatibilidad mínima para asegurarte de la máxima compatibilidad y un rendimiento aceptable para dispositivos más antiguos.

También vale la pena mencionar que CoreML puede optimizar algunas de las capas y cálculos intermedios en su lugar, lo que puede mejorar significativamente el rendimiento. Otro factor a considerar es que sometimes, un modelo que se ejecuta peor en un escritorio puede hacer la inferencia más rápido en iOS. Esto significa que vale la pena pasar algo de tiempo experimentando con diferentes arquitecturas.

Para una optimización aún mayor, Xcode tiene una herramienta de instrumentos agradable con una plantilla solo para modelos de CoreML que puede proporcionar una visión más detallada de lo que está ralentizando tu modelo de inferencia.

Conclusión

Nadie puede prever todos los posibles peligros cuando se desarrollan modelos de ML para iOS. Sin embargo, hay algunos errores que se pueden evitar si sabes qué buscar. Comienza a convertir, validar y perfilar tus modelos de ML temprano para asegurarte de que tu modelo funcione correctamente y se adapte a tus requisitos comerciales, y sigue los consejos descritos anteriormente para asegurar el éxito lo antes posible.

Konstantin Semianov, es CTO de Neatsy.AI, la primera aplicación del mundo que detecta problemas de salud ortopédica y podología, utilizando IA y AR, con solo una cámara de iPhone. Antes de Neatsy.AI, trabajó como ingeniero de I&D en Prisma Labs, creadores de la aplicación Lensa.