dmlls / jizt-tfg Goto Github PK
View Code? Open in Web Editor NEWServicio de Resumen de Textos con AI en la Nube (versión TFG).
Home Page: https://dmlls.github.io/jizt-tfg-website/
License: GNU General Public License v3.0
Servicio de Resumen de Textos con AI en la Nube (versión TFG).
Home Page: https://dmlls.github.io/jizt-tfg-website/
License: GNU General Public License v3.0
Actualmente, el Motor de Resumen lleva a cabo las tareas de codificación y resumen del texto. Se ha considerado que estos dos procesos pueden independizarse para conformar dos microservicios separados dentro de la arquitectura del sistema, a fin de conseguir una mayor modularidad.
Gestionar el post-procesado del texto generado por el motor de resumen con el fin de mejorar la presentación final del mismo al usuario. Esto puede incluir tareas como formatear correctamente el texto (p. ej. eliminando espacios innecesarios), eliminar frases inacabadas, recuperar las URLs del texto original, etc.
El modelo incluido por defecto en la librería truecase está entrenado con el corpus en inglés de NLTK. Entrenándolo con un volcado reciente de Wikipedia, se podría mejorar su precisión, especialmente en el caso de las entidades nombradas.
Gestionar el preprocesado de los textos para adaptar la entrada al motor de resúmenes con el fin de conseguir mejores resultados.
Conocer más acerca de estos servicios proporcionados por Amazon Web Services (AWS).
Implementar la API Gateway con Flask y Flask-RESTful.
El objetivo de esta historia de usuario es implementar una primera versión reducida de la arquitectura dirijida por eventos (event-driven architecture), junto con la funcionalidad de asincronismo.
Para implementar la arquitectura event-driven, se empleará Kafka y Strimzi.
En esta arquitectura reducida solo se emplearán los microservicios Dispatcher y Pre-procesador. La figura incluida a continuación muestra qué parte de la arquitectura se va a implementar.
En un primer momento, no se utilizará una base de datos real, si no que se almacenarán los datos en memoria. La implementación de la base de datos queda pendiente para futuros epics.
Para más información, ver la Issue #67, donde se explica detalladamente la arquitectura completa.
Para facilitar el descubrimiento de los de los servicios dentro del nodo Kubernetes, se va emplear el plugin CoreDNS. Este plugin facilita la labor de lookup en la tabla DNS, de forma que podemos saber la IP de un servicio específico a través de su nombre (el cual sabemos de antemano porque lo configuramos nosotros).
La tabla DNS tendría, por ejemplo, el siguiente aspecto:
Nombre del servicio | IP |
---|---|
dispatcher-service | 10.102.219.82 |
text-preprocessor-service | 10.103.134.72 |
encoder-service | 10.104.202.94 |
summarizer-service | 10.104.204.15 |
post-processor-service | 10.105.120.11 |
... | ... |
Por lo tanto, si quisiéramos enviar una petición HTTP al servicio text-preprocessor-service
, podríamos obtener su IP con el siguiente código (Python):
import socket
ip_txt_preprocessor_svc = socket.gethostbyname('text-preprocessor-service')
y enviar la petición a dicha IP.
A la hora de hablar de arquitectura event-driven, una de las plataformas más populares es Apache Kafka. En nuestro caso lo emplearemos para poder implementar el asíncronismo en nuestra arquitectura, de forma que los diferentes microservicios se comuniquen mediante la publicación de mesajes.
Por otra parte, Strimzi simplifica la tarea de configuración y gestión de Apache Kafka en Kubernetes, por lo que también emplearemos este framework.
Configurar la orquestración de los contenedores Docker mediante Kubernetes.
Generar un diseño preliminar de cómo se organizarán los diferentes microservicios que componen el sistema.
Describe el error:
Cuando la cadena de entrada contiene siglas con puntos (p. ej. "U.K. o "U.S.A.", "B.C.", etc.), el texto procesado contiene un espacio entre las letras de la sigla (i.e., "U. K.", "U. S. A", "B. C.", etc.).
Pasos para reproduccir:
Introducir una cadena de entrada con una sigla que contenga puntos.
Resultados esperados:
Las sigla en la cadena de salida deberían mantenerse intactas.
Resultados obtenidos:
Las siglas en la cadena de salida contienen espacios entre las letras.
Información adicional:
El error no aparece si las siglas están en minúsculas (p. ej. "u.k.", "u.s.a.", etc.).
Implementar el post-procesado del texto, la lógica del productor y el consumidor de Kafka, y dockerizar el servicio.
Diseño de un logo e imagen (colores, fuentes, etc.) para el proyecto. Se trata de una tarea preliminar y la idea es que la imagen del proyecto vaya creciendo junto a este, por lo cual esta tarea se trata de una primera aproximación, sujeta a futuros cambios.
Sección de código actual que debería ser refactorizado:
Actualmente, el constructor de la clase SplitterTokenizer
https://github.com/dmlls/jizt/blob/77daf04459ae8a00b9de30535beb9234fa9d5db2/src/text_summarization.py#L58
toma directamente el tokenizador como parámetro.
Propuesta de refactorización:
Se propone, en vez de pasar el tokenizador como objeto, pasar únicamente una str
indicando el modelo a emplear.
Por ejemplo: SplitterTokenizer("bart-base")
.
El modelo pasado como str
debe estar incluido dentro de los modelos implementeados por Hugging Face, concretamente los modelos Bart y T5.
Motivos para la refactorización:
De esta forma, se descarga al código exterior a la clase de la responsabilidad de instanciar el tokenizador, logrando una mayor simplicidad y abstracción.
Pequeña introducción a Flask: ¿qué es?, ¿cómo funciona?, instalación, uso básico, etc.
Visualizar la serie de vídeos correspondiente al curso "Stanford CS224N: NLP with Deep Learning".
Tiempo estimado: 25 horas.
Los Persistent Disks de Google Cloud proporcionan almacenamiento en bloque fiable y de alto rendimiento para instancias de máquinas virtuales. Nuestros modelos serán almacenados en este componente, y serán accedidos a través de volúmenes persistentes desde los microservicios de codificación y motor de resumen orquestrados por Kubernetes.
Por el momento, se empleará el modelo T5-large
tanto como para la codificación del texto, como para su resumen. Este modelo consta de 770 millones de parámetros con 24 capas.
Los distintos microservicios se comunicarán mediante peticiones REST. Una buena herramienta para implementar APIs REST en Python es Flask.
A fin de "atacar" el desafío de montar la arquitectura de microservicios completa, se comenzará por implementar una arquitectura muy básica, que únicamente lleve a cabo la tarea de pre-procesado del texto. La siguiente ilustración muestra la implementación concreta de esta arquitectura básica.
El objetivo de esta historia de usuario es conseguir implementar un Producto Mínimo Viable (MVP) que funcione bajo unas condiciones lo más parecidas a las de la arquitectura final, especialmente en lo que respecta a los siguientes puntos:
El objetivo es conseguir implementar el MPV de manera rápida, adquiriendo durante dicha implementación experiencia y lecciones valiosas, a través de un fuerte enfoque ensayo-error, para el futuro desarrollo final de la arquitectura completa.
Añadir la versión a los scripts existentes. Versión inicial: v0.1.
Realizar una pequeña búsqueda de servicios de computación en la nube y contratar el más apropiado para alojar nuestro modelo generador de resúmenes, así como el resto de componentes necesarios (pre y post-pocesador de texto, driver para Twitter, etc.).
Establecer las columnas de las que dispondrá nuestro tablero Kanban.
Helm es un popular package manager para Kubernetes. Una de sus principales puntos fuertes son los llamados "Charts", los cuales permiten definir plantillas que configuran el despliegue de los diferentes componentes de Kubernetes.
En nuestro caso, el uso de Helm Charts es ventajoso no solo porque permite "encapsular" toda nuestra arquitectura en un único paquete, de forma que cualquier usuario podría desplegarla con tan solo un comando, sino también por el hecho de que los diferentes microservicios que componen jizt tienen una configuración muy parecida. A través de los Helm Charts, podemos definir una plantilla base para todos los microservicios, de forma que reducimos la duplicación de código y facilitamos la mantenibilidad del código.
Más información en la documentación oficial de Helm.
Si la última frase del texto no acaba en punto ".", el preprocesador lo añade automáticamente. Sin embargo, la útlima frase podría acabar en "!" o "?" y ser correcta. En estos casos, el preprocesador seguiría añadiendo el punto, de forma que la útlima frase acabaría en "!." o "?.", lo cual no cumple con las reglas gramaticales.
Añadir al final del Readme el logo del Ministerio de Educación y Formación Profesional por la concesión de la Beca de colaboración con el Departamento de Ingeniería Informática de la UBU.
Implementar la API REST para el dispatcher y el pre-procesador de textos con Flask y Flask_RESTful.
Los modelos de codificación y resumen de texto pueden llegar a tener un gran tamaño (del orden de GBs). Dado que los diferentes pods correspondientes a un modelo, p. ej. T5-large
, van a utilizar todos ese mismo modelo, parece contraproducente que cada pod tenga su propia copia del mismo.
Una posible opción a explorar son los volúmenes de Kubernetes, que permiten establecer un espacio de memoria externo a los contenedores (p. ej., en el propio disco del servidor) al que pueden acceder de forma compartida (requiere una correcta configuración).
Tras un pequeño test, se ha comprobado que la función text_to_sentences
incluido en la librería blingfire de Microsoft obtiene mejores resultados que sent_tokenize
de NLTK.
Tareas:
Añadir, eliminar o editar Labels para ajustarlas a las necesidades del proyecto.
Formación básica sobre la integración de Flask en Docker.
Más inforamación sobre Sphinx.
Como se indica en la Issue #67, en la que se describe la arquitectura event-driven de jizt, dentro del framework de Kafka existen los topics a donde los productores envían sus mensajes, y de los cuales los consumidores los consumen.
Se puede encontrar más información sobre los topics de Kafka en su sitio web.
Recordando, nuestra arquitectura tiene el siguiente aspecto:
En el anterior diagrama, los topics estarían incluidos dentro del Kafka Broker:
El Dispatcher, por su parte, consumiría de todos los anteriores topics a fin de actualizar el estado del job en cuestión.
Pequeña introducción a Docker: ¿qué es?, ¿cómo funciona?, instalación, uso básico, etc.
Investigar cómo llevar a cabo el guardado y la carga de los modelos preentrenados de Hugging Face.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.