Sorotan • Ikhtisar • Penginstalan • Memulai • Hub • Dokumentasi • Tutorial • Berkontribusi • Catatan Rilis • Blog
GNES [ jee-nes ] adalah Generic Neural Elastic Search , sistem pencarian semantik cloud-native berdasarkan jaringan saraf dalam.
GNES memungkinkan indeks skala besar dan pencarian semantik untuk teks-ke-teks , gambar-ke-gambar , video-ke-video , dan bentuk konten apa pun ke apa pun .
? Untuk mengetahui lebih banyak tentang prinsip utama GNES, baca postingan blog ini
☁️Cloud-Native & Elastis | ?Mudah Digunakan | ?Tercanggih |
---|---|---|
GNES adalah layanan mikro lengkap ! Encoder, pengindeks, praprosesor, dan router semuanya berjalan di wadahnya masing-masing. Mereka berkomunikasi melalui API berversi dan berkolaborasi di bawah orkestrasi Docker Swarm/Kubernetes, dll. Penskalaan, penyeimbangan beban, pemulihan otomatis, semuanya tersedia di GNES. | Berapa lama waktu yang dibutuhkan untuk menerapkan perubahan yang hanya melibatkan peralihan satu lapisan di VGG? Di GNES, ini hanyalah perubahan satu baris dalam file YAML. Kami mengabstraksi logika pengkodean dan pengindeksan ke konfigurasi YAML, sehingga Anda dapat mengubah atau menumpuk encoder dan pengindeks tanpa menyentuh basis kode. | Memanfaatkan komunitas AI/ML/NLP/CV yang berkembang pesat, kami belajar dari model pembelajaran mendalam terbaik dan menghubungkannya ke GNES, memastikan Anda selalu menikmati kinerja tercanggih. |
?Generik & Universal | ?Modelkan sebagai Plugin | ?Praktik Terbaik |
Mencari teks, gambar, atau bahkan video pendek? Menggunakan Python/C/Java/Go/HTTP sebagai klien? Tidak peduli bentuk konten apa yang Anda miliki atau bahasa apa yang Anda gunakan, GNES dapat menangani semuanya. | Jika model bawaan tidak memenuhi persyaratan Anda, buat saja model Anda sendiri dengan GNES Hub. Kemas model Anda sebagai wadah buruh pelabuhan dan gunakan sebagai plugin. | Kami senang mempelajari praktik terbaik dari komunitas, membantu GNES kami mencapai tingkat ketersediaan, ketahanan, kinerja, dan daya tahan berikutnya. Jika Anda memiliki ide atau saran, silakan berkontribusi. |
GNES Hub mengirimkan model AI/ML sebagai container Docker dan menggunakan container Docker sebagai plugin. Ia menawarkan cara yang bersih dan berkelanjutan untuk memasukkan algoritma eksternal (dengan dependensinya) ke dalam kerangka GNES. GNES Hub dihosting di Docker Hub. |
Ada dua cara untuk mendapatkan GNES, baik sebagai image Docker atau sebagai paket PyPi. Bagi pengguna cloud, kami sangat merekomendasikan penggunaan GNES melalui Docker .
docker run gnes/gnes:latest-alpine
Perintah ini mengunduh image GNES terbaru (berdasarkan Alpine Linux) dan menjalankannya dalam sebuah container. Saat kontainer berjalan, ia mencetak pesan informasi dan keluar.
Selain image alpine
yang dioptimalkan untuk ruang, kami juga menyediakan image berbasis Buster (Debian 10.0), Ubuntu 18.04 dan Ubuntu 16.04. Tabel di bawah ini merangkum semua tag GNES yang tersedia. Seseorang dapat mengisi {ver}
dengan latest
, stable
atau v0..xx
. latest
mengacu pada master terbaru dari repositori ini, yang mungkin tidak stabil. Kami menyarankan Anda untuk menggunakan rilis resmi dengan mengubah nomor versi latest
, misalnya v0.0.24
, atau cukup menggunakan stable
untuk rilis terakhir, misalnya gnes:stable-ubuntu
Menandai | Ukuran dan lapisan | Keterangan |
---|---|---|
{ver}-alpine | berdasarkan Alpine Linux; tidak ada perpustakaan pembelajaran mendalam; sangat ringan dan portabel, memungkinkan penskalaan cepat pada perangkat edge sekalipun. | |
{ver}-buster | berdasarkan Debian 10.0; tidak ada perpustakaan pembelajaran mendalam; direkomendasikan untuk membangun atau memperluas image GNES-Hub. | |
{ver}-ubuntu18 | berdasarkan Ubuntu 18.04; tidak ada perpustakaan pembelajaran yang mendalam. | |
{ver}-full | berdasarkan Ubuntu 16.04; python-3.6.8, cuda-10.0, tf1.14, pytorch1.1, faiss, beberapa model terlatih; berat namun mandiri, berguna dalam pengujian GNES secara end-to-end. |
️ Sejak 21/10/2019, kami telah menghentikan hosting mirror publik Tencent Cloud. Gambar Docker lama masih ada, tetapi gambar baru tidak lagi tersedia di Tencent Cloud.
Kami juga menyediakan paket mirror Github publik. Pilih cermin yang melayani Anda dengan baik.
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
Tabel di bawah ini menunjukkan status alur pembangunan.
Registri | Membangun status |
---|---|
Pusat Dockergnes/gnes:[tag] | |
Paket Githubdocker.pkg.github.com/gnes-ai/gnes/gnes:[tag] |
pip
Anda juga dapat menginstal GNES sebagai paket Python3 melalui:
pip install gnes
Perhatikan bahwa ini hanya akan menginstal GNES versi "barebone", yang terdiri dari ketergantungan minimal untuk menjalankan GNES. Tidak ada model terlatih pihak ketiga, paket pembelajaran mendalam/NLP/CV yang akan diinstal. Kami menjadikan pengaturan ini sebagai perilaku instalasi default, karena model yang tertarik pada teknisi NLP mungkin tidak tertarik pada teknisi CV. Di GNES, model berfungsi sebagai plugin Docker.
? Tensorflow, Pytorch, dan torchvision bukan bagian dari instalasi GNES. Tergantung pada model Anda, Anda mungkin harus menginstalnya terlebih dahulu.
Meskipun tidak disarankan, Anda dapat menginstal GNES dengan dependensi penuh melalui:
pip install gnes[all]
pip instal gnes[bert] | bert-serving-server>=1.8.6, bert-serving-client>=1.8.6 |
pip install gnes[bakat] | bakat>=0.4.1 |
pip install gnes[mengganggu] | mengganggu==1.15.2 |
pip instal gnes[Cina] | jieba |
pip instal gnes[visi] | opencv-python>=4.0.0, hash gambar>=4.0 |
pip instal gnes[leveldb] | tingkat>=1.0.5 |
pip instal gnes[tes] | pylint, memory_profiler>=0.55.0, psutil>=5.6.1, gputil>=1.4.0 |
pip instal gnes[transformator] | transformator pytorch |
pip instal gnes[onnx] | pada waktu proses |
pip instal gnes[audio] | librosa>=0.7.0 |
pip instal gnes[scipy] | ilmu pengetahuan |
pip instal gnes[nlp] | bert-serving-server>=1.8.6, pytorch-transformer, bakat>=0.4.1, bert-serving-client>=1.8.6 |
pip instal gnes[cn_nlp] | pytorch-transformers, bert-serving-client>=1.8.6, bert-serving-server>=1.8.6, jieba, flair>=0.4.1 |
pip instal gnes[semua] | 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, waktu berjalan, memory_profiler>=0.55.0, jieba, bakat>=0.4.1, librosa>=0.7.0, scipy, plyvel>=1.0.5, opencv-python>=4.0.0 |
Cara yang baik untuk memilih dependensi adalah dengan mengikuti contoh di GNES Hub dan membuat image GNES milik Anda sendiri.
Apa pun pilihannya, jika Anda akhirnya membaca pesan berikut setelah $ gnes
atau $ docker run gnes/gnes
, maka Anda siap berangkat!
Sebelum kita mulai, izinkan saya memperkenalkan dua konsep penting dalam GNES: layanan mikro dan alur kerja .
Bagi para insinyur pembelajaran mesin dan ilmuwan data yang belum terbiasa dengan konsep cloud-native dan layanan mikro , layanan mikro dapat dibayangkan sebagai sebuah aplikasi di ponsel cerdas Anda. Setiap aplikasi berjalan secara independen, dan suatu aplikasi dapat bekerja sama dengan aplikasi lain untuk menyelesaikan suatu tugas. Di GNES, kami memiliki empat aplikasi dasar alias. layanan mikro, yaitu:
Di GNES, kami telah menerapkan lusinan praprosesor, encoder, pengindeks untuk memproses berbagai bentuk konten, seperti gambar, teks, video. Ini juga sangat mudah untuk memasang implementasi Anda sendiri, yang akan kita lihat contohnya di sekuelnya.
Sekarang kita memiliki banyak aplikasi, apa yang kita harapkan dari aplikasi tersebut? Sistem pencarian pada umumnya memiliki dua tugas mendasar: indeks dan kueri . Indeks menyimpan dokumen, kueri mencari dokumen. Dalam sistem pencarian saraf, seseorang mungkin menghadapi tugas lain: train , di mana seseorang menyempurnakan encoder/praprosesor sesuai dengan distribusi data untuk mencapai relevansi pencarian yang lebih baik.
Ketiga tugas ini sesuai dengan tiga alur kerja berbeda di GNES.
Sejak
v0.0.46
GNES Flow telah menjadi antarmuka utama GNES. GNES Flow menyediakan cara pythonic dan intuitif untuk mengimplementasikan alur kerja , memungkinkan pengguna menjalankan atau men-debug GNES pada mesin lokal. Secara default, GNES Flow mengatur semua layanan mikro menggunakan backend multi-thread atau multi-proses, dan juga dapat diekspor ke konfigurasi Docker Swarm/Kubernetes YAML, yang memungkinkan seseorang mengirimkan GNES ke cloud.
? Contoh lengkap dan Notebook Jupyter terkait dapat ditemukan di sini.
Dalam contoh ini, kita akan menggunakan API gnes.flow
baru ( diperlukan gnes >= 0.0.46
) untuk membangun sistem pencarian gambar mainan untuk mengindeks dan mengambil bunga berdasarkan kemiripannya.
Pertama-tama mari kita tentukan alur kerja pengindeksan dengan:
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' ]))
Di sini, kami menggunakan model terlatih inceptionV4 sebagai encoder dan pengindeks bawaan untuk menyimpan vektor dan dokumen. Alurnya harus cukup jelas, jika tidak, Anda selalu dapat mengonversinya menjadi gambar SVG dan melihat visualisasinya:
flow . build ( backend = None ). to_url ()
Untuk mengindeks data bunga, kita memerlukan iterator yang menghasilkan string bytes
dan memasukkan string bytes
tersebut ke dalam aliran yang ditentukan.
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 ()
Sekarang kita dapat melakukan pengindeksan melalui backend multi-proses:
with flow ( backend = 'process' ) as fl :
fl . index ( bytes_gen = read_flowers (), batch_size = 64 )
Ini akan memakan waktu beberapa menit tergantung pada mesin Anda.
Kami cukup mengambil sampel 20 gambar bunga sebagai kueri dan mencari 10 gambar serupa teratas:
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
Inilah hasilnya, dimana query berada pada baris pertama.
Seseorang dapat mengonversi objek Flow
ke file penulisan Docker Swarm/Kubernetes YAML dengan sangat mudah melalui:
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
Untuk menerapkannya, cukup salin konfigurasi YAML yang dihasilkan ke file katakanlah my-gnes.yml
, lalu lakukan
docker stack deploy --compose-file my-gnes.yml gnes-531
Pada contoh ini, kita akan membangun mesin pencari puisi semantik menggunakan GNES. Berbeda dengan contoh pencarian bunga sebelumnya, di sini kita menjalankan setiap layanan sebagai container Docker yang terisolasi dan kemudian mengaturnya melalui Docker Swarm. Ini mewakili skenario umum dalam pengaturan cloud. Anda akan belajar cara menggunakan gambar GNES yang kuat dan dapat disesuaikan dari hub GNES.
? Silakan periksa repositori ini untuk detailnya dan ikuti instruksi untuk mereproduksi.
Mari kita rekap singkat apa yang telah kita pelajari.
Dokumentasi resmi GNES disimpan di doc.gnes.ai. Itu secara otomatis dibuat, diperbarui dan diarsipkan pada setiap rilis baru.
? Tutorialnya masih dalam tahap pembangunan. Pantau terus! Sementara itu, kami dengan tulus menyambut Anda untuk menyumbangkan pengalaman belajar/studi kasus Anda bersama GNES!
PyTorch-Transformers
ke GNESbert-as-service
Kami telah menyiapkan repositori ini untuk melacak latensi jaringan pada versi GNES yang berbeda. Sebagai bagian dari pipeline CICD, repo ini diperbarui secara otomatis ketika master GNES diperbarui atau versi GNES baru dirilis.
❤️ Permulaan selalu yang tersulit. Namun jangan takut, bahkan jika Anda menemukan kesalahan ketik, docstring atau unit test yang hilang, Anda dapat memperbaikinya dengan membuat komitmen pada GNES. Berikut langkah-langkahnya:
fix-gnes-typo-1
fix(readme): improve the readability and move sections
fix(readme): improve the readability and move sections
Bagus sekali! Setelah PR digabungkan, berikut hal-hal yang terjadi selanjutnya:
-latest
akan diperbarui secara otomatis dalam satu jam. Anda dapat memeriksa status bangunannya di sini-stable
akan diperbarui sesuai dengan itu.Detail lebih lanjut dapat ditemukan di pedoman kontributor.
Jika Anda menggunakan GNES dalam makalah akademis, Anda dipersilakan untuk membuat kutipan. Berikut dua cara mengutip 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}
}
Jika Anda telah mengunduh salinan biner atau kode sumber GNES, harap dicatat bahwa biner dan kode sumber GNES keduanya dilisensikan di bawah Lisensi Apache, Versi 2.0.
Tencent dengan senang hati mendukung komunitas open source dengan menyediakan GNES.