Highlights • Übersicht • Installation • Erste Schritte • Hub • Dokumentation • Tutorial • Mitwirken • Versionshinweise • Blog
GNES [ jee-nes ] ist Generic Neural Elastic Search , ein Cloud-natives semantisches Suchsystem, das auf einem tiefen neuronalen Netzwerk basiert.
GNES ermöglicht eine umfassende Index- und semantische Suche für Text-zu-Text- , Bild-zu-Bild- , Video-zu-Video- und Any-to-Any- Inhaltsformen.
? Um mehr über die wichtigsten Grundsätze von GNES zu erfahren, lesen Sie diesen Blogbeitrag
☁️Cloud-nativ und elastisch | ?Einfach zu bedienen | ?Stand der Technik |
---|---|---|
GNES ist All-in-Microservice ! Encoder, Indexer, Präprozessor und Router laufen alle in ihren eigenen Containern. Sie kommunizieren über versionierte APIs und arbeiten unter der Orchestrierung von Docker Swarm/Kubernetes usw. zusammen. Skalierung, Lastausgleich, automatisierte Wiederherstellung – sie sind in GNES von der Stange. | Wie lange würde es dauern, eine Änderung bereitzustellen, bei der nur eine Ebene in VGG gewechselt wird? In GNES ist dies nur eine Zeilenänderung in einer YAML-Datei. Wir abstrahieren die Codierungs- und Indexierungslogik in eine YAML-Konfiguration, sodass Sie Encoder und Indexer ändern oder stapeln können, ohne die Codebasis auch nur zu berühren. | Wir nutzen die sich schnell entwickelnden KI-/ML-/NLP-/CV-Communitys, lernen von den besten Deep-Learning-Modellen und integrieren sie in GNES, um sicherzustellen, dass Sie immer in den Genuss der hochmodernen Leistung kommen. |
?Generisch und universell | ?Modell als Plugin | ?Best Practice |
Suchen Sie nach Texten, Bildern oder sogar Kurzvideos? Verwenden Sie Python/C/Java/Go/HTTP als Client? Egal welche Inhaltsform Sie haben oder welche Sprache Sie verwenden, GNES kann sie alle verarbeiten. | Wenn integrierte Modelle Ihren Anforderungen nicht genügen, erstellen Sie einfach Ihre eigenen mit GNES Hub. Packen Sie Ihr Modell als Docker-Container und verwenden Sie es als Plugin. | Wir lieben es, die Best Practices aus der Community zu lernen und unserem GNES dabei zu helfen, die nächste Stufe der Verfügbarkeit, Ausfallsicherheit, Leistung und Haltbarkeit zu erreichen. Wenn Sie Ideen oder Vorschläge haben, können Sie gerne einen Beitrag leisten. |
GNES Hub liefert AI/ML-Modelle als Docker-Container und verwendet Docker-Container als Plugins. Es bietet eine saubere und nachhaltige Möglichkeit, externe Algorithmen (mit den Abhängigkeiten) in das GNES-Framework zu portieren. GNES Hub wird auf dem Docker Hub gehostet. |
Es gibt zwei Möglichkeiten, GNES zu erhalten, entweder als Docker-Image oder als PyPi-Paket. Für Cloud-Benutzer empfehlen wir dringend die Verwendung von GNES über Docker .
docker run gnes/gnes:latest-alpine
Dieser Befehl lädt das neueste GNES-Image (basierend auf Alpine Linux) herunter und führt es in einem Container aus. Wenn der Container ausgeführt wird, gibt er eine Informationsmeldung aus und wird beendet.
Neben dem für den Weltraum optimierten alpine
Image stellen wir auch auf Buster (Debian 10.0), Ubuntu 18.04 und Ubuntu 16.04 basierende Images bereit. Die folgende Tabelle fasst alle verfügbaren GNES-Tags zusammen. Man kann {ver}
mit latest
, stable
oder v0..xx
ausfüllen. latest
bezieht sich auf den neuesten Master dieses Repositorys, der möglicherweise nicht stabil ist. Wir empfehlen Ihnen, eine offizielle Version zu verwenden, indem Sie die latest
in eine Versionsnummer ändern, z. B. v0.0.24
, oder einfach stable
für die letzte Version verwenden, z. B. gnes:stable-ubuntu
Etikett | Größe und Schichten | Beschreibung |
---|---|---|
{ver}-alpine | basierend auf Alpine Linux; keine Deep-Learning-Bibliotheken; extrem leicht und tragbar, ermöglicht eine schnelle Skalierung auf Even-Edge-Geräten. | |
{ver}-buster | basierend auf Debian 10.0; keine Deep-Learning-Bibliotheken; Empfohlen zum Erstellen oder Erweitern eines GNES-Hub-Images. | |
{ver}-ubuntu18 | basierend auf Ubuntu 18.04; keine Deep-Learning-Bibliotheken. | |
{ver}-full | basierend auf Ubuntu 16.04; Python-3.6.8, Cuda-10.0, TF1.14, Pytorch1.1, Faiss, mehrere vorab trainierte Modelle; Schwer, aber in sich geschlossen, nützlich beim End-to-End-Testen von GNES. |
️ Seit dem 21.10.2019 hosten wir den öffentlichen Mirror Tencent Cloud nicht mehr. Die alten Docker-Images sind noch vorhanden, aber es werden keine neuen Images mehr auf Tencent Cloud verfügbar sein.
Wir bieten auch öffentliche Github-Spiegelpakete an. Wählen Sie den Spiegel aus, der Ihnen gute Dienste leistet.
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
Die folgende Tabelle zeigt den Status der Build-Pipeline.
Registrierung | Build-Status |
---|---|
Docker-Hubgnes/gnes:[tag] | |
Github-Paketdocker.pkg.github.com/gnes-ai/gnes/gnes:[tag] |
pip
Sie können GNES auch als Python3 -Paket installieren über:
pip install gnes
Beachten Sie, dass dadurch nur eine „Barebone“-Version von GNES installiert wird, die aus den minimalen Abhängigkeiten für die Ausführung von GNES besteht. Es werden keine vorab trainierten Modelle von Drittanbietern, Deep-Learning-/NLP-/CV-Pakete installiert. Wir legen dieses Setup als Standardinstallationsverhalten fest, da ein für NLP-Ingenieure interessantes Modell für CV-Ingenieure möglicherweise nicht von Interesse ist. In GNES dienen Modelle als Docker-Plugins.
? Tensorflow, Pytorch und Torchvision sind nicht Teil der GNES-Installation. Abhängig von Ihrem Modell müssen Sie diese möglicherweise vorab installieren.
Obwohl dies nicht empfohlen wird, können Sie GNES mit vollständigen Abhängigkeiten installieren über:
pip install gnes[all]
pip install gnes[bert] | bert-serving-server>=1.8.6, bert-serving-client>=1.8.6 |
pip install gnes[flair] | Flair>=0,4,1 |
pip install gnes[nerven] | nervig==1.15.2 |
pip install gnes[chinesisch] | jieba |
pip install gnes[vision] | opencv-python>=4.0.0, imagehash>=4.0 |
pip install gnes[leveldb] | Lagenhöhe>=1,0,5 |
pip install gnes[test] | pylint, Memory_profiler>=0.55.0, psutil>=5.6.1, gputil>=1.4.0 |
pip install gnes[transformers] | Pytorch-Transformatoren |
pip install gnes[onnx] | onnxruntime |
pip install gnes[audio] | librosa>=0,7,0 |
pip install gnes[scipy] | scipy |
pip install gnes[nlp] | bert-serving-server>=1.8.6, pytorch-transformers, flair>=0.4.1, bert-serving-client>=1.8.6 |
pip install gnes[cn_nlp] | pytorch-transformers, bert-serving-client>=1.8.6, bert-serving-server>=1.8.6, jieba, flair>=0.4.1 |
pip install gnes[all] | 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 |
Eine gute Möglichkeit, Abhängigkeiten auszuwählen, besteht darin, dem Beispiel in GNES Hub zu folgen und ein eigenes GNES-Image zu erstellen.
So oder so: Wenn Sie nach $ gnes
oder $ docker run gnes/gnes
die folgende Meldung lesen, können Sie loslegen!
Bevor wir beginnen, möchte ich zunächst zwei wichtige Konzepte in GNES vorstellen: Microservice und Workflow .
Ingenieure für maschinelles Lernen und Datenwissenschaftler, die mit dem Konzept von Cloud-Native und Microservices nicht vertraut sind, können sich einen Microservice als App auf Ihrem Smartphone vorstellen. Jede App wird unabhängig ausgeführt und eine App kann mit anderen Apps zusammenarbeiten, um eine Aufgabe zu erfüllen. In GNES haben wir vier grundlegende Apps, auch bekannt als: Microservices, das sind:
In GNES haben wir Dutzende von Präprozessoren, Encodern und Indexern implementiert, um verschiedene Inhaltsformen wie Bilder, Text und Videos zu verarbeiten. Es ist auch super einfach, Ihre eigene Implementierung einzubinden, was wir in der Fortsetzung als Beispiel sehen werden.
Was erwarten wir von ihnen, nachdem wir nun eine Reihe von Apps haben? Ein typisches Suchsystem hat zwei grundlegende Aufgaben: Index und Abfrage . Der Index speichert die Dokumente, die Abfrage durchsucht die Dokumente. In einem neuronalen Suchsystem steht man möglicherweise vor einer anderen Aufgabe: Trainieren , bei der man einen Encoder/Präprozessor entsprechend der Datenverteilung feinabstimmt, um eine bessere Suchrelevanz zu erreichen.
Diese drei Aufgaben entsprechen drei verschiedenen Arbeitsabläufen in GNES.
Seit
v0.0.46
ist GNES Flow die Hauptschnittstelle von GNES. GNES Flow bietet eine pythonische und intuitive Möglichkeit, einen Workflow zu implementieren, sodass Benutzer GNES auf einem lokalen Computer ausführen oder debuggen können. Standardmäßig orchestriert GNES Flow alle Microservices mithilfe eines Multithread- oder Multiprozess-Backends. Es kann auch in eine Docker Swarm/Kubernetes YAML-Konfiguration exportiert werden, sodass GNES in der Cloud bereitgestellt werden kann.
? Das vollständige Beispiel und das dazugehörige Jupyter Notebook finden Sie hier.
In diesem Beispiel verwenden wir die neue gnes.flow
API ( gnes >= 0.0.46
ist erforderlich), um ein Suchsystem für Spielzeugbilder zum Indizieren und Abrufen von Blumen basierend auf ihren Ähnlichkeiten zu erstellen.
Definieren wir zunächst den Indexierungsworkflow durch:
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' ]))
Hier verwenden wir das vorab trainierte Modell inceptionV4 als Encoder und die integrierten Indexer zum Speichern von Vektoren und Dokumenten. Der Ablauf sollte ziemlich selbsterklärend sein. Wenn nicht, können Sie ihn jederzeit in ein SVG-Bild konvertieren und seine Visualisierung sehen:
flow . build ( backend = None ). to_url ()
Um unsere Blumendaten zu indizieren, benötigen wir einen Iterator, der bytes
Strings generiert und diese bytes
Strings in den definierten Fluss einspeist.
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 ()
Wir können jetzt die Indizierung über das Multiprozess-Backend durchführen:
with flow ( backend = 'process' ) as fl :
fl . index ( bytes_gen = read_flowers (), batch_size = 64 )
Abhängig von Ihrer Maschine dauert es einige Minuten.
Wir probieren einfach 20 Blumenbilder als Suchanfragen aus und suchen nach den 10 ähnlichsten Bildern:
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
Hier ist das Ergebnis, wobei die Abfragen in der ersten Zeile stehen.
Man kann ein Flow
Objekt ganz einfach in eine Docker Swarm/Kubernetes YAML-Compose-Datei konvertieren über:
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
Um es bereitzustellen, kopieren Sie einfach die generierte YAML-Konfiguration in eine Datei, beispielsweise my-gnes.yml
, und führen Sie dann den Vorgang aus
docker stack deploy --compose-file my-gnes.yml gnes-531
In diesem Beispiel erstellen wir mit GNES eine semantische Gedichtsuchmaschine. Im Gegensatz zum vorherigen Beispiel für die Blumensuche führen wir hier jeden Dienst als isolierten Docker-Container aus und orchestrieren ihn dann über Docker Swarm. Es stellt ein häufiges Szenario in den Cloud-Einstellungen dar. Sie erfahren, wie Sie leistungsstarke und benutzerdefinierte GNES-Bilder vom GNES-Hub verwenden.
? Bitte schauen Sie sich dieses Repository an, um Einzelheiten zu erfahren, und befolgen Sie die Anweisungen zum Reproduzieren.
Lassen Sie uns kurz zusammenfassen, was wir gelernt haben.
Die offizielle Dokumentation von GNES wird auf doc.gnes.ai gehostet. Es wird bei jeder neuen Version automatisch erstellt, aktualisiert und archiviert.
? Das Tutorial befindet sich noch im Aufbau. Bleiben Sie dran! In der Zwischenzeit heißen wir Sie herzlich willkommen, Ihre eigene Lernerfahrung/Fallstudie mit GNES einzubringen!
PyTorch-Transformers
in GNESbert-as-service
Wir haben dieses Repository eingerichtet, um die Netzwerklatenz über verschiedene GNES-Versionen hinweg zu verfolgen. Als Teil der CICD-Pipeline wird dieses Repo automatisch aktualisiert, wenn der GNES-Master aktualisiert oder eine neue GNES-Version veröffentlicht wird.
❤️ Der Anfang ist immer der Schwierigste. Aber keine Angst, selbst wenn Sie einen Tippfehler, eine fehlende Dokumentzeichenfolge oder einen Komponententest finden, können Sie diese einfach korrigieren, indem Sie einen Commit bei GNES durchführen. Hier sind die Schritte:
fix-gnes-typo-1
fix(readme): improve the readability and move sections
fix(readme): improve the readability and move sections
Gut gemacht! Sobald eine PR zusammengeführt wird, geschieht Folgendes:
-latest
getaggten Docker-Images werden innerhalb einer Stunde automatisch aktualisiert. Sie können den Baustatus hier überprüfen-stable
markierten Docker-Images entsprechend aktualisiert.Weitere Einzelheiten finden Sie in den Richtlinien für Mitwirkende.
Wenn Sie GNES in einer wissenschaftlichen Arbeit verwenden, können Sie gerne zitieren. Es gibt zwei Möglichkeiten, GNES zu zitieren:
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}
}
Wenn Sie eine Kopie der GNES-Binärdatei oder des Quellcodes heruntergeladen haben, beachten Sie bitte, dass sowohl die GNES-Binärdatei als auch der Quellcode unter der Apache-Lizenz, Version 2.0, lizenziert sind.
Tencent freut sich, die Open-Source-Community durch die Bereitstellung von GNES zu unterstützen.