Aspectos destacados • Descripción general • Instalación • Primeros pasos • Centro • Documentación • Tutorial • Contribución • Notas de la versión • Blog
GNES [ jee-nes ] es Generic Neural Elastic Search , un sistema de búsqueda semántica nativo de la nube basado en una red neuronal profunda.
GNES permite la búsqueda semántica y de índice a gran escala de texto a texto , imagen a imagen , vídeo a vídeo y contenido cualquiera a cualquier formato.
? Para saber más sobre los principios clave de GNES, lea esta publicación de blog
☁️Nativo de la nube y elástico | ?Fácil de usar | ?Lo último |
---|---|---|
¡GNES es un microservicio todo en uno ! El codificador, el indexador, el preprocesador y el enrutador se ejecutan en sus propios contenedores. Se comunican a través de API versionadas y colaboran bajo la orquestación de Docker Swarm/Kubernetes, etc. Escalado, equilibrio de carga, recuperación automatizada, están disponibles en GNES. | ¿Cuánto tiempo llevaría implementar un cambio que implica simplemente cambiar una capa en VGG? En GNES, esto es sólo un cambio de línea en un archivo YAML. Abstraemos la lógica de codificación e indexación a una configuración YAML, para que pueda cambiar o apilar codificadores e indexadores sin siquiera tocar el código base. | Aprovechando las comunidades de IA/ML/NLP/CV en rápida evolución, aprendemos de los mejores modelos de aprendizaje profundo y los conectamos a GNES, asegurándonos de que siempre disfrute del rendimiento de última generación. |
?Genérico y universal | ?Modelo como complemento | ?Mejores prácticas |
¿Busca textos, imágenes o incluso vídeos cortos? ¿Usando Python/C/Java/Go/HTTP como cliente? No importa qué formato de contenido tengas o qué idioma utilices, GNES puede manejarlos todos. | Cuando los modelos integrados no cumplan con sus requisitos, simplemente construya el suyo propio con GNES Hub. Empaque su modelo como un contenedor acoplable y utilícelo como complemento. | Nos encanta aprender las mejores prácticas de la comunidad, ayudando a nuestro GNES a alcanzar el siguiente nivel de disponibilidad, resiliencia, rendimiento y durabilidad. Si tiene alguna idea o sugerencia, no dude en contribuir. |
GNES Hub envía modelos AI/ML como contenedores Docker y utiliza contenedores Docker como complementos. Ofrece una forma limpia y sostenible de portar algoritmos externos (con las dependencias) al marco GNES. GNES Hub está alojado en Docker Hub. |
Hay dos formas de obtener GNES, ya sea como una imagen de Docker o como un paquete PyPi. Para los usuarios de la nube, recomendamos encarecidamente utilizar GNES a través de Docker .
docker run gnes/gnes:latest-alpine
Este comando descarga la última imagen de GNES (basada en Alpine Linux) y la ejecuta en un contenedor. Cuando el contenedor se ejecuta, imprime un mensaje informativo y sale.
Además de la imagen alpine
optimizada para el espacio, también proporcionamos imágenes basadas en Buster (Debian 10.0), Ubuntu 18.04 y Ubuntu 16.04. La siguiente tabla resume todas las etiquetas GNES disponibles. Se puede completar {ver}
con latest
, stable
o v0..xx
. latest
se refiere al último maestro de este repositorio, que puede no ser estable. Le recomendamos utilizar una versión oficial cambiando la latest
a un número de versión, digamos v0.0.24
, o simplemente usando stable
para la última versión, por ejemplo, gnes:stable-ubuntu
Etiqueta | Tamaño y capas | Descripción |
---|---|---|
{ver}-alpine | basado en Alpine Linux; sin bibliotecas de aprendizaje profundo; Extremadamente liviano y portátil, permite un escalado rápido incluso en dispositivos de borde. | |
{ver}-buster | basado en Debian 10.0; sin bibliotecas de aprendizaje profundo; Recomendado para construir o ampliar una imagen de GNES-Hub. | |
{ver}-ubuntu18 | basado en Ubuntu 18.04; sin bibliotecas de aprendizaje profundo. | |
{ver}-full | basado en Ubuntu 16.04; python-3.6.8, cuda-10.0, tf1.14, pytorch1.1, faiss, múltiples modelos previamente entrenados; pesado pero autónomo, útil para probar GNES de un extremo a otro. |
️ Desde el 21/10/2019, dejamos de alojar el espejo público Tencent Cloud. Las imágenes antiguas de Docker todavía existen, pero ya no habrá imágenes nuevas disponibles en Tencent Cloud.
También proporcionamos paquetes de Github espejo público. Selecciona el espejo que te sirva bien.
docker login --username=xxx docker.pkg.github.com/gnes-ai/gnes # login to github package so that we can pull from it
docker run docker.pkg.github.com/gnes-ai/gnes/gnes:latest-alpine
La siguiente tabla muestra el estado de la canalización de compilación.
Registro | Estado de construcción |
---|---|
Centro acoplablegnes/gnes:[tag] | |
Paquete Githubdocker.pkg.github.com/gnes-ai/gnes/gnes:[tag] |
pip
También puedes instalar GNES como un paquete Python3 a través de:
pip install gnes
Tenga en cuenta que esto sólo instalará una versión "barebone" de GNES, que consta de las dependencias mínimas para ejecutar GNES. No se instalarán modelos previamente entrenados de terceros, ni paquetes de aprendizaje profundo/NLP/CV. Establecemos esta configuración como el comportamiento de instalación predeterminado, ya que un modelo interesado en los ingenieros de PNL puede no interesarles a los ingenieros de CV. En GNES, los modelos sirven como complementos de Docker.
? Tensorflow, Pytorch y torchvision no forman parte de la instalación de GNES. Dependiendo de tu modelo, es posible que tengas que instalarlos con antelación.
Aunque no se recomienda, puedes instalar GNES con dependencias completas a través de:
pip install gnes[all]
pip instalar gnes[bert] | bert-serving-servidor>=1.8.6, bert-serving-cliente>=1.8.6 |
pip instalar gnes[estilo] | estilo>=0.4.1 |
pip install gnes[molesto] | molestar==1.15.2 |
pip instalar gnes[chino] | jieba |
pip install gnes[visión] | opencv-python>=4.0.0, imagehash>=4.0 |
pip instala gnes[leveldb] | nivel>=1.0.5 |
pip instalar gnes[prueba] | pylint, memoria_profiler>=0.55.0, psutil>=5.6.1, gputil>=1.4.0 |
pip install gnes[transformadores] | transformadores-pytorch |
pip instalar gnes[onnx] | tiempo de ejecución |
pip instalar gnes[audio] | librosa>=0.7.0 |
pip instalar gnes[scipy] | picante |
pip instalar gnes[nlp] | bert-serving-server>=1.8.6, pytorch-transformers, flair>=0.4.1, bert-serving-client>=1.8.6 |
pip instalar gnes[cn_nlp] | pytorch-transformers, bert-serving-client>=1.8.6, bert-serving-server>=1.8.6, jieba, flair>=0.4.1 |
pip instalar gnes[todos] | pylint, psutil>=5.6.1, pytorch-transformers, molestar==1.15.2, bert-serving-client>=1.8.6, gputil>=1.4.0, bert-serving-server>=1.8.6, imagehash >=4.0, onnxruntime, memoria_profiler>=0.55.0, jieba, flair>=0.4.1, librosa>=0.7.0, scipy, plyvel>=1.0.5, opencv-python>=4.0.0 |
Una buena forma de seleccionar dependencias es seguir el ejemplo de GNES Hub y crear su propia imagen de GNES.
De cualquier manera, si terminas leyendo el siguiente mensaje después de que $ gnes
o $ docker run gnes/gnes
, ¡entonces estás listo para comenzar!
Antes de comenzar, permítanme presentarles dos conceptos importantes en GNES: microservicio y flujo de trabajo .
Para los ingenieros de aprendizaje automático y científicos de datos que no están familiarizados con el concepto de microservicio y nativo de la nube , pueden imaginarse un microservicio como una aplicación en su teléfono inteligente. Cada aplicación se ejecuta de forma independiente y una aplicación puede cooperar con otras aplicaciones para realizar una tarea. En GNES, tenemos cuatro aplicaciones fundamentales, también conocidas como. microservicios, son:
En GNES, hemos implementado docenas de preprocesadores, codificadores e indexadores para procesar diferentes formas de contenido, como imágenes, texto y videos. También es muy fácil conectar su propia implementación, que veremos como ejemplo en la secuela.
Ahora que tenemos un montón de aplicaciones, ¿qué esperamos que hagan? Un sistema de búsqueda típico tiene dos tareas fundamentales: indexar y consultar . El índice almacena los documentos, la consulta busca los documentos. En un sistema de búsqueda neuronal, uno puede enfrentarse a otra tarea: entrenar , donde se ajusta un codificador/preprocesador de acuerdo con la distribución de datos para lograr una mejor relevancia de la búsqueda.
Estas tres tareas corresponden a tres flujos de trabajo diferentes en GNES.
Desde
v0.0.46
GNES Flow se ha convertido en la interfaz principal de GNES. GNES Flow proporciona una forma pitónica e intuitiva de implementar un flujo de trabajo , lo que permite a los usuarios ejecutar o depurar GNES en una máquina local. De forma predeterminada, GNES Flow organiza todos los microservicios utilizando un backend multiproceso o multiproceso; también se puede exportar a una configuración YAML de Docker Swarm/Kubernetes, lo que permite entregar GNES a la nube.
? El ejemplo completo y el Jupyter Notebook correspondiente se pueden encontrar aquí.
En este ejemplo, usaremos la nueva API gnes.flow
(se requiere gnes >= 0.0.46
) para crear un sistema de búsqueda de imágenes de juguetes para indexar y recuperar flores en función de sus similitudes.
Primero definamos el flujo de trabajo de indexación de la siguiente manera:
from gnes . flow import Flow
flow = ( Flow ( check_version = False )
. add_preprocessor ( name = 'prep' , yaml_path = 'yaml/prep.yml' )
. add_encoder ( yaml_path = 'yaml/incep.yml' )
. add_indexer ( name = 'vec_idx' , yaml_path = 'yaml/vec.yml' )
. add_indexer ( name = 'doc_idx' , yaml_path = 'yaml/doc.yml' , recv_from = 'prep' )
. add_router ( name = 'sync' , yaml_path = 'BaseReduceRouter' , num_part = 2 , recv_from = [ 'vec_idx' , 'doc_idx' ]))
Aquí, utilizamos el modelo previamente entrenado inceptionV4 como codificador y los indexadores integrados para almacenar vectores y documentos. El flujo debería explicarse por sí mismo; si no, siempre puedes convertirlo a una imagen SVG y ver su visualización:
flow . build ( backend = None ). to_url ()
Para indexar nuestros datos de flores, necesitamos un iterador que genere cadenas bytes
y alimente esas cadenas bytes
al flujo definido.
def read_flowers ( sample_rate = 1.0 ):
with tarfile . open ( '17flowers.tgz' ) as fp :
for m in fp . getmembers ():
if m . name . endswith ( '.jpg' ) and random . random () <= sample_rate :
yield fp . extractfile ( m ). read ()
Ahora podemos realizar la indexación a través del backend multiproceso:
with flow ( backend = 'process' ) as fl :
fl . index ( bytes_gen = read_flowers (), batch_size = 64 )
Tardará unos minutos dependiendo de su máquina.
Simplemente tomamos una muestra de 20 imágenes de flores como consultas y buscamos sus 10 imágenes similares principales:
num_q = 20
topk = 10
sample_rate = 0.05
# do the query
results = []
with flow . build ( backend = 'process' ) as fl :
for q , r in fl . query ( bytes_gen = read_flowers ( sample_rate )):
q_img = q . search . query . raw_bytes
r_imgs = [ k . doc . raw_bytes for k in r . search . topk_results ]
r_scores = [ k . score . value for k in r . search . topk_results ]
results . append (( q_img , r_imgs , r_scores ))
if len ( results ) > num_q :
break
Aquí está el resultado, donde las consultas están en la primera fila.
Se puede convertir un objeto Flow
en un archivo de composición Docker Swarm/Kubernetes YAML muy fácilmente a través de:
flow . build ( backend = None ). to_swarm_yaml ()
version : ' 3.4 '
services :
Frontend0 :
image : gnes/gnes:latest-alpine
command : frontend --port_in 56086 --port_out 52674 --port_ctrl 49225 --check_version
False --ctrl_with_ipc True
prep :
image : gnes/gnes:latest-alpine
command : preprocess --port_in 52674 --port_out 65461 --host_in Frontend0 --socket_in
PULL_CONNECT --socket_out PUB_BIND --port_ctrl 49281 --check_version False --ctrl_with_ipc
True --yaml_path yaml/prep.yml
Encoder0 :
image : gnes/gnes:latest-alpine
command : encode --port_in 65461 --port_out 50488 --host_in prep --socket_in SUB_CONNECT
--port_ctrl 62298 --check_version False --ctrl_with_ipc True --yaml_path yaml/incep.yml
vec_idx :
image : gnes/gnes:latest-alpine
command : index --port_in 50488 --port_out 57791 --host_in Encoder0 --host_out
sync --socket_in PULL_CONNECT --socket_out PUSH_CONNECT --port_ctrl 58367 --check_version
False --ctrl_with_ipc True --yaml_path yaml/vec.yml
doc_idx :
image : gnes/gnes:latest-alpine
command : index --port_in 65461 --port_out 57791 --host_in prep --host_out sync
--socket_in SUB_CONNECT --socket_out PUSH_CONNECT --port_ctrl 50333 --check_version
False --ctrl_with_ipc True --yaml_path yaml/doc.yml
sync :
image : gnes/gnes:latest-alpine
command : route --port_in 57791 --port_out 56086 --host_out Frontend0 --socket_out
PUSH_CONNECT --port_ctrl 51285 --check_version False --ctrl_with_ipc True --yaml_path
BaseReduceRouter --num_part 2
Para implementarlo, simplemente copie la configuración YAML generada en un archivo que diga my-gnes.yml
y luego haga
docker stack deploy --compose-file my-gnes.yml gnes-531
En este ejemplo, construiremos un motor de búsqueda de poemas semánticos usando GNES. A diferencia del ejemplo anterior de búsqueda de flores, aquí ejecutamos cada servicio como un contenedor Docker aislado y luego los organizamos a través de Docker Swarm. Representa un escenario común en la configuración de la nube. Aprenderá a utilizar imágenes GNES potentes y personalizadas desde GNES hub.
? Consulte este repositorio para obtener más detalles y siga las instrucciones para reproducirlo.
Hagamos un breve resumen de lo que hemos aprendido.
La documentación oficial de GNES está alojada en doc.gnes.ai. Se crea, actualiza y archiva automáticamente en cada nueva versión.
? El tutorial aún está en construcción. ¡Manténganse al tanto! Mientras tanto, ¡le invitamos sinceramente a contribuir con su propia experiencia de aprendizaje/estudio de caso con GNES!
PyTorch-Transformers
a GNESbert-as-service
Hemos configurado este repositorio para rastrear la latencia de la red en diferentes versiones de GNES. Como parte del proceso CICD, este repositorio se actualiza automáticamente cuando se actualiza el maestro GNES o se lanza una nueva versión de GNES.
❤️ El comienzo siempre es el más difícil. Pero no temas, incluso si encuentras un error tipográfico, una cadena de documentación faltante o una prueba unitaria, puedes simplemente corregirlos comprometiéndote con GNES. Aquí están los pasos:
fix-gnes-typo-1
fix(readme): improve the readability and move sections
fix(readme): improve the readability and move sections
¡Bien hecho! Una vez que se fusiona un PR, estas son las cosas que sucedieron a continuación:
-latest
se actualizarán automáticamente en una hora. Puede consultar el estado de su edificio aquí.-stable
se actualizarán en consecuencia.Se pueden encontrar más detalles en las pautas para contribuyentes.
Si utiliza GNES en un artículo académico, puede hacer una cita. Aquí están las dos formas de citar GNES:
footnote{https://github.com/gnes-ai/gnes}
@misc{tencent2019GNES,
title={GNES: Generic Neural Elastic Search},
author={Xiao, Han and Yan, Jianfeng and Wang, Feng and Fu, Jie and Liu, Kai},
howpublished={ url {https://github.com/gnes-ai}},
year={2019}
}
Si ha descargado una copia del código fuente o binario de GNES, tenga en cuenta que tanto el código fuente como el binario de GNES tienen la licencia Apache, versión 2.0.
Tencent se complace en apoyar a la comunidad de código abierto al hacer que GNES esté disponible.