基于彈性云服務器的昇騰AI應用開發隨筆【與云原生的故事】

      網友投稿 920 2022-05-29

      什么是彈性云服務器?

      先來說說云服務器(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

      基于彈性云服務器的昇騰AI應用開發隨筆【與云原生的故事】

      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小時內刪除侵權內容。

      上一篇:數學建模學習(68):機器學習訓練模型的保存與模型使用
      下一篇:超高性價比!華為云GeminiDB聚焦企業級業務場景
      相關文章
      国产亚洲精品久久久久秋霞| 亚洲国产精品毛片av不卡在线| 亚洲日韩精品射精日| 亚洲精品视频在线观看你懂的| 亚洲成a人片在线观看天堂无码| 亚洲一区二区三区在线| 亚洲福利一区二区| 亚洲精品免费在线| 亚洲精品不卡视频| 亚洲午夜久久久精品电影院| 亚洲精品电影天堂网| 亚洲啪啪免费视频| 亚洲日本国产综合高清| 国产精品亚洲综合久久 | 亚洲精品乱码久久久久66| 亚洲熟妇无码乱子AV电影| 亚洲女久久久噜噜噜熟女| 国内精品99亚洲免费高清| 亚洲日韩精品无码专区网址| 久久国产亚洲观看| 亚洲高清美女一区二区三区| 亚洲神级电影国语版| 亚洲成年网站在线观看| 亚洲欧美日韩一区二区三区| 国产亚洲欧美日韩亚洲中文色| 亚洲?V无码成人精品区日韩| 久久精品国产精品亚洲艾草网美妙| 亚洲无线观看国产精品| 亚洲av日韩av天堂影片精品| 亚洲久本草在线中文字幕| 亚洲毛片免费视频| 亚洲精品一二三区| 妇女自拍偷自拍亚洲精品| 亚洲伊人成无码综合网| 亚洲AV无码专区亚洲AV伊甸园| 337p日本欧洲亚洲大胆色噜噜| 亚洲一线产区二线产区精华| 亚洲精品无码少妇30P| 亚洲A∨午夜成人片精品网站| 在线亚洲精品福利网址导航| 久久综合九九亚洲一区|