モデル変換 - takgto/utokyo-chipathon2023 GitHub Wiki
この手順では、重みファイルをFPGAで使える形式に変換します。
配布したPCにはWSL2でLinux環境が構築されています。エクスプローラーでLinuxディレクトリを編集することもできます。
手順では、WSL2(Ubuntu)とMobaXtermのターミナル(黒い画面)を使用します。コマンドを実行する際は、どちらの画面を使うか先頭のアイコンで示しています。
このアイコンのついているコマンドはUbuntu(WSL2)のコンソールに一行ずつ入力してください。
このアイコンのついているコマンドはMobaXtermのSerial接続したコンソールに一行ずつ入力してください。
このアイコンのついているコマンドはMobaXtermのSSH接続したコンソールに一行ずつ入力してください。
0. FPGA接続
箱の中にケースに入ったSDカードが入っているので、それを基板のスロットに挿してください。
PCとFPGAをケーブルで接続して始めます。
まだ接続していない場合はFPGA接続方法のページを参考にしてください。
1. SSH接続
この後、スクリプトを実行してモデル変換とファイル転送を行います。そのためにまずはPCと基板間でSSH接続を確立させます。
1.1. MobaXtermでSerial接続
FPGAの接続ページのようにケーブルがつないだ状態で、タスクバーまたはスタートメニューからMobaXtermを立ち上げSessionからSerialで接続します。
COM4もしくはCOM7など、2つ見えているうちの小さいほうの番号のポートを選び、Speedはプルダウンメニューから115200bpsを選びます。
OKを押して接続します。
アイコンのタブが開いたら、電源を接続します。
すると、コンソールに文字が表示されます。root@xilinx-kv260-starterkit-20221:~#と出てきて表示が止まったら正常に起動しています。
コンソールに数行しか文字が出てこない場合は、大きい方の番号のポートも試してみてください。
1.2. IPアドレスなどを設定する
次のコマンドをMobaXtermのSerialコンソールに入力します。
source ./init260.sh
この時、以下のようなメッセージが出ることがありますが、問題ありません。
これは、init260.shの中で作成しようとしているシンボリックリンクが、既にあるというメッセージです。
init260.shの中身は以下のようになっています。
1行目でIPを指定しています。
2行目以下でaliasを設定しています。
例:
$ yolov3s = cd /home/root/Vitis-AI/examples/Vitis-AI-Library/samples/yolov3
yolov3s入力でFPGAで推論するためのテストコードがあるディレクトリに移動します。
$ model = cd /usr/share/vitis_ai_library/models
model入力で量子化したモデル(*.xmodel)が入っているディレクトリに移動します。
Serialコンソールでこれらのaliasが使えるようになります。この後SSHでもFPGAに接続しますが、SSHコンソールで同じaliasを使いたい場合は、再度SSHコンソールのrootディレクトリ(init260.shがあるディレクトリ)で再度source ./init260.shを入力します。
または、aliases(rootディレクトリにあります)にもinit250.shの2行目以下が記載されているので、SSHコンソールで以下のコマンドを用いても同様のaliasが使えるようになります。
source ./aliases
Serialコンソールで以下のコマンドをタイプしてipが表示されることを確認します。
ifconfig
eth0の下にinet 192.168.1.100が含まれていない場合は、イーサネットケーブル(水色)の接続を確認して、電源の抜き差しを行いもう一度kv260を立ち上げます。その後、もう一度source ./init260.shを実行します。
1.3. FPGAで推論するための準備
まず、PCのIPアドレスを設定します。
スタートメニューの「設定」から「ネットワークとインターネット」、「イーサネット」と進みます。
「IP割り当て」、「IPv4アドレス」、「IPv4マスク」の右の「編集」からIPアドレスを手動で設定します。
IPアドレス:192.168.1.10
サブネットマスク」255.255.255.0
(既に設定されていれば変更不要です)
「保存」をクリックして設定します。
IPアドレスを設定できたら、MobaXtermで新しいSessionを開き、SSHで接続します。
Remote hostに
192.168.1.100を入力します。Specify usernameのチェックを入れて、空欄にrootと入力します。
OKをクリックしてSSHでFPGAに接続すると、パスワードを聞かれるのでrootと入力してください。
Serialと同様にroot@xilinx-kv260-starterkit-20221:~#が表示されたら、イーサネットで正常に接続できています。
[!TIP] 作業中にSSH接続が切れることがあります。その時はイーサケーブルを抜き差しして、Serialコンソールに
source ./init260.shを再度入力してください。
2. ターミナルを起動する
タスクバーかスタートメニューから以下のアイコンをクリックします。
タブの右にある下向きの>をクリックして、「Ubuntu」を開きます。
アイコンが違う場合や名前にバージョンが入っている場合がありますが、バージョン18~20.04なら問題ありません。
$が表示されるまで待ちます。コマンドはここに入力します。
3. 作業ディレクトリに移動する
WSL2のhomeディレクトリに、Vitis-AIディレクトリを用意してあり、ここに必要なファイルがあります。Vitis-AIディレクトリに移動します。
cd Vitis-AI
4. 学習済みweightをコピーする
Windowsの/Users/x-nics-kuroda/Downloads/work_best_weightsにあらかじめ用意されたyolov3-416_final.weightsをコピーする
cp /mnt/c/Users/x-nics-kuroda/Downloads/weights/yolov3-416_final.weights /home/x-nics-kuroda/Vitis-AI/yolov3-dlab/work/backup
コピー元のパスは各個人に合わせること
ユーザー名のx-nics-kurodaはguestの場合もあるので確認してから実行してください。
自分で学習を行ったweightを使う場合は、Google driveの学習結果ファイルdarknet/work/backup/(config名_*).weightsをダウンロードして使用します。 最も高い性能を示した重みファイルは(config名)_best.weightsとして保存され、今回の場合、yolov3-416_best.weightsとなります。
5. Docker起動
PCのディスクトップまたはタスクバーのDocker DesktopのアイコンをダブルクリックしてDockerを起動します(数分かかる)
docker images
上記をUbuntuコンソールにタイプして、次のように表示されればOK
REPOSITORY TAG IMAGE ID CREATED SIZE
my_vitis-ai-cpu latest 2979897c870f 2 months ago 21GB
上記は表示例です。my_vitis-ai-cpu以外のREPOSITORYがある場合もありますが、my_vitis-ai-cpuがあれば問題ありません。
以下のコマンドでDockerのコンソールを起動します。
./docker_run.sh my_vitis-ai-cpu:latest
最初の起動では何回かPress any key to continue...と表示されるので、都度何かキーを押してください。
Do you agree to the terms and wish to proceed [y/n]?と表示されたらyを入力してEnterキーを押してください。
以降、このUbuntuコンソールはDockerのコンソールになります。Ubuntuにあるファイルをコピーする、等Ubuntuコンソールを再度使用したい場合は別のコンソールを立ち上げてください。
6. Conda環境立ち上げ
(Docker)
conda activate vitis-ai-tensorflow2
7. モデル変換スクリプト実行
まずはスクリプトのあるディレクトリへ移動します。
(Docker)
cd /workspace/yolov3-dlab/scripts_tf2
ここにdeploy_model.pyというファイルがあります。これはモデル変換を行い、できたファイルをFPGAへ転送します。
使いたい.cfgファイルと.weightsファイルを指定して、以下のコマンドを入力します。
まずは416のファイルを試してみましょう。
(Docker)
python deploy_model.py --config_name yolov3-416.cfg --weights_name yolov3-416_final.weights
しばらく待つと、パスワードを求められるはずです。もしパスワードを求められずに入力待ち(プロンプト)が表示された場合は、ファイルができているかどうかを確認してください。
以下のような表示が出てきたら、転送は成功しませんでしたがファイルはできています。
この表示が出た場合は以下の【Tips】を試してみてください。表示が出る前に止まってしまった時はTAを呼んでください。
[!TIP] 転送がうまくいかない時は?
MobaXtermのSSH接続画面
でEnterキーを押して、改行がされることを確認してください。 改行されない時はSSH接続が切れています。イーサケーブルを抜き挿しして、PC側のポート、基板のポートどちらも奥まで挿入されていることを確認してください。 その後、MobaXtermのSerialコンソールに以下のコマンドを入力します。
source ./init260.sh ifconfig
eth0の下にinet 192.168.1.100が含まれていることを確認して、再度スクリプトを試してください。
8. KV260へのモデルデプロイ(転送)
以下のような画面でパスワードを求められたら、スクリプトが正常に進んでいます。
文字を入力しても何も表示されませんが、rootと入力してEnterキーを押してください。正しく入力できていれば、KV260に接続されます。
次に以下のような画面になります。
ここで指定した名前が、KV260側でのフォルダ名および各ファイル名(.xmodel / .prototxt)に自動で統一されます。何も入力せずEnterキーを押すと、自動的にデフォルトの名前になります。ここではyolov3-416という名前のフォルダが作られます。
転送しますか?と訊かれるので、yと入力してEnterキーを押します。
もう一度パスワードを求められるのでrootと入力します。ちなみに、スクリプト実行2回目以降はこの転送のパスワードは求められなくなります。
正常に転送されると、以下のような表示になります。
転送が完了した場合は、FPGAボードでの推論を行います。 次のページへはここをクリック。
参考 : モデルの手動転送方法
もし、以下のように表示された場合は、ファイルはできていますが、FPGAに転送されていません。
この表示が出る前に止まってしまった時はTAを呼んでください。
転送できなかった場合もファイルはできているので、手動でファイルをFPGAに転送すれば続けられます。
以下に手動でのファイルの転送方法を記載します。
/workspace/yolov3-dlab/compiled_yolov3ディレクトリに、yolov3-416_final.xmodel、meta.json、md5sum.txtの3つのファイルが生成されているはずです。これら3つのファイルをFPGAボードに転送します。
まずはFPGAにディレクトリを作成します。
[!TIP] 他の重みファイルを変換する時の注意 ディレクトリ名とファイル名(拡張子なし)は一致させてください。 例えば、
/usr/share/vitis_ai_library/models/my_dpu_yolov3としたら、その下のファイル名は、my_dpu_yolov3.xmodel,my_dpu_yolov3.prototxt,md5sum.txt,meta.jsonとする必要があります。 スクリプトを流すと、フォルダ名入力を求められて、自動的にフォルダ名とファイル名を一致させてくれます。
次のコマンドをMobaXtermのSSHコンソールに入力してディレクトリを生成します。
cd /usr/share/vitis_ai_library/models
mkdir yolov3-416
以下のコマンドでFPGAに転送してください。転送時にディレクトリ名に合わせてファイル名を変更します。
(Docker)
scp /workspace/yolov3-dlab/compiled_yolov3/yolov3-416_final.xmodel [email protected]:/usr/share/vitis_ai_library/models/yolov3-416/yolov3-416.xmodel
(Docker)
scp /workspace/yolov3-dlab/compiled_yolov3/md5sum.txt [email protected]:/usr/share/vitis_ai_library/models/yolov3-416
(Docker)
scp /workspace/yolov3-dlab/compiled_yolov3/meta.json [email protected]:/usr/share/vitis_ai_library/models/yolov3-416
また、prototxtを転送します。/workspace/yolov3-dlab/workディレクトリにyolov3.prototxtというファイルがあるので、名前を変更して転送します。
scp /workspace/yolov3-dlab/work/yolov3.prototxt [email protected]:/usr/share/vitis_ai_library/models/yolov3-416_final/yolov3-416.prototxt