Points forts • Présentation • Installation • Mise en route • Hub • Documentation • Tutoriel • Contribution • Notes de version • Blog
GNES [ jee-nes ] est Generic Neural Elastic Search , un système de recherche sémantique natif du cloud basé sur un réseau neuronal profond.
GNES permet un index à grande échelle et une recherche sémantique de texte à texte , d'image à image , de vidéo à vidéo et de toute forme de contenu.
? Pour en savoir plus sur les principes clés de GNES, lisez cet article de blog
☁️Cloud-natif et élastique | ?Facile à utiliser | ?État de l'art |
---|---|---|
GNES est un microservice tout-en-un ! L'encodeur, l'indexeur, le préprocesseur et le routeur fonctionnent tous dans leurs propres conteneurs. Ils communiquent via des API versionnées et collaborent sous l'orchestration de Docker Swarm/Kubernetes, etc. Mise à l'échelle, équilibrage de charge, récupération automatisée, ils sont disponibles dans le commerce dans GNES. | Combien de temps faudrait-il pour déployer un changement impliquant simplement le changement de couche dans VGG ? Dans GNES, il ne s'agit que d'un changement de ligne dans un fichier YAML. Nous résumons la logique d'encodage et d'indexation dans une configuration YAML, afin que vous puissiez modifier ou empiler les encodeurs et indexeurs sans même toucher à la base de code. | Tirant parti des communautés IA/ML/NLP/CV en évolution rapide, nous apprenons des meilleurs modèles d'apprentissage profond et les connectons à GNES, en veillant à ce que vous profitiez toujours des performances de pointe. |
?Générique et universel | ?Modèle en tant que plugin | ?Meilleure pratique |
Vous recherchez des textes, des images ou même de courtes vidéos ? Vous utilisez Python/C/Java/Go/HTTP comme client ? Peu importe la forme de contenu dont vous disposez ou la langue que vous utilisez, GNES peut tous les gérer. | Lorsque les modèles intégrés ne répondent pas à vos besoins, créez simplement le vôtre avec GNES Hub. Emballez votre modèle sous forme de conteneur Docker et utilisez-le comme plugin. | Nous aimons apprendre les meilleures pratiques de la communauté, aidant ainsi notre GNES à atteindre le niveau supérieur de disponibilité, de résilience, de performance et de durabilité. Si vous avez des idées ou des suggestions, n'hésitez pas à contribuer. |
GNES Hub expédie les modèles AI/ML sous forme de conteneurs Docker et utilise les conteneurs Docker comme plugins. Il offre un moyen propre et durable de porter des algorithmes externes (avec les dépendances) dans le framework GNES. GNES Hub est hébergé sur Docker Hub. |
Il existe deux façons d'obtenir GNES, soit sous forme d'image Docker, soit sous forme de package PyPi. Pour les utilisateurs du cloud, nous recommandons fortement d'utiliser GNES via Docker .
docker run gnes/gnes:latest-alpine
Cette commande télécharge la dernière image GNES (basée sur Alpine Linux) et l'exécute dans un conteneur. Lorsque le conteneur s'exécute, il imprime un message d'information et se ferme.
Outre l'image alpine
optimisée pour l'espace, nous fournissons également des images basées sur Buster (Debian 10.0), Ubuntu 18.04 et Ubuntu 16.04. Le tableau ci-dessous résume toutes les balises GNES disponibles. On peut remplir {ver}
avec latest
, stable
ou v0..xx
. latest
fait référence au dernier maître de ce référentiel, qui peut ne pas être stable. Nous vous recommandons d'utiliser une version officielle en remplaçant la latest
par un numéro de version, par exemple v0.0.24
, ou simplement en utilisant stable
pour la dernière version, par exemple gnes:stable-ubuntu
Étiqueter | Taille et couches | Description |
---|---|---|
{ver}-alpine | basé sur Alpine Linux; pas de bibliothèques d'apprentissage profond ; extrêmement léger et portable, permet une mise à l'échelle rapide, même sur les appareils de pointe. | |
{ver}-buster | basé sur Debian 10.0 ; pas de bibliothèques d'apprentissage profond ; recommandé pour créer ou étendre une image GNES-Hub. | |
{ver}-ubuntu18 | basé sur Ubuntu 18.04 ; pas de bibliothèques d'apprentissage profond. | |
{ver}-full | basé sur Ubuntu 16.04 ; python-3.6.8, cuda-10.0, tf1.14, pytorch1.1, faiss, plusieurs modèles pré-entraînés ; lourd mais autonome, utile pour tester GNES de bout en bout. |
️ Depuis le 21/10/2019, nous avons arrêté d'héberger le miroir public Tencent Cloud. Les anciennes images Docker existent toujours, mais il n'y aura plus de nouvelles images disponibles sur Tencent Cloud.
Nous fournissons également un miroir public des packages Github. Sélectionnez le miroir qui vous sert 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
Le tableau ci-dessous montre l'état du pipeline de build.
Enregistrement | Statut de construction |
---|---|
Centre Dockergnes/gnes:[tag] | |
Forfait GitHubdocker.pkg.github.com/gnes-ai/gnes/gnes:[tag] |
pip
Vous pouvez également installer GNES en tant que package Python3 via :
pip install gnes
Notez que cela installera uniquement une version "barebone" de GNES, comprenant les dépendances minimales pour exécuter GNES. Aucun modèle tiers pré-entraîné, aucun package d'apprentissage profond/NLP/CV ne sera installé. Nous faisons de cette configuration le comportement d'installation par défaut, car un modèle intéressant les ingénieurs NLP peut ne pas intéresser les ingénieurs CV. Dans GNES, les modèles servent de plugins Docker.
? Tensorflow, Pytorch et torchvision ne font pas partie de l'installation de GNES. Selon votre modèle, vous devrez peut-être les installer à l'avance.
Bien que cela ne soit pas recommandé, vous pouvez installer GNES avec toutes les dépendances via :
pip install gnes[all]
pip installer gnes[bert] | bert-serving-server>=1.8.6, bert-serving-client>=1.8.6 |
pip installer gnes[flair] | flair>=0.4.1 |
pip installer gnes[ennuyer] | ennuyer==1.15.2 |
pip install gnes[chinois] | jieba |
pip installer gnes[vision] | opencv-python>=4.0.0, imagehash>=4.0 |
pip installer gnes[leveldb] | plyvel>=1.0.5 |
pip installer gnes[test] | pylint, profil_mémoire>=0.55.0, psutil>=5.6.1, gputil>=1.4.0 |
pip installer gnes[transformateurs] | transformateurs pytorch |
pip installer gnes[onnx] | onnxruntime |
pip installer gnes[audio] | bibliothèque>=0.7.0 |
pip installer gnes[scipy] | scipy |
pip installer gnes[nlp] | bert-serving-server>=1.8.6, pytorch-transformers, flair>=0.4.1, bert-serving-client>=1.8.6 |
pip installer gnes[cn_nlp] | pytorch-transformers, bert-serving-client>=1.8.6, bert-serving-server>=1.8.6, jieba, flair>=0.4.1 |
pip installer gnes[tous] | pylint, psutil>=5.6.1, pytorch-transformers, annoy==1.15.2, bert-serving-client>=1.8.6, gputil>=1.4.0, bert-serving-server>=1.8.6, imagehash >=4.0, onnxruntime, memory_profiler>=0.55.0, jieba, flair>=0.4.1, librosa>=0.7.0, scipy, plyvel>=1.0.5, opencv-python>=4.0.0 |
Un bon moyen de sélectionner les dépendances consiste à suivre l'exemple de GNES Hub et à créer votre propre image GNES.
Quoi qu'il en soit, si vous finissez par lire le message suivant après $ gnes
ou $ docker run gnes/gnes
, alors vous êtes prêt à partir !
Avant de commencer, permettez-moi d'abord de présenter deux concepts importants dans GNES : le microservice et le workflow .
Pour les ingénieurs en apprentissage automatique et les data scientists qui ne sont pas familiers avec le concept de cloud natif et de microservice , on peut imaginer un microservice comme une application sur votre smartphone. Chaque application s'exécute indépendamment et une application peut coopérer avec d'autres applications pour accomplir une tâche. Dans GNES, nous avons quatre applications fondamentales, alias. les microservices, ce sont :
Dans GNES, nous avons implémenté des dizaines de préprocesseurs, encodeurs et indexeurs pour traiter différentes formes de contenu, telles que l'image, le texte, la vidéo. Il est également très simple de brancher votre propre implémentation, dont nous verrons un exemple dans la suite.
Maintenant que nous avons un tas d’applications, qu’attendons-nous d’elles ? Un système de recherche typique a deux tâches fondamentales : l'indexation et la requête . L'index stocke les documents, la requête recherche les documents. Dans un système de recherche neuronale, on peut être confronté à une autre tâche : train , où l'on ajuste un encodeur/préprocesseur en fonction de la distribution des données afin d'obtenir une meilleure pertinence de recherche.
Ces trois tâches correspondent à trois workflows différents dans GNES.
Depuis
v0.0.46
GNES Flow est devenu l'interface principale de GNES. GNES Flow fournit un moyen pythonique et intuitif de mettre en œuvre un flux de travail , permettant aux utilisateurs d'exécuter ou de déboguer GNES sur une machine locale. Par défaut, GNES Flow orchestre tous les microservices à l'aide d'un backend multi-thread ou multi-processus, il peut également être exporté vers une configuration Docker Swarm/Kubernetes YAML, permettant de fournir GNES sur le cloud.
? L’exemple complet et le Jupyter Notebook correspondant peuvent être trouvés ici.
Dans cet exemple, nous utiliserons la nouvelle API gnes.flow
( gnes >= 0.0.46
est requis) pour créer un système de recherche d'images de jouets permettant d'indexer et de récupérer des fleurs en fonction de leurs similitudes.
Définissons d'abord le workflow d'indexation par :
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' ]))
Ici, nous utilisons le modèle pré-entraîné inceptionV4 comme encodeur et indexeurs intégrés pour stocker les vecteurs et les documents. Le flux devrait être assez explicite, sinon vous pouvez toujours le convertir en image SVG et voir sa visualisation :
flow . build ( backend = None ). to_url ()
Pour indexer nos données de fleurs, nous avons besoin d'un itérateur qui génère des chaînes bytes
et alimente ces chaînes bytes
dans le flux défini.
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 ()
Nous pouvons désormais faire de l'indexation via le backend multi-processus :
with flow ( backend = 'process' ) as fl :
fl . index ( bytes_gen = read_flowers (), batch_size = 64 )
Cela prendra quelques minutes selon votre machine.
Nous échantillonnons simplement 20 images de fleurs sous forme de requêtes et recherchons leurs 10 images similaires les plus importantes :
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
Voici le résultat, où les requêtes sont sur la première ligne.
On peut convertir très facilement un objet Flow
en fichier de composition Docker Swarm/Kubernetes YAML via :
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
Pour le déployer, copiez simplement la configuration YAML générée dans un fichier, par exemple my-gnes.yml
, puis faites
docker stack deploy --compose-file my-gnes.yml gnes-531
Dans cet exemple, nous allons construire un moteur de recherche de poèmes sémantiques en utilisant GNES. Contrairement à l'exemple de recherche de fleurs précédent, nous exécutons ici chaque service en tant que conteneur Docker isolé, puis nous les orchestrons via Docker Swarm. Cela représente un scénario courant dans les paramètres cloud. Vous apprendrez à utiliser des images GNES puissantes et personnalisées à partir du hub GNES.
? Veuillez consulter ce référentiel pour plus de détails et suivre les instructions pour reproduire.
Faisons un bref récapitulatif de ce que nous avons appris.
La documentation officielle de GNES est hébergée sur doc.gnes.ai. Il est automatiquement construit, mis à jour et archivé à chaque nouvelle version.
? Le didacticiel est toujours en construction. Restez à l'écoute! En attendant, nous vous invitons sincèrement à apporter votre propre expérience d’apprentissage/étude de cas avec GNES !
PyTorch-Transformers
dans GNESbert-as-service
Nous avons configuré ce référentiel pour suivre la latence du réseau sur différentes versions de GNES. Dans le cadre du pipeline CICD, ce référentiel est automatiquement mis à jour lorsque le maître GNES est mis à jour ou qu'une nouvelle version de GNES est publiée.
❤️ Le début est toujours le plus dur. Mais n'ayez crainte, même si vous trouvez une faute de frappe, une docstring ou un test unitaire manquant, vous pouvez simplement les corriger en vous engageant dans GNES. Voici les étapes :
fix-gnes-typo-1
fix(readme): improve the readability and move sections
fix(readme): improve the readability and move sections
Bien joué! Une fois qu'un PR est fusionné, voici les événements suivants :
-latest
seront automatiquement mises à jour dans une heure. Vous pouvez vérifier l'état de sa construction ici-stable
seront mis à jour en conséquence.Plus de détails peuvent être trouvés dans les directives des contributeurs.
Si vous utilisez GNES dans un article universitaire, vous êtes plus que bienvenu pour faire une citation. Voici les deux manières de citer 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 vous avez téléchargé une copie du binaire ou du code source de GNES, veuillez noter que le binaire et le code source de GNES sont tous deux sous licence Apache, version 2.0.
Tencent est heureux de soutenir la communauté open source en rendant GNES disponible.