Inhaltsverzeichnis
4 Skript zum Ändern des Docker-Images
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.
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
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
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.
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 :
-
Docker-Basisimage entwickeln: Klicken Sie hier, um zur offiziellen Website zu gelangen und das Ubuntu-Entwicklungsimage herunterzuladen . Bitte wählen Sie das Docker-Image aus, das der SDK-Version entspricht. -
SDK-Softwarepaket: Klicken Sie hier, um zur offiziellen Website zu gelangen und das SDK-Softwarepaket herunterzuladen . Bitte wählen Sie die SDK-Version aus, die dem Warehouse-Codezweig entspricht.
2 Erstellen Sie eine Docker-Entwicklungsumgebung
-
Installationswerkzeugesudo 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, ztorch.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