하이라이트 • 개요 • 설치 • 시작하기 • 허브 • 문서 • 튜토리얼 • 기여 • 릴리스 노트 • 블로그
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를 사용하여 직접 구축해 보세요. 모델을 도커 컨테이너로 패키징하고 플러그인으로 사용하세요. | 우리는 커뮤니티에서 모범 사례를 배우고 GNES가 다음 수준의 가용성, 탄력성, 성능 및 내구성을 달성하도록 돕는 것을 좋아합니다. 아이디어나 제안 사항이 있으면 자유롭게 참여해 주세요. |
GNES Hub는 AI/ML 모델을 Docker 컨테이너로 제공하고 Docker 컨테이너를 플러그인으로 사용합니다. 외부 알고리즘(종속성 포함)을 GNES 프레임워크로 포팅하는 깨끗하고 지속 가능한 방법을 제공합니다. GNES Hub는 Docker Hub에서 호스팅됩니다. |
Docker 이미지 또는 PyPi 패키지로 GNES를 얻는 방법에는 두 가지가 있습니다. 클라우드 사용자의 경우 Docker를 통해 GNES를 사용하는 것이 좋습니다 .
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 | 알파인 리눅스 기반; 딥러닝 라이브러리가 없습니다. 매우 가볍고 휴대성이 뛰어나 엣지 디바이스에서도 빠른 확장이 가능합니다. | |
{ver}-buster | 데비안 10.0 기반; 딥러닝 라이브러리가 없습니다. GNES-Hub 이미지를 구축하거나 확장하는 데 권장됩니다. | |
{ver}-ubuntu18 | 우분투 18.04 기반; 딥러닝 라이브러리가 없습니다. | |
{ver}-full | 우분투 16.04 기반; python-3.6.8, cuda-10.0, tf1.14, pytorch1.1, faiss, 사전 훈련된 여러 모델; 무겁지만 독립적이며 GNES를 처음부터 끝까지 테스트하는 데 유용합니다. |
️ 2019년 10월 21일부터 공개 미러 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] | |
Github 패키지docker.pkg.github.com/gnes-ai/gnes/gnes:[tag] |
pip
를 통해 GNES 설치다음을 통해 GNES를 Python3 패키지로 설치할 수도 있습니다.
pip install gnes
이는 GNES 실행을 위한 최소한의 종속성 으로 구성된 GNES의 "베어본" 버전만 설치한다는 점에 유의하십시오. 타사의 사전 훈련된 모델이 없으며 딥 러닝/NLP/CV 패키지가 설치되지 않습니다. NLP 엔지니어에게 관심이 있는 모델이 CV 엔지니어에게는 관심이 없을 수 있으므로 이 설정을 기본 설치 동작으로 설정합니다. GNES에서 모델은 Docker 플러그인 역할을 합니다.
? Tensorflow, Pytorch 및 torchvision은 GNES 설치의 일부가 아닙니다. 모델에 따라 사전에 설치해야 할 수도 있습니다.
권장되지는 않지만 다음을 통해 전체 종속성을 갖춘 GNES를 설치할 수 있습니다.
pip install gnes[all]
pip 설치 gnes[버트] | 버트-서빙-서버>=1.8.6, 버트-서빙-클라이언트>=1.8.6 |
pip 설치 gnes[flair] | 감각>=0.4.1 |
pip 설치 gnes[짜증] | 짜증나==1.15.2 |
pip 설치 gnes[중국어] | 지에바 |
pip 설치 gnes[비전] | opencv-python>=4.0.0, 이미지해시>=4.0 |
pip 설치 gnes[leveldb] | 플라이벨>=1.0.5 |
pip 설치 gnes[테스트] | pylint, memory_profiler>=0.55.0, psutil>=5.6.1, gputil>=1.4.0 |
pip 설치 gnes[변압기] | 파이토치 트랜스포머 |
pip 설치 gnes[onnx] | onnx런타임 |
pip 설치 gnes[오디오] | 리브로사>=0.7.0 |
pip 설치 gnes[scipy] | 사이피 |
pip 설치 gnes[nlp] | bert-serving-server>=1.8.6, pytorch-transformers, flair>=0.4.1, bert-serving-client>=1.8.6 |
pip 설치 gnes[cn_nlp] | pytorch-transformers, bert-serving-client>=1.8.6, bert-serving-server>=1.8.6, jieba, flair>=0.4.1 |
pip 설치 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, 지에바, flair>=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에서는 이미지, 텍스트, 비디오와 같은 다양한 콘텐츠 형식을 처리하기 위해 수십 개의 전처리기, 인코더, 인덱서를 구현했습니다. 자신만의 구현을 연결하는 것도 매우 쉽습니다. 이에 대한 예는 후속편에서 살펴보겠습니다.
이제 우리는 수많은 앱을 갖게 되었는데, 이들 앱이 무엇을 하기를 기대합니까? 일반적인 검색 시스템에는 index 와 query라는 두 가지 기본 작업이 있습니다. 인덱스는 문서를 저장하고, 쿼리는 문서를 검색합니다. 신경 검색 시스템에서는 더 나은 검색 관련성을 달성하기 위해 데이터 분포에 따라 인코더/전처리기를 미세 조정하는 train이라는 또 다른 작업에 직면할 수 있습니다.
이 세 가지 작업은 GNES의 세 가지 다른 워크플로 에 해당합니다.
v0.0.46
부터 GNES Flow는 GNES의 주요 인터페이스가 되었습니다. GNES Flow는 워크플로를 구현하는 Python적이고 직관적인 방법을 제공하여 사용자가 로컬 시스템에서 GNES를 실행하거나 디버그할 수 있도록 합니다. 기본적으로 GNES Flow는 다중 스레드 또는 다중 프로세스 백엔드를 사용하여 모든 마이크로서비스를 조율하며, Docker Swarm/Kubernetes YAML 구성으로 내보내 GNES를 클라우드에 제공할 수도 있습니다.
? 전체 예제와 해당 Jupyter Notebook은 여기에서 찾을 수 있습니다.
이 예에서는 새로운 gnes.flow
API( 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
객체를 Docker Swarm/Kubernetes YAML 작성 파일로 매우 쉽게 변환할 수 있습니다.
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에서 호스팅됩니다. 새 릴리스가 나올 때마다 자동으로 빌드, 업데이트 및 보관됩니다.
? 튜토리얼은 아직 제작 중입니다. 계속 지켜봐 주시기 바랍니다! 한편, GNES를 통한 학습 경험/사례 연구에 참여해 주신 것을 진심으로 환영합니다!
PyTorch-Transformers
GNES로 포팅bert-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
태그가 지정된 모든 Docker 이미지는 1시간 내에 자동으로 업데이트됩니다. 여기에서 건물 상태를 확인할 수 있습니다.-stable
태그가 지정된 모든 Docker 이미지가 그에 따라 업데이트됩니다.자세한 내용은 기여자 지침에서 확인할 수 있습니다.
학술 논문에서 GNES를 사용하는 경우 언제든지 인용하실 수 있습니다. 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를 출시하여 오픈 소스 커뮤니티를 지원하게 된 것을 기쁘게 생각합니다.