當前位置:網站首頁>百度BML-飛槳服務器以及Jetson nano部署實戰案例(下)

百度BML-飛槳服務器以及Jetson nano部署實戰案例(下)

2022-01-28 00:07:49 翼達口香糖

百度BML-飛槳服務器以及Jetson nano部署實戰案例(下)

這次我們直接把模型部署到公有雲和Jetson nano的實戰訓練,首先說下用的是公有雲部署,然後再說下Jetson nano。首先說下這裏采用的百度的公有的服務器的部署,因為我自己是沒買服務器資源的,所以這裏就使用百度的公有雲。
第二個是自己的端側設備部署,可以有很多的選擇,百度自己家的硬件會好部署一些,但是這裏還是考慮到大多數人都是使用自己的一些端側設備,所以這次就拿Jetson nano來部署為案例。

在這裏具體模型怎麼訓練、數據怎麼標注、怎麼調參這裏就不具體來寫了,可以看下我前面寫的博客,這裏直接拿一個已經訓練好的模型來進行部署。

公有雲部署

首先這個平臺主要是在百度BML平臺訓練,因為我手上沒有顯卡,所以通過他門的平臺的雲資源顯卡,首先需要登錄BML平臺,首先我們直接跳到模型部署這部,我們的訓練好的模型已經在模型倉庫裏面了。
請添加圖片描述

然後我們隨便挑選一個訓練好的模型
請添加圖片描述

點右側的版本列錶,可以進入到如下的界面

請添加圖片描述
現在支持的部署方式主要有在線服務(公有雲)、端雲協同服務部署、批量預測、純離線服務(端側部署)
四類部署
請添加圖片描述

點開在線服務,因為這裏我們沒有自己的服務器,使用的是百度的雲服務器,但是給點錢。接口地址可以填上自己的服務器,在下面我們寫下怎麼自己申請百度的公有雲接口。
請添加圖片描述

下面還有部署的服務器的資源,越好肯定價格越高。
請添加圖片描述

點擊查看性能曲線還可以查看資源的延時和QPS。請添加圖片描述

請添加圖片描述

怎麼去開一個自己的公有雲接口,首先需要點開自己的頭像,然後你會進入到個人中心,點開左側列錶,那裏有個全功能AI開發平臺BML,點進去就可以看到下面那個頁面。

請添加圖片描述

在在線服務中找到應用列錶,點個創建應用,然後開始申請用一個公有雲服務器。

請添加圖片描述

應用歸屬寫個人,其他的就是補充一些自定義資料,然後就可以
請添加圖片描述

然後可以獲得一個AppID,把這個填入到上面的借口地址中,就可以調用百度的公有雲服務器。
請添加圖片描述

部署完後就可以運行了,這樣子就完成了一次公有雲部署。
請添加圖片描述

一旁有一個體驗H5,你可以設置一個二維碼,讓人可以在線使用這個莫心,比如說你做了個質量檢測的模型,然後你把二維碼給了別人以後別人掃下二維碼上傳照片就可以在線質檢。

請添加圖片描述
請添加圖片描述
請添加圖片描述

上面的公有雲部署比較簡單,接下來說下端側部署,這個複雜一些。以Jetson nano為例子,當然這裏不限於這個,飛槳事實上可以更多的是部署在像win、OS、Linux和MIPS、X86、ARM等諸多環境都是完全沒問題

純離線端側部署

首先我們可以點開純離線部署
請添加圖片描述

然後你會發現有服務器(私有API和服務器端SDK)、通用小型設備(我們用的是這個)、專項適配配件三種

私有API是以docker的形式部署在本地服務器上,目的是為了和公有雲的顯示進行兼容,相關的硬件包括有GPU 和CPU。
另一個SDK是把模型
封裝成適配本地的SDK,可以供用戶進行二次開發,非常靈活
請添加圖片描述
這是第一種,服務器部署,基本上和各大廠商都兼容
請添加圖片描述

第二種是通用小型設備
請添加圖片描述

第三種是百度自家的硬件,我也沒有就不看了。

我們針對第二個通用小型設備進行部署。請添加圖片描述

點擊部署後,你可以看到正在發布中

好,接下來我們上我們自己的Jetson nano,
請添加圖片描述

這裏有兩個選擇,一個下載SDK,這個可以獲取zip 壓縮包,另一個是獲取序列號,用於激活。你可以這麼理解,就是你在百度這邊訓練模型後做出一個壓縮包,然後下載到設備中去,解壓後在部署過程中你得用序列號去激活,第一次使用要聯網激活。然後官方在這裏收取一定的費用。
請添加圖片描述

請添加圖片描述

這裏我們使用的是獨立的jetson nano ,但是工業上一般都是不用屏幕的,一般都是把設備作為電腦的隨從設備去調的。這裏用這套的東西給配了屏幕和鍵盤是我自己學習用的哈哈哈。

由於屏幕太小了Linux截圖互傳太麻煩,所以這裏直接用官方的代碼就不截圖了。

在這裏插入圖片描述

在這裏插入圖片描述

安裝 paddlepaddle
使用x86_64 CPU 基礎版預測時必須安裝:

pip3 install -U paddlepaddle==1.8.5

大家看版本,下面這個版本沒問題,可以隨時更新最新的版本
使用NVIDIA GPU 基礎版預測時必須安裝:

pip3 install -U paddlepaddle-gpu==1.8.5.post107 
pip3 install -U paddlepaddle-gpu==1.8.5.post97 

同時有幾個注意的地方:
如果你使用的是Nvidia GPU 加速版預測時必須安裝cuda、cudnn。 依賴的版本為 cuda9.0、cudnn7。版本號必須正確。
安裝 pytorch(torch >= 1.7.0)
目標跟踪模型的預測必須安裝pytorch版本1.7.0及以上(包含:Nvidia GPU 基礎版、x86_64 CPU 基礎版)。
目標跟踪模型Nvidia GPU 基礎版也需安裝依賴cuda、cudnn。

關於不同版本的pytorch和CUDA版本的對應關系:pytorch官網 目標跟踪模型還有一些列舉在requirements.txt裏的依賴(包括torch >= 1.7.0),均可使用pip下載安裝。

pip3 install -r requirements.txt
  1. 安裝 easyedge python wheel 包
 pip3 install -U BaiduAI_EasyEdge_SDK-{
    版本號}-cp36-cp36m-linux_x86_64.whl

接下裏就是使用序列號激活啦,這個需要點開上面的那個獲取序列號,然後選擇聯網激活,那裏有一個序列號的號碼,等會就用。
請添加圖片描述

修改demo.py 填寫序列號

 pred = edge.Program()
pred.set_auth_license_key("這裏填寫序列號")

然後接下來是測試 Demo

圖片預測的話是需要找到你要輸入對應的模型文件夾(默認為RES)和測試圖片路徑,運行:

 python3 demo.py {
    model_dir} {
    image_name.jpg}

除此之外也可以試下視頻預測,

輸入對應的模型文件夾(默認為RES)和測試視頻文件路徑 / 攝像頭id / 網絡視頻流地址

video_type指的是輸入源類型,主要有本地視頻文件、攝像頭的index、網絡視頻流

video_src裏面寫的是輸入源地址,如視頻文件路徑、攝像頭index等等

然後運行下面這個代碼

python3 demo.py {
    model_dir} {
    video_type} {
    video_src}

就可以跑起來了

在聯網的狀態的下你甚至可以直接在電腦端登錄來用我們的模型

  1. 測試Demo HTTP 服務
    輸入對應的模型文件夾(默認為RES)、序列號、設備ip和指定端口號,運行:
 python3 demo_serving.py {
    model_dir} {
    serial_key} {
    host, default 0.0.0.0} {
    port, default 24401}

然後就會顯示:

Running on http://0.0.0.0:24401/

字樣,此時,開發者可以打開瀏覽器,http://{設備ip}:24401,選擇圖片或者視頻來進行測試。

詳細的使用代碼說明

demo.py

 import BaiduAI.EasyEdge as edge

pred = edge.Program()
pred.set_auth_license_key("這裏填寫序列號")
pred.init(model_dir={
    RES文件夾路徑}, device=edge.Device.CPU, engine=edge.Engine.PADDLE_FLUID)
