Methoden und Schritte zum Konvertieren des Deep-Learning-Algorithmusmodells in das xx.bmodel-Modell der Computertechnologieplattform

Inhaltsverzeichnis

1 Docker-Image herunterladen

2 SDK-Download 

3 Sophon-Demo herunterladen

4 Skript zum Ändern des Docker-Images

5 Erstellen Sie einen Ordner

6.Quelle

7.Transfermodell


1 Docker-Image herunterladen

Bildbezogene Informationen finden Sie auf Dockerhub

https://hub.docker.com/r/sophgo/tpuc_dev/tags

 Laden Sie es mit dem folgenden Befehl herunter

docker pull sophgo/tpuc_dev:latest

Wenn der obige Befehl zu langsam ist, laden Sie eine andere Version des Docker-Images von der offiziellen Website herunter.

technisches Zentrum

 Nach dem Download ist es:

Führen Sie dann den folgenden Befehl aus, um das Bild zu laden

docker load -i sophgo-tpuc_dev-v2.1-82d75f5c633d.tar
475a54c2a93d: Loading layer [==================================================>]  65.52MB/65.52MB
c5cf9c6d3cf4: Loading layer [==================================================>]  5.647GB/5.647GB
0cdbfbd3d3f4: Loading layer [==================================================>]  739.4MB/739.4MB
7d7b0448f25b: Loading layer [==================================================>]  1.536kB/1.536kB
Loaded image: sophgo/tpuc_dev:v2.1

 Beachten Sie hier sophgo/tpuc_dev:v2.1 , das später im Skript verwendet wird.

2 SDK-Download 

technisches Zentrum

Gehen Sie zum Download 23.03.01. Für die Modellkonvertierung ist kein SDK erforderlich, es ist jedoch NNTC erforderlich. 

3 Sophon-Demo herunterladen

https://github.com/sophgo/sophon-demo

Gehen Sie zur oben genannten URL, um sophon-demo herunterzuladen, das ein Konvertierungsskript enthält.

4 Skript zum Ändern des Docker-Images

docker_run_sophonsdk.sh,

#!/bin/bash

arch=$(uname -m)
x86="x86"
arm="aarch64"

REPO="sophgo"
IMAGE="sophonsdk3"
TAG=${1:-ubuntu18.04-py37-dev-22.06}

if [ x$(echo ${arch} | grep ${x86}) != x"" ]; then
  echo "running on: ${arch}"
elif [[ $(echo ${arch} | grep ${arm}) != "" ]]; then
  echo "${arch} not support yet"
else
  echo "${arch} not support yet"
  exit 1
fi

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
WORKSPACE=$PWD
echo "Current   Directory: $DIR"
echo "Workspace Directory: $WORKSPACE"
echo "Docker             : $REPO/$IMAGE:$TAG"

if [ -c "/dev/bm-sophon0" ]; then
  for dev in $(ls /dev/bm-sophon*);
  do
    mount_options+="--device="$dev:$dev" "
  done
  CMD="docker run \
      --network=host \
      --workdir=/workspace \
      --privileged=true \
      ${mount_options} \
      --device=/dev/bmdev-ctl:/dev/bmdev-ctl \
      -v /dev/shm --tmpfs /dev/shm:exec \
      -v $WORKSPACE:/workspace \
      -v /dev:/dev \
      -v /etc/localtime:/etc/localtime \
      -e LOCAL_USER_ID=`id -u` \
      -itd $REPO/$IMAGE:$TAG \
      bash
  "
else
  CMD="docker run \
      --network=host \
      --workdir=/workspace \
      --privileged=true \
      -v $WORKSPACE:/workspace \
      -v /dev/shm --tmpfs /dev/shm:exec \
      -v /etc/localtime:/etc/localtime \
      -e LOCAL_USER_ID=`id -u` \
      -itd $REPO/$IMAGE:$TAG \
      bash
  "
fi

echo "creating docker container from image: $REPO/$IMAGE:$TAG"
echo $CMD
container_sha=`eval $CMD`
container_id=${container_sha:0:12}
CMD="docker exec -it ${container_id} bash"

echo "container_id: $container_id"
[[ ! -z "$container_id" ]] && eval $CMD || echo "failed to create container!"

 Da wir zu einem neuen Image gewechselt sind, haben wir REPO, IMAGE und TAG des darin enthaltenen Docker-Images in die folgende Form geändert, und die anderen Inhalte werden vorerst nicht geändert.

REPO="sophgo"
IMAGE="tpuc_dev"
TAG="v2.1"

5 Erstellen Sie einen Ordner

Hier habe ich einen Ordner „convert_model“ erstellt und demo und nntc darin abgelegt, wie in der Abbildung unten gezeigt

docker_run_sophonsdk.sh wurde zuvor geändert, und dann habe ich das Skript direkt ausgeführt, um es zu spiegeln.

./docker_run_sophonsdk.sh

6.Quelle

Umgebungsvariablen unter Quelle

Es gibt ein envsetup.sh-Skript in /workspace/tpu-nntc/tpu-nntc_v3.1.7-b267d3cd-230327/scripts

source envsetup.sh

7.Transfermodell

Dann ist das spezifische Konvertierungsmodell-Skript in sophon-demo-release/sample/YOLOv5/scripts verfügbar.

Das Modell muss das Modell nach JIT verwenden. Die spezifische Methode befindet sich in der alten Methode: https://github.com/sophon-ai-algo/examples/tree/3.0.0/simple/yolov5

Ändern wir das Skript gen_int8bmodel_nntc.sh und ändern wir den Pfad des Kalibrierungsbilds sowie den Pfad und Namen der Modelldatei. Nach der Änderung ist wie folgt

#!/bin/bash
model_dir=$(dirname $(readlink -f "$0"))

if [ ! $1 ]; then
    echo "Please set the target chip. Option: BM1684 and BM1684X"
    exit
else
    target=$1
fi

outdir=../models/$target

function auto_cali()
{
    python3 -m ufw.cali.cali_model  \
            --net_name=yolov5s  \
            --model=../build/640_edge_compute_best_20230821.torch.pt  \
            --cali_image_path=../calib  \
            --cali_iterations=128   \
            --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
            --input_shapes="[1,3,640,640]"  \
            --target=$target   \
            --convert_bmodel_cmd_opt="-opt=1"   \
            --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=MAX"
    mv ../models/torch/yolov5s_batch1/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_1b.bmodel
}

function gen_int8bmodel()
{
    bmnetu --model=../models/torch/yolov5s_bmnetp_deploy_int8_unique_top.prototxt  \
           --weight=../models/torch/yolov5s_bmnetp.int8umodel \
           -net_name=yolov5s \
           --shapes=[$1,3,640,640] \
           -target=$target \
           -opt=1
    mv compilation/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_$1b.bmodel
}

pushd $model_dir
if [ ! -d $outdir ]; then
    mkdir -p $outdir
fi
# batch_size=1
auto_cali
# batch_size=4
gen_int8bmodel 4

popd

dann ausführen

./gen_int8bmodel_nntc.sh  BM1684

Fehler gemeldet: 

bad layer name: < 24 >55 !!!
*** Check failure stack trace: ***
./gen_int8bmodel_nntc.sh: line 14:  2971 Aborted                 (core dumped) python3 -m ufw.cali.cali_model --net_name=yolov5s --model=../build/640_edge_compute_best_20230821.torch.pt --cali_image_path=../calib --cali_iterations=128 --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True' --input_shapes="[1,3,640,640]" --target=$target --convert_bmodel_cmd_opt="-opt=1" --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=MAX"
mv: cannot stat '../models/torch/yolov5s_batch1/compilation.bmodel': No such file or directory

Dann können Sie den Namen der Ausgänge in Zeile 24 im Skript sehen.

 Dies liegt daran, dass der Ebenenname falsch ist. Ich schaue mir mein eigenes Onnx-Modell an.

 Ändern Sie dann den Ebenennamen im Skript. Das geänderte Skript sieht wie folgt aus: Die Funktion gen_int8bmodel wird nicht aufgerufen und ist nicht erforderlich.

#!/bin/bash
model_dir=$(dirname $(readlink -f "$0"))

if [ ! $1 ]; then
    echo "Please set the target chip. Option: BM1684 and BM1684X"
    exit
else
    target=$1
fi

outdir=../models/$target

function auto_cali()
{
    python3 -m ufw.cali.cali_model  \
            --net_name=yolov5s  \
            --model=../build/edge_compute_best_20230821.onnx  \
            --cali_image_path=../calib  \
            --cali_iterations=150   \
            --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \
            --input_shapes="[1,3,640,640]"  \
            --target=$target   \
            --convert_bmodel_cmd_opt="-opt=1"   \
            --try_cali_accuracy_opt="-fpfwd_outputs=326,378,430;-th_method=MAX"
    #mv ../models/torch/yolov5s_batch1/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_1b.bmodel
}

function gen_int8bmodel()
{
    bmnetu --model=../models/torch/yolov5s_bmnetp_deploy_int8_unique_top.prototxt  \
           --weight=../models/torch/yolov5s_bmnetp.int8umodel \
           -net_name=yolov5s \
           --shapes=[$1,3,640,640] \
           -target=$target \
           -opt=1
    mv compilation/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_$1b.bmodel
}

pushd $model_dir
if [ ! -d $outdir ]; then
    mkdir -p $outdir
fi
# batch_size=1
auto_cali
# batch_size=4
#gen_int8bmodel 4

popd

 Anschließend wird das Modell generiert

=============================================== ====================
In Zukunft wird die oben eingeführte neue Methode zum Konvertieren des Modells verwendet. Die folgende Methode ist die alte Methode zuvor. Das neue Methoden-Tutorial ist jetzt: https://github.com/sophgo/sophon-demo

https://github.com/sophgo/sophon-demo/blob/release/docs/Environment_Install_Guide.md#1-tpu-mlir%E7%8E%AF%E5%A2%83%E6%90%AD%E5% BB%BA

Und laden Sie das neue Docker-Image herunter, dann kann das SDK zuerst das zuvor verwendete 3.0 verwenden, dann nur den NNTC im SDK durch das neue ersetzen und dann die Demo konvertieren, um die neue URL zu verwenden.

Die folgenden URLs sind veraltet.

https://github.com/sophon-ai-algo/examples/tree/cc94f7c06da1c645ec193e40537915d40f94e005/simple/yolov5

 Befolgen Sie die Anweisungen unter der obigen URL, um das Algorithmusmodell zu konvertieren.

1. Laden Sie zunächst das SDK-Paket und das Image-Paket herunter

Download des SDK-Softwarepakets :

2 Erstellen Sie eine Docker-Entwicklungsumgebung 

  • Installationswerkzeuge

    sudo apt update
    sudo apt install unzip
  • Docker-Image laden:

    unzip <docker_image_file>.zip
    cd <docker_image_file>
    docker load -i <docker_image>
  • Entpacken Sie das SDK:

    unzip <sdk_zip_file>.zip
    cd <sdk_zip_file>/
    tar zxvf <sdk_file>.tar.gz
  • Erstellen Sie einen Docker-Container. Das SDK wird gemountet und dem Container zur Verwendung zugeordnet:

    cd <sdk_path>/
    # 若您没有执行前述关于docker命令免root执行的配置操作,需在命令前添加sudo
    ./docker_run_<***>sdk.sh
  • Geben Sie den Docker-Container ein, um die Bibliothek zu installieren:

    # 进入容器中执行
    cd  /workspace/scripts/
    ./install_lib.sh nntc
  • Umgebungsvariablen festlegen – [Keine PCIe-Beschleunigerkarte]:

    # 配置环境变量,这一步会安装一些依赖库,并导出环境变量到当前终端
    # 导出的环境变量只对当前终端有效,每次进入容器都需要重新执行一遍,或者可以将这些环境变量写入~/.bashrc,这样每次登录将会自动设置环境变量
    source envsetup_cmodel.sh
  • Umgebungsvariablen festlegen – [mit PCIe-Beschleunigerkarte]:

    # 配置环境变量,这一步会安装一些依赖库,并导出环境变量到当前终端
    # 导出的环境变量只对当前终端有效,每次进入容器都需要重新执行一遍,或者可以将这些环境变量写入~/.bashrc,这样每次登录将会自动设置环境变量
    source envsetup_pcie.sh
  • Installieren Sie das Sail-Paket, das der Python-Version entspricht

    # the wheel package is in the SophonSDK:
    pip3 uninstall -y sophon
    # get your python version
    python3 -V
    # choose the same verion of sophon wheel to install
    # the following py3x maybe py35, py36, py37 or py38
    # for x86
    pip3 install ../lib/sail/python3/pcie/py3x/sophon-?.?.?-py3-none-any.whl --user

3 Modellvorbereitung

 Es ist zu beachten, dass wir beim Exportieren des Algorithmusmodells relevanten Trace-Code hinzufügen müssen

Das PyTorch-Modellkompilierungstool BMNETP in SophonSDK akzeptiert nur das JIT-Modell (TorchScript-Modell) von PyTorch.

JIT (Just-In-Time) ist eine Reihe von Kompilierungstools, die die Lücke zwischen Forschung und Produktion in PyTorch schließen sollen. Es ermöglicht die Erstellung von Modellen, die ohne Abhängigkeit vom Python-Interpreter ausgeführt und aggressiver optimiert werden können. Wenn es ein Python-Modell von PyTorch gibt (die Basisklasse ist Torch.nn.Module), kann das JIT-Modell über Torch.jit.trace abgerufen werden, z torch.jit.trace(python_model, torch.rand(input_shape)).save('jit_model'). BMNETP unterstützt derzeit keine JIT-Modelle mit Kontrollflussoperationen (z. B. if-Anweisungen oder Schleifen), daher kann Torch.jit.script nicht verwendet werden. Stattdessen wird Torch.jit.trace verwendet, das nur Operationen an Tensoren verfolgt und protokolliert, nicht jedoch Alle Kontrollflussvorgänge werden protokolliert. Yolov5 hat diesen Teil der Operation bereits für uns geschrieben. Führen Sie einfach den folgenden Befehl aus, um das JIT-Modell zu exportieren, das den Anforderungen entspricht:

4 Modellumstellung

Dies kann durch direktes Ausführen des Skripts zur Konvertierung erfolgen. Es gibt verschiedene Skripte für das 32-Bit-Modell und das int8-Modell.

8. Konvertierung jedes Framework-Modells in die ONNX-Referenz – TPU-MLIR 1.1-Dokument

https://github.com/sophgo/sophon-demo

Acho que você gosta

Origin blog.csdn.net/u013171226/article/details/132421278
Recomendado
Clasificación