分解示例
分解模型
- 切换到amct_tf/sample/tensor_decompose路径,执行如下命令分解原始模型:
python3.7.5 decompose_sample.py --meta_path META_PATH --ckpt_path CKPT_PATH --save_path SAVE_PATH
各参数解释如表4-28所示。
表4-28 张量分解脚本所用参数说明参数
说明
--meta_path META_PATH
必填。TensorFlow模型文件(.meta)路径。
--ckpt_path CKPT_PATH
必填。TensorFlow权重文件路径:.data-0000X-of-0000X文件与.index文件所在路径,路径中不必包含文件后缀。
--save_path SAVE_PATH
必填。张量分解后所得文件的保存路径,支持相对路径和绝对路径,如果没有创建,指定脚本时会自动创建。
该路径需要包含分解后模型名前缀,例如tmp/model_decomposition。
使用样例如下:
python3.7.5 decompose_sample.py --meta_path checkpoints/model.ckpt-200.meta --ckpt_path checkpoints/model.ckpt-200 --save_path tmp/model_decomposition
分解过程中,日志会打印支持分解的算子名称,以及分解后的算子名称,如下所示(如下示例中的算子信息只是样例,请以实际分解的模型为准):
[AMCT]:[AMCT]: Processing conv2d_1/Conv2D [AMCT]:[AMCT]: Decompose conv2d_1/Conv2D -> ['conv2d_1/Conv2D/decom_first/decom_first', 'conv2d_1/Conv2D/decom_core/decom_core', 'conv2d_1/Conv2D/decom_last/decom_last'] ...
若提示如下信息,则说明分解成功:
auto_decomposition complete!
- 分解成功后,在“--save_path”参数指定路径下,生成分解后的模型,如下所示:
-rw-r--r-- 1 amct amct 95 Jul 28 04:49 checkpoint //TensorFlow保存模型时保存的检查点 -rw-r--r-- 1 amct amct 10846856 Jul 28 04:49 model_decomposition.data-00000-of-00001 //张量分解后的权重文件 -rw-r--r-- 1 amct amct 967 Jul 28 04:49 model_decomposition.index //张量分解后的权重文件索引 -rw-r--r-- 1 amct amct 315800 Jul 28 04:49 model_decomposition.meta //张量分解后的模型文件 -rw-r--r-- 1 amct amct 517 Jul 28 04:49 model_decomposition.pkl //分解时图结构改动信息,用于decompose_graph接口
分解后微调(finetune)
正常情况下,分解后模型的精度会比原始模型有所下降,所以在分解之后,会用一个finetune(微调)过程来提高分解模型的精度。finetune的方法和普通模型finetune的方式一致,将原始的学习率调小,一般可以从原始学习率的0.1倍开始降低。 finetune的epoch(1个epoch表示过了1遍训练集中的所有样本)数各个模型不尽相同,分解的卷积层越多,所需要的epoch一般就越多。 finetune之后的模型,其精度可能与原模型持平,也可能有少许的下降或提升。
- 前提条件
该章节会调用decompose_graph接口,然后插入训练代码中,用于分解训练代码中的graph以便对分解后的模型进行finetune。该场景需基于训练代码完成,且必须保证auto_decomposition接口分解的模型和权重是基于该训练代码训练得到的。 sample/tensor_decompose目录提供两份TensorFlow训练代码:一份使用Session接口训练,一份使用Estimator接口训练,用户根据实际情况进行选择。
- 操作示例
调用decompose_graph接口插入训练代码时,插入位置须在模型构建完成之后,优化器构建之前(请参见finetune_sample_session.py和finetune_sample_estimator.py)。 插入该接口之后,需要加载分解后模型的权重进行finetune,由于分解后的ckpt中可能存在分解前模型的优化器参数,这些参数与当前分解后模型不匹配,因此只加载分解后模型的权重而不加载优化器参数(请参见finetune_sample_session.py和finetune_sample_estimator.py)。
- 切换到amct_tf/sample/tensor_decompose路径,执行如下命令进行模型finetune:
python3.7.5 finetune_sample_session.py --data_path DATA_PATH --save_path SAVE_PATH
或
python3.7.5 finetune_sample_estimator.py --data_path DATA_PATH --save_path SAVE_PATH
各参数解释如表4-29所示。
表4-29 模型finetune脚本所用参数说明参数
说明
--data_path DATA_PATH
必填。mnist数据集的路径,获取方法请参见分解前提。
--save_path SAVE_PATH
必填。auto_decomposition接口中文件的保存路径。
使用样例如下:
python3.7.5 finetune_sample_session.py --data_path data/mnist --save_path tmp/model_decomposition
若提示如下信息,则说明finetune成功(如下精度结果只是样例,请以实际环境为准):Valid Accuracy: 0.9838 //基于mnist数据集的精度
- finetune完成后,在sample/tensor_decompose目录自动生成finetuned_ckpt结果文件,用于保存分解后模型的模型文件以及权重文件。示例如下:
-rw-r--r-- 1 amct amct 128 Aug 1 04:14 checkpoint -rw-r--r-- 1 amct amct 10093192 Aug 1 04:14 model.ckpt-100.data-00000-of-00001 //finetune后的权重文件索引 -rw-r--r-- 1 amct amct 1144 Aug 1 04:14 model.ckpt-100.index //finetune后的权重文件 -rw-r--r-- 1 amct amct 122783 Aug 1 04:14 model.ckpt-100.meta //finetune后的模型文件 -rw-r--r-- 1 amct amct 3171658 Aug 1 04:14 model.pb //finetune后可用于量化的pb格式的模型文件
其他开源网络模型分解后的数据请参考开源网络模型分解数据参考。
- 如果用户要对分解后pb格式的模型进行量化, 则请参见基于calibration的量化。
- 切换到amct_tf/sample/tensor_decompose路径,执行如下命令进行模型finetune: