2. 模型压缩使用指南

本文档主要对清微骑士工具链TS.Knight-MC模型压缩工具进行介绍,帮助用户快速上手。

2.1. Knight-MC介绍

2.1.1. 概述

Knight-MC(Model Compression)是一个专注于深度学习模型压缩的软硬件协同优化平台,提供剪枝、稀疏模型、模型结构搜索等压缩功能,结合清微骑士工具链,帮助客户快速实现模型小型化、提高板端推理性能,同时保持模型精度。

2.1.2. 整体框架

Knight-MC架构如下图所示:

pipeline

当前已实现2个功能:Pruning,Sparsity。

Pruning:模型剪枝是指从模型结构上进行剪枝,比如对卷积进行输入、输出整通道的裁剪。该模块可根据模型精度和模型在芯片上的推理时间进行强化学习,自动剪枝输出较优的剪枝候选模型。此后用户可根据实际业务对精度和耗时的需求选择最优模型。其中Pruning工具中会调用量化,RNE编译器和RNE性能分析器获取模型的推理时间。

Sparsity:模型稀疏是使用指定稀疏方法进行模型权重参数稀疏,比如对卷积kernel中小于阈值的权重参数置0。当前支持两种稀疏方法:一是2:4稀疏,二是清微芯片定制稀疏Cin32Cout64, 该稀疏方法详情请参见 编译仿真性能分析使用指南

NAS:模型结构搜索,包含zero-shot,one-shot 和few-shot三种方式。当前尚未支持,在开发中。

备注

Knight-MC当前仅支持对Pytorch模型进行压缩。

2.1.3. 目录介绍

文件目录如下表:

目录

开源/ 封闭

说明

kmc-3.0.0.x-py3-none-any.whl

封闭

通过pip install 可安装在用户本地环境中

config/

开源

配置文件模板

pruning_template.yaml: Pruning工具的配置文件模板

sparsity_template.yaml: Sparsity工具的配置文件模板

examples/

开源

供使用kmc库的demo示例

requirements.txt

开源

提供运行工具必须的python软件包, 未注明版本号的软件包对于版本并没有严格的要求。

Demo目录examples涉及的文件目录如下表:

目录

开源/ 封闭

说明

examples/cls/dataset

开源

存放图像分类的训练数据和测试数据

examples/cls/pretrained_model

开源

存放预训练的图像分类模型

examples/cls/resnet50_cifar

开源

resnet50图像分类模型压缩示例

pruning_config.yaml: Pruning工具配置文件示例

sparsity_config.yaml: Sparsity工具配置文件示例

pruning_demo.py: 调用Pruning工具代码示例

sparsity_demo.py: 调用Sparsity工具代码示例

resnet_cifar.py: resnet模型结构定义

train_val.py: 训练模型代码,包含数据加载处理代码

examples/det/dataset

开源

存放目标检测所需的训练数据和测试数据

examples/det/pretrained_model

开源

存放预训练的目标检测模型

examples/det/yolov5

开源

Yolov5目标检测模型压缩示例

pruning_config.yaml: Pruning工具配置文件示例

sparsity_config.yaml: Sparsity工具配置文件示例

pruning_demo.py: 调用Pruning工具代码示例

sparsity_demo.py: 调用Sparsity工具代码示例

其他文件data, models, utils等均和yolov5模型构建代码相关

2.1.4. 开发流程

Knight-MC整体工作流程如下图所示。

pipeline

1)用户提供浮点模型和训练数据,使用Pruning进行自动剪枝,得到剪枝候选模型,用户根据实际需求选择最优的剪枝后模型。或者使用Sparsity进行稀疏,得到稀疏后的模型。

2)用户对压缩后的模型进行重训练,以恢复模型精度。

3)使用Knight量化工具对模型进行量化,然后使用Knight RNE编译器进行编译,最终会将模型部署到清微芯片上,后续步骤详情请可见文档 量化使用指南编译仿真性能分析使用指南

2.2. 环境准备

2.2.1. 基础环境准备

2.2.1.1. CUDA环境准备

用户需要根据显卡型号安装对应版本的CUDA和Pytorch,查看显卡和CUDA的命令如下:

nvcc --version

若该命令无法使用,需要在.bashrc中设置环境变量,设置示例如下:

