目录

模型轻量化示例

TensorFlow Quant_INT8-8无训练量化Demo

[h2]环境准备

请参见环境准备,安装TensorFlow及依赖。

[h2]模型配置

[h2]模型量化

执行"dopt_tf_py3/demo/quant8-8/notrain/tensorflow_mnist/"下run_release.sh即可。

"dopt_tf_py3/demo/quant8-8/notrain/tensorflow_mnist"中存有量化后的pb模型和量化配置文件,运行demo后生成的文件如下图所示:

PyTorch Quant_INT8-8无训练量化Demo

[h2]环境准备

请参见环境准备,安装PyTorch及依赖。

[h2]模型配置

[h2]模型量化

执行"dopt_pytorch_py3/demo/quant8-8/notrain/pytorch_mnist/"下run_release.sh即可。

"dopt_pytorch_py3/demo/quant8-8/notrain/pytorch_mnist/"中存有PyTorch无训练量化示例文件,如下图所示:

ONNX Quant_INT8-8无训练量化Demo

[h2]环境准备

环境准备请参见环境准备,安装ONNX及依赖。

[h2]示例代码

将dopt_onnx_py3 目录添加到系统环境中,在终端环境执行

python3 ./dopt_so.py \
    --framework 5 \
    --mode   0 \
    --model "./resnet18_matmul.onnx" \          ## 待量化的ONNX模型
    --cal_conf "./config.prototxt" \            ## 校准集配置文件
    --output  "./resnet18_matmul_quant.onnx" \  ## 量化后的ONNX文件
    --input_shape   input:1,3,128,128 \         ## 浮点模型输入shape
    --compress_conf  ./mnist_param              ## dopt 工具生成的量化文件

其中,./config.prototxt配置内容为(配置文件使用方法):

strategy: 'Quant_INT8-8'
device: USE_CPU
preprocess_parameter:
{
    input_type: BINARY
    input_file_path: './input1.bin'
}

TensorFlow Quant_INT8-8插件式量化Demo

[h2]环境准备

请参见准备TensorFlow环境。安装TensorFlow-gpu 2.8.0版本以及其必要的依赖。

[h2]示例代码

import sys
sys.path.append(".../dopt_tf_py3") ## 其中路径为绝对路径

def generate_config():
    with tf.Session(config=config) as sess:
        build_tf_model() ## 自定义tf模型graph,仅构建拓扑图,不可加载权重
        from dopt.dopt_tf.opt_main import generate_config_file
        generate_config_file(sess, dst_path="./config_gen.json")

def train_model():
    with tf.Session(config=config) as sess:
        build_tf_model() ## 自定义tf模型graph,仅构建拓扑图,不可加载权重
        from dopt.dopt_tf.opt_main import optimize_model
        quant_flag = tf.placeholder(tf.int32)
        is_train_flag = tf.placeholder(tf.bool, name='is_train')
        ## 模型量化,自动在 tf.get_default_graph()上进行改图操作
        optimize_model(
            sess,
            "./config_gen.json",
            is_train_flag,
            quant_flag
        )
        ## 调用完optimize_model之后,加载模型权重
        saver = tf.Saver()
        saver.restore(ckpt)
        tf.global_variables_initializer().run()
        ## train model
        for i in range(...):
            optimizer = ...
            feed_dict[is_train_flag] = True
            feed_dict[quant_flag] = 1
            sess.run(train_op, feed_dict)
        ## eval model
        feed_dict[is_train_flag] = False
        feed_dict[quant_flag] = 1
        sess.run(output, feed_dict)
        evaluate_output(output)

def calibrate_model():
    with tf.Session(config=config) as sess:
        build_tf_model() ## 自定义tf模型graph,仅构建拓扑图,不可加载权重
        from dopt.dopt_tf.opt_main import optimize_model, set_calibrate_state
        quant_flag = tf.placeholder(tf.int32)
        is_train_flag = tf.placeholder(tf.bool, name='is_train')
        ## 模型量化,自动在 tf.get_default_graph()上进行改图操作
        optimize_model(
            sess,
            "./config_gen.json",
            is_train_flag,
            quant_flag
        )
        ## 调用完optimize_model之后,加载模型权重
        saver = tf.Saver()
        saver.restore(ckpt)

        calibration_mode = True
        set_calibrate_state(sess, calibration_mode )
        ## eval model
        feed_dict[is_train_flag] = False
        feed_dict[quant_flag] = 1
        sess.run(output, feed_dict)
        evaluate_output(output)

