Press "Enter" to skip to content

基于FastAPI和Docker的机器学习模型部署快速上手

针对前文所述机器学习模型部署摘要 中docker+fastapi部署机器学习的一个完整示例

 

outline

fastapi简单示例
基于文件内容检测的机器学习&fastapi
在docker容器部署

Install

 

pip install fastapi
pip install "uvicorn[standard]"

 

example

 

from typing import Optional
from fastapi import FastAPI
#创建FastAPI实例
app = FastAPI()
#创建访问路径
@app.get("/")
def read_root():#定义根目录方法
    return {"message": "Hello World"}#返回响应信息
#定义方法,处理请求
@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

 

在开发代码时,为了调试方便,可以使用如下命令

 

uvicorn main:app --reload

 

uvicorn main:app –reload 含义

main:main.py 文件
app:在main.py
文件中通过app = FastAPI()
创建的对象。
--reload
:让服务器在更新代码后重新启动。仅在开发时使用该选项。

upload file and predict

 

一个简单的上传文件并对文件进行检测的小样例

 

from typing import Optional
from sympy import content
import uvicorn
from fastapi import FastAPI,File,UploadFile
from io import BytesIO
from ml.predict import load_model,Features,predict
#创建FastAPI实例
app = FastAPI()
#创建访问路径
@app.get("/")
def read_root():
    return {"message": "Hello World"}
# 加载模型
models = load_model()
def test(file):
feature = Features(file)
return model.predict(feature)
#调用模型接口
@app.post("/detect/v2")
async def detect2(file: UploadFile):
    f = file.file
    content = await file.read()
    res = test(content)
    return {
        "filename": file.filename,
        "attributes": (len(content),str(type(f)),str(type(content))),
        "result": res
        }
#运行
if __name__ == '__main__':
    uvicorn.run(app, host="127.0.0.1", port=8000)

 

test

 

127.0.0.1:8000/docs
页面可以测试验证模型

 

request post

 

使用request构造post请求验证结果

 

import time
import requests
t0 = time.time()
url2 = 'http://127.0.0.1:8000/detect/v2'
filename2 = "examples/00bb57e75b014b9342326afd2e7b7b071ee3f08205e56d0f1bfab8542509212a"
# requests库post请求文件格式
files = {
    'file':(filename2,open(filename2, 'rb'))
    }
response2 = requests.post(url2, files=files)
print(response2.content, f"
 spend time: {time.time()-t0}")

 

deployment

 

install docker

 

$ curl -fsSL https://get.docker.com -o get-docker.sh
 $ sudo sh get-docker.sh

 

官方文档https://docs.docker.com/engine/install/ubuntu

 

创建Dockerfile

 

目录结构如下

 

.
├── app
│   ├── __init__.py
│   └── main.py #代码目录
├── Dockerfile
└── requirements.txt

 

构建Dockerfile

 

vim Dockerfile

 

FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

 

build docker image

 

在Dockerfile所在目录执行

 

docker build -t myimage .

 

Start the Docker Container

 

docker run -d --name mycontainer -p 80:80 myimage

 

至此,基于docker的fastapi部署完成,可以在主机对应地址看到web信息,或发起对应http请求。

 

官方文档https://fastapi.tiangolo.com/zh/deployment/docker/

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注