sexta-feira, 11 de outubro de 2024

MILK-V DUO 256 - MobileNetV2 - Part I


Este tutorial apresenta o uso da cadeia de ferramentas TPU-MLIR para converter o modelo MobileNet-Caffe , gerar MLIR e quantizar o MLIR em um modelo INT8 e realizar testes de implantação na placa de desenvolvimento Milk-V Duo para concluir a tarefa de classificação de imagem, que envolve as seguintes etapas:

🚩【Nota】🚩: A placa de desenvolvimento Milk-V Duo está equipada com o chip CV1800B , que suporta a série ONNX e os modelos Caffe . Atualmente, não suporta o tipo de dados de quantificação do modelo TFLite . quantização assimétrica.

  1. Preparação do ambiente de trabalho
  2. Conversão do modelo MobileNet-Caffe
  3. Implante o cvimodel INT8 na placa de desenvolvimento Duo e verifique

A seguir está uma introdução detalhada a essas três etapas.

1. Preparando o ambiente de trabalho

1.1 Configurar o ambiente de desenvolvimento do Docker

Instale e configure o docker:

sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

Extraia o arquivo de imagem do docker hub:

docker pull sophgo/tpuc_dev:v2.2

Execute docker para criar um contêiner, onde duodev está o nome do contêiner, que pode ser modificado por você mesmo. O diretório padrão após a criação é /workspace:

docker run --privileged --network=host --name duodev -v $PWD:/workspace -it sophgo/tpuc_dev:v2.2


duodev

Configure a rede no ambiente docker e instale dependências básicas:

apt-get update
apt-get install net-tools

Baixe a cadeia de ferramentas de conversão de modelo tpu-mlir. O formato de nomenclatura do pacote é tpu-mlir_xxxx.tar.gz, onde xxxx está o número da versão. Este tutorial usa a versão como exemplo v1.2.89-g77a2268f-20230703:

wget --user='cvitek_mlir_2023' --password='7&2Wd%cu5k' ftp://218.17.249.213/home/backup/tpu-mlir_v1.2.89-g77a2268f-20230703.tar.gz

Descompacte a cadeia de ferramentas e importe variáveis ​​de ambiente:

tar zxf tpu-mlir_v1.2.89-g77a2268f-20230703.tar.gz
source tpu-mlir_v1.2.89-g77a2268f-20230703/envsetup.sh

1.2 Preparar diretório de trabalho

Baixe o modelo MobileNet do site oficial:

git clone https://github.com/shicai/MobileNet-Caffe.git

Crie um diretório e coloque os arquivos de modelo no diretório mobilenet_v2clonado MobileNet-Caffe(referido abaixo) e os arquivos de imagem no diretório da cadeia de ferramentas (referido abaixo) neste diretório e, em seguida, crie um diretório de trabalho chamado Referência no texto), usado para armazenar arquivos compilados como MLIR e cvimodel:${MOBILE_DIR}tpu-mlir${TPUMLIR_DIR}workspace${WORK_DIR}

mkdir mobilenet_v2 && cd mobilenet_v2
cp /workspace/MobileNet-Caffe/mobilenet_v2_deploy.prototxt .
cp /workspace/MobileNet-Caffe/mobilenet_v2.caffemodel .
cp -rf /workspace/tpu-mlir_v1.2.89-g77a2268f-20230703//regression/dataset/ILSVRC2012/ .
cp -rf /workspace/tpu-mlir_v1.2.89-g77a2268f-20230703//regression/image/ .
mkdir workspace && cd workspace

2. Conversão do modelo MobileNet-Caffe

As etapas para conversão do modelo são as seguintes:

  • Converter o modelo Caffe em MLIR
  • Gere tabelas de calibração necessárias para quantificação
  • MLIR quantizado em cvimodel assimétrico INT8

2.1 Converter modelo Caffe para MLIR

A entrada do modelo é uma imagem e precisamos entender o pré-processamento do modelo antes de convertê-lo. Se o modelo usar arquivos npz pré-processados ​​como entrada, não há necessidade de considerar o pré-processamento. O processo de pré-processamento é expresso pela fórmula a seguir ( xxx representa entrada):
y = ( x − média ) × escalonado = (x-média)\escala de tempo ssim=x-significar )×escala

O modelo neste exemplo é a entrada BGR , a média e a escala são respectivamente 103.94,116.78,123.680.017,0.017,0.017, o comando de conversão do modelo é o seguinte:

model_transform.py \
    --model_name mobilenet_v2 \
    --model_def ../mobilenet_v2_deploy.prototxt \
    --model_data ../mobilenet_v2.caffemodel \
    --input_shapes [[1,3,224,224]] \
    --resize_dims=256,256 \
    --mean 103.94,116.78,123.68 \
    --scale 0.017,0.017,0.017 \
    --pixel_format bgr \
    --test_input ../image/cat.jpg \
    --test_result mobilenet_v2_top_outputs.npz \
    --mlir mobilenet_v2.mlir


O arquivo gerado pela execução do script model_transform.py é mostrado abaixo:


2.2 Gerar tabelas de calibração necessárias para quantificação

Execute run_calibration.py para obter a tabela de calibração. O número de dados de entrada deve ser de cerca de 100 a 1000 folhas de acordo com a situação.
Aqui usamos as 100 imagens existentes do ILSVRC2012 como exemplo e executamos o comando de calibração:

run_calibration.py mobilenet_v2.mlir \
    --dataset ../ILSVRC2012 \
    --input_num 100 \
    -o mobilenet_v2_cali_table

Após a conclusão da operação, será gerado um arquivo nomeado ${model_name}_cali_table, que será utilizado para posteriormente compilar o arquivo de entrada do modelo INT8.


2.3 MLIR quantizado em cvimodel assimétrico INT8

🚩【Nota】🚩: A placa de desenvolvimento Milk-V Duo está equipada com o chip CV1800B , que suporta a série ONNX e os modelos Caffe . Atualmente, não suporta o tipo de dados de quantificação do modelo TFLite . quantização assimétrica , portanto, nesta seção, use  parâmetros de script model_deploy.pypara usar assimétrico para quantização assimétricapara converter o arquivo MLIR em um modelo de quantização assimétrica INT8 e execute o seguinte comando:

model_deploy.py \
    --mlir mobilenet_v2.mlir \
    --asymmetric \
    --calibration_table mobilenet_v2_cali_table \
    --fuse_preprocess \
    --customization_format BGR_PLANAR \
    --chip cv180x \
    --quantize INT8 \
    --test_input ../image/cat.jpg \
    --model mobilenet_v2_cv1800_int8_asym.cvimodel

Após a conclusão da compilação, ${model_name}_cv1800_int8_asym.cvimodel será gerado um arquivo com o nome, conforme mostrado na figura abaixo:

Nenhum comentário:

Postar um comentário