基于彈性云服務器的昇騰AI應用開發隨筆【與云原生的故事】
什么是彈性云服務器?
先來說說云服務器(Elastic Cloud Server),云服務器是具有完整硬件、操作系統、網絡功能,并且運行在一個完全隔離環境中的計算機系統。云服務器具有彈性、按需獲取的特點。簡單來說,就是能夠彈性獲得資源的云服務器。而我選擇使用的是華為云提供的彈性云服務器,規格如下圖所示,是用來做基于Ascend 310的應用開發的,得益于云服務的方便和快捷,我通過接收官方共享的鏡像,可以快速創建應用開發環境,進行我自己的開發,很方便,更重要的是極大克服了時間和空間的限制,隨時隨地,有網路,有瀏覽器就能開發了,對本地硬件要求大大降低。從生產的角度講,還很方便進行擴容、傳輸和分享。
這里,我很感興趣的是,彈性云服務器的隔離和獨立性,個人認為這應該是基于容器之類的的服務,隔離底層硬件,直接向上提供給用戶服務,使得用戶無需關心底層硬件,我了解到容器使應用程序不僅彼此隔離,而且與底層系統隔離。這不僅使軟件棧更干凈,而且更容易使容器化應用程序使用系統資源,例如CPU、GPU、內存、I/O、網絡等,此外,還可以確保數據和代碼保持獨立。這些在開發中有了體會,比如如果當前系統崩潰或出現問題,我一般直接再創建一個彈性云服務器就好了,又是一個全新的環境。
下面來介紹下我在彈性云服務器上基于Ascend 310的應用開發,這其實是在參加CANN訓練營,這里推薦一下,硬核AI技術 · 新手+進階定制化課程 更有無人機等超級大獎等你來!!感興趣的同學,可以來參加一下,小白亦可,有新手班,還是不錯的!
昇騰AI應用開發
這里主要是基于Ascend 310處理器的彈性云服務器做應用開發,偏向于媒體數據處理,并最終應用于AI模型推理,更多詳情,可參考媒體數據處理精講與實戰。
應用第一彈
前情提要
1. 按照官方B站視頻介紹,接收鏡像,并創建云服務器;如果不想看視頻,可以參照其他開發者的教程配置環境,推薦教程【CANN訓練營進階班應用課筆記】大作業1實戰趟坑記錄。
2. ssh登錄服務器,可以用MobaXterm,也可以直接用Visual Studio Code,這里選擇前者,因為MobaXterm支持X server,簡單來說,就是支持圖形界面,方便我們后續查看yuv文件,如果有朋友不熟悉,推薦教程【CANN訓練營進階班應用課筆記】大作業1實戰趟坑記錄。
準備工作
1. 安裝ffmepg。方便通過ffplay查看yuv文件。在root用戶下執行如下命令即可:
sudo apt-get install ffmpeg
2. 切換到用戶HwHiAiUser。因為默認是root用戶登陸,但是運行代碼用HwHiAiUser用戶才行,否則報錯。
具體操作
1. 將jpeg圖片解碼成yuv格式(輸入文件是dog1_1024_683.dog,尺寸為1024 x 683)先來看看輸入jpg文件
接下來操作!
# 確保已經切換到HwHiAiUser用戶 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpegd/scripts # 注意下面命令運行時,會彈出架構選項,因為我們的CPU是x86架構的,所以這里選擇x86,如下圖所示 bash sample_build.sh bash sample_run.sh
最終程序運行成功截圖:
我們到這個目錄下可以看到生成的.yuv文件:
/home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpegd/out/output
如下圖所示:
接下來,我們查看圖片,在root用戶下執行命令:
# 注意在root用戶下執行,如果不是root用戶,可執行su root進行切換 ffplay -f rawvideo -video_size 1024x683 dvpp_output.yuv
可以看到,如下圖片,注意這是依賴了MobaXterm的X Server
此時程序運行截圖:
可以看到yuv格式的文件上方有一條黃邊,在使用ffplay查看時,需要設置圖像大小,這里設置的是解碼之前的jpeg文件大小,即1024 x 683,而得到的yuv文件,要符合DVPP的寬128對齊,高16對齊要求,原文件寬度沒問題,高度要調整對齊,則應為1024 x 688(688是16的倍數),即高度增加了,接下來,我們運行如下代碼試試:
ffplay -f rawvideo -video_size 1024x688 dvpp_output.yuv
得到如下圖片:
上方的黃邊沒了,但是下方多了一條綠邊,應該就是因為高度對齊帶來的吧,正如作業文檔提到的那樣:
2. 對yuv格式進行resize(輸入是上一步得到的yuv格式文件)
# 注意之前可能是root用戶,這里我們通過su HwHiAiUser切換為HwHiAiUser用戶 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/scripts # 注意下面命令運行時,仍然會彈出架構選項,因為我們的CPU是x86架構的,所以這里選擇x86,如下圖所示 bash sample_build.sh
我們希望resize第一步生成的yuv文件,并設置resize大小,所以先將之前生成的yuv文件拷貝到當前程序的輸入目錄
cp /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpegd/out/output/dvpp_output.yuv /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/data/
接下來,修改運行腳本sample_run.sh,主要是輸入圖片的路徑和resize的分辨率:
cd ../scripts/ vim sample_run.sh # 將sample_run.sh的第10行,替換為如下,表示輸入yuv文件路徑是../data/dvpp_output.yuv,大小是1024 x 688,resize后大小是224 224 running_command="./main ../data/dvpp_output.yuv 1024 688 ./output/output.yuv 224 224 " # 運行程序 bash sample_run.sh
我們來看下運行成功截圖:
下面看看resize后的yuv文件
# 查看yuv文件要root用戶,所以先切換 su root # 切換到輸出的yuv文件目錄 cd ../out/output # 查看yuv文件 ffplay -f rawvideo -video_size 224x224 output.yuv
可以看到明顯變小了,而且沒有綠邊或黃邊,這應該是因為DVPP的輸入是符合前面提到的寬高對齊要求的。但要注意的是我們設置的resize大小224 x 224的寬度是不符合128對齊的。
3. resize后的yuv文件編碼成jpg圖片(輸入是上一步得到的resize后的yuv格式文件)
# 注意之前可能是root用戶,這里我們通過su HwHiAiUser切換為HwHiAiUser用戶 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/scripts # 修改main.cpp文件,執行輸入yuv文件路徑和大小 # 切換到main.cpp所在文件夾 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/src # 修改文件 vim main.cpp # 在第242行,將該行替換為如下: PicDesc testPic = {"../data/output.yuv", 224, 224}; # 注意下面命令運行時,仍然會彈出架構選項,因為我們的CPU是x86架構的,所以這里選擇x86 bash sample_build.sh # 接下來,我們要將上一步得到的resize后的yuv文件拷貝過來作為輸入 cp /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/out/output/output.yuv /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/data/dvpp_output.yuv # 運行程序 bash sample_run.sh
最終運行成功截圖:
最終得到編碼后的圖片
至此,我們完成了全部流程,對于輸入文件是dog1_1024_683.dog,尺寸為1024 x 683的jpg文件——> 解碼為YUV文件——>resize到224 x 224 大小——>編碼為jpg文件,最終得到了編碼后的,如上圖所示的jpg文件。
應用第二彈
這是在前一步的基礎上的延伸和拓展,一脈相承
前情提要
1. 按照官方B站視頻介紹,接收鏡像,并創建云服務器;如果不想看視頻,可以參照其他開發者的教程配置環境,推薦教程【CANN訓練營進階班應用課筆記】大作業1實戰趟坑記錄。
2. ssh登錄服務器,可以用MobaXterm,也可以直接用Visual Studio Code,這里選擇前者,因為MobaXterm支持X server,簡單來說,就是支持圖形界面,方便我們后續查看yuv文件,如果有朋友不熟悉,推薦教程【CANN訓練營進階班應用課筆記】大作業1實戰趟坑記錄。
準備工作
1. 安裝ffmepg。方便做視頻解碼和通過ffplay查看yuv文件。在root用戶下執行如下命令即可:
sudo apt-get install ffmpeg
2. 切換到用戶HwHiAiUser。因為默認是root用戶登陸,但是運行代碼用HwHiAiUser用戶才行,否則報錯。
3. 任務要求。從開發手冊可以看到
首先,明確輸入是一段.mp4封裝的視頻,輸出是jpeg圖片(注意,圖片的“分辨率”與輸入視頻不同),具體來說,整個過程是
本地.mp4封裝的視頻(無法直接對mp4格式封裝的視頻做解碼,需要先轉換為H.264/H.265視頻流)------>硬解碼為H.264/H.265視頻流——>解碼得到YUV圖片(一張或多張))——>縮放(修改分辨率,一張或多張)——>硬編碼為jpeg文件(一張或多張)
這里提供一段mp4格式封裝的視頻,分辨率為1920 x 1080(1080P),幀率為25,編碼為AVC(H.264),下載鏈接為:
鏈接:https://pan.baidu.com/s/10b3x15HfGHRmam16M1sGrw
提取碼:fo6c
預覽一下視頻!這是一段經典的視頻,一般用于展示行人檢測或跟蹤的應用效果。
具體操作
1. 將輸入的mp4文件解碼為H.264或H.265視頻流
接下來操作!因為昇騰處理器中的視頻編解碼專用硬件電路無法直接對mp4格式封裝的視頻操作,要求輸入是H.264/H.265視頻流,所以我們先對輸入的mp4視頻做“拆裝”,可以通過ffmpeg來做:
# 注意,我們要先將視頻文件TownCentreXVID_1920_1080_25_AVC_H264.mp4上傳到 # /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/data/下 # 上傳操作也很簡單,直接在MobaXterm上打開到上述目錄,點擊上傳即可 ffmpeg -i TownCentreXVID_1920_1080_25_AVC_H264.mp4 -vcodec h264 TownCentreXVID_1920_1080_25_AVC_H264.h264
運行過程截圖:
運行結果截圖:
好了,我們現在得到想到的H.264視頻流了(即?TownCentreXVID_1920_1080_25_AVC_H264.h264),下面要開始解碼了,得到YUV格式文件:
首先要修改下main.cpp中的一些參數設置:
# 進入main.cpp所在目錄 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/src # vim修改文件 vim main.cpp # 首先,修改輸入文件路徑和名稱,將第22行的std::string filePath= "../data/vdec_h265_1frame_rabbit_1280x720.h265"; 修改為 std::string filePath= "../data/TownCentreXVID_1920_1080_25_AVC_H264.h264"; # 其次,修改輸入視頻大小 # 將第23行的const int inputWidth = 1280; 修改為 const int inputWidth = 1920; # 將第24行的const int inputHeight = 720; 修改為 const int inputHeight = 1080; # 這樣才和我們的輸入視頻大小相匹配 # 最后修改解碼設定,將第 40行的int32_t enType_ =0 ; 改為 int32_t enType_ =3 ; # 參照注釋,可知這對應H.264 /* 0:H265 main level * 1:H264 baseline level * 2:H264 main level * 3:H264 high level */
接下來,來運行試試!
# 確保已經切換到HwHiAiUser用戶 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/scripts # 注意下面命令運行時,會彈出架構選項,因為我們的CPU是x86架構的,所以這里選擇x86,如下圖所示 bash sample_build.sh bash sample_run.sh
最終程序運行成功截圖:
運行速度很快,體驗不錯!我們到這個目錄下可以看到生成的.yuv文件:
cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/out/output
如下圖所示,可以看到我們得到的10張圖片
接下來,我們查看圖片,在root用戶下執行命令:
# 注意在root用戶下執行,如果不是root用戶,可執行su root進行切換 ffplay -f rawvideo -video_size 1920x1080 image1.yuv
可以看到,如下圖片,注意這是依賴了MobaXterm的X Server
此時程序運行截圖:
我們還可以查看其他yuv圖片,注意到展示的圖片有些色彩疑似有問題,暫時先不管了。
2. 對yuv格式進行resize(輸入是上一步得到的yuv格式文件)
其實到這一步的話,就和第一次大作業的過程基本一致了,這也是此次作業的目的之一,鞏固上次的學習成果,連續性還是很不錯的,可見老師設計的時候也是經過深思熟慮和精心安排的,同時這種視頻編解碼、resize和圖片編解碼的操作是在計算機操作中很常見的,在AI推理和訓練中也常用,非常有學習價值和意義,更重要的是,一般來說,都會配有專門的硬件電路來加速,這也是DVPP的作用。
那這里,就選擇image1.yuv來操作吧!
# 注意之前可能是root用戶,這里我們通過su HwHiAiUser切換為HwHiAiUser用戶 # 首先將image1.yuv拷貝到我們resize操作的數據輸入目錄 cp /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/vdec/out/output/image1.yuv /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/data # 接下來修改運行腳本sample_run.sh,主要是輸入圖片的路徑和resize的分辨率: # 首先進入腳本所在路徑 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/scripts # vim修改文件第10行,修改為 running_command="./main ../data/image1.yuv 1920 1080 ./output/output.yuv 224 224 " # 這表示我們處理的是./main ../data/image1.yuv文件,該文件尺寸為1920 x 1080,設置輸出路徑是./output/output.yuv ,輸出文件outpu.yuv的大小是224 x 224 # 注意下面命令運行時,仍然會彈出架構選項,因為我們的CPU是x86架構的,所以這里選擇x86,如下圖所示 bash sample_build.sh bash sample_run.sh
resize后的文件為output.yuv,我們來看看
# 來到output.yuv保存路徑 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/out/output # 注意在root用戶下執行,如果不是root用戶,可執行su root進行切換 ffplay -f rawvideo -video_size 224x224 output.yuv
可以看到圖片尺寸確實縮小了,而且沒有綠邊或黃邊,這應該是因為DVPP的輸入是符合前面提到的寬高對齊要求的。但要注意的是我們設置的resize大小224 x 224的寬度是不符合128對齊的。
應該沒啥問題,接著來吧!
3. resize后的yuv文件編碼成jpg圖片(輸入是上一步得到的resize后的yuv格式文件)
# 注意之前可能是root用戶,這里我們通過su HwHiAiUser切換為HwHiAiUser用戶 # 將上一步生成的output.yuv拷貝到指定路徑,方便后續jpeg編碼 cp /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/out/output/output.yuv /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/data # 進行路徑 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/scripts # 修改main.cpp文件,執行輸入yuv文件路徑和大小 # 切換到main.cpp所在文件夾 cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/src # 修改文件 vim main.cpp # 在第242行,將該行替換為如下: PicDesc testPic = {"../data/output.yuv", 224, 224}; # 注意下面命令運行時,仍然會彈出架構選項,因為我們的CPU是x86架構的,所以這里選擇x86 bash sample_build.sh # 接下來,我們要將上一步得到的resize后的yuv文件拷貝過來作為輸入 cp /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/out/output/output.yuv /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/data/dvpp_output.yuv # 運行程序 bash sample_run.sh
接下來,到輸出路徑看看,之后下載到本地查看即可。因為MobaXterm很好的文件交互性和可視化,我們可以直接雙擊該輸出文件,就能自動下載查看了
最終得到編碼后的圖片
至此,我們完成了全部流程,最終得到了編碼后的,如上圖所示的jpg文件。
應用第三彈
首先來看下要求
簡單來說,就是利用所學,完成YOLOv3完整的推理過程!下面來逐步操作吧。
1. 完成模型轉換
注意,模型轉換要涉及處理模型輸入數據的大小和格式,這一點要明確。這里先參照開發手冊上提供的模型和配套教程走一遍,驗證下流程。
先建一個文件夾用來保存整個過程的文件
mkdir yolov3_detection # 接下來建立model文件夾,保存模型 mkdir model # 接下來,下載模型和配置文件 wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/Yolov3/yolov3.caffemodel wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/Yolov3/yolov3.prototxt wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/Yolov3/aipp_nv12.cfg
運行截圖:
接下來,參照指導,進行模型轉換:
# 注意,這里使用的是官方給的命令,會導致轉換的模型后綴為.om.om,不建議使用 atc --model=yolov3.prototxt --weight=yolov3.caffemodel --framework=0 --output=yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfg # 建議使用本命令,這樣轉換得到的模型是.om后綴 atc --model=yolov3.prototxt --weight=yolov3.caffemodel --framework=0 --output=yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32 --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfg
注意,參照教程這里的--output是以.om結尾,但是發現這會導致生成的模型是 yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om.om,即是以.om.om結尾,有點奇怪,不過不影響運行,畢竟只是個名字,但是這會影響到后續的執行,因為教程后續用的是
yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om
而我們實際生成的是
yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om.om
這在系統看來完全是兩個不同的模型,因此,要注意統一名稱,只要保持先后一致即可,這里我選擇的是直接用實際生成的.om.om模型吧!
再次需要注意的是這里僅僅是對樣例說明,如果將模型用于推理,則一定要用.om模型,如果再用.om.om模型就會報錯(當然,也可能是權限不夠,因為我們運行時,使用的是HwHiAiUser用戶),因此,從規范和長遠角度來說,應該用.om模型,我這里的選擇用.om.om模型是不明智的,有些糟糕,建議大家直接用上方轉換模型的第二條命令,直接得到.om模型,推薦!推薦!推薦!
這個模型轉換過程資源消耗較大,需要稍等一下,運行成功截圖:
接下來,使用使用msame工具推理,先來準備一下,這里官方提供了較為詳細的教程,跟著做就行了:
git clone https://gitee.com/ascend/tools.git export DDK_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest export NPU_HOST_LIB=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/acllib/lib64/stub cd $HOME/tools/msame/ chmod +x build.sh ./build.sh g++ $HOME/tools/msame/out cd out # 注意,這里的--model和--output路徑根據實際模型存放路徑和你想輸出的路徑填寫 ./msame --model /home/HwHiAiUser/yolov3_detection/model/yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om.om --output /home/HwHiAiUser/yolov3_detection/model/msame_infer --outfmt TXT --loop 100
程序運行成功的部分截圖:
可以到我們指定的輸出路徑下看到生成的結果文件
至此的整個過程按照開發文檔中提供的教程操作即可,還是比較簡單的。
2. 結合所學,完成模型推理
這里參考了官倉的樣例,基于上述得到的模型進行推理,完整代碼會提交在作業帖中,并附有README,分為模型準備和轉換、編譯和運行三部分,正常運行推理后可得到結果
至此,基本應用開發就完成了,算是初識,如果日后用到,算是有個印象,但想深入研究的話,還是要多看看文檔,了解底層硬件,特別是這種應用,根據硬件特性做針對性加速很重要。
與ModelArts相關的一些
這里主要是在ModelArts平臺,基于華為Ascend 910解決訓練網絡精度調優的問題,可參見訓練網絡精度調優精講與實戰獲取更多詳情。
前情提要
1. PyCharm常用操作和配置ModelArts插件使用,官方文檔和介紹較為詳細,這里不在敘述
2. 需要說明的是,我是用的插件版本是3.3.5,比教程中的應該是新一些,所以有些配置不同,主要是兩點:(1)Image Path按照教程設置無效,導致無法啟動訓練作業,直接不設置就行了;(2)Data Path,即數據集存放路徑,必須是本人賬號的桶路徑才行(也可能是因為教程中的桶區域不是北京四),所以無法按照教程設置,我下載數據集后,上傳到自己的桶中,并指定路徑即可。
具體操作
1. 直接運行,可以得到:
性能指標約為sec / step: 0.01,即每訓練一步耗費的時間約為0.01秒,這應該是在純CPU運行的情況下,即全部跑在鯤鵬處理器上。從負載圖上,也能看到基本都是CPU在承擔任務:
進行NPU遷移
參照社區文檔和老師的講解,可以較好完成模型遷移,遷移后運行:
可以看到性能約為sec / step :0.002,提升了5倍,NPU果然效果顯著,我想這還不是極限,因為目前僅遷移,還沒有做性能調優,從系統負載圖,也能看到NPU在承擔計算任務了,但利用率不是很高,有很大提升空間。
大約15分40秒的時間,模型訓練完成,如圖所示:
性能和精度還是不錯的。
2. 驗證完成NPU遷移
這里要說明一下: 因不習慣使用ModelArts插件,所以我下載了數據集和代碼,并進行了修改,已適配ModelArts的NoteBook的Ascend環境,故以下操作都是在ModelArts的NoteBook運行,而非訓練作業。ModelArts的NoteBook的規格為
運行日志保存在./test/output//train_.log中,可以查看信息,我們來看看Ascend 910運行情況:
我們可以看到NPU的AI Core的利用率、Memory-Usage和HBM-Usage,這都顯示已經運行在NPU上了,這里的利用率過低是因為同時進行了溢出檢測等操作,而且這是同時在跑兩個程序。如果不進行溢出檢測,僅運行一個程序就好多了,如下圖所示
3. 混合精度 + Loss Scale 使能
這里,我使用了靜態Loss Scale,設置loss_scale = 1024,方便后續附加作業打印
4. 完成溢出檢測使能
可以到overflow文件夾下查看信息,大體如圖所示:
5. 附加題,使能 lossscale 后,打印出 loss scale 的具體值
查看./test/output//train_.log,可以看到打印的loss scale數值
至此,基本完成了。還是挺有意思的!
好了,到這里就要結束了,如果有問題,可聯系tjulitianyi@163.com或在下方評論,謝謝。
【與云原生的故事】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/345260
AI 云原生 云端實踐 彈性云服務器 ECS 昇騰
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。