Использование Flask с запросами, связанными с процессором, которые должны распараллеливаться на несколько ядер - PullRequest
0 голосов
/ 13 февраля 2020

Ученый по вычислительной технике, где я работаю, написал программу, которая оценивает входные данные, используя модель машинного обучения, построенную с помощью scikit-learn. Моя задача - сделать этот счетчик ML доступным в качестве микросервиса.

Поэтому я написал несколько строк кода, используя Flask, чтобы выполнить 1015 *. Миссия выполнена!

Ну, не совсем. Поскольку порой этот сервис будет работать довольно интенсивно, он должен иметь возможность обрабатывать несколько запросов параллельно. (То есть на нескольких ядрах. У нас около 20 на нашем сервере.) Решение, которого я могу достичь, потратив около десяти минут, состоит в том, чтобы просто развернуть десять или двадцать этих маленьких REST-серверов на разных портах и ​​выполнить циклический перебор на них. используя nginx в качестве обратного прокси.

Хотя это будет работать нормально, я уверен, что было бы более элегантно иметь один Python сервер, обрабатывающий все запросы, а не двадцать Python серверов. Поэтому я начал читать о WSGI, uWSGI и многом другом. Но все, что я сделал со всем этим чтением и веб-серфингом, в конечном итоге очень запутано.

Поэтому я попрошу здесь вместо того, чтобы пытаться разгадать это самостоятельно: я должен просто придерживаться подхода грубой силы Я описал выше? Или есть что-то лучшее, чем я мог бы заниматься?

Но если для того, чтобы сделать что-то «лучше», потребуются дни усилий, чтобы пройтись по непонятной документации, провести разочаровывающие эксперименты и вырвать все мои волосы, тогда я Я предпочел бы просто придерживаться подхода тупой грубой силы, который я уже понимаю и который точно знаю, сработает.

Спасибо.

Ответы [ 2 ]

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

Я бы посоветовал перенести FastAPI для этого. Он значительно быстрее, действительно прост в использовании (особенно если вы переходите с Flask) и используется многими людьми для вывода ML.

FastAPI использует более новую функциональность asyn c в python, что позволяет обрабатывать значительно больше запросов при том же количестве ресурсов.

Вы также можете использовать существующие контейнеры docker для flask или fastapi вместо настройки самостоятельно.

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

По предложению tedivm я использовал FastAPI и uvicorn для реализации рабочего решения.

Вот пример небольшой серверной программы с именем test_fast_api.py. Он отвечает как на запросы GET, так и на POST (запросы POST должны быть в JSON), а ответы - в JSON:

from typing import List
from fastapi import FastAPI

app = FastAPI()

@app.get("/score/{seq}")
async def score(seq: str):
    return len(seq)

@app.get("/scores/{seqs}")
async def scores(seqs: str):
    return [len(seq) for seq in seqs.split(",")]

@app.post("/scores")
async def scores_post(seqs: List[str]):
    return [len(seq) for seq in seqs]

Эта служба может затем обслуживаться 10 процессами, например так:

$ uvicorn --workers 10 --port 12345 test_fast_api:app

Если бы эта служба была на самом деле привязана к процессору, запуск с использованием 10 процессов позволил бы ей эффективно использовать 10 ядер процессора.

...