Слишком медленный первый запуск модели TorchScript и ее реализация в Flask - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь развернуть факсимильную модель в Python и Flask. Как я понял (по крайней мере, как уже упоминалось здесь ), скриптовые модели необходимо "прогреть" перед использованием, поэтому первый запуск таких моделей занимает гораздо больше времени, чем последующие. Мой вопрос: есть ли способ загрузить модели с факелами на маршруте Flask и прогнозировать без потери времени на «разогрев»? Могу ли я хранить где-нибудь «прогретую» модель, чтобы избежать прогрева при каждом запросе? Я написал простой код, который воспроизводит проход «прогрева»:

    import torchvision, torch, time
    model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)
    model = torch.jit.script(model)
    model.eval()
    x = [torch.randn((3,224,224))]
    for i in range(3):
      start = time.time()
      model(x)
      print(‘Time elapsed: {}’.format(time.time()-start))

Вывод:

Time elapsed: 38.29<br>
Time elapsed: 6.65<br>
Time elapsed: 6.65<br>

И Flask код:

    import torch, torchvision, os, time
    from flask import  Flask
    app = Flask(__name__)
    @app.route('/')
    def test_scripted_model(path='/tmp/scripted_model.pth'):
        if os.path.exists(path):
            model = torch.jit.load(path, map_location='cpu')
        else:
            model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)
            model = torch.jit.script(model)
            torch.jit.save(model, path)
        model.eval()
        x = [torch.randn((3, 224, 224))]
        out = ''
        for i in range(3):
            start = time.time()
            model(x)
            out += 'Run {} time: {};\t'.format(i+1, round((time.time() - start), 2))
        return out
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000, debug=False)

Выход:

Run 1 time: 46.01; Run 2 time: 8.76; Run 3 time: 8.55;

ОС: Ubuntu 18.04 & Windows10
Python версия: 3.6.9 Flask: 1.1.1 Факел: 1.4.0 Torchvision: 0.5.0

Обновление:

Решена проблема «прогрева» как:

with torch.jit.optimized_execution(False):
    model(x)

Update2 : Решена Flask проблема (как упомянуто ниже) с созданием глобального объекта модели python перед запуском сервера и его прогревом там. Затем в каждом запросе модель готова к использованию.

    model = torch.jit.load(path, map_location='cpu').eval()
    model(x)
    app = Flask(__name__)

, а затем в @ app.route:

@app.route('/')
def test_scripted_model():
    global model
    ...
    ...

1 Ответ

1 голос
/ 15 февраля 2020

Могу ли я хранить где-нибудь "прогретую" модель, чтобы избежать прогрева при каждом запросе?

Да, просто создайте экземпляр вашей модели вне функции test_scripted_model и обратитесь к это изнутри функции.

...