C贸mo lanzar ML en prod: seis rastrillos que pisamos

M谩s recientemente, buscamos un cient铆fico de datos en el equipo (y encontramos: 隆hola, nik_son y Arseny!). Mientras hablamos con los candidatos, nos dimos cuenta de que muchas personas quieren cambiar sus trabajos porque est谩n haciendo algo "en la mesa".

Por ejemplo, asumen el pron贸stico complejo que propuso el jefe, pero el proyecto se detiene porque la empresa no comprende qu茅 y c贸mo incluir en la producci贸n, c贸mo obtener ganancias, c贸mo "recuperar" los recursos gastados en el nuevo modelo.



HeadHunter no tiene una gran potencia inform谩tica, como Yandex o Google. Entendemos lo dif铆cil que es poner ML complejo en producci贸n. Por lo tanto, muchas compa帽铆as piensan en el hecho de que los modelos lineales m谩s simples se est谩n introduciendo en la producci贸n.

En el proceso de la pr贸xima implementaci贸n de ML en el sistema de recomendaci贸n y en la b煤squeda de vacantes, encontramos una serie de "rastrillos" cl谩sicos. Preste atenci贸n a ellos si tiene la intenci贸n de implementar ML en casa: tal vez esta lista lo ayudar谩 a no seguirlos y encontrar su propio rastrillo personal .

Rastrillo No. 1: Cient铆fico de datos - Artista libre


En cada empresa que comienza a introducir el aprendizaje autom谩tico, incluidas las redes neuronales, en su trabajo, existe una brecha entre lo que el cient铆fico de datos quiere hacer y lo que beneficia a la producci贸n. Incluso porque el negocio no siempre puede explicar qu茅 beneficio es y c贸mo puede ayudar.

Nos ocupamos de esto de la siguiente manera: discutimos todas las ideas emergentes, pero solo implementamos lo que beneficiar谩 a la empresa, ahora o en el futuro. No investigamos en el vac铆o.

Despu茅s de cada implementaci贸n o experimento, consideramos la calidad, los recursos y los efectos econ贸micos y actualizamos nuestros planes.

Rastrillo n煤mero 2: actualizaci贸n de bibliotecas


Este problema ocurre en muchos. Aparecen muchas bibliotecas nuevas y convenientes de las que nadie hab铆a o铆do hablar hace un par de a帽os, o ninguna. Me gustar铆a usar las 煤ltimas bibliotecas, porque son m谩s convenientes.

Pero hay varios obst谩culos:

1. Si el producto usa, por ejemplo, el decimocuarto Ubuntu, lo m谩s probable es que simplemente no haya nuevas bibliotecas en 茅l. La soluci贸n es transferir el servicio a Docker e instalar las bibliotecas de Python usando pip (en lugar de paquetes deb).

2. Si se utiliza un formato dependiente del c贸digo para el almacenamiento de datos (como pickle), esto congela las bibliotecas utilizadas. Es decir, cuando el modelo de aprendizaje autom谩tico se obtuvo utilizando la biblioteca scikit-learn versi贸n 15 y se guard贸 en formato pickle, entonces para la recuperaci贸n correcta del modelo, se necesitar谩 la biblioteca de quince versiones scikit-learn. No puede actualizar a la 煤ltima versi贸n, y esta es una trampa mucho m谩s insidiosa que la descrita en el p谩rrafo 1.

Hay dos formas de salir de esto:

  • Utilice un formato independiente del c贸digo para almacenar modelos.
  • Siempre podr谩 volver a entrenar cualquier modelo. Luego, al actualizar la biblioteca, ser谩 necesario entrenar todos los modelos y guardarlos con la nueva versi贸n de la biblioteca.

Hemos elegido el segundo camino.

Rastrillo n煤mero 3: trabajar con modelos antiguos


Hacer algo nuevo en un modelo antiguo y aprendido es menos 煤til que hacer algo simple en uno nuevo. A menudo, al final resulta que la introducci贸n de modelos m谩s simples pero m谩s frescos es m谩s 煤til, y la cantidad de esfuerzo es menor. Es importante recordar esto y siempre tener en cuenta la cantidad de esfuerzos comunes en la b煤squeda de patrones.

Rastrillo n煤mero 4: solo experimentos locales


