Caffe框架GPU与MLU计算结果不一致请问如何调试?
Caffe框架GPU與MLU計算結果不一致請問如何調試?
某一檢測模型移植到Cambricon
Caffe上時,發現無法檢測出結果,于是將GPU和MLU的運行結果輸出并保存后進行對比,發現二者計算結果不一致,如下圖所示:
第一張為GPU模式下,第二張為GPU模式,二者使用的輸入和數據預處理方式均完全一樣,該輸出為網絡第一層卷積的部分輸出。
用Cambricon
Caffe提供的test_forward工具驗證該模型在CPU和MLU模式下的輸入,結果仍不一致,如下圖所示:
第一張為MLU模式下的輸出,第二張CPU模式下的輸出。
請問這種情況下如何調試具體哪里出現了問題?
在GPU模式下ROIPooling層的輸出結果為:
在MLU模式下運行,結果為:
最后在CPU模式下使用ROIPooling算子,計算結果為:
對比CPU和GPU的運算結果可知,僅處理了第一個ROI,修改了ROIPooling層部分代碼才能得到正確結果。而MLU模式下的ROIPooling層的結果是完全錯誤的。
首先在GPU上使網絡輸出Proposal層的運算結果,如下:
使用Proposal算子在CPU模式下運行的結果為:
MLU模式下的結果為:
將Proposal層替換為Python的Proposal層,在CPU模式下的運算結果為:
與GPU計算結果是一致的,所以認為Proposal算子有問題。
MLU100上的數據格式為FP16/INT8, 運算結果不一致是合理的,具體正確性要看誤差,可以用MAPE度量一下誤差,一般FP16不會超過%1。另外如果是faster-rcnn網絡,不要直接比較proposal層之后的結果,只能直接比較proposal層前的結果。proposal層之后的結果因為涉及到bbox,無法直接比較,可以用IOU之類的方法比較。最后MLUfaster-rcnn的輸出結果layout和CPU的輸出結果layout不同,因此兩者的后處理方式是不一致的,具體可以參考我司提供的后處理示例。
重新對比了一下GPU與MLU的輸出結果,Proposal層之前的處理結果是正確的,但是MLU的Proposal和ROIPooling層有問題。在輸入特征相同的情況下,使用FasterRCNN的Proposal層和MLU的Proposal層得到的結果是不一致的;使用FasterRCNN的Proposal層得到正確的ROI后,輸入到ROIPooling層只處理了第一個ROI,我修改了CPU版本的ROIPooling層才可以得到正確的結果。
MLU100上的數據格式為FP16/INT8, 運算結果不一致是合理的,具體正確性要看誤差,可以用MAPE度量一下誤差,一般FP16不會超過%1。另外如果是faster-rcnn網絡,不要直接比較proposal層之后的結果,只能直接比較proposal層前的結果。proposal層之后的結果因為涉及到bbox,無法直接比較,可以用IOU之類的方法比較。最后MLUfaster-rcnn的輸出結果layout和CPU的輸出結果layout不同,因此兩者的后處理方式是不一致的,具體可以參考我司提供的后處理示例。
總結
以上是生活随笔為你收集整理的Caffe框架GPU与MLU计算结果不一致请问如何调试?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YOLOv5目标检测源码重磅发布了!
- 下一篇: TensorFlow基础剖析