web-dev-qa-db-ja.com

pythonスクリプトを呼び出すたびにMLモデルをリロードしないようにするにはどうすればよいですか?

2つのファイルがあります。1GBのMLモデルサイズを持つ_file1.py_と、file1からget_vec()メソッドを呼び出し、代わりにベクターを受け取る_file2.py_です。 ML modelは、file1 get_vec()メソッドが呼び出されるたびにロードされます。これは、モデルをディスクからロードするのに多くの時間(約10秒)を要する場所です。

File1にモデルを毎回リロードするのではなく、以前の呼び出しからロードされたモデルを利用するように伝えたい.

サンプルコードは以下の通りです

_# File1.py

import spacy
nlp = spacy.load('model')

def get_vec(post):
    doc = nlp(post)
    return doc.vector

_
_File2.py

from File1 import get_vec

df['vec'] = df['text'].apply(lambda x: get_vec(x))

_

したがって、ここでは、各呼び出しに10〜12秒かかります。これは小さなコードのようですが、大きなプロジェクトの一部であり、両方を同じファイルに入れることはできません。

pdate1:​​

いくつかの調査を行ったところ、Redisを使用してモデルを初めて実行するときにキャッシュに保存でき、その後、モデルをキャッシュから直接読み取ることができることがわかりました。以下のようにRedisでテストしてみました

_import spacy
import redis

nlp = spacy.load('en_core_web_lg')
r = redis.Redis(Host = 'localhost', port = 6379, db = 0)
r.set('nlp', nlp)
_

エラーをスローします

_DataError: Invalid input of type: 'English'. Convert to a bytes, string, int or float first.
_

type(nlp)English()であり、適切な形式に変換する必要があるようです。だからピクルスも使って変換してみました。しかし、繰り返しになりますが、pickleはエンコードとデコードに多くの時間を費やしています。これをRedisに保存する方法はありますか?

誰かが私にそれをより速くする方法を教えてもらえますか?ありがとう。

2
Samual

Flask を使用します。このユーザーがここで実装しようとした方法を参照してください: Simple Flask spaCy NLPを使用するアプリが断続的にハングする

HTTPリクエストを介して、データフレームデータをFlaskに送信します。または、ファイルとして保存してサーバーに送信することもできます。

モデルをグローバル変数にロードし、その変数をアプリのコードで使用するだけです。

1
Sushant Gautam

すべての構文が正しい場合、モデルを2回以上ロードすることはできません。 (mlクラスのコンストラクターのみ)

# File1.py

import spacy
class ml:
   def __init__(self, model_path):
       self.nlp = spacy.load(model_path) # 'model'
   def get_vec(self, post):
       return self.nlp(post).vector


# File2.py

from File1 import ml

my_ml = ml('model') # pass model path

df['vec'] = df['text'].apply(lambda x: my_ml.get_vec(x))

1
Zabir Al Nazi