Servir todo

No hace mucho tiempo, en una galaxia bastante distante, en un planeta provincial hab铆a descendientes famosos de monos que eran tan vagos que decidieron inventar inteligencia artificial. "Bueno, 驴qu茅?" Ellos pensaron. Es bueno tener en los asesores de la Overmind un "cerebro" que pensar谩 por ti cuando sea necesario, tus problemas se pueden resolver r谩pidamente, y es incluso mejor de lo que una criatura viviente puede hacer ... Y, sin pensar en las consecuencias, comenzaron sus monos. Los cerebros inversos y el proceso cognitivo en los bloques de construcci贸n se desmontan. Pensaron, pensaron y pensaron, no lo creer谩n: un modelo de neurona, un algoritmo de aprendizaje matem谩tico y luego redes neuronales con diferentes topolog铆as desplegadas. Por supuesto, esto no funcion贸 para decirlo muy bien. Hubo muchas deficiencias, en comparaci贸n con la inteligencia natural, pero una cierta gama de problemas, estos modelos nos permitieron resolver con una precisi贸n razonable. Y lentamente, las habilidades digitalizadas y serializadas comenzaron a aparecer en forma de modelos de redes neuronales. Hoy, queridos amantes de la historia del universo, tocaremos la organizaci贸n e implementaci贸n de varias habilidades de inteligencia artificial.


Sobre la creaci贸n y capacitaci贸n de modelos de redes neuronales (habilidades) en Habr茅 se escribe mucho, por lo tanto, no hablaremos de eso hoy. Habiendo entrenado o recibido habilidades de IA serializadas, esperamos usarlas en nuestros sistemas de informaci贸n objetivo, y aqu铆 surge un problema. Lo que funciona en el stand de laboratorio no puede transferirse a la producci贸n en su forma original, es necesario implementar toda la pila de tecnolog铆a asociada e incluso realizar modificaciones significativas en la plataforma objetivo (por supuesto, hay excepciones en la forma de CoreML, pero este es un caso especial y solo para equipos Apple). Adem谩s, existen muchas herramientas para desarrollar y serializar modelos, 驴es realmente necesario que todos desarrollen una soluci贸n de integraci贸n separada? Adem谩s, incluso en el laboratorio, a menudo es necesario obtener una conclusi贸n r谩pida del modelo, sin esperar la carga de toda la pila de desarrollo asociada.
Como sugerencia para resolver estos problemas, me gustar铆a contarles acerca de una herramienta de c贸digo abierto relativamente nueva, que, tal vez, ser谩 煤til para ustedes al desarrollar proyectos relacionados con la IA.

0Mind (leer ZeroMind) es un servidor de habilidades gratuito. La soluci贸n es un servidor de aplicaciones modular, universal y f谩cilmente extensible con elementos de un marco para servir modelos de aprendizaje autom谩tico heterog茅neos (salida altamente accesible). El servidor es feo en Python 3 y usa Tornado para el procesamiento de solicitudes as铆ncronas. Independientemente del marco de aprendizaje autom谩tico que se utiliz贸 para preparar y serializar el modelo, 0Mind facilita el uso de una habilidad o grupo de habilidades utilizando la API REST universal. De hecho, la soluci贸n es un servidor web as铆ncrono con una API REST, unificada para trabajar con modelos de habilidades de IA y un conjunto de adaptadores para varios marcos de aprendizaje autom谩tico. Es posible que haya trabajado con el servicio de tensorflow: esta es una soluci贸n similar, pero 0Mind no est谩 apilado y puede servir varios modelos de diferentes marcos en el mismo puerto. Por lo tanto, en lugar de implementar toda la pila de tecnolog铆a para derivar modelos de IA en el sistema de informaci贸n de destino, puede usar la API REST simple y familiar para la habilidad de inter茅s, adem谩s, el modelo preparado permanece en el servidor y no termina en la distribuci贸n de software. Para no confundir una vez m谩s con t茅rminos complejos, pasemos a ejemplos de uso y comencemos a lanzar hechizos de consola.

Instalaci贸n


Aqu铆 todo es simple:

git clone git@github.com:MisteryX/0Mind.git 0Mind 

Ahora tenemos una instancia de servidor en funcionamiento. Instalar las dependencias:

 cd 0Mind pip3 install -r requirements.txt 

O si usas Conda:

 conda install --yes --file requirements.txt 

Una advertencia importante es que el servidor admite varios marcos de aprendizaje autom谩tico y, para no agregarlos todos y no instalarlos, usted mismo decide qu茅 marcos de marcos cargar谩 en el host con la instancia de 0Mind, instale y configure estas herramientas de forma independiente.

