两个工具
|
|
summarize这个工具代码比较简单,主要用来打印出所有的节点的名字
transform才是用来对计算图进行转换,这个很重要
看transform_graph_main.cc
ParseFlagsAndTransformGraph 解析命令行参数
调用ParseTransformParameters解析–transforms传进来的所有要执行的转换操作
TransformGraph正式执行转换
ParseTransformParameters
调用scanner去解析–transforms传进来的文本
TransformGraph
遍历–transforms传进来的所有操作
调用
Status transform_result =
transform_func(*graph_def, context, &transformed_graph_def);去执行转换
transform_func时通过GetTransformRegistry仓库拿到的
GetTransformRegistry
有个TransformRegistry对象
TransformRegistrar类是个仓库
调用REGISTER_GRAPH_TRANSFORM往仓库里面注册transform的操作
代码里grep -rni “REGISTER_GRAPH_TRANSFORM”
可以看到所有注册操作的地方
看具体注册的操作
grep -rni “REGISTER_GRAPH_TRANSFORM(\”fuse_quantized_matmul_and_requantize”
一个转换的例子:
|
|
先看strip_unused_nodes操作
|
|
看模型
运行读取pb
tensorboard –logdir log/
对比INT8和FP32两个模型,发现主要区别在DNN模型上面
INT8 DNN 模型
TF 代码使用分支:
git checkout remotes/origin/dungeon_wnd
INT8 DNN从tensorboard上面看到调用op是
QuantizedMatMulWithBiasAndReluAndRequantize
在代码里面grep这个op
但是这两个op对应的实现都是NoOp
在计算启动的时候进过mkl层添加_Mkl前缀
如何具体看MKLDNN的调用关系
step1
首先export MKLDNN_VERBOSE=1
运行代码,得到mkldnn调用到的具体的kernel的名字,比如igemm_s8u8s32:blas
step2
在代码里面搜索igemm_s8u8s32:blas,得到对应的执行的代码在gemm_x8s8s32x_inner_product.cpp第62行的generate函数去执行
step3
编译debug版本的tensorflow,gdb调试,断点打在gemm_x8s8s32x_inner_product.cpp第62行
bt 去看调用栈
看到对应的tensorflow的kernel是MklIPFwdPrimitive
wnd数据集
google搜索criteo-kaggle
Display Advertising Challenge
https://blog.csdn.net/horizonheart/article/details/78891501
https://www.kaggle.com/c/criteo-display-ad-challenge