def generate_params():
    with tf.Session(config=config) as sess:
        build_tf_model()
        from dopt.dopt_tf.opt_main import generate_final_model
        generate_final_model(
            sess,
            config_file         = "./config_gen.json",
            output_name_list    = ["output"],
            ckpt_file           = "train_ckpt_path",
            output_dir          = "./output_dir"
        )
if __name__ == "__main__":
    ## step 1
    ## 开发者接入,配置修改
    generate_config()
    
    ## step 2
    ## 训练模型,直至达标
    train_model() ## 重训练量化模型
    ## calibrate_model()  ## 校准量化模型
    
    ## step 3
    ## 提取参数,用于后续模型部署
    generate_params()

PyTorch Quant_INT8-8插件式量化Demo

[h2]环境准备

请参见准备PyTorch环境。安装PyTorch-gpu 1.11版本以及其必要的依赖。

[h2]示例代码

import sys
sys.path.append(".../dopt_tf_py3") ## 其中路径为绝对路径

def generate_config():
    model = build_torch_model()  ## 开发者待量化的浮点模型
    generate_config_file(model, input_shape, dst_path="./config_gen.json") # model:torch.nn.Module, input_shape : "input1:input1.shape;input2:input2.shape"
    return model

def train_model():
    model = build_torch_model() ## 开发者待量化的浮点模型
    from dopt.dopt_torch.opt_main import optimize_model
    model.load_state_dict(state)  ## load 浮点模型参数
    
    ## 调用optimize model 量化模型
    quanted_model = optimize_model(model, config_path)
    
    ## train model
    quant_loss = get_quant_loss(quant_model)
    optimizer = torch.optim.SGD(quanted_model.parameters(), lr=0.001, momentum=0.9) ## 假设使用SGD优化器
    
    for input_data, label in range(...):
        optimizer.zero_grad()
        outputs = model(input_data)
        loss = loss_fn(outputs, label) ## loss_fn 为原始浮点网络训练loss
        
        total_loss = loss + quant_weight * quant_loss ## quant_weight是指量化损失所占比例
        loss.backward()
        
        optimizer.step()

def calibrate_model():
    model = build_torch_model() ## 开发者待量化的浮点模型
    from dopt.dopt_torch.opt_main import optimize_model, set_calibrate_state
    model.load_state_dict(state)  ## load 浮点模型参数
    
    ## 调用optimize model 量化模型
    quanted_model = optimize_model(model, config_path)
    
    calibrate_mode = True
    set_calibrate_state(model, calibrate_mode)
    
    for input_data, label in range(...):
        outputs = model(input_data)

def generate_params():
    model = build_torch_model()
    from dopt.dopt_torch.opt_main import generate_final_model
    generate_final_model(model,
                        config_file,
                        pth_file="quant.pth",
                        output_dir="./results_dir")

if __name__ == "__main__":
    ## step 1
    ## 开发者接入,配置修改
    generate_config()
    
    ## step 2
    ## 训练模型,直至达标
    train_model()
    ## 无训练模式
    ## calibrate_model()
 
    ## step 3
    ## 提取参数,用于后续模型部署
    generate_params()

TensorFlow NASEA网络结构搜索Demo

[h2]NASEA分类网络

分类网络Demo位于tools_dopt/dopt_tf_py3/demo/nas_ea/ea_cls_imagenet,包含5个文件,如下图所示:

执行步骤:

  1. 准备ImageNet数据集(tfrecord格式),并修改scen.yaml文件中的数据集路径。

  2. 环境准备请参见环境准备。

  3. 加载依赖的开源代码:

    1. 进入分类网络demo目录:

      cd tools_dopt/dopt_tf_py3/demo/nas_ea/ea_cls_imagenet
    2. 下载开源代码:

      git clone https://github.com/Tensorflow/models.git
    3. 进入开源代码目录:

      cd models
    4. 切换到指定版本:

      • 如果TensorFlow版本为1.12.0,执行如下命令:

        git checkout v1.12.0
      • 如果TensorFlow版本为2.1.0,执行如下命令:

        git checkout v2.1.0
    5. 返回分类网络demo目录:

      cd ..
    6. 设置PYTHONPATH默认路径:

      export PYTHONPATH=$PYTHONPATH:`pwd`/models/

    每次打开终端需要重新执行一次上述命令,或添加到“~/.bashrc”文件,并执行“source ~/.bashrc”。

  4. 配置demo下的scen.yaml文件,请参见搜索参数配置。scen.yaml中提供了建议参数,开发者可根据实际需求修改。

  5. 修改demo下的user_module.py文件,模型接口定义请参见TensorFlow用户自定义接口。user_module.py中提供了建议配置,开发者可根据实际需求进行修改。

  6. 执行脚本run_release.sh,在results下,生成多个model_arch_result_*.py文件。开发者可根据log_classification中提供的信息选择合适的网络结构进行训练。后续训练可参考readme.md中的指导。

[h2]NASEA检测网络

检测网络Demo位于"tools_dopt/dopt_tf_py3/demo/nas_ea/ea_det_coco",包含6个文件,如下图所示:

执行步骤:

  1. 准备数据集,包括用于预训的ImageNet数据集(tfrecord格式)和用于训练的COCO数据集(原始格式)。若有完成预训练的ckpt文件,则不需再准备ImageNet数据集。请参见搜索参数配置,修改scen.yaml文件中的数据集路径。

  2. 环境准备请参见环境准备。

  3. 加载依赖的开源代码。

    1. 进入检测网络demo目录。

      cd tools_dopt/dopt_tf_py3/demo/nas_ea/ea_det_coco
    2. 下载开源代码。

      git clone https://github.com/pierluigiferrari/ssd_keras.git
      git clone https://github.com/Tensorflow/models.git
    3. 进入开源代码目录。

      cd ssd_keras
    4. 切换到指定版本。

      git checkout -b v0.9.0
    5. 返回检测网络demo目录。

      cd ..
    6. 进入models开源代码目录。

      cd models
    7. 切换models到指定版本。

      如果TensorFlow版本为1.12.0,执行如下命令:

      git checkout v1.12.0

      如果TensorFlow版本为2.1.0,则执行如下命令:

      git checkout v2.1.0
    8. 进入models开源代码目录

      cd models
    9. 设置PYTHONPATH默认路径

      export PYTHONPATH=$PYTHONPATH:`pwd`/models/
    10. 按照readme.md中的step1~step4步骤,修改相关开源文件。

  4. 配置demo的scen.yaml文件和pre_train.yaml,请参见搜索参数配置。scen.yaml中提供了建议参数,开发者可根据实际需求修改。

  5. 修改demo的user_module.py文件,模型接口定义请参见TensorFlow用户自定义接口。user_module.py中提供了建议配置,开发者可根据实际需求进行修改。

  6. 执行脚本run_release.sh,在results下,生成多个model_arch_result_*.py文件。开发者可根据log_detection中提供的信息选择合适的网络结构进行训练。后续训练可参考readme.md中的指导。

[h2]NASEA分割网络

分割网络Demo位于tools_dopt/dopt_tf_py3/demo/nas_ea/ea_seg_voc,包含 6个文件,如下图所示:

