milvusのインストールとチュートリアル

milvusプロフィール

milvusをしているのですか?人気いえば、milvusはすぐに類似性メトリックが内積やユークリッド距離などもあり、大規模なベクトルライブラリの数、最も類似したベクトルとターゲットベクトルを取得することができます。借入公式の言葉を:

Milvusは、オープンソース、大規模な特徴ベクトルの類似検索エンジンです。フレームベースの異種メニーコア設計、低コスト、および優れたパフォーマンスを計算しています。限られコンピューティングリソースには、唯一の10億ミリ秒の応答ベクトル探索。

それは私が10億個のベクトルを話さないだろう、速い意味し、コサイン類似1000300次元ベクトルの計算を完了するために、独自のコードを書いて、私がテストしたとしても、scipyのダウンロードライブラリと、限り、それのない小さな応答時間を必要としないソート速度を計算することは、まだmilvusよりもはるかに遅いです。

milvusの比較とFaiss

実際には、milvusオープンソースの前に、また高性能ベクトル類似検索エンジン(ライブラリ)、このエンジンは、具体的に参照するので、あまりにも多くの導入をしない、その機能とmilvusが同じで、FacebookのFaissであり、公式ウェブサイト

私にとっては個人的に、私はmilvusを使用することをお勧めし、主に私の個人的意見では、milvusは、次のような利点があります。

  • milvusを展開することができるので、マルチプラットフォームユニバーサル、マック、WindowsとLinuxは良い共通プラットフォームの多くので、ドッキングウィンドウでサポートされています。
  • 多言語のプログラミングは、Javaは、C、C ++とPythonがサポートされているサポートしています、あなたはFaissは、Javaでサポートされていない知っている、そしてそれはちょうどあなたが夢中になり、Faissはについてですgithubのプロジェクトの権限は、Javaのに変身するIおよびJavaのためPythonは、私は、Javaのgithubのプロジェクトfaissターンに入れ、使用されるオーバーしようとした以上、結論は限りFaissバージョンを更新して、我々は最後のJavaを使用することができたとしても、すべてのそれを再度行う必要があり、インストールすることは非常に困難であり、またしていますその安定性を保証します。私はまだそれを与えるFaissでJavaを使用したいと思います。
  • 速度の面では、私自身のテストの目的は、milvusはFaissを失わないが、私はGPUテスト、試すことができます興味のある小さなパートナーを使用していませんでした。

私自身は、不適切な使用によって引き起こされた場合、もちろん使用することが困難な場所milvusがありますが、私は、2つの点を見つけ、また私たちの友人がコメントで指摘招待:

  • milvusベクトル形式は、numpyのサポート保存されたベクトルのリストを使用しますが、リストには、小さなメモリのホストでメモリを取るndarrayする災害が実際よりもはるかに大きいしない、私500,000×768行列の転置に、最大16GBのメモリ条件の下にありましたリストには、コンピュータが直接立ち往生。
  • 最初の検索でmilvusが取得する機会の後、遅くなり、これは小さくあるべきバグを、それはgithubのに提案されたあなたはmilvusの最初のスピードテストではカウントされませんので、すぐに修復する必要があります時間の時間。

milvusのインストールとよくある質問

ドッキングウィンドウのインストールの独自のインストールと使用をコンパイル:milvus 2つのインストール方法があります。ここでは、それがWindows上で使用することができ、使用のドッキングウィンドウのインストール、ドッキングウィンドウの迅速かつ簡単にインストールすることをお勧めします。コンパイルし、自分自身をインストールするには、一人一人の環境ので、間違って行くことは容易です。このホワイトペーパーでは、私は貧しいですので、これだけインストールのCPUバージョンを導入しますが、GPUのインストールが類似している他、唯一のドッキングウィンドウベースのインストールについて説明します。

ベースのドッキングウィンドウmilvus CPUのバージョンをインストールします

