Gradio快速搭建ML/DL Web端服務(wù)
前言
當(dāng)我們訓(xùn)練好了某個(gè)模型并且效果還不錯(cuò)時(shí),最先想到的應(yīng)該是部署.部署又可以分為線上Web服務(wù)和邊緣模塊上;為了匯報(bào)的時(shí)候往往還是選擇線上部署,畢竟盒子部署好了還得配置相應(yīng)的硬件輸入也不方便展示.在這個(gè)專欄之前嘗試用fastapi
搭建了Web服務(wù),并且將一些算法模型部署到api接口中,但是由于要自己設(shè)計(jì)一些預(yù)處理工作,路由,附加功能以及頁面UI感覺很麻煩.所以今天就介紹一下這個(gè)基于fastapi
構(gòu)建的一個(gè)非常方便就可以部署模型且功能強(qiáng)大的Web框架—Gradio
官網(wǎng)的鏈接在這里,大家可以先去了解一下Gradio 雖然目前沒有中文文檔,但是我感覺整個(gè)文檔寫的還是比較好讀懂的,所以一步步模仿文檔操作也不難.
介紹了這么多,下面就開始寫demo.計(jì)劃是這樣的
- 擼一個(gè)簡(jiǎn)單的層數(shù)較少的ResNet,在
cifar10
上訓(xùn)練一下,得到一個(gè)效果好點(diǎn)的模型(這里不用遷移主要是之前為了實(shí)驗(yàn)重參數(shù)化在ResNet結(jié)構(gòu)上效果不好然后自己寫了個(gè)簡(jiǎn)單的順便拿來用了) - 使用
Gradio
編寫一個(gè)Web服務(wù),其實(shí)只要我們實(shí)現(xiàn)推理的函數(shù)就行,其他的只用實(shí)例化接口,非常快捷.
開始
模型訓(xùn)練
最基本的殘差模塊堆一堆,接個(gè)全連接層分類然后就可以訓(xùn)練了.這里面訓(xùn)練特意嘗試了一下最近幾年提出的Ranger優(yōu)化器代替之前的sgd,adam之類的,效果確實(shí)會(huì)有一定的提升.
來看看官網(wǎng)給出的效果對(duì)比,經(jīng)過我的訓(xùn)練結(jié)果來看也確實(shí)如此.
使用的最簡(jiǎn)單方法只需要把ranger21.py下載下來,然后訓(xùn)練的時(shí)候引用就可以了或者按照官網(wǎng)用pip安裝pip install git+https://github.com/lessw2020/Ranger21.git
只有幾層的模型最終效果也還不錯(cuò)
這樣我們就得到了一個(gè)效果還可以的模型,下一步就使用Gradio
部署
部署
從官網(wǎng)的入門教程可以看到,我們需要自己寫推理部分的函數(shù),并且在gr.Interface()
中注冊(cè)自己的函數(shù)以及輸入輸出一些附加功能.不得不說這個(gè)框架封裝之后真的非常便于開發(fā),很多功能已經(jīng)實(shí)現(xiàn)了,比如:結(jié)果緩存,模型解釋甚至考慮到訪問量特別大的時(shí)候利用隊(duì)列而不是并行進(jìn)行結(jié)果響應(yīng)等等
先加載模型然后寫推理函數(shù)
if os.path.exists("best.pt"):
ResNet.load_state_dict(torch.load('best.pt'))
ResNet.eval()
labels=['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']
def classify_image(img):
img = transforms.ToTensor()(img).unsqueeze(0).cuda()
with torch.no_grad():
predict=torch.nn.functional.softmax(ResNet(img)[0],dim=0).cpu()
confidence={labels[i]:float(predict[i]) for i in range(10)}
return confidence
然后注冊(cè)到接口實(shí)例化并啟動(dòng)
gr.Interface(
fn=classify_image,
inputs=gr.Image(type="pil",shape=(320,320)),
outputs=gr.Label(num_top_classes=10),
examples=['./data/airplane.jpeg'],
interpretation="default",cache_examples=True,title="Shelgi的分類Demo"
).launch(enable_queue=True)
上面的解釋基于默認(rèn)的``SHAP`,也可以設(shè)置自己的解釋函數(shù).再來看看其他的結(jié)果
到這里基本的部署部分就實(shí)現(xiàn)了,但是和以往慣例一樣,還是要帶著看看源碼的.
源碼部分
開頭我說這是基于fastapi
封裝的框架,那就來好好看看它的一些實(shí)現(xiàn).最基本的既然是Web框架,那就先看看它的路由部分.
很明顯,就是利用fastapi來搭建路由的.App
繼承了FastAPI
,實(shí)現(xiàn)了自己的相關(guān)路由(login,config,file等等)
然后在blocks
中有更多功能的實(shí)現(xiàn),包括前處理,運(yùn)行注冊(cè)函數(shù)和后處理,這也是調(diào)用預(yù)測(cè)的重要代碼
再來看看基礎(chǔ)設(shè)置,類似于url,端口號(hào)這些都在networking.py
中,設(shè)置如下圖
當(dāng)然,我們也可以對(duì)頁面進(jìn)行一些自己的diy設(shè)計(jì)
可以看出來靜態(tài)頁面是從templates
文件夾下讀取的,所以我們可以對(duì)頁面進(jìn)行更改.或者我們想要簡(jiǎn)單的添加一些內(nèi)容,可以試試模仿標(biāo)題和描述那樣,調(diào)用Markdown()
進(jìn)行添加
文章來源:http://www.zghlxwxcb.cn/news/detail-504827.html
當(dāng)然如果想要?jiǎng)?chuàng)造更復(fù)雜的頁面,就需要使用Blocks
一點(diǎn)點(diǎn)的組建頁面,更詳細(xì)的內(nèi)容有興趣的可以去官網(wǎng)文檔中好好查看.文章來源地址http://www.zghlxwxcb.cn/news/detail-504827.html
到了這里,關(guān)于Gradio快速搭建ML/DL Web端服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!