执行步骤:

  1. 准备数据集,包括用于预训练的ImageNet数据集(tfrecord格式)和用于训练的VOC数据集(tfrecord格式)。若有完成预训练的ckpt文件,则不需再准备ImageNet数据集。请参见搜索参数配置,修改scen.yaml文件中的数据集路径。

  2. 环境准备请参见环境准备。

  3. 加载依赖的开源代码。

    1. 进入分割网络demo目录。
      cd tools_dopt/dopt_tf_py3/demo/nas_ea/ea_seg_voc
    2. 下载开源代码:
      git clone https://github.com/Tensorflow/models.git
    3. 进入开源代码目录。
      cd models
    4. 切换到指定版本。
      git checkout v1.13.0
    5. 返回分割网络demo目录。
      cd ..
    6. 设置PYTHONPATH默认路径:
      export PYTHONPATH=$PYTHONPATH:`pwd`/models/research:`pwd`/models/research/slim
    7. 如果TensorFlow版本为2.1.0,需要执行如下命令:
      1. 创建models_tf2.1,并进入文件夹

        mkdir models_tf2.1
        cd models_tf2.1
      2. 下载开源实现

        git clone https://github.com/Tensorflow/models.git
      3. 进入开源代码路径

        cd models
      4. 切换到指定版本

        git checkout v2.1.0
      5. 返回models_tf2.1目录

        cd ..
      6. 设置PYTHONPATH默认路径

        export PYTHONPATH=$PYTHONPATH:`pwd`/models/

        每次打开终端需要重新执行一次上述命令,或添加到"~/.bashrc"文件,并执行"source ~/.bashrc"。

    8. 修改开源实现,按照readme.md中修改开源实现的步骤,修改相关开源文件。
  4. 配置demo的scen.yaml文件和pre_train.yaml,请参见搜索参数配置。scen.yaml中提供了建议参数,开发者可根据实际需求修改。

  5. 修改demo的user_module.py文件,模型接口定义请参见TensorFlow用户自定义接口。user_module.py中提供了建议配置,开发者可根据实际需求进行修改。

  6. 执行脚本run_release.sh,在results下,生成多个model_arch_result_*.py文件。开发者可根据log_segmentation中提供的信息选择合适的网络结构进行训练。后续训练可参考readme.md中的指导。

PyTorch NASEA网络结构搜索Demo

[h2]NASEA分类网络

分类网络Demo位于tools_dopt/dopt_pytorch_py3/demo/nas_ea/ea_cls_imagenet_pytorch,包含5个文件,如下:

执行步骤:

  1. 准备ImageNet数据集(原始格式),并修改scen.yaml文件中的数据集路径。

  2. 环境准备请参见环境准备。

  3. 配置demo下的scen.yaml文件,请参见搜索参数配置。scen.yaml中提供了建议参数,开发者可根据实际需求修改。

  4. 修改demo下的user_module.py文件,模型接口定义请参见PyTorch开发者自定义接口。user_module.py中提供了建议配置,开发者可根据实际需求进行修改。

  5. 执行脚本run_release.sh,在results下,生成多个model_arch_result_*.py文件。开发者可根据log_classification中提供的信息选择合适的网络结构进行训练。后续训练可参考readme.md中的指导。

[h2]NASEA分割网络

分割网络Demo位于tools_dopt/dopt_pytorch_py3/demo/nas_ea/ea_seg_voc_pytorch,包含 6个文件,如下:

执行步骤:

  1. 准备数据集,包括用于预训练的ImageNet数据集(原始格式)和用于训练VOC数据集(原始格式)。若有完成预训练的ckpt文件,则不需再准备ImageNet数据集。请参见搜索参数配置,修改scen.yaml文件中的数据集路径。

  2. 环境准备请参见环境准备。

  3. 加载依赖的开源代码:参考tools_dopt/dopt_pytorch_py3/demo/nas_ea/ea_seg_voc_pytorch/readme.md

  4. 配置demo下的scen.yaml文件和pre_train.yaml文件,请参见搜索参数配置。scen.yaml中提供了建议参数,开发者可根据实际需求修改。

  5. 修改demo下的user_module.py文件,模型接口定义请参见PyTorch开发者自定义接口。user_module.py中提供了建议配置,开发者可根据实际需求进行修改。

  6. 执行脚本run_release.sh,在results下,生成多个model_arch_result_*.py文件。开发者可根据log_segmentation中提供的信息选择合适的网络结构进行训练。后续训练可参考readme.md中的指导。