當前面的準備工作都已妥善之后,就可以進入模型訓練的步驟,后面的工作就是計算設備的事情了。
4、 執行 TAO 模型訓練:
TAO 工具提供提供 QAT (Quantize Aware Training) 量化感知的訓練模式,不過目前 QAT 效果還在驗證當中,倒也不急于使用,因此我們還是以標準模式來訓練,就是將配置文件中 training_config 設置組的 “enable_qat” 參數設為 “false” 就行,然后直接執行指令塊的命令,TAO 就會啟動視覺類容器來執行模型訓練任務。
這里提供兩組執行訓練所花費的時間參考數據:
-
NVIDIA Qudra RTX A4000/16GB 顯存:48 秒/回合
-
NVIDIA RTX-2070/16GB 顯存:67 秒/回合
-
兩張卡一起訓練:40秒/回合
為了更有效率地執行,我們可以在training_config設置組里添加 “checkpoint_interval: 10” 參數,這樣每 10 回合生成一個中間文件,這樣能節省大約 7GB 的空間。現在檢查一下所生成的中間模型文件,如下圖所示總共 8 個。
接下去我們看看這 8 個模型的訓練效果如何,因為得挑一個精確度 (mAP) 最好的文件,進行后面的修剪任務。
通常越后面的模型 mAP 值越高,但這不是絕對的,最好是有明確的數據來做依據,才是比較科學的態度。在 experiment_dir_unpruned/ssd_training_log_resnet18.csv 提供這些記錄,右鍵點擊文件 -> Open With-> CSVTable 之后,就會看到如下圖的內容。
表中可以看到,越下面模型的 mAP 值越高,這樣就能明確的選擇 “epoch_080” 的模型來進行后續工作,記得在 “%set_env EPOCH=” 后面填入參數值,例如要選擇第 80 回合的模型文件,就輸入 “080”,然后繼續往下進行。
5、評估模型好的訓練:
這個步驟的目的是為了確認模型是否符合要求?有時候可能效果最好的模型,效果還未達到預期目標,如果是這樣的話,就得回到第 4 步驟,以前面找到效果最好的模型,作為遷移選項的預訓練模型,就是將配置文件的 training_config 設置組的 “pretrain_model_path” 改成 ssd_resnet18_epoch_080.tlt 的完整路徑,然后再做 80 回合的訓練。
執行評估效果的結構在本指令塊輸出的最下方,如下圖所示。
比對一下這里顯示的精準度,與前面 ssd_training_log_resnet18.csv 記錄的結果是相同的,其實這個步驟是有點冗余,可以忽略!
6、修剪模型:
如果您的模型要放在計算資源充沛的設備上執行推理的話,其實后面的步驟是可以省略的,因此修剪模型的目的,是要在精確度維持水平的基礎上將模型進行優化,這對 Jetson 這類計算資源吃緊的邊緣設備來說就非常重要,因為這對推理性能有很大的影響,因此要看您所需要執行推理的設備是什么,再決定是否要進行修剪。
每個神經網絡都有各自的修剪重點,必須找到對應的說明文件,例如這里對ssd進行修剪,請訪問https://docs.nvidia.com/tao/tao-toolkit/text/object_detection/ssd.html,在里面的 “Pruning the Model” 有非常詳細的參數說明。
TAO 提供以下 6 種模型修剪的方式,設定值的粗體字為預設值:
-
標準化器 (normalizer):使用參數 -n,設定值為 “max/L2”;
-
均衡器 (equalization_criterion):使用參數 -eq,設定值為 “union/ intersection/ arithmetic_mean/geometric_mean”;
-
修剪粒度 (pruning_granularity):使用參數 -pq,設定值為正整數,預設值為 8;
-
修剪閾值 (pruning threshold):使用參數 -pth,設定值為小于 1 的浮點數,預設值為 0.1;
-
最小數量過濾器 (min_num_filters):使用參數 -nf,設定值為正整數,預設值為 16;
-
排除層 (excluded_layers):使用參數 -el,設定值為正整數,預設值為空值(不排除)。
在大家還不熟悉這些參數用法時,最簡單的方法就是調整閾值 (-pth) 的大小去找到平衡點,通常這個值越高就會損失較大的精度值,模型也會比較更小大。參數預設值為 0.1,差不多達0.3 已經是極限,再大可能就會讓精準度低于一般要求。
這個步驟會用到 ssd_train_resnet18_kitti.txt 配置文件,修剪完的模型會存放在 -o參數所指定的目錄,這里是“$USER_EXPERIMENT_DIR/experiment_dir_pruned”,輸出的模型文件名為 “ssd_resnet18_pruned.tlt”,后面的“重新訓練剪裁模型”步驟,就會以這個文件作為遷移學習的訓練基礎。
這個修剪過的模型文件還不能作為部署用途,還得經過下個步驟去重新訓練之后,是我們最終所需要的版本。
7、重新訓練修剪過的模型:
這個步驟與前面的模型訓練幾乎是一樣的,唯一不同的地方就是前面以 NCG 下載的 resnet_18.hdf5 為基礎導入遷移學習的功能,這里是以 ssd_resnet18_pruned.tlt 這個修剪過的文件為基礎,同樣用最前面的數據集進行訓練。
以這個項目為例,未剪裁模型的大小為 101.7MB,用閾值為 0.1 所剪裁的重新訓練模型大小只剩 22.5MB、閾值為 0.3 所剪裁的模型大小只剩 9.8MB。重新訓練后同樣會生成很多模型文件,同樣查看 experiment_dir_retrain 目錄下面的 ssd_training_log_resnet18.csv,挑出精度最好的一個準備下個評估環節。
8、評價重新訓練的模型:
與前面的評估方式一樣,找到效果最好的一個,然后將數值填入 “%set_envEPOCH=” 里,準備在訓練設備上測試一下推理的效果。
如果修剪后重新訓練的模型精度與未修剪的相差不多,這個模型就可以用來作為后面的推理測試,如果精度差距較大,就得回到第 6 步驟重新執行修剪工作與第 7 步驟重新訓練,一直到獲得滿意精度的模型為止。
-
NVIDIA
+關注
關注
14文章
4986瀏覽量
103067 -
TAO
+關注
關注
0文章
10瀏覽量
6995 -
模型訓練
+關注
關注
0文章
18瀏覽量
1341
原文標題:NVIDIA Jetson Nano 2GB 系列文章(62):物件檢測的模型訓練與優化-2
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達企業解決方案】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論