export CUDA_HOME="/usr/local/cuda-11.8"
export LD_LIBRARY_PATH="$CUDA_HOME/lib64:$CUDA_HOME/extras/CUPTI/lib64:$LD_LIBRARY_PATH"
export PATH="$CUDA_HOME/bin:$PATH"

2.2.1.2. pip环境准备

确认python(=3.8)安装环境中是否有安装pip,命令如下:

which pip

此时会出现pip相应的安装路径,比如 miniconda3/envs/quant_tool/bin/pip,说明pip已安装。 如果pip并未安装,在终端里执行如下命令,则自动安装conda软件包(包含pip安装包),无需另外安装。

wget  https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh

2.2.1.3. python依赖包安装

安装kmc依赖包

pip install -r requirements.txt

安装完成后需要验证当前环境下GPU是否可用,验证方式如下:

pipeline

如果没有报错表示pytorch能够在GPU上正常运行,否则需要检查服务器上显卡驱动和CUDA的版本是否安装正确。

备注

为了演示yolov5 Demo,还需安装Arial.ttf字体,若自动下载失败可进行手动下载,放在提示的目录中即可,示例如下,其中root可替换为实际使用的用户名:

pipeline

2.2.2. 安装kmc软件包

Knight-MC环境准备,安装kmc软件包,示例如下:

pip install kmc-3.0.0.x-py3-none-any.whl

注意需要保证 基础环境准备 中的环境都满足,才可成功安装并使用kmc软件包。

2.2.3. Knight镜像包准备

若在使用Pruning工具时,需要结合Knight工具链将芯片推理时间作为剪枝优化目标,则需要准备Knight镜像包ts.knight-<version>.tar.gz,放在用户服务器中目录中, 同时安装docker环境,详情参见 使用指南综述

其他使用场景则无需准备Knight镜像包。

2.3. Pruning工具

2.3.1. 工具简介

Pruning工具利用自主学习的策略执行剪枝,提高模型压缩的质量。该方案结合了Knight工具链的其他模块,充分结合芯片的硬件特性,得到不同芯片最适合部署的压缩模型。

2.3.2. Pruning工具应用场景

Pruning工具需要用户准备好经过充分训练的精度较好的模型,可支持两种使用方式:

第一种不结合Knight工具链,仅考虑模型精度,直接进行剪枝;

第二种是结合Knight工具链,同时考虑模型精度和模型在芯片上的推理时间,进行自动剪枝。此时需要增加准备Knight镜像。

经过剪枝后的模型,需要用户进行重训练以恢复模型精度。

pipeline

2.3.3. Pruning Demo模型

Pruning工具提供了图像分类模型resnet50和目标检测模型Yolov5 的模型压缩示例。

2.3.3.1. resnet50 Demo

2.3.3.1.1. 不结合Knight工具链

不结合Knight工具链执行剪枝操作时,examples/cls/resnet50_cifar/pruning_config.yaml 配置文件中docker_cfg字段run_latency设置为False。

在cifar10数据集上,使用Pruning工具压缩resnet50模型示例如下:

cd examples/cls/resnet50_cifar
python pruning_demo.py

执行成功后,在output目录下输出剪枝后的模型文件如下图所示。

pipeline

其中kmc-pruning.csv中内容如下:

pipeline

不同参数含义如下:

episode对应保存的模型id;

ckpt_name对应模型名称;

ind1和ind2表示模型评估结果,参见 KMC注意事项 第3点;

infer_time表示模型推理时间(若未使用Knight镜像,则为none);

op_num表示总计算数(若未使用Knight镜像,则为none);

total_macs表示剪枝后模型计算量;

normalized_macs表示计算量百分比;

normalized_nnz表示参数量百分比。

2.3.3.1.2. 结合Knight工具链

首先将examples/cls/resnet50_cifar/pruning_config.yaml配置文件中docker_cfg字段进行如下配置,详情参见 knight相关配置

docker_cfg:
   run_latency: True
   chip: TX5368AV200
   image_path: ${Knight_image_dir}
   localhost_dir: ${host_dir}/examples/
   container_dir: /example
   workspace_dir: /example
   container_name: resnet50_demo
   bit_width: 8
   is_sparse: False

在cifar10数据集上,使用Pruning工具压缩resnet50模型示例如下:

cd examples/cls/resnet50_cifar

python pruning_demo.py

执行成功后,在output目录下输出剪枝后的模型, 其中 kmc-pruning.csv 的文件如下图所示。

pipeline

可以看出,由于结合了Knight工具链,可以获得不同剪枝后模型的板端推理时间infer_time。

重训练后,模型输出在目录examples/cls/resnet50_cifar/logs/中,该目录内容如下所示:

pipeline

2.3.3.2. yolov5 Demo

2.3.3.2.1. 不结合Knight工具链示例

不结合Knight工具链执行剪枝操作时,examples/det/yolov5/pruning_config.yaml配置文件中docker_cfg字段run_latency设置为False。

在coco数据集上,使用Pruning工具压缩Yolov5模型,示例如下:

cd examples/det/yolov5
python pruning_demo.py

执行成功后,在output目录下输出剪枝后的模型, 其中 kmc-pruning.csv 的文件如下图所示。

pipeline

2.3.3.2.2. 结合Knight工具链示例

首先将examples/det/yolov5/pruning_config.yaml配置文件中docker_cfg字段进行如下配置,详情参见 knight相关配置

docker_cfg:
    run_latency: True
    chip: TX5368AV200
    image_path: ${Knight_image_dir}
    localhost_dir: ${host_dir}/examples
    container_dir: /example
    workspace_dir: /example
    container_name: yolov5_demo
    bit_width: 8
    is_sparse: False

在coco数据集上,使用Pruning工具压缩yolov5模型示例如下:

cd examples/det/yolov5
python pruning_demo.py

执行成功后,在output目录下输出剪枝后的模型, 其中 examples/det/yolov5/output/kmc-pruning.csv 的文件内容如下图所示。

pipeline

2.3.4. Pruning自定义模型

Pruning自定义模型的操作步骤如下:

pipeline

步骤一:基础环境准备,按照 基础环境准备 说明, 用户在自己训练环境的服务器上安装kmc所需的依赖包,准备kmc运行环境;

步骤二:安装kmc软件包,参见 安装kmc软件包 说明;

步骤三(可选):如果同时考虑模型准确率和清微芯片推理时间,则需要Knight工具链。用户需要准备Knight镜像,同时完成yaml文件中相应配置, 详情请参见 Pruning自定义模型 中结合Knight工具链部分。如果仅将模型准确率作为剪枝优化目标,则无需集成Knight工具链,可跳过该步骤;

步骤四:准备yaml配置文件,详情请参见 Pruning配置文件说明

步骤五:用户在自己的训练代码中调用kmc Pruning,详情请参见 调用pruning说明

步骤六:执行剪枝脚本得到剪枝后的模型。

2.3.4.1. Pruning配置文件说明

Pruning工具的配置文件模板为config/pruning_template.yaml,用户可根据自身需求对模板中参数值修改。配置文件中共包含3个部分的参数配置:基础配置(app_args, network),Pruning策略配置(amc_cfg)以及Knight相关配置(docker_cfg)

Pruning resnet50 Demo中的yaml文件示例如下:

app_args:
    arch: resnet50_cifar
    dataset: cifar10
    input_shape: [1, 3, 32, 32]
    device: 0
    output_dir: ./output
amc_cfg:
    agent_algo: DDPG
    protocol: mac-constrained
    pruning_pattern: channels
    pruning_method: l1-rank
    target_density: 0.5
    n_points_per_fm: 10
    group_size: 1
    action_range: [0.05, 0.95]
    ddpg_cfg:
        bsize: 256 # batch size
        tau: 0.01
        discount: 1.0
        epsilon: 50000
        init_delta: 0.5
        delta_decay: 0.95
        hidden1: 300
        hidden2: 300
        window_length: 1
        heatup_noise: 0.5
        initial_training_noise: 0.5
        training_noise_decay: 0.95
        warmup: 100 # num_heatup_episodes
        num_training_episodes: 300
        lr_a: 0.0001 # actor_lr
        lr_c: 0.001 # critic_lr

network:
    resnet50_cifar:
         [ layer1.0.conv2, layer1.0.conv3, layer1.1.conv2, layer1.1.conv3 … …]

docker_cfg:
    run_latency: False
    chip: TX5368AV200
    image_path: ${Knight_image_dir}
    localhost_dir: ${host_dir}/examples
    container_dir: /example
    workspace_dir: /example
    container_name: kmc_demo
    bit_width: 8
    is_sparse: False
