Como programador, los núcleos del centro de datos escribieron


Pocas personas creen que la pila de ciencia de datos moderna no se puede construir en Python, pero existen tales precedentes :). La pila Odnoklassniki se formó durante muchos años, principalmente por programadores que cambiaron a la ciencia de datos, pero aún se mantuvo cerca del producto, por lo que se basa en las tecnologías abiertas de la pila JVM: Hadoop, Spark, Kafka, Cassandra, etc. Esto nos ayuda a reducir el tiempo y el costo de poner en funcionamiento los modelos, pero a veces crea dificultades. Por ejemplo, al preparar soluciones básicas para los participantes de SNA Hackathon 2019 , tuvieron que comprimir su fuerza de voluntad y sumergirse en el mundo de la escritura dinámica. Detalles (y trolling fácil) debajo del corte :)


Instalación



Hay algún tipo de python en casi cualquier máquina de desarrollo. Fue encontrado en el mío, ya por duplicado: 2.7 y 3.4. Habiendo hurgado en los contenedores de memoria, recordé que instalé la versión 3.4 hace tres años, después de que los participantes enfrentaran problemas épicos en SNA Hackathon 2016, tratando de expandir un gráfico de medio gigabyte en la memoria (como resultado de un pequeño video de entrenamiento y una competencia por separado ), pero hoy es La economía ya es moralmente obsoleta y necesita una actualización.


En el mundo de Java, cada proyecto durante el ensamblaje indica todo lo que quiere incorporar a sí mismo, y continúa con esto. En teoría, todo es simple y hermoso, pero en la práctica, cuando necesita la biblioteca A y la biblioteca B, seguramente resultará que ambas necesitan la biblioteca C, con dos versiones diferentes incompatibles :). En vanos intentos de romper este círculo vicioso, algunas bibliotecas empaquetan todas sus dependencias en sí mismas y se esconden del resto, mientras que el resto gira como pueden.


¿Qué pasa con esto en Python? No existe un proyecto como tal, pero existe un "entorno", y dentro de cada entorno, se puede formar un ecosistema independiente a partir de paquetes de ciertas versiones. Al mismo tiempo, existen herramientas para los perezosos , con la ayuda de los cuales no es más difícil administrar el entorno local de Python, que un grupo heterogéneo distribuido de Clauder o Horton. Pero los conflictos mutuos entre las versiones del paquete no irán a ninguna parte. Inmediatamente me enfrenté al hecho de que la versión Pandas 0.24 transfirió el método privado _maybe_box_datetimelike a la API pública, y de repente resultó que mucha gente lo había usado en su forma anterior y ahora se cayó :) (y sí, en El mundo de Java es igual ). Pero al final, todo fue reparado, aparte de las terribles advertencias sobre la nueva depriycheyshin, funcionó.


Línea base colaborativa


imagen

Las tareas en SNA Hackathon 2019 se dividen en tres áreas: recomendaciones sobre registros, textos e imágenes. Comencemos con los registros (spoiler - megapattern Cmd + C / Cmd + V con stackoverflow también funciona con python). Los datos se recopilaron de una producción en vivo: a cada usuario al azar, sin pesar, se le mostró algo de alimentación de su entorno, después de lo cual todos los signos en el momento del espectáculo y la reacción final se registraron en el registro. La tarea más fácil: tomamos señales, nos metemos en un registro , ¡ganancias!


Pero el plan brilló en la primera etapa, en la lectura de datos. En teoría, existe un maravilloso paquete Apache Arrow , que supuestamente unificaría el trabajo con datos en diferentes ecosistemas y, en particular, permitiría leer archivos de "parquet" de Python sin chispas. En la práctica, resultó. que incluso al leer estructuras anidadas simples tiene problemas , y nuestra hermosa jerarquía se ha convertido en una miseria plana :(.


Pero hubo aspectos positivos. Jupyter , en general, estaba contento, es casi tan cómodo, aunque no tan bonito como Zeppelin . ¡Incluso hay un núcleo de roca ! Bueno, la velocidad de la regresión logística en un pequeño dato en la memoria complacida: no alcanza el poder de la opción distribuida, pero aprende instantáneamente en cuatro signos y un par de cientos de miles de ejemplos.


Entonces, sin embargo, el entusiasmo que surgió fue golpeado con fuerza: si la transformación de datos necesaria (agrupar por clave y ensamblar en una lista) no está en la lista estándar y aparece aplicar o mapa, entonces la velocidad cae por órdenes de magnitud. Como resultado, el 80% del tiempo de la línea de base no es leer datos, uniones, capacitación y clasificación de modelos, sino una compilación banal de la lista.


Por cierto, es precisamente por esta característica que siempre me sorprenden los usuarios de pySpark: después de todo, casi toda la funcionalidad estándar está disponible en forma de Spark SQL, que es lo mismo en python y rock, y después del primer yudf-in similar a python con algo personal de diez núcleos. el racimo se convierte en una calabaza ...


Pero, al final, se superaron todos los obstáculos y ¡ nueve puntos fueron suficientes para obtener un puntaje de 0.65!


Línea de base de texto



Bueno, ahora nuestra tarea es más complicada: si el registro se puede encontrar en cientos de implementaciones para todas las plataformas, entonces hay más variedad de herramientas para trabajar con textos en Python. Afortunadamente, los textos ya se envían no solo en forma cruda, sino también procesados ​​por nuestro sistema de preprocesamiento regular basado en Spark y Lucene . Por lo tanto, puede tomar de inmediato la lista de tokens y no preocuparse por la tokenización / lematización / derivación.


Durante un tiempo dudé de qué llevar: BigARTM nacional o Gensim importado. Como resultado, me decidí por el segundo y copié el tutorial doc2vec :). Espero que los colegas del equipo BigARTM no dejen de arriesgarse y mostrar las ventajas de su biblioteca en la competencia.