pred.infer_image({
    numpy.ndarray的圖片})
pred.close()

demo_serving.py

 import BaiduAI.EasyEdge as edge
from BaiduAI.EasyEdge.serving import Serving

server = Serving(model_dir={
    RES文件夾路徑}, license=serial_key)


# 請參考同級目錄下demo.py裏:
# pred.init(model_dir=xx, device=xx, engine=xx, device_id=xx)
# 對以下參數device\device_id和engine進行修改
server.run(host=host, port=port, device=edge.Device.CPU, engine=edge.Engine.PADDLE_FLUID)

初始化
接口

     def init(self,
            model_dir,
            device=Device.LOCAL,
            engine=Engine.PADDLE_FLUID,
            config_file='conf.json',
            preprocess_file='preprocess_args.json',
            model_file='model',
            params_file='params',
            graph_file='graph.ncsmodel',
            label_file='label_list.txt',
            device_id=0
            ):
       """
       Args:
           device: Device.CPU
           engine: Engine.PADDLE_FLUID
           model_dir: str
               model dir
           preprocess_file: str
           model_file: str
           params_file: str
           graph_file: str
           label_file: str
           device_id: int

       Raises:
           RuntimeError, IOError
       Returns:
           bool: True if success

       """

使用 NVIDIA GPU 預測時,必須滿足:

機器已安裝 cuda, cudnn
已正確安裝對應 cuda 版本的 paddle 版本
通過設置環境變量FLAGS_fraction_of_gpu_memory_to_use設置合理的初始內存使用比例
使用 CPU 預測時,可以通過在 init 中設置 thread_num 使用多線程預測。如:

 pred.init(model_dir=_model_dir, device=edge.Device.CPU, engine=edge.Engine.PADDLE_FLUID, thread_num=1)

預測圖像

接口
快捷鍵目錄標題文本樣式列錶鏈接代碼片錶格注脚注釋自定義列錶LaTeX 數學公式插入甘特圖插入UML圖插入Mermaid流程圖插入Flowchart流程圖插入類圖
代碼片複制

下面展示一些 內聯代碼片

// A code block
var foo = 'bar';

     def infer_image(self, img,
                   threshold=0.3,
                   channel_order='HWC',
                   color_format='BGR',
                   data_type='numpy'):
       """

       Args:
           img: np.ndarray or bytes
           threshold: float
               only return result with confidence larger than threshold
           channel_order: string
               channel order HWC or CHW
           color_format: string
               color format order RGB or BGR
           data_type: string
               image data type
           
       Returns:
           list

       """

請添加圖片描述

x1 * 圖片寬度 = 檢測框的左上角的橫坐標

y1 * 圖片高度 = 檢測框的左上角的縱坐標

x2 * 圖片寬度 = 檢測框的右下角的橫坐標

y2 * 圖片高度 = 檢測框的右下角的縱坐標

可以參考 demo 文件中使用 opencv 繪制矩形的邏輯。

結果示例

i) 圖像分類

{
“index”: 736,
“label”: “table”,
“confidence”: 0.9
}

ii) 物體檢測

{
“y2”: 0.91211,
“label”: “cat”,
“confidence”: 1.0,
“x2”: 0.91504,
“index”: 8,
“y1”: 0.12671,
“x1”: 0.21289
}

iii) 圖像分割

{
“name”: “cat”,
“score”: 1.0,
“location”: {
“left”: …,
“top”: …,
“width”: …,
“height”: …,
},
“mask”: …
}
mask字段中,data_type為numpy時,返回圖像掩碼的二維數組

{
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
}
其中1代錶為目標區域,0代錶非目標區域
data_type為string時,mask的遊程編碼,解析方式可參考 demo

預測視頻(目前僅限目標跟踪模型調用)

接口

 def infer_frame(self, frame, threshold=None):
   """
   視頻推理(抽幀之後)
   :param frame:
   :param threshold:
   :return:
   """

請添加圖片描述

版權聲明
本文為[翼達口香糖]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201280007487110.html

隨機推薦