2.3.4.1.1. 基础配置

app_args中为基础配置参数,network中则配置模型中要剪枝的层,各参数含义如下所示:

参数

说明

默认 值

必选/可选

参数 类型

arch

模型结构名称, 和模型定义中的名称一致, 同时需要和network参数中模型名称一致。

必选

dataset

数据加载名称, 和数据加载定义中的名称一致

必选

input_shape

模型输入shape

必选

device

cpu 或 gpu id,仅支持使用一个gpu

0

必选

int

output_dir

压缩后模型输出路径

可选

network

配置模型对应的剪枝层

必选

2.3.4.1.2. Pruning策略配置

amc_cfg中配置自动剪枝算法相关的参数,一般情况下用户无需关注,仅适合剪枝算法调优场景。

各参数含义如下所示:

参数

说明

默认值

必选/可选

参数类型

agent_algo

强化学习算法名称,当前仅支持DDPG

DDPG

可选

string

protocol

压缩策略检索方法,取值范围如下:

mac-constrained,

accuracy-guaranteed,

mac-constrained-experimental,

punish-agent

mac-constrained

可选

string

pruning_pattern

剪枝方式,默认channel剪枝

channels

可选

string

pruning_method

剪枝方法, 可选范围如下:

("l1-rank","stochastic -l1-rank","fm-reconstruction")

fm-reconstruction

可选

string

target_density

目标稀疏 率,全局的剪枝率,控制稀疏化程度

0.5

可选

n_points_per_fm

当pruning_method为 fm-reconstruction时,选择的特征点

10

可选

int

group_size

分组大小

1

可选

int

action_range

强化学习中action的范围

[0.05,0.95]

可选

list

ddpg_cfg

DDPG 强化学习算法配置参数

bsize: batchsize, 默认为1

tau: 0.01

discount: 1.0

epsilon: 50000

init_delta: 0.5

delta_decay: 0.95

hidden1: 300

hidden2: 300

window_length: 1

heatup_noise: 0.5

initial_training_noise: 0.5

training_noise_decay: 0.95

warmup: 100

num_training_episodes:300

lr_a: 0.0001

lr_c: 0.001

可选

dic

2.3.4.1.3. Knight相关配置

docker_cfg中为结合工具链相关的基础配置参数,适用于 pruning工具应用场景 中第二种适用场景。

各参数含义如下所示:

参数

说明

默认值

必 选/可 选

参 数类型

run_latency

是否将清微芯片 推理时间作为剪枝优化目标。

False

可选

bool

chip

芯片型号。

必选

string

image_path

Knight镜像在用户本地的路径

必选

string

localhost_dir

宿主机所在的工作目录, 注意只能使用绝对路径

必选

string

container_dir

映射到Knight 容器内的目录

必选

string

workspace_dir

容器内工作目录

必选

string

container_name

启动镜像时的容器名称

必选

string

bit_width

量化位宽

8

可选

int

is_sparse

是否稀疏

False

可选

bool

2.3.4.2. 调用Pruning说明

2.3.4.2.1. kmc Pruning的API接口

API接口

接口说明

输入参数说明

MCPruning.prune_model

剪枝模型

need_args: dict类型参数,包含如下字段:

model_fn: 原始模型定义

val_fn: 模型评估函数, 要求该函数返回模型评估指标, 详情参见 KMC注意事项 第三点。

config_file: Pruning工具配置文件路径

MCPruning.load_pruned_model

加载剪枝后的模型

model: 原始模型定义 weight_file: 剪枝后模型的权重文件

MCPruning.save_pruned_model

保存模型文件

model: 原始模型定义 save_name: 保存模型的路径

extras: 模型额外信息,dict类型,可包含精度 ,优化器,推理时间之类的信息。

2.3.4.2.2. 使用步骤

以resnet50为例说明如何压缩用户自己的模型,如下为 examples/cls/resnet50_cifar/pruning_demo.py 中的示例代码。

模型训练相关的部分只需和浮点模型训练一致即可。

# 加载数据集,加载预训练好的模型路径

train_loader, test_loader = cifar10_loader(data_dir=data_dir)
ckpt = torch.load( )
model.load_state_dict(ckpt['state_dict'])

#定义损失函数, 优化器和学习率

