ハイライト • 概要 • インストール • はじめに • ハブ • ドキュメント • チュートリアル • 寄稿 • リリース ノート • ブログ
GNES [ jee-nes ] は、ディープ ニューラル ネットワークに基づくクラウドネイティブのセマンティック検索システムであるGeneric Neural Elastic Searchです。
GNES は、テキストからテキスト、画像から画像、ビデオからビデオ、および任意のコンテンツ形式に対する大規模なインデックス検索とセマンティック検索を可能にします。
? GNES の重要な原則について詳しくは、このブログ投稿をお読みください。
☁️クラウドネイティブで弾力性のある | ?使いやすい | ?最先端の |
---|---|---|
GNES はオールインマイクロサービスです。エンコーダー、インデクサー、プリプロセッサ、ルーターはすべて独自のコンテナーで実行されます。これらはバージョン管理された API を介して通信し、Docker Swarm/Kubernetes などのオーケストレーションの下で連携します。スケーリング、ロード バランシング、自動リカバリは、GNES ですぐに使用できます。 | VGG でレイヤーを切り替えるだけの変更をデプロイするにはどれくらい時間がかかりますか? GNES では、これは YAML ファイル内の 1 行の変更だけです。エンコードとインデックス作成のロジックを 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 パッケージとして入手する 2 つの方法があります。クラウド ユーザーの場合は、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 | 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 をエンドツーエンドでテストするのに役立ちます。 |
️ 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[bert] | 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 インストール 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] | 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、jieba、 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 の 2 つの重要な概念、マイクロサービスとワークフローを紹介します。
クラウドネイティブやマイクロサービスの概念に慣れていない機械学習エンジニアやデータサイエンティストにとって、マイクロサービスはスマートフォン上のアプリとして想像できるでしょう。各アプリは独立して実行され、アプリは他のアプリと連携してタスクを実行する場合があります。 GNES には、4 つの基本的なアプリがあります。マイクロサービスとは次のとおりです。
GNES では、画像、テキスト、ビデオなどのさまざまなコンテンツ形式を処理するために、数十のプリプロセッサ、エンコーダ、インデクサを実装しました。独自の実装をプラグインすることも非常に簡単です。これについては、続編で例を見ていきます。
たくさんのアプリがある今、私たちはそれらに何を期待しているでしょうか?一般的な検索システムには、インデックスとクエリという 2 つの基本的なタスクがあります。インデックスはドキュメントを保存し、クエリはドキュメントを検索します。ニューラル検索システムでは、別のタスク、 trainに直面する場合があります。ここでは、より良い検索関連性を達成するために、データ分布に従ってエンコーダー/プリプロセッサを微調整します。
これら 3 つのタスクは、GNES の 3 つの異なるワークフローに対応します。
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 を引用する 2 つの方法は次のとおりです。
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 License バージョン 2.0 に基づいてライセンス供与されていることに注意してください。
Tencent は、GNES を利用できるようにすることでオープンソース コミュニティをサポートできることを嬉しく思います。