Основные моменты • Обзор • Установка • Начало работы • Центр • Документация • Учебное пособие • Участие • Примечания к выпуску • Блог
GNES [ jee-nes ] — это Generic Neural Elastic Search , облачная система семантического поиска, основанная на глубокой нейронной сети.
GNES обеспечивает крупномасштабный индексный и семантический поиск для форматов контента «текст-текст» , «изображение-изображение» , «видео-видео» и «любой-к-любому» .
? Чтобы узнать больше о ключевых принципах GNES, прочитайте эту публикацию в блоге.
☁️Облачный и эластичный | ?Простой в использовании | ?Уровень развития |
---|---|---|
GNES — это микросервис «все в одном» ! Кодер, индексатор, препроцессор и маршрутизатор работают в своих собственных контейнерах. Они общаются через версионные API и сотрудничают под управлением Docker Swarm/Kubernetes и т. д. Масштабирование, балансировка нагрузки, автоматическое восстановление — они уже готовы в GNES. | Сколько времени потребуется, чтобы развернуть изменение, которое включает просто переключение уровня в VGG? В GNES это всего лишь одно изменение строки в файле YAML. Мы абстрагируем логику кодирования и индексирования в конфигурацию YAML, чтобы вы могли изменять или объединять кодировщики и индексаторы, даже не касаясь базы кода. | Воспользовавшись преимуществами быстро развивающихся сообществ AI/ML/NLP/CV, мы учимся на лучших в своем классе моделях глубокого обучения и подключаем их к GNES, гарантируя, что вы всегда будете наслаждаться самой современной производительностью. |
?Общий и универсальный | ?Модель как плагин | ?Лучшая практика |
Ищете тексты, изображения или даже короткие видеоролики? Использование Python/C/Java/Go/HTTP в качестве клиента? Неважно, какую форму контента вы используете или какой язык вы используете, GNES справится со всем этим. | Если встроенные модели не соответствуют вашим требованиям, просто создайте свою собственную с помощью GNES Hub. Упакуйте свою модель как Docker-контейнер и используйте ее как плагин. | Нам нравится перенимать лучшие практики сообщества, помогая нашему GNES достичь нового уровня доступности, отказоустойчивости, производительности и долговечности. Если у вас есть какие-либо идеи или предложения, не стесняйтесь вносить свой вклад. |
GNES Hub поставляет модели AI/ML в виде контейнеров Docker и использует контейнеры Docker в качестве плагинов. Он предлагает чистый и устойчивый способ переноса внешних алгоритмов (с зависимостями) в структуру GNES. GNES Hub размещается на Docker Hub. |
Получить GNES можно двумя способами: в виде образа Docker или в виде пакета PyPi. Пользователям облака мы настоятельно рекомендуем использовать GNES через Docker .
docker run gnes/gnes:latest-alpine
Эта команда загружает последний образ GNES (на основе Alpine Linux) и запускает его в контейнере. Когда контейнер запускается, он печатает информационное сообщение и завершает работу.
Помимо образа alpine
, оптимизированного для данного места, мы также предоставляем образы на базе Buster (Debian 10.0), Ubuntu 18.04 и Ubuntu 16.04. В таблице ниже приведены все доступные теги GNES. Можно заполнить {ver}
latest
, stable
или v0..xx
. latest
относится к последнему мастеру этого репозитория, который может быть нестабильным. Мы рекомендуем вам использовать официальную версию, изменив latest
на номер версии, скажем, v0.0.24
, или просто используя stable
для последней версии, например gnes:stable-ubuntu
Ярлык | Размер и слои | Описание |
---|---|---|
{ver}-alpine | на базе Alpine Linux; нет библиотек глубокого обучения; чрезвычайно легкий и портативный, обеспечивает быстрое масштабирование даже на периферийных устройствах. | |
{ver}-buster | на основе Debian 10.0; нет библиотек глубокого обучения; рекомендуется для создания или расширения образа GNES-Hub. | |
{ver}-ubuntu18 | на базе Ubuntu 18.04; нет библиотек глубокого обучения. | |
{ver}-full | на базе Ubuntu 16.04; python-3.6.8, cuda-10.0, tf1.14, pytorch1.1, faiss, несколько предварительно обученных моделей; тяжелый, но автономный, полезен при комплексном тестировании GNES. |
️ С 21 октября 2019 г. мы прекратили размещение общедоступного зеркала Tencent Cloud. Старые образы Docker все еще существуют, но новых образов в Tencent Cloud больше не будет.
Мы также предоставляем общедоступное зеркало Github. Выберите зеркало, которое вам хорошо служит.
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
В таблице ниже показано состояние конвейера сборки.
Реестр | Статус сборки |
---|---|
Докер-Хабgnes/gnes:[tag] | |
Пакет Githubdocker.pkg.github.com/gnes-ai/gnes/gnes:[tag] |
pip
Вы также можете установить GNES как пакет Python3 через:
pip install gnes
Обратите внимание, что при этом будет установлена только базовая версия GNES, состоящая из минимальных зависимостей для запуска GNES. Никакие предварительно обученные сторонние модели, пакеты глубокого обучения/НЛП/CV устанавливаться не будут. Мы делаем эту настройку поведением установки по умолчанию, поскольку модель, интересная инженерам NLP, может не интересовать инженеров CV. В GNES модели служат плагинами Docker.
? Tensorflow, Pytorch и torchvision не являются частью установки GNES. В зависимости от вашей модели, возможно, вам придется установить их заранее.
Хотя это и не рекомендуется, вы можете установить GNES с полными зависимостями через:
pip install gnes[all]
pip install gnes[берт] | bert-serving-server>=1.8.6, bert-serving-client>=1.8.6 |
pip install gnes[чутье] | чутье>=0.4.1 |
pip install gnes [раздражать] | раздражать==1.15.2 |
pip install gnes [китайский] | Джиеба |
pip install gnes[видение] | opencv-python>=4.0.0, imagehash>=4.0 |
pip install gnes[leveldb] | пливел>=1.0.5 |
pip install gnes [тест] | pylint, Memory_profiler>=0.55.0, psutil>=5.6.1, gputil>=1.4.0 |
pip install gnes[трансформеры] | pytorch-трансформеры |
pip установить gnes[onnx] | onnxruntime |
pip install gnes[аудио] | либроса>=0.7.0 |
pip install gnes[scipy] | острый |
pip install gnes[nlp] | bert-serving-server>=1.8.6, pytorch-transformers, чутье>=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, чутье>=0.4.1 |
pip install gnes[все] | 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, чутье>=0.4.1, librosa>=0.7.0, scipy, plyvel>=1.0.5, opencv-python>=4.0.0 |
Хороший способ выбрать зависимости — следовать примеру в GNES Hub и создать собственный образ GNES.
В любом случае, если вы прочитаете следующее сообщение после того, как $ gnes
или $ docker run gnes/gnes
, тогда вы готовы к работе!
Прежде чем мы начнем, позвольте мне сначала представить две важные концепции GNES: микросервис и рабочий процесс .
Инженеры по машинному обучению и специалисты по обработке данных, которые не знакомы с концепцией облачных технологий и микросервисов , могут представить микросервис как приложение на вашем смартфоне. Каждое приложение работает независимо, и приложение может взаимодействовать с другими приложениями для выполнения задачи. В GNES у нас есть четыре основных приложения, т.е. микросервисы, это:
В ГНЭС мы реализовали десятки препроцессоров, кодировщиков, индексаторов для обработки различных форм контента, таких как изображение, текст, видео. Также очень легко подключить собственную реализацию, пример которой мы увидим в дальнейшем.
Теперь, когда у нас есть несколько приложений, чего мы от них ожидаем? Типичная поисковая система выполняет две фундаментальные задачи: индексирование и запрос . Индекс хранит документы, запрос ищет документы. В нейронной поисковой системе можно столкнуться с другой задачей: обучением , где выполняется тонкая настройка кодировщика/препроцессора в соответствии с распределением данных, чтобы добиться лучшей релевантности поиска.
Эти три задачи соответствуют трем различным рабочим процессам в GNES.
Начиная с
v0.0.46
GNES Flow стал основным интерфейсом GNES. GNES Flow предоставляет питонический и интуитивно понятный способ реализации рабочего процесса , позволяющий пользователям запускать или отлаживать GNES на локальном компьютере. По умолчанию GNES Flow организует все микросервисы с использованием многопоточного или многопроцессного бэкэнда. Его также можно экспортировать в конфигурацию YAML Docker Swarm/Kubernetes, что позволяет доставлять GNES в облако.
? Полный пример и соответствующий блокнот Jupyter можно найти здесь.
В этом примере мы будем использовать новый API gnes.flow
(требуется gnes >= 0.0.46
) для создания системы поиска игрушечных изображений для индексации и поиска цветов на основе их сходства.
Давайте сначала определим рабочий процесс индексирования:
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' ]))
Здесь мы используем предварительно обученную модель inceptionV4 в качестве кодировщика и встроенные индексаторы для хранения векторов и документов. Порядок действий должен быть вполне понятен, в противном случае вы всегда можете преобразовать его в изображение SVG и просмотреть его визуализацию:
flow . build ( backend = None ). to_url ()
Чтобы индексировать наши данные о цветах, нам нужен итератор, который генерирует строки bytes
и передает эти строки bytes
в определенный поток.
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 ()
Теперь мы можем выполнять индексацию через многопроцессный бэкэнд:
with flow ( backend = 'process' ) as fl :
fl . index ( bytes_gen = read_flowers (), batch_size = 64 )
Это займет несколько минут в зависимости от вашей машины.
Мы просто выбираем 20 изображений цветов в качестве запросов и ищем топ-10 похожих изображений:
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
Вот результат: запросы находятся в первой строке.
Объект Flow
можно легко преобразовать в файл компоновки YAML Docker Swarm/Kubernetes с помощью:
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
Чтобы развернуть его, просто скопируйте сгенерированную конфигурацию YAML в файл, скажем, my-gnes.yml
, а затем выполните
docker stack deploy --compose-file my-gnes.yml gnes-531
В этом примере мы создадим систему поиска семантических стихотворений с использованием GNES. В отличие от предыдущего примера поиска цветов, здесь мы запускаем каждый сервис как изолированный контейнер Docker, а затем оркестрируем их через Docker Swarm. Это представляет собой распространенный сценарий в настройках облака. Вы узнаете, как использовать мощные и настраиваемые изображения GNES из центра GNES.
? Пожалуйста, проверьте этот репозиторий для получения подробной информации и следуйте инструкциям для воспроизведения.
Давайте подведем краткий итог тому, что мы узнали.
Официальная документация GNES размещена на doc.gnes.ai. Он автоматически создается, обновляется и архивируется в каждом новом выпуске.
? Учебник все еще находится в разработке. Следите за обновлениями! Между тем, мы искренне приветствуем вас, если вы поделитесь своим собственным опытом обучения или практическим примером использования ГНЕС!
PyTorch-Transformers
в GNESbert-as-service
Мы настроили этот репозиторий для отслеживания задержки в сети в разных версиях GNES. Являясь частью конвейера CICD, этот репозиторий автоматически обновляется при обновлении мастера GNES или выпуске новой версии GNES.
❤️Начало всегда самое сложное. Но не бойтесь: даже если вы обнаружите опечатку, отсутствующую строку документации или модульный тест, вы можете просто исправить их, выполнив коммит в GNES. Вот шаги:
fix-gnes-typo-1
fix(readme): improve the readability and move sections
fix(readme): improve the readability and move sections
Отличная работа! После объединения PR происходит следующее:
-latest
будут автоматически обновлены через час. Вы можете проверить статус здания здесь.-stable
будут обновляться соответствующим образом.Более подробную информацию можно найти в правилах для участников.
Если вы используете 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}
}
Если вы загрузили копию двоичного файла или исходного кода GNES, обратите внимание, что двоичный файл и исходный код GNES лицензируются по лицензии Apache версии 2.0.
Tencent рада поддержать сообщество открытого исходного кода, сделав GNES доступным.