如何獲取pytorch的動態圖?
model = torch.jit.load("test.pth")
graph = model.graph.copy()
torch._C._jit_pass_inline(graph)
node_list = graph.nodes()
加載模型后,獲取模型的graph,這個graph就是需要的動態圖,graph node就是計算圖的計算節點(有序),關于各個層的相關引數都可以從node節點中獲取,各個引數的相對位置需要查找一下該op的實作,
需要注意的是,需要使用 _jit_pass_inline來將graph的sub module展開,
如何獲取pytorch的權重等引數?
對于非量化模型:
可以通過named_parameters或者state_dict獲取,
對于量化模型:
在一次次的嘗試和介面的設定中終于找到了!!!
a = 0
for model_name, module in model.named_modules():
print(model_name)
print(module)
if a == 2:
mod_c = module._c
#print(mod_c.dump())
param = module.__getattr__('_packed_params')
print(param)
print(type(param))
print(dir(param))
print(param._method_names())
weight,bias = param.unpack()
print(bias)
break
else:
a = a + 1
首先可查看model的各個attribute的內容,方便后續直接getattr,這個程序可通過_c屬性獲得,然后將獲得的屬性值dump出來就可查看各個子module的所有內容,然后根據需要就可以獲取想要的屬性了,
決議時遇到以下問題:
1、權重的layout如何確定?
通過shape屬性可以獲取Tensor的shape,通過Tensor.storage()可以獲取Tensor里的值,通過Tensor.layout可以獲取資料布局,也就是說這個Tensor的值是通過.layout的布局方式來排列,并沒有按照shape的順序來排列,
決議的模型layout是torch.strided,這種布局是按照stride來排列的,這種解釋還是比較模糊,
假設3x3卷積的權重的shape為[32,3,3,3](nchw),通過Tensor.stride()就可以獲取各個維度的stride資訊,權重的stride資訊為[27,1,9,3](nchw),含義是:每跨一個n,步長為27,每跨一個c,步長為1,每跨一個h,步長為9,每跨一個w,步長為3,這樣也就意味著排列順序是nhwc,所以決議的時候需要按照框架要求進行轉換,
2、權重是int8,決議后的框架是uint8,如何使之能適用于uint8的框架?
看了下量化計算的實作:如果計算是需要減去zeropoint,即計算的時候使用value-zeropoint的值參與計算,那么就可以將權重的所有值都加一個128(int8最小值為-128),zeropoint的值也得加128就可以了
3、quant和dequant op做了啥事情?
pytorch的每個量化tensor存的資料其實還是float資料,在通過storage獲取資料時會將其按照scale/zeropoint量化成int8資料,
quant op做的事情:input / scale + zeropoint,將float轉換為uint8資料,再將uint8資料反量化后存下來:(input - zeropoint) * scale,即quant op做了量化反量化的事情,將一個float Tensor轉換為一個int8 scale tensor,
dequant op就做了一個反量化操作:(input - zeropoint) * scale
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/218999.html
標籤:其他
下一篇:第二章 tensor和梯度計算
