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