【问题标题】:why is my fastapi or uvicorn getting shutdown?为什么我的 fastapi 或 uvicorn 会被关闭?
【发布时间】:2021-04-06 21:12:09
【问题描述】:

我正在尝试运行一个使用简单转换器罗伯塔模型进行分类的服务。推理脚本/函数本身在测试时按预期工作。当我将它包含在快速 api 中时,它会关闭服务器。

uvicorn==0.11.8
fastapi==0.61.1
simpletransformers==0.51.6
cmd : uvicorn --host 0.0.0.0 --port 5000 src.main:app

@app.get("/article_classify")
def classification(text:str):
    """function to classify article using a deep learning model.
    Returns:
        [type]: [description]
    """

    _,_,result = inference(text)
    return result

错误:

INFO:     Started server process [8262]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:5000 (Press CTRL+C to quit)
INFO:     127.0.0.1:36454 - "GET / HTTP/1.1" 200 OK
INFO:     127.0.0.1:36454 - "GET /favicon.ico HTTP/1.1" 404 Not Found
INFO:     127.0.0.1:36454 - "GET /docs HTTP/1.1" 200 OK
INFO:     127.0.0.1:36454 - "GET /openapi.json HTTP/1.1" 200 OK
before
100%|████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 17.85it/s]
INFO:     Shutting down
INFO:     Finished server process [8262]

推理脚本:

model_name = "checkpoint-3380-epoch-20"
model = MultiLabelClassificationModel("roberta","src/outputs/"+model_name)
def inference(input_text,model_name="checkpoint-3380-epoch-20"):
    """Function to run inverence on one sample text"""
    #model = MultiLabelClassificationModel("roberta","src/outputs/"+model_name)
    all_tags =[]
    if isinstance(input_text,str):
        print("before")
        result ,output = model.predict([input_text])
        print(result)
        tags=[]
        for idx,each in enumerate(result[0]):
            if each==1:
                tags.append(classes[idx])
        all_tags.append(tags)
    elif isinstance(input_text,list):
        result ,output = model.predict(input_text)
        tags=[]
        for res in result : 
            for idx,each in enumerate(res):
                if each==1:
                    tags.append(classes[idx])
            all_tags.append(tags)

    return result,output,all_tags

更新:尝试使用烧瓶并且服务正在运行,但是当在烧瓶顶部添加 uvicorn 时,它卡在重启循环中。

【问题讨论】:

  • 看起来它恰好在处理result ,output = model.predict([input_text]) 行时(或之后)停止。您可以尝试从那里进行调试,将代码行放在 try-catch 块中。

标签: python fastapi multilabel-classification uvicorn simpletransformers


【解决方案1】:

将整个函数放在try-except 块下并显示输出,以便我们调查真正的问题。

import logging

@app.get("/article_classify")
def classification(text:str):
    """function to classify article using a deep learning model.
    Returns:
        [type]: [description]
    """
    try:
    _,_,result = inference(text)
    except:
        logging.exception("something bad happened")  # automatically print exception info

    return result

【讨论】:

  • 没有出现错误/异常,这是开始的问题。
【解决方案2】:

我已经通过显式使用多处理启动进程池解决了这个问题。

from multiprocessing import set_start_method
from multiprocessing import Process, Manager
try:
    set_start_method('spawn')
except RuntimeError:
    pass
@app.get("/article_classify")
def classification(text:str):
    """function to classify article using a deep learning model.
    Returns:
        [type]: [description]
    """
    manager = Manager()

    return_result = manager.dict()
    # as the inference is failing 
    p = Process(target = inference,args=(text,return_result,))
    p.start()
    p.join()
    # print(return_result)
    result = return_result['all_tags']
    return result

【讨论】:

  • 很棒的发现。尝试了与在同一实例中运行的其他进程的所有组合。也用 set_start_method('fork') 进行了测试,但 set_start_method('spawn') 成功了,现在看起来很稳定。谢谢
【解决方案3】:

我最近遇到了类似的问题。我的情况可能有点不同,但想提供它作为参考。我正在使用需要下载大重量文件的句子转换器,下载过程需要 o(10) 秒。但是,默认独角兽有一个设置timeout_notify=30。通过阅读源代码,似乎是导致服务器不断重启的原因,因为下载需要很长时间(接近30秒)。

后来,我使用不同的方式来加快下载速度,然后重启问题就消失了。

【讨论】:

    【解决方案4】:

    根据https://github.com/ThilinaRajapakse/simpletransformers/issues/761,它与多处理有关。

    我设置了 args={'use_multiprocessing': False} 并且网络服务器不再关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 2022-08-04
      • 2021-10-14
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      相关资源
      最近更新 更多