Nuevamente tenemos un plan simple: tomamos todos los textos de la prueba, entrenamos el modelo Doc2Vec, luego lo inferimos en el tren y aprendemos el registro de sus resultados (¡apilar es nuestro todo!). Pero, como de costumbre, los problemas comenzaron de inmediato. A pesar de la cantidad relativamente modesta de textos en la muestra de entrenamiento (solo un gigabyte y medio), al intentar arrastrarlos a la rampa, la pitón se comió 20 (¡20 Karl!) Gigabytes de memoria, se cambió y no regresó. Tuve que comerme un elefante en partes.


Al leer, siempre indicamos qué columnas levantar del piso, lo que nos permite no leer el texto sin procesar en la memoria. Esto ahorra su uso a la mitad, los documentos del conjunto de prueba se cargan en la memoria para entrenar sin problemas. Con un conjunto de entrenamiento de tal truco no es suficiente, así que a la vez no cargamos más de un archivo de "parquet". Además, en el archivo descargado, dejamos solo la identificación de los días que queremos usar para la capacitación, y ya los inferimos en ellos.


Iniciar sesión además de esto funciona igual de rápido, y al final obtenemos 14 párrafos y una puntuación de 0,54 :)


Imagen de referencia



¿Qué podría ser más popular que el aprendizaje profundo? ¡Solo gatos! Por lo tanto, para la imagen de línea de base, hicimos un plan brillantemente simple: ejecutar un detector de gatos en las imágenes del conjunto de prueba y luego clasificar el contenido de acuerdo con la puntuación :)


Y de nuevo hay mucho para elegir. Clasificación o detección? pyTorch o Tensorflow? El criterio principal es la facilidad de implementación mediante el método de copiar y pegar. Y el ganador es ... YOLOv3 en MXNet :). La concisión de su demo cautivó a primera vista, pero luego, como siempre, comenzaron los problemas.


¿Con qué suele comenzar el trabajo con big data? Con estimaciones de rendimiento y el tiempo necesario de la máquina. Quería hacer que la línea base fuera lo más autónoma posible, por lo que le enseñaron a trabajar directamente con el archivo tar y rápidamente se dieron cuenta de que a una velocidad de extracción de 200 fotos por segundo de tar a tmpfs, tomaría aproximadamente media hora, las normas para procesar 352,758 imágenes. Agregue carga y preprocesamiento de fotos: 100 por segundo, aproximadamente una hora para todo, normas. Agregue el cálculo de la red neuronal - 20 fotos por segundo, 5 horas, bueno ... ok. Agregue la extracción de resultados - 1 foto por segundo, semana, WTF?


Después de un par de horas de baile con panderetas, se comprende que el NDArray que observamos nunca está sucio, y la estructura interna de MXNet, que hace todos los cálculos de manera perezosa. Bingo! Que hacer ¡Cualquier diplerner novato sabe que todo es del tamaño del lote! Si MXNet calcula el puntaje perezosamente, entonces si primero les solicitamos un par de docenas de fotos, y luego comenzamos a extraerlas, ¿tal vez el procesamiento de las fotos irá en lotes? Y sí, después de agregar el lote a una velocidad de 10 fotos por segundo, logré encontrar a todos los gatos :).


Luego aplicamos la ingeniería conocida y en 10 párrafos obtenemos una puntuación de 0.504 :).


Conclusiones



Cuando se le preguntó a un sabio sensei: "¿Quién ganará, maestro de Aikido o Karate?", Él respondió: "El Maestro ganará" Este experimento nos llevó aproximadamente a las mismas conclusiones: no existe y no puede haber un lenguaje ideal para todas las ocasiones. Con Python, puede ensamblar rápidamente una solución a partir de bloques prefabricados, pero tratar de alejarse de ellos con cantidades suficientemente grandes de datos traerá mucho dolor. En Java y Scala, también puede encontrar muchas herramientas listas para usar e implementar fácilmente sus propias ideas, pero los lenguajes mismos serán más exigentes con la calidad del código.


Y, por supuesto, ¡buena suerte a todos los miembros de SNA Hackathon 2019 !

Source: https://habr.com/ru/post/439394/


All Articles