Personalizaci贸n


El punto de entrada o el ejecutable del servidor principal es model_pool.py .
Las posibles opciones de inicio son -c o --config_file con la ruta al archivo de configuraci贸n. De manera predeterminada, 0Mind usa el archivo configs / model_pool_config.json como archivo de configuraci贸n. El servidor tambi茅n usa el archivo config / logger.json para controlar el registro est谩ndar del m贸dulo de registro de Python.

Con el fin de demostrar las capacidades, podemos dejar intacto el archivo de configuraci贸n predeterminado. Lea m谩s sobre la configuraci贸n en la documentaci贸n oficial .

La configuraci贸n principal del servidor es: id, host, puerto, tareas.

id : (n煤mero) identificador 煤nico del grupo de modelos (utilizado para equilibrar y direccionar en una red distribuida de grupos)
host - (cadena) direcci贸n de red o nombre de dominio de este host
puerto : (n煤mero) en qu茅 puerto desea alojar el servicio 0Mind (debe estar libre en este host)
tareas : (lista de objetos) una lista de tareas cargadas con el servicio (puede estar vac铆a). En la configuraci贸n predeterminada, se carga el modelo de demostraci贸n CNN_MNIST preparado por Keras, y lo usaremos para demostrar las capacidades.

Par谩metros de configuraci贸n adicionales (opcionales):

model_types : (lista de cadenas) puede limitar los tipos de modelos cargados a este grupo al especificarlos en esta lista. Si la lista est谩 vac铆a, entonces no hay restricciones.

debug : (tipo booleano) es responsable de habilitar o deshabilitar el modo de depuraci贸n de Tornado. En modo de depuraci贸n, en caso de errores, la informaci贸n de error extendida se devuelve a stdout, lo cual es 煤til cuando se desarrollan extensiones.

Las posibilidades


Lo principal en 0Mind es la lista de marcos compatibles y las caracter铆sticas de la API REST .

Las solicitudes a la API REST se pueden realizar utilizando un navegador o utilidades http. En esta gu铆a, as铆 como en la documentaci贸n del servidor, utilizaremos cURL como la herramienta m谩s simple y asequible para sistemas abiertos.

Actualmente, 0Mind API tiene un total de 10 solicitudes:

1. http: // $ HOST: $ PORT / info - informaci贸n general sobre la instancia de 0Mind
2. http: // $ HOST: $ PORT / info / system: informaci贸n del sistema sobre el host en el que se ejecuta 0Mind
3. http: // $ HOST: $ PORT / info / task: informaci贸n sobre la tarea especificada
4. http: // $ HOST: $ PORT / info / tareas - lista de tareas de instancia 0Mind
5. http: // $ HOST: $ PORT / model / list: una lista de identificadores de modelos cargados en el grupo
6. http: // $ HOST: $ PORT / model / info - muestra informaci贸n de la interfaz sobre el modelo
7. http: // $ HOST: $ PORT / model / load: carga un nuevo modelo en el grupo
8. http: // $ HOST: $ PORT / model / drop: descarga un modelo cargado previamente del grupo
9. http: // $ HOST: $ PORT / model / predict - solicita salida del modelo
10.http: // $ HOST: $ PORT / command / stop - detiene el servicio 0Mind y finaliza su proceso

Informacion


Puede iniciar una instancia de servidor, por ejemplo, as铆:

 python3 model_pool.py 

Por ejemplo, obtendremos informaci贸n general sobre una instancia de servidor en ejecuci贸n:

 curl http://127.0.0.1:5885/info 

 {"service": "ModelPool", "id": 1, "options": {"debug": false}, "version": [1, 1, 4]} 

Ok, ahora descubrimos qu茅 modelos est谩n cargados en el grupo:

 curl http://127.0.0.1:5885/model/list 

 {"id": 1, "check_sum": "4d8a15e3cc35750f016ce15a43937620", "models": ["1"]} 

Ahora aclaremos la interfaz del modelo cargado con el identificador "1":

 curl http://127.0.0.1:5885/model/info?id=1 

 {"inputs": {"0": {"name": "conv2d_1_input:0", "type": "float32", "shape": [null, 28, 28, 1]}}, "outputs": {"0": {"name": "dense_2/Softmax:0", "type": "float32", "shape": [null, 10]}}, "tool": "keras"} 

Queda por averiguar con qu茅 filtros se carga el modelo. Para hacer esto, aclaramos los detalles de la tarea de cargar el modelo con el identificador "1":

 curl http://127.0.0.1:5885/info/task?id=1 

 {"id": "1", "model_file": "ML/models/mnist_cnn_model.keras", "model_type": "keras", "input_filters": {"conv2d_1_input:0": ["i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter"]}, "output_filters": {}} 

