深層学習アルゴリズム モデルをコンピューティング テクノロジ プラットフォーム xx.bmodel モデルに変換するための方法と手順

目次

1 つの Docker イメージのダウンロード

2 SDKのダウンロード 

3 sophon-demo をダウンロードする

4 Dockerイメージを変更するスクリプト

5 フォルダーを作成する

6.ソース

7.トランスファーモデル


1 つの Docker イメージのダウンロード

イメージ関連の情報はdockerhubで確認できます。

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

 以下のコマンドでダウンロード

docker pull sophgo/tpuc_dev:latest

上記のコマンドが遅すぎる場合は、公式 Web サイトから別のバージョンの Docker イメージをダウンロードしてください。

テクニカルセンター

 ダウンロード後は次のようになります。

次に、次のコマンドを実行してイメージをロードします

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

 ここでsophgo/tpuc_dev:v2.1に注意してください。これは後でスクリプトで使用されます。

2 SDKのダウンロード 

テクニカルセンター

ダウンロードに進む 23.03.01. モデル変換にはSDKは必要ありませんが、内部にnntcが必要です。 

3 sophon-demo をダウンロードする

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

上記の URL にアクセスして、変換スクリプトを含む sophon-demo をダウンロードします。

4 Dockerイメージを変更するスクリプト

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!"

 新しいイメージに変更したので、中のdockerイメージのREPO、IMAGE、TAGを以下の形に修正しました。その他の内容は当面変更しません。

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

5 フォルダーを作成する

ここでは、下の図に示すように、convert_model フォルダーを作成し、その中にデモと NNTC を置きました。

docker_run_sophonsdk.sh は以前に変更されていたので、スクリプトを直接実行してそれをミラーリングしました。

./docker_run_sophonsdk.sh

6.ソース

ソース下の環境変数

/workspace/tpu-nntc/tpu-nntc_v3.1.7-b267d3cd-230327/scripts に envsetup.sh スクリプトがあります。

source envsetup.sh

7.トランスファーモデル

特定の変換モデル スクリプトは sophon-demo-release/sample/YOLOv5/scripts で入手できます。

モデルは JIT 後のモデルを使用する必要があります。具体的な方法は古い方法にあります: https://github.com/sophon-ai-algo/examples/tree/3.0.0/simple/yolov5

gen_int8bmodel_nntc.sh スクリプトを変更して、キャリブレーション イメージのパスとモデル ファイルのパスと名前を変更しましょう。次のように修正されました

#!/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

そして実行します

./gen_int8bmodel_nntc.sh  BM1684

エラーが報告されました: 

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

スクリプトの 24 行目に出力の名前が表示されます。

 これはレイヤー名が間違っているためです。自分の onnx モデルを見てみると、

 次に、スクリプト内のレイヤー名を変更します。変更されたスクリプトは次のとおりです。gen_int8bmodel 関数は呼び出されず、必要ありません。

#!/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

 その後、モデルが生成されます

================================================= ====================
今後は、上で紹介した新しい方法でモデルを変換する予定です 以下の方法は以前の古い方法です 新しい方法のチュートリアル現在: 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

新しい Docker イメージをダウンロードすると、SDK は最初に以前に使用されていた 3.0 を使用し、次に SDK 内の nntc のみを新しいものに置き換えて、新しい URL を使用するようにデモを変換します。

次の URL は廃止されました。

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

 上記 URL の指示に従ってアルゴリズム モデルを変換します。

1.まずSDKパッケージとイメージパッケージをダウンロードします。

SDK ソフトウェア パッケージのダウンロード:

2 Docker開発環境を作成する 

  • インストールツール

    sudo apt update
    sudo apt install unzip
  • Docker イメージをロードします。

    unzip <docker_image_file>.zip
    cd <docker_image_file>
    docker load -i <docker_image>
  • SDK を解凍します。

    unzip <sdk_zip_file>.zip
    cd <sdk_zip_file>/
    tar zxvf <sdk_file>.tar.gz
  • Docker コンテナを作成すると、SDK がマウントされ、コンテナにマッピングされて使用されます。

    cd <sdk_path>/
    # 若您没有执行前述关于docker命令免root执行的配置操作,需在命令前添加sudo
    ./docker_run_<***>sdk.sh
  • Docker コンテナに入り、ライブラリをインストールします。

    # 进入容器中执行
    cd  /workspace/scripts/
    ./install_lib.sh nntc
  • 環境変数を設定します - [PCIe アクセラレータ カードなし]:

    # 配置环境变量,这一步会安装一些依赖库,并导出环境变量到当前终端
    # 导出的环境变量只对当前终端有效,每次进入容器都需要重新执行一遍,或者可以将这些环境变量写入~/.bashrc,这样每次登录将会自动设置环境变量
    source envsetup_cmodel.sh
  • 環境変数を設定します - [PCIe アクセラレータ カードを使用]:

    # 配置环境变量,这一步会安装一些依赖库,并导出环境变量到当前终端
    # 导出的环境变量只对当前终端有效,每次进入容器都需要重新执行一遍,或者可以将这些环境变量写入~/.bashrc,这样每次登录将会自动设置环境变量
    source envsetup_pcie.sh
  • Pythonのバージョンに対応したsailパッケージをインストールする

    # 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 モデルの準備

 注意する必要があるのは、アルゴリズム モデルをエクスポートするときに、関連するトレース コードを追加する必要があることです。

SophonSDK の PyTorch モデル コンパイル ツール BMNETP は、PyTorch の JIT モデル (TorchScript モデル) のみを受け入れます。

JIT (Just-In-Time) は、PyTorch の研究と運用の間のギャップを埋めるために設計されたコンパイル ツールのセットです。これにより、Python インタープリターに依存せずに実行でき、より積極的に最適化できるモデルを作成できます。PyTorch の Python モデル (基本クラスは torch.nn.Module) がある場合、JIT モデルは、次のような torch.jit.trace を通じて取得できますtorch.jit.trace(python_model, torch.rand(input_shape)).save('jit_model')BMNETP は現在、制御フロー操作 (if ステートメントやループなど) を含む JIT モデルをサポートしていないため、torch.jit.script は使用できません。代わりに、torch.jit.trace が使用されます。制御フロー操作はすべてログに記録されます。Yolov5 は操作のこの部分をすでに作成しています。次のコマンドを実行するだけで、要件を満たす JIT モデルをエクスポートできます。

4 モデル変換

これは、変換のためにスクリプトを直接実行することで実行できます。32 ビット モデルと int8 モデルでは異なるスクリプトがあります。

8. 各フレームワーク モデルの ONNX リファレンスへの変換 - TPU-MLIR 1.1 ドキュメント

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

おすすめ

転載: blog.csdn.net/u013171226/article/details/132421278