A muchos expertos en ciencia de datos les gusta experimentar localmente en sus servidores de aprendizaje autom谩tico. Solo los productos no tienen tanta flexibilidad: como resultado, se revelan muchas razones por las cuales es imposible arrastrar estos experimentos a la producci贸n.

Es importante configurar la comunicaci贸n entre el especialista de DS y los ingenieros de ventas para una comprensi贸n com煤n: c贸mo funcionar谩 este o aquel modelo en la producci贸n, si existe la potencia y la capacidad f铆sica necesarias para implementarlo. Adem谩s, cuanto m谩s complejos son los modelos y los factores, m谩s dif铆cil es hacerlos confiables y poder capacitarlos nuevamente en cualquier momento. A diferencia de las competencias de Kaggle, en la producci贸n a menudo es mejor sacrificar diez mil茅simas en m茅tricas locales e incluso un peque帽o KPI en l铆nea, pero implementar la versi贸n de modelos es mucho m谩s simple, estable en resultados y f谩cil en recursos inform谩ticos.

La copropiedad del c贸digo (los desarrolladores y los cient铆ficos de datos saben c贸mo funciona el c贸digo escrito por otros desarrolladores), la reutilizaci贸n de signos y metaatributos en varios modelos tanto en el proceso de aprendizaje como cuando se trabaja en productos (nos ayuda us framework), unit-and autotests, que manejamos muy a menudo, integraci贸n de c贸digo con retesting. Ponemos los modelos finales en repositorios git y tambi茅n los usamos en producci贸n.

Rastrillo n煤mero 5: prueba solo prod


Cada uno de nuestros desarrolladores y cient铆ficos de datos tiene su propio banco de pruebas, a veces no uno. Los componentes principales de la producci贸n HH se implementan en 茅l. Es costoso, pero paga por la calidad y la velocidad de desarrollo. Es necesario, pero no suficiente. No solo cargamos los modelos que ya est谩n en producci贸n, sino tambi茅n los que estar谩n all铆 pronto. Esto ayuda a comprender a tiempo que los modelos que funcionan perfectamente en m谩quinas locales, bancos de prueba o en producci贸n para el 5% de los usuarios, y cuando se encienden al 100%, son demasiado pesados.

Usamos varias etapas de prueba. Verificamos el c贸digo muy r谩pidamente (este es el punto clave): al agregar o cambiar componentes en el repositorio, el c贸digo se recopila, la unidad y las pruebas autom谩ticas se ejecutan en los componentes correspondientes, si es necesario, tambi茅n los volvemos a probar manualmente, y si algo est谩 mal, responda "El tuyo est谩 roto, decide."

Rastrillo n煤mero 6: c谩lculos largos y p茅rdida de enfoque


Si un modelo requiere, por ejemplo, una semana para entrenar, es f谩cil perder la concentraci贸n en la tarea debido al cambio a otro proyecto. Intentamos no dar a los desarrolladores y cient铆ficos de datos m谩s de dos tareas en una mano. Y no m谩s de uno urgente para que pueda cambiar a 茅l tan pronto como se completen los c谩lculos o experimentos A / B. Esta regla es necesaria para no perder el enfoque y por temor a que algunas de estas tareas generalmente corran el riesgo de perderse, y otra parte que se implementa mucho m谩s tarde de lo necesario.

Pisamos un rastrillo pero no nos rendimos


Recientemente completamos un experimento sobre la introducci贸n de redes neuronales en un sistema de recomendaci贸n. Comenz贸 con el hecho de que en dos d铆as el hackathon interno escribi贸 un modelo para pronosticar las respuestas por curr铆culum, lo que facilit贸 enormemente la b煤squeda de vacantes adecuadas.

Pero m谩s tarde aprendimos: para ponerlo en producci贸n, debe actualizar casi todo, por ejemplo, transferir el sistema de doble uso, que considera signos y ense帽a modelos, a Docker, as铆 como actualizar las bibliotecas de aprendizaje autom谩tico.

Como fue


Utilizamos el modelo DSSM con una red neuronal de una sola capa. En el art铆culo original de Microsoft, se utiliz贸 una red neuronal de tres capas, pero no observamos mejoras de calidad con un aumento en el n煤mero de capas, por lo que nos decidimos por una capa.



En resumen:

  1. El texto de la consulta y el encabezado de la vacante se convierten en dos vectores trigrama de s铆mbolos. Usamos 20,000 trigramas de caracteres.
  2. El vector trigrama se alimenta a la entrada de una red neuronal de capa 煤nica. En la entrada de la capa de red neuronal, hay 20,000 n煤meros, en la salida, 64. Esencialmente, la red neuronal es una matriz de 20,000 x 64 por la cual se multiplica el vector trigrama de entrada de dimensi贸n 1 x 20 000. Se agrega un vector constante de dimensi贸n 1 x 64 al resultado de multiplicaci贸n. La salida de dicha red neuronal corresponde a la solicitud (o el t铆tulo de la vacante).
  3. Se calcula el producto escalar del vector dssm de consulta y el vector dssm del encabezado de vacante. La funci贸n sigmoidea se aplica al trabajo. El resultado final es el meta-signo dssm.

Cuando intentamos incluir este modelo por primera vez, las m茅tricas locales mejoraron, pero cuando intentamos incluirlo en la prueba A / B, vimos que no hab铆a ninguna mejora.

Despu茅s de eso, tratamos de aumentar la segunda capa de neuronas a 256, desplegada por el 5% de los usuarios: result贸 que el sistema de recomendaci贸n y la b煤squeda mejoraron, pero cuando activ贸 el modelo al 100%, de repente result贸 que era demasiado pesado.

Analizamos por qu茅 el modelo es tan pesado, eliminamos la derivaci贸n y volvimos a experimentar con esta red neuronal. Y solo despu茅s de eso, habiendo recorrido todo el camino nuevamente, descubrieron que el modelo es 煤til: el n煤mero de respuestas en el sistema de recomendaciones aument贸 en 700 por d铆a, y en la b煤squeda, despu茅s de todos los recuentos, en 4200.

La introducci贸n de una red neuronal tan poco compleja permite a nuestros clientes contratar a varias docenas de empleados adicionales todos los d铆as a trav茅s de hh.ru, y durante la implementaci贸n hemos derrotado a una parte importante de los grandes problemas. Por lo tanto, planeamos desarrollar nuestras redes neuronales a煤n m谩s. Los planes son intentar la derivaci贸n general, la lematizaci贸n adicional, procesar los textos completos de la vacante y reanudar, realizar experimentos con la topolog铆a (capas ocultas y, posiblemente, RNN / LSTM).

Lo m谩s importante que hemos hecho con este modelo:

  • No deje caer el experimento en el medio.
  • Calculamos los indicadores de aumento de la respuesta y descubrimos que el trabajo en este modelo vali贸 la pena. Es muy importante comprender cu谩nto beneficio aporta cada implementaci贸n.

Curiosamente, el modelo que hicimos y finalmente agregamos al producto es muy similar al m茅todo del componente principal (PCA) aplicado a la matriz [texto de la consulta, t铆tulo del documento, si hubo un clic]. Es decir, a una matriz en la que una fila corresponde a una consulta 煤nica, una columna a un encabezado de vacante 煤nico; el valor en la celda es 1 si despu茅s de esta solicitud el usuario hizo clic en una vacante con este encabezado y 0 si no hubo clic.

Los resultados de la aplicaci贸n de este modelo a las solicitudes de scala, java, C #, "abogado", "abogado" se encuentran en la tabla a continuaci贸n. Los pares de consultas de significado similar se resaltan en la oscuridad, a diferencia de la luz. Se puede ver que el modelo comprende la conexi贸n entre diferentes lenguajes de programaci贸n, hay una fuerte conexi贸n entre la solicitud "abogado" y "abogado". Pero entre el "abogado" y cualquier lenguaje de programaci贸n, la conexi贸n es muy d茅bil.

En alg煤n momento, realmente quiero rendirme: los experimentos contin煤an, pero no se est谩n "encendiendo". En este punto, un cient铆fico de datos puede encontrar 煤til apoyar al equipo y una vez m谩s calcular los beneficios: puede valer la pena "enterrar a la azafata" y no tratar de "montar el caballo muerto", esto no es un fracaso, sino un experimento exitoso con un resultado negativo. O, despu茅s de sopesar los pros y los contras, realizar谩 otro experimento que "disparar谩". Entonces nos pas贸 a nosotros.

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


All Articles