Como puede ver, nuestro modelo tiene un filtro de entrada: i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter y filtra la entrada con el nombre - conv2d_1_input: 0. Este filtro simplemente convierte el archivo de imagen especificado en un tensor y lo escala de acuerdo con la entrada del modelo. Los filtros son otra gran herramienta generalizada de 0Mind. Dado que el procesamiento previo y posterior del procesamiento de datos para los modelos es el mismo, simplemente puede acumular estos filtros para un uso r谩pido en el trabajo posterior con otros modelos, indicando la tarea deseada como un atributo para cargar el modelo.

Salida de datos del modelo (inferencia)


Bueno, ahora que tenemos toda la informaci贸n necesaria para la inferencia, podemos sacar una conclusi贸n del modelo. Como entrada, usamos la imagen del conjunto de pruebas incluido en la distribuci贸n 0Mind samples / image5.png :



 curl -d '{"conv2d_1_input:0": [{"image_file": "samples/image5.png"}]}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/predict?id=1 

La 煤nica entrada del modelo conv2d_1_input: 0 con el filtro i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter son los datos en el formato aceptado por el filtro - [{"image_file": "samples / image5.png"}]. En respuesta de 0Mind, obtenemos la salida del modelo:

 {"result": {"dense_2/Softmax:0": [[2.190017217283827e-21, 1.6761866200587505e-11, 2.2447325167271673e-14, 0.00011080023978138342, 1.881280855367115e-17, 0.9998891353607178, 1.6690393796396863e-16, 9.67975005705668e-12, 1.1265206161566871e-13, 2.086113400079359e-13]]}, "model_time": 0.002135753631591797} 

Entonces, la 煤nica salida del modelo "dense_2 / Softmax: 0" (ver informaci贸n sobre el modelo anterior) nos dio el vector de confianza del modelo en la clasificaci贸n de esta imagen. Como puede ver, la probabilidad m谩s alta es 0.99 para una clase con un 铆ndice de 6 (las clases son n煤meros 0-9), que corresponde al n煤mero 5 . Por lo tanto, el modelo hizo frente con 茅xito al reconocimiento del manuscrito y dio una conclusi贸n con gran confianza. El tiempo de inferencia del modelo en el host 0Mind fue 0.002135753631591797 segundos, porque la salida estaba en una CPU x86 normal.

Carga y descarga din谩mica de modelos.


Ahora descargue nuestro modelo del grupo:

 curl http://127.0.0.1:5885/model/drop?id=1 

 {"result": true, "unload_time": 0.000152587890625, "memory_released": 0, "model_id": "1"} 

Volvemos a cargar el mismo modelo, pero ahora con un identificador diferente ("nuevo") y un filtro de salida del modelo io_argmax.ArgMaxFilter, que probablemente derivar谩 el 铆ndice del vector de confianza del modelo. Tendremos que cambiar los 铆ndices de las entradas y salidas del modelo, esto se debe a las caracter铆sticas de Keras:

 curl -d '{"id": "new", "output_filters": {"dense_2_1/Softmax:0": ["io_argmax.ArgMaxFilter"]}, "model_file": "ML/models/mnist_cnn_model.keras", "input_filters": {"conv2d_1_input_1:0": ["i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter"]}, "model_type": "keras"}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/load 

 {"result": true, "load_time": 0.45618462562561035, "memory_consumed": 16183296, "model_id": "new"} 

Y ahora le pedimos al modelo que reconozca para nosotros dos im谩genes a la vez en una solicitud samples / image5.png y samples / image1.png :


 curl -d '{"conv2d_1_input:0": [{"image_file": "samples/image5.png"}, {"image_file": "samples/image1.png"}]}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/predict?id=new 

 {"result": {"dense_2_1/Softmax:0": [5, 1]}, "model_time": 0.003907206535339355} 

El modelo de demostraci贸n no volvi贸 a confundirse.

Extensi贸n


Ampliar las capacidades de 0Mind no es dif铆cil, gracias a su arquitectura modular, el uso de herramientas populares y buenas convenciones de c贸digo en el proyecto. Los principales vectores de extensi贸n pueden ser:

  1. Los adaptadores son clases entre capas para trabajar con nuevos marcos de redes neuronales y aprendizaje autom谩tico.
  2. Los filtros son manejadores de datos para entrar y salir de modelos de habilidades.
  3. Controladores de solicitud : le permiten agregar nueva funcionalidad a las solicitudes y respuestas de la API 0Mind.

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


All Articles