目次
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
新しい Docker イメージをダウンロードすると、SDK は最初に以前に使用されていた 3.0 を使用し、次に SDK 内の nntc のみを新しいものに置き換えて、新しい URL を使用するようにデモを変換します。
次の URL は廃止されました。
上記 URL の指示に従ってアルゴリズム モデルを変換します。
1.まずSDKパッケージとイメージパッケージをダウンロードします。
SDK ソフトウェア パッケージのダウンロード:
-
Docker ベース イメージの開発:クリックして公式 Web サイトに移動し、Ubuntu 開発イメージをダウンロードします。SDK バージョンに一致する Docker イメージを選択してください。 -
SDK ソフトウェア パッケージ:クリックして公式 Web サイトに移動し、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 モデルでは異なるスクリプトがあります。