criterion =optimizer = lr_scheduler =#定义所需参数

need_args = {
'model_fn': model,
'val_fn': partial(validate, val_loader=test_loader),
'config_file': 'pruning_config.yaml'
}

from kmc.pruning import MCPruning

#剪枝训练好的模型
MCPruning.prune_model(need_args)

#重训练剪枝后的模型,加载最优的剪枝后模型
MCPruning.load_pruned_model(model, weight_file=best_pruning_weight)

for epoch in range(epochs):
    train_acc1, _, train_loss = train(model, optimizer, criterion,train_loader, lr_scheduler
    result_info = validate(model, test_loader)

#保存带有剪枝mask的模型

MCPruning.save_pruned_model()

2.3.4.3. 结合Knight工具链

该剪枝方案为自动模型剪枝,可将在清微芯片上的推理时间和模型精度作为优化目标,得到最优的剪枝模型。因此需要调用工具链量化,编译,Profiling 各模块得到实际推理时间。还需以下两个步骤方可得到软硬一体的自动剪枝模型。

步骤一:Knight镜像准备,详情参见 knight镜像包准备

步骤二:配置Knight相关参数,详情参见 knight相关配置

2.4. Sparsity工具

2.4.1. 工具简介

Sparsity工具利用指定的稀疏策略对用户浮点模型进行稀疏,然后用户需要重训练以恢复模型精度,可减少模型部署在清微芯片上的推理时间。

2.4.2. Sparsity工具应用场景

Sparsity工具需要用户准备好经过充分训练的精度较好的模型,当前可支持两种稀疏方式:

一是2:4稀疏,该方式稀疏后的模型, 在清微芯片上无加速效果。

二是清微芯片定制稀疏Cin32Cout64,目前仅TX5368x_TX5339x_TX5335x系列和TX5336x_TX5256x芯片支持,清微其他系列芯片不支持编译。

2.4.3. Sparsity Demo模型

Sparsity工具提供了图像分类模型resnet50和目标检测模型Yolov5 的模型压缩示例。

2.4.3.1. resnet50 Demo

在cifar10数据集上,使用Sparsity工具压缩resnet50模型示例如下:

cd examples/cls/resnet50_cifar

python sparsity_demo.py

demo中包含了稀疏和重训练两个过程,执行成功后,输出如下界面。

pipeline

2.4.3.2. yolov5 Demo

在coco数据集上,使用Sparsity工具压缩yolov5模型示例如下:

cd examples/det/yolov5

python sparsity_demo.py

demo中包含了稀疏和重训练两个过程,执行成功后,输出如下界面。

pipeline

2.4.4. Sparsity自定义模型

Sparsity自定义模型的操作步骤如下:

pipeline

步骤一:基础环境准备,按照 基础环境准备 说明, 用户在自己训练环境的服务器上安装kmc所需的依赖包,准备kmc运行环境;

步骤二:安装kmc软件包,参见 安装kmc软件包 说明;

步骤三:准备yaml配置文件,详情请参见 配置文件说明

步骤四:用户在自己的训练代码中调用kmc Sparsity,详情请参见 调用sparsity说明

步骤五:执行稀疏脚本得到稀疏后的模型。

2.4.4.1. 配置文件说明

Sparsity工具的配置文件模板为config/sparsity_template.yaml,用户可根据自身需求对模板中参数值修改。配置文件中共包含2个部分的参数配置:基础配置(app_args, network),Sparsity策略配置(asp_cfg)

Sparsity resnet50 Demo中的yaml文件示例如下:

app_args:
    arch: resnet50_cifar
    dataset: cifar10
    device: 0

asp_cfg:
    sparsity_method: CustomPruner # options: CustomPruner, Pruner2to4
    target_sparsity: 0.5

network:
    resnet50_cifar: [layer1.0.conv2.weight,layer1.1.conv2.weight,layer1.2.conv2.weight,]
2.4.4.1.1. 基础配置

app_args中为基础配置参数,network中则配置模型中要稀疏的层,各参数含义如下所示:

参数

说明

默认值

必选/可选

参数类型

arch

模型结构名称,和模型定义中的名称一致,同时需要和network参数中模型名称一致。

必选

dataset

数据加载名称,和数据加载定义中的名称一致

必选

device

cpu 或 gpu id,仅支持使用一个gpu,仅指定控制稀疏时使用的gpu,重训练需在代码中根据需求自行配置gpu。

0

必选

int

network

配置模型对应的稀疏层

必选

2.4.4.1.2. Sparsity策略配置

asp_cfg中配置稀疏算法相关的参数,各参数含义如下所示

参数

说明

默认值

必选/ 可选

参数类 型

sparsity_method

稀疏方法选择,可选值如下

CustomPruner:清微稀疏Cin32Cout64;

Pruner2to4:2比4稀疏;

CustomPruner

可选

string

target_sparsity

目标稀疏率

0.5

必选

float

2.4.4.2. 调用Sparsity说明

2.4.4.2.1. kmc Sparsity的API接口

API接口

接口说明

输入参数说明

MCSparsity.sparse_model

稀疏模型

need_args:dict类型参数,包含如下字段:

"model_fn": 原始模型定义;

"optimizer": 模型优化器;

"config_file":Sparsity工具配置文件路径;

MCSparsity.load_sparse_model

加载稀疏后模型

model: 原始模型定义

weight_file: 稀疏后模型的权重文件

MCSparsity.save_sparse_model

保存模型文件

model: 原始模型定义

save_name: 要保存的模型文件路径

extras:模型额外信息,dict类型,可包含精度,优化器,推理时间之类的信息。

2.4.4.2.2. 使用步骤

以resnet50为例说明如何压缩用户自己的模型,如下为 examples/cls/resnet50_cifar/sparsity_demo.py 中的示例代码。

模型训练相关的部分只需和浮点模型训练一致即可。

# 加载数据集,加载预训练好的模型路径
train_loader, test_loader = cifar10_loader(data_dir=data_dir)
ckpt = torch.load( )
model.load_state_dict(ckpt['state_dict'])

#定义损失函数, 优化器和学习率
criterion = optimizer = lr_scheduler = …

from kmc.sparsity import MCSparsity

#定义所需参数
need_args = {
'model_fn': model,
'optimizer': optimizer,
'config_file': 'sparsity_config.yaml'}

#稀疏训练好的模型

MCSparsity.sparse_model(need_args)
for epoch in range(epochs):
    train_acc1, _, train_loss = train(model, optimizer, criterion,
    train_loader, lr_scheduler)
result_info = validate(model, test_loader)
#保存带有稀疏mask的模型
MCSparsity.save_sparse_model()
#重训练稀疏后的模型,加载稀疏后的模型
MCSparsity.load_sparse_model(model, weight_file=best_sparse_weight)

2.5. KMC注意事项

用户需注意以下事项:

  1. Pruning工具剪枝范围针对卷积层和全连接层进行剪枝,同时会影响上一层的剪枝。

示例如下,当对Conv2 Filter进行输入通道Ci方向上的通道剪枝时,Conv2 Filter的输入层即Conv1 Output的通道数会受到影响,而Conv1 Output的通道数是由Conv1 Filter的数量决定的,因此会剪掉Conv1 Filter中相应的卷积核。

pipeline
  1. Pruning工具通道剪枝仅影响模型图中直接相连的上一层。如下示例情况不支持,当剪枝了绿色的层,那么直接相连的蓝色的层会受到影响,而与此同时会间接影响红色的层,此种情况会进行报错处理。

pipeline
  1. Pruning工具和Sparsity工具模型评估函数(test_fn/val_fn)返回字典类型,需要增加ind1,ind2参数,作为剪枝优化的目标精度,应包含如下信息:

{'ind1': 模型评估指标1(Acc@top1/mAP@0.5),
 'ind2': 模型评估指标1(Acc@top5/mAP@0.5-0.95),
 'vloss': 可选, ...}

其中,性能评估采取百分制。examples/cls/resnet50_cifar/train_val.py 中示例如下:

{'acc1': top1_acc_avg,
 'ind1': top1_acc_avg,
 'ind2': top5_acc_avg,
 'vloss': None}
  1. Pruning工具和Sparsity工具剪枝或稀疏过程不支持多卡并行,但可支持加载多卡训练的模型。

  2. Pruning工具和Sparsity工具剪枝或稀疏后,若经过重训练仍然无法恢复到理想的精度,则用户可考虑修改yaml配置文件中的层配置,建议剪枝或稀疏靠后的层,即channel较多的层,此时对精度影响较小。