簡単なインストールでは、すべての大物がドッキングウィンドウで展開milvusを入れた後、私達はちょうどライン上で起動し、比較的簡単です

インストールのドッキングウィンドウ

最初のドッキングウィンドウは、仮想マシンのツールを使用に直接移動することは非常に簡単で、波を学ぶことができるかわからない、ドッキングウィンドウをインストールすることですし、公式サイト対応プラットフォームのインストールファイルをダウンロードしてください。

ミラーの適切なバージョンをダウンロード

ドッキングウィンドウをインストールした後、最初の高度な、対応する画像(画像を)引っ張って行く公式サイトをdockerhubそしてmilvusを検索し、最初の結果があります。それを引き下げてCPU-最新のタグで検索して、そして我々は、CPUのバージョンをインストールしているので、そのラインウィンドウは、あなたのコマンドで入力してください
docker pull milvusdb/milvus:cpu-latest注:繰り返しの更新バージョンは、この一つのコマンドは、将来的に失敗する可能性と、それはタグを使用すべきかを見るために、dockerhub検索を行くことをお勧めします。

作業ディレクトリと設定ファイルを設定します

あなたが起動コンテナを作成する前に、まず作業ディレクトリと設定ファイルを設定する必要があります。

3つのディレクトリ、つまりデータベース格納ディレクトリの合計を設定するには、格納ディレクトリとプロファイルディレクトリを記録します。プロファイルディレクトリは、設定ファイルを保存するために、どこで言いました。2つのプロファイル、それぞれのサーバの設定ファイルやログファイルの設定があります。

私たちはどこに置くのに良い3つのフォルダをしたいので、例えば、私たちは、現在のユーザーディレクトリにmilvusフォルダを作成することができ、その後、3つのディレクトリ内に保存されています。今、私たちは、2つのプロファイルを設定するには、サーバーの設定ファイル名に覚えておく必要があるserver_config.yaml代わりに、ログ設定ファイルlog_config.conf
2つの構成ファイルの内容:サーバ設定ファイル 、ログ設定ファイルプロファイルはまたに行くことができるダウンロードする公式サイト

ここに私のファイルのディレクトリ構造、参照の合計は次のとおりです。

  milvus
    ├─conf //配置文件目录
    │      log_config.conf  //服务器配置文件
    │      server_config.yaml  //日志配置文件
    ├─db //数据库存储目录
    └─logs //日志存储目录

[スタート]ドッキングウィンドウサービス

作業ディレクトリを設定した後、あなたは、コンテナを作成するためにミラーを使用することができ、私の作業ディレクトリであるC:\Users\Zhdun\milvus私のコマンドが作成されますので、:

docker run -td --name mymilvus -e "TZ=Asia/Shanghai" -p 19530:19530 -p 8080:8080 -v C:\Users\Zhdun\milvus\db:/var/lib/milvus/db -v C:\Users\Zhdun\milvus\conf:/var/lib/milvus/conf -v C:\Users\Zhdun\milvus\logs:/var/lib/milvus/logs milvusdb/milvus:cpu-latest

コマンドが少し長く見え、私は、少し下を説明し、-tdバックグラウンドで実行されている-船舶の名前は自分で名前を付けることで、-pポートマッピングは、デフォルトを使用したくない、あなたはサーバーの設定ファイルに変更することができ、-vこれは3つの作業ディレクトリをマップすることです。特定の参照]ドッキングウィンドウのrunコマンド

あなたは興奮のコンテナを作成して、それはログが間違っているものを見る、見てドッカことを発見した場合、コマンドを実行した後、ドッキングウィンドウのps -aを実行します。あなたはコンテナが実行されていることが判明した場合、その基本的には問題がないことを意味します。

次に、私は一般的なインストールの問題について話しましょう、とmilvusを使用する方法。

一般的なインストールの問題と解決策

無効な設定バージョンを::コンフィグチェックが失敗 。期待コンフィグバージョン:0.1 サーバーの設定ファイルの最初の行での経験、この問題をプラスversion: 0.1

コンフィグチェックが失敗:無効なCPUのキャッシュ容量
:1.考えられる理由を:. cache_config.cpu_cache_capacityとdb_config.insert_buffer_sizeの合計は、システムメモリを超えて、この問題最初cpu_cache_capacityとinsert_buffer_sizeにサーバの設定を確認し、上限よりもメモリを説明するためには大きすぎではありませんA。

そして、ドッキングウィンドウの情報により確認することができますどのくらいのメモリ与えられたドッキングウィンドウのセットを確認してください。

基本的な使用milvus

インストールが完了したら、あなたは最終的にmilvusアップ、milvusサポートのpython、JavaやC ++を使用して起動することができます。ここで私は唯一のpythonの使用を紹介します。
まずpymilvusライブラリをインストールしますpip install pymilvus、そして、あなたは書き込みコードにこのライブラリを使用することができ、その後、私は自分のコードサンプルに直接書き込みます、私はコメントで直接あなたを教えてくれます具体的には、各ステップの意味と可能な拡張した、アップ投稿間違っている場合にも明記してください。

# -*- coding: utf-8 -*-

#导入相应的包
import numpy as np
from milvus import Milvus, IndexType, MetricType

# 初始化一个Milvus类,以后所有的操作都是通过milvus来的
milvus = Milvus()

# 连接到服务器,注意端口映射,要和启动docker时设置的端口一致
milvus.connect(host='localhost', port='19530')

# 向量个数
num_vec = 5000
# 向量维度
vec_dim = 768

# 创建表
# 参数含义
# table_name: 表名
# dimension: 向量维度
# metric_type: 向量相似度度量标准, MetricType.IP是向量内积; MetricType.L2是欧式距离
table_param = {'table_name': 'mytable', 'dimension':vec_dim, 'index_file_size':1024, 'metric_type':MetricType.IP}
milvus.create_table(table_param)

# 随机生成一批向量数据
vectors_array = np.random.rand(num_vec,vec_dim)
vectors_list = vectors_array.tolist()

# 官方建议在插入向量之前,建议先使用 milvus.create_index 以便系统自动增量创建索引
# 索引类型有:FLAT / IVFLAT / IVF_SQ8 / IVF_SQ8H,其中FLAT是精确索引,速度慢,但是有100%的召回率
index_param = {'index_type': IndexType.FLAT, 'nlist': 128}
milvus.create_index('mytable', index_param)

# 把向量添加到刚才建立的表格中
# ids可以为None,使用自动生成的id
status, ids = milvus.add_vectors(table_name="mytable",records=vectors_list,ids=None) # 返回这一组向量的ID

# 官方建议 向量插入结束后,相同的索引需要手动再创建一次
milvus.create_index('mytable', index_param)

# 输出一些统计信息
status, tables = milvus.show_tables()
print("所有的表格:",tables)
print("表格的数据量(行):{}".format((milvus.count_table('mytable')[1])))
print("mytable表格是否存在:",milvus.has_table("mytable")[1])

# 加载表格到内存
milvus.preload_table('mytable')

# 创建查询向量
query_vec_array = np.random.rand(1,vec_dim)
query_vec_list = query_vec_array.tolist()
# 进行查询, 注意这里的参数nprobe和建立索引时的参数nlist 会因为索引类型不同而影响到查询性能和查询准确率
# 对于 FLAT类型索引,两个参数对结果和速度没有影响
status, results = milvus.search(table_name='mytable', query_records=query_vec_list, top_k=4, nprobe=16)
print(status)
print(results)



# 删除表格和索引, 不删除的话,下一次还可以继续使用
milvus.drop_index(table_name="mytable")
milvus.delete_table(table_name="mytable")

# 断开连接
milvus.disconnect()

milvusマルチプロセス使用

この章の主な目的は、時間を節約することができ、同時テスト、およびマルチプロセスを記述することで、複数のプロセスを使用して公式の説明書には、次の2つの条件を満たしている必要があります。

  • メインプログラムの実行プロセスは、クライアントを作成していない場合
  • それぞれの子プロセスは、クライアントの操作を作成しました

ここに私のテストコードは次のようになります。

# -*- coding: utf-8 -*-
import time
from multiprocessing import Pool
import numpy as np
import random
from milvus import Milvus, IndexType, MetricType

def create_data(host,port,num_vec,vec_dim):
    """ 创建一些表格和索引用来做多进程测试 """
    milvus = Milvus()
    milvus.connect(host=host, port=port)
    # 创建2个表
    table_param = {'table_name': 'table1', 'dimension':vec_dim, 'index_file_size':1024, 'metric_type':MetricType.IP}
    milvus.create_table(table_param)
    table_param = {'table_name': 'table2', 'dimension':vec_dim, 'index_file_size':1024, 'metric_type':MetricType.L2}
    milvus.create_table(table_param)
    # 随机生成一批向量数据
    vectors_array = np.random.rand(num_vec,vec_dim)
    vectors_list = vectors_array.tolist()
    # 创建索引
    index_param = {'index_type': IndexType.FLAT, 'nlist': 128}
    milvus.create_index('table1', index_param)
    milvus.create_index('table2', index_param)

    # 添加数据
    milvus.add_vectors(table_name="table1",records=vectors_list,ids=None)
    milvus.add_vectors(table_name="table2",records=vectors_list,ids=None)

    # 创建索引
    milvus.create_index('table1', index_param)
    milvus.create_index('table2', index_param)
    print(milvus.show_tables())
    # 断开连接
    milvus.disconnect()
def clear_table(host,port):
    """ 清空表格和索引 """
    milvus = Milvus()
    milvus.connect(host=host, port=port)
    for table_name in milvus.show_tables()[1]:
        milvus.drop_index(table_name=table_name)
        milvus.delete_table(table_name=table_name)
    milvus.disconnect()
def milvus_search(host,port,table_name,query_vec,search_time=10):
    """ 测试查询, 返回查询的秒数"""
    milvus = Milvus()
    milvus.connect(host=host, port=port)
    # 因为bug的原因,要先搜索一次
    milvus.search(table_name,4,8,query_vec)
    # 开始测试
    for _ in range(search_time):
        query_vec[0][0] = random.random() # 稍微随机化一下
        milvus.search(table_name, 4, 8, query_vec)


if __name__  == "__main__":
    host = "localhost"
    port = "19530"
    num_vec = 100000
    vec_dim = 768
    num_proc = 3 # 进程数
    search_time = 2000 # 搜索次数
    ####### Step1 先创建用于测试的数据 运行一次就行了
    # create_data(host=host,port=port,num_vec=num_vec,vec_dim=vec_dim)
    # clear_table(host,port)
    # exit(0)

    ####### Step2 测试依次执行的时间
    start_time = time.time()
    for _ in range(num_proc):
        query_vec = np.random.rand(1,vec_dim).tolist()
        milvus_search(host,port,"table1",query_vec,search_time)
    end_time = time.time()
    print("顺序执行milvus_search的时间总和是:",end_time-start_time)

    ####### Step3 测试多进程时间
    pool = Pool(num_proc)
    start_time = time.time()
    for _ in range(num_proc):
        query_vec = np.random.rand(1,vec_dim).tolist()
        pool.apply_async(milvus_search,args=(host,port,"table1",query_vec,search_time))
    pool.close()
    pool.join()
    end_time = time.time()
    print("并行执行milvus_search的时间总和是:",end_time-start_time)

結論はsearch100回、そして同時に10のプロセスオープン、各プロセスsearch10時間続く検索動作のために、オープンマルチプロセススピードが速くなることです。私が理解し、表面的な結論は、私はその批判を願っています。

おすすめ

転載: www.cnblogs.com/SuperDun/p/12025155.html