iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0

前情提要: 昨天已經把inference的code搞定了,雖然需要花時間重寫,但重寫完非常簡潔,看了心情十分之好~

1. CRUD

在開始寫fastapi之前,我們簡單來介紹一下web的基礎概念,CRUD分別是四個英文的縮寫,對應到

  • Create (C)
  • Read (R)
  • Update (U)
  • Delete (D)

主要就是新增 讀 更新 刪除,這裡有很多資料會放在Database (DB),那前端網頁會設計頁面讓你點了之後,會去戳後端的API,後端會與DB做連線,做完之後後端回傳結果給前端,前端再透過頁面告訴使用者。

2. fastapi

進公司之後就學fastapi,不然還有flask或者Diango,那當中都是說fastapi高性能,所以直接選擇使用他來開發,所以比較少碰其他兩個。

再來就是我們可以透過fastapi來創造上面說的CRUD的API,在我自己部屬模型,最常用到的就是post,其餘的基本很少碰到,這裡CURD簡單對應fastapi的部分:

  • Read → get
  • Create → post
  • Update → put
  • Delete → delete

安裝非常簡單

最後一個是讓我們可以上傳檔案,要上傳檔案主要是要送到model去辨識,聲音當然就是音檔,圖像當然就是圖片。

pip install fastapi uvicorn python-multipart

3. 創一個app.py

我們先來個官方範例,程式非常簡單,然後在你的terminal輸入

uvicorn app:app --port 8000
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

因為我是在我自己比筆電上跑的,所以最後是run在http://127.0.0.1:8000,輸入網址就可以得到囉
https://ithelp.ithome.com.tw/upload/images/20240818/20168446cEO2EbhaLE.png
https://ithelp.ithome.com.tw/upload/images/20240818/20168446IcV4BPulzu.png
再來我們在後面多加/docs,fastapi另一個好處就是有這樣子的頁面讓你可以做測試。
https://ithelp.ithome.com.tw/upload/images/20240818/20168446XhADvBSpWb.png

4. 上傳檔案

剛才有提到,我們是要做model的辨識的,

  1. 上傳檔案: 這時對應到的就是app.post,當中的/api/v1/mnist這個你可以自行定義,通常會是/api/版本/任務
  2. 透過fastapi當中的UploadFile,以及透過with open來儲存檔案,with open儲存檔案這個我們在先前爬蟲的code也有看到哦!!
  3. 多新增了一些log來幫助DEBUG,因為有時候會遇到莫名其妙的問題,那只要有一部份有錯,可能就導致最後沒有回傳結果,那戳你這隻api的人根本不知道發生甚麼事,所以一些基礎的log及判斷要有。

可以先ctrl + c斷掉terminal在跑的,然後再下一次指令,reload主要是當你save py檔的時候,他會讓頁面直接重載,用於開發時不用一直斷掉再跑。

uvicorn app:app --port 8000 --reload
import logging

from fastapi import FastAPI, UploadFile, File
from fastapi import FastAPI

FORMAT = '%(asctime)s %(levelname)s [%(filename)s] %(message)s'
logging.basicConfig(level = logging.INFO, format = FORMAT)

app = FastAPI(title = 'deploy mnist classifer model')


@app.get("/")
async def root():
    return {"message": "Hello World"}


@app.post("/api/v1/mnist")
async def mnist_classifer(
        file: UploadFile = File(None), 
    ):
    '''
        Args:
            file: 上傳的檔案
    '''
    try:
        file_location = "./temp.jpg"
        with open(file_location, "wb+") as file_object:
            file_object.write(file.file.read())
            
        logging.info(f"Successfully uploaded {file.filename}")

    except Exception as e:
        logging.DEBUG(e)
        return {"error": f"failed uploaded {file_location}"}

再回到我們的頁面,你發現多了一個POST,然後可以按Try it out,就發現可以上傳檔案做測試囉。
https://ithelp.ithome.com.tw/upload/images/20240818/20168446dkPPRQJwN6.png

在terminal還能看到我們用logging顯示的資訊,以及fastapi成功的資訊。
https://ithelp.ithome.com.tw/upload/images/20240818/20168446gEdxcRTSsC.png

今天就先到這裡囉~ 明天會把fastapi與昨天的inference code做合併。
主要是稍微介紹一下,有興趣的可以在網路上搜尋更多的教學,或者官網上有很多範例,可以去體驗看看。


上一篇
[Day 13] pytorch lightning (predict_step)
下一篇
[Day 15] fastapi + pytorch lightning
系列文
菜鳥AI工程師給碩班學弟妹的挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言