问题描述
我使用 Python 和 FastAPI 构建了一个 API。使用此 API,我的目标是可以训练自定义的 spaCy NLP 模型。
这是我的代码:
'''
main.py
'''
from fastapi import FastAPI,HTTPException
from pydantic import BaseModel
import subprocess
import sys
app = FastAPI()
class Project(BaseModel):
token: str
def run_task(cmd,project_path):
process = subprocess.Popen(cmd,cwd=project_path,shell=True,bufsize=1,universal_newlines=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
return process
@app.post("/project/train")
async def main(project: Project):
project_path = '/'.join(["textcat","projects",project.token])
process = run_task("python -u -m spacy project run all",project_path)
return {
"status": "success","process_id" : process.pid
}
我通过以下方式运行应用程序:
python -m uvicorn main:app
然后,我触发一个 POST 请求到:http://127.0.0.1:8000/project/train
与以下正文:
{
"token":"1234"
}
我触发的子进程 python -m spacy project run all
基本上是运行 spaCy workflow,这可能需要相当长的时间(小时)才能完成。
假设,在我的团队中,我们有两个用户,每个用户都想训练一个自定义模型——这意味着我们都将向 API(使用不同的项目令牌)发送请求,并触发 NLP 模型的训练。
解决方法
我看到了两种方法:
- 在文本文件中记录您的进度
- 在数据库中记录您的进度
在任何情况下,您都必须将其写在磁盘上的某个位置,而不是内存中,以便在应用程序意外停止的情况下,您仍然可以知道您的工作在哪里停止。