Rq: Précharger le modèle d'apprentissage en profondeur

Créé le 16 mai 2019  ·  4Commentaires  ·  Source: rq/rq

J'ai un modèle d'apprentissage en profondeur qui se charge dans le GPU
Je veux le précharger et le réutiliser chaque fois que j'exécute un travail.
J'ai trouvé https://python-rq.org/docs/workers/#performance -notes, mais je ne sais pas comment accéder aux objets à partir du code de travail
custom_worker.py

import sys
from rq import Connection, Worker, SimpleWorker

import cv2
import numpy as np
from cv.cnn_model import init_model, predict
__model = init_model("config.json", "weights.data")#loads to GPU

with Connection():
    qs = sys.argv[1:] or ['default']

    w = SimpleWorker(qs)
    w.work()

job.py

def detect(image_path):    
    image = cv2.imread(image_path)
    data = predict(__model, image) #should use preloaded __model
    return data

Commentaire le plus utile

Enfin, j'ai compris comment cela devrait fonctionner. RQ utilise importlib.import_module pour charger la fonction. Ainsi, chaque fois que vous appelez la fonction, elle charge le fichier de tâches. Donc, si je comprends bien, pour résoudre ce problème, vous devez charger ce fichier AVANT l'exécution du travailleur.

import library_that_you_want_preloaded

doit être remplacé par

from job import predict

pas ça

import cv2
import numpy as np
from cv.cnn_model import init_model, predict
__model = init_model("config.json", "weights.data")#loads to GPU

Mon script final ressemble à ceci
job.py

import cv2
import numpy as np
from cv.cnn_model import init_model, predict


def init_weights():
    global __model
    __model =init_model("config.json", "weights.data")

def predict(image_path):    
    image = cv2.imread(image_path)
    data = predict(__model, image)
    return data

travailleur.py

import sys
from rq import Connection, SimpleWorker
from job import predict, init_weights

with Connection():
    qs = sys.argv[1:] or ['default']
    init_weights()#I initialize model before workers start
    w = SimpleWorker(qs)#I use SimpleWorker because it does not fork
    w.work()

Tous les 4 commentaires

J'ai trouvé une solution en utilisant un travailleur personnalisé pour transmettre le modèle chargé à la fonction de travail
mais ça a l'air moche !

class CustomWorker(SimpleWorker):
    def __init__(self, *args, **kwargs):
        self.__model = init_model("config.json", "weights.data")
        SimpleWorker.__init__(self, *args, **kwargs)

    def execute_job(self, job, queue):
        job.args = (job.args[0], self.__model)
        return self.perform_job(job, queue)

job.py

def detect(image_path, model):    
    image = cv2.imread(image_path)
    data = predict(model, image) #used preloaded model
    return data

TBH Je ne sais pas si vous pourriez faire mieux. C'est probablement comme ça que je ferais aussi. Pourquoi tu penses que c'est moche ?

@hnykda C'est moche parce que je viole l'encapsulation de la classe Worker en changeant sa variable args. A l'origine il devrait représenter les valeurs passées de l'appelant "result = q.enqueue(predict, "1.jpeg")" Il n'y a qu'un seul paramètre !
mais j'ai trouvé une meilleure solution

Enfin, j'ai compris comment cela devrait fonctionner. RQ utilise importlib.import_module pour charger la fonction. Ainsi, chaque fois que vous appelez la fonction, elle charge le fichier de tâches. Donc, si je comprends bien, pour résoudre ce problème, vous devez charger ce fichier AVANT l'exécution du travailleur.

import library_that_you_want_preloaded

doit être remplacé par

from job import predict

pas ça

import cv2
import numpy as np
from cv.cnn_model import init_model, predict
__model = init_model("config.json", "weights.data")#loads to GPU

Mon script final ressemble à ceci
job.py

import cv2
import numpy as np
from cv.cnn_model import init_model, predict


def init_weights():
    global __model
    __model =init_model("config.json", "weights.data")

def predict(image_path):    
    image = cv2.imread(image_path)
    data = predict(__model, image)
    return data

travailleur.py

import sys
from rq import Connection, SimpleWorker
from job import predict, init_weights

with Connection():
    qs = sys.argv[1:] or ['default']
    init_weights()#I initialize model before workers start
    w = SimpleWorker(qs)#I use SimpleWorker because it does not fork
    w.work()
Cette page vous a été utile?
0 / 5 - 0 notes