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


    针对前文所述 机器学习模型部署摘要 中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"\n 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/

  • 相关阅读:
    Angular2新人常犯的5个错误
    好爱情,坏爱情
    关于css中a标签的样式
    移动端rem布局实践
    我们这一代人的困惑
    原创ui.router源码解析
    Web客户端数据存储学习笔记——Cookie
    喝汤了——如何用一年时间获得十年的能力和经验
    Petya勒索木马
    推荐几个精致的web UI框架
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/15999587.html
Copyright © 2020-2023  润新知