Python - AI - MAX78000 - 学習・量子化

クラウディア 
1. 概要
2. データ取得
3. 学習
4. ソース作成
5. モデルの評価
6. 参考

1. 概要

 前ページで、作成した環境では、下記の判定を行う、サンプルが用意されています。
コード 内  容 備  考
dogs vs cats 画像が犬か猫か判定する
camvid_unet 車載カメラで撮影された画像 何をするかはよくわからない
cifar 画像認識
rps グー・チョキ・パーの手の画像を識別
mnist 0~9 の手書き文字を判定
svhn 家にある番号(日本の表札?)を判定

 ここでは、「dogs vs cats」を使用してみます。
 本ページは、下記のサイトを参考にさせていただきました。

cannot import name 'preserve_channel_dim' from 'albucore.utils' · Issue #426 · Gourieff/comfyui-reactor-node

2. データ取得

 サンプルで使用する、データを取得します。  下記のサイトへアクセスします。
dogs vs cats
 アカウントの登録が必要になります。  アカウントを登録したら、「Download」で、ダウンロードできます。
「Python」-「dogs vs cats」

 「archive.zip」というファイルがダウンロードされます。
 この中に、下記のフォルダが存在します。


dogs_vs_cats
test
train
 「dogs_vs_cats」を展開します。  圧縮率が非常に高く、展開には、気の遠くなるような時間がかかりますので、展開し始めたら、いったん別の作業をして、次の日まで待つような忍耐が必要です。  展開した、「dogs_vs_cats」を前ページで作成した、下記のディレクトリへ展開します。

ai8x-training/data/cats_vs_dogs
 なんでか、「dogs_vs_cats」を「cats_vs_dogs」と名前を変えるのであります。  どういうことかは、わかりませぬ。

3. 学習

 前ページで作成した環境で。

cd ai8x-training/

source .venv/Scripts/activate

scripts/train_catsdogs.sh
 これが、末尾に書いているエラーになるので、参考サイトを読んで。

python -m pip install albucore==0.0.16
 再度。

scripts/train_catsdogs.sh
 ここは、おそっろしく時間がかかります。  12時間以上かかる、覚悟が必要かと思います。  ところどころ。

INFO:albumentations.check_version:A new version of Albumentations is available: 1.4.18 (you have 1.4.12). Upgrade using: pip install -U albumentations. To disable automatic update checks, set the environment variable NO_ALBUMENTATIONS_UPDATE to 1.
 ちゅうのが、やたら出力されるので、下記を先に流しておいた方がいいかもしれません。

python -m pip install albumentations==1.4.18
 終了すると、下記のようなメッセージが出力されます。  (YYYY.MM.DD-HHMMSS は、年.月.日-時分秒)  (当然、日時的なものはそのときの値になります)

Log file for this run: ドライブ:\パス\ai8x-training\logs\YYY.MM.DD-HHMMSS\YYY.MM.DD-HHMMSS.log
 実行時に出力されていたメッセージは、「.log」で確認することができるかと思います。  実行結果として、「ドライブ:\パス\ai8x-training\logs\YYYY.MM.DD-HHMMSS」配下に、下記のファイルが作成されます。

configs\schedule-catsdogs.yaml
2024.10.11-142258.log
best.pth.tar
checkpoint.pth.tar
qat_best.pth.tar
qat_checkpoint.pth.tar
 「.tar」は、重みファイル(らしい)。  下記で終了します。

deactivate

4. ソース作成

 前項で作成したものをもとにして、「MAX78000」の組み込み用のソースを作成します。  (ここ、実はよう理解していません)

cd ../ai8x-synthesis

source .venv/Scripts/activate
 前項で作成した、重みファイルを量子化(?)します。

python quantize.py ../ai8x-training/logs/YYYY.MM.DD-HHMMSS/qat_best.pth.tar trained/qat_best-q-YYYYMMDD-HHMMSS.pth.tar --device MAX78000
 新たに、下記のファイルが作成されます。

ai8x-synthesis/trained/qat_best-q-YYYYMMDD.pth.tar
 プログラム作成。  (下記は、1行で入力なので、注意)

python ai8xize.py --test-dir sdk/Examples/MAX78000/CNN --prefix cats-dogs --checkpoint-file trained/qat_best-q-YYYYMMDD-HHMMSS.pth.tar --config-file networks/cats-dogs-hwc.yaml --fifo --softmax --device MAX78000 --timer 0 --display-checkpoint --verbose "$@"
 下記のような出力がありまして。  (「WARNING」が気にはなりますが・・・)

Following Github server redirection from /repos/MaximIntegratedAI/ai8x-synthesis to /repositories/265377030
Configuring device: MAX78000
Reading networks/cats-dogs-hwc.yaml to configure network...
WARNING: Cannot run "yamllint" linter to check networks/cats-dogs-hwc.yaml
Reading ../ai8x-training/logs/2024.10.11-142258/qat_best-q.pth.tar to configure network weights...
Checkpoint for epoch 175, model ai85cdnet - weight and bias data:
 InCh OutCh  Weights         Quant Shift  Min  Max    Size Key                                       Bias       Quant  Min  Max Size Key
    3    16  (48, 3, 3)          8    -1  -96  127     432 conv1.op.weight                           N/A            0    0    0    0 N/A
   16    32  (512, 3, 3)         8    -1  -97   88    4608 conv2.op.weight                           N/A            0    0    0    0 N/A
   32    64  (2048, 3, 3)        8    -1 -110   81   18432 conv3.op.weight                           N/A            0    0    0    0 N/A
   64    32  (2048, 3, 3)        8    -1 -107  103   18432 conv4.op.weight                           N/A            0    0    0    0 N/A
   32    32  (1024, 3, 3)        8    -1 -111   97    9216 conv5.op.weight                           N/A            0    0    0    0 N/A
   32    16  (512, 3, 3)         8    -1 -114  122    4608 conv6.op.weight                           N/A            0    0    0    0 N/A
 1024     2  (1, 2, 1024)        8    -2  -74   91    2048 fc.op.weight                              (2,)           8  -31   27    2 fc.op.bias
TOTAL: 7 parameter layers, 57,778 parameters, 57,778 bytes
Configuring data set: cats_vs_dogs.
cats-dogs...
Arranging weights... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100%
Storing weights...   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100%
Creating network...  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100%
 この結果。

ai8x-synthesis\sdk\Examples\MAX78000\CNN\cats-dogs
 というフォルダの下に、下記のようなファイルが作成されます。

.settings
.vscode
.cproject
.project
cats-dogs.launch
cnn.c
cnn.h
log.txt
main.c
Makefile
project.mk
sampledata.h
sampleoutput.h
softmax.c
weights.h
 これが、「MAX78000」に組み込むためのソースファイル一式になるはずなのだ。  環境設定をリセットしておきます。

deactivate

5. モデルの評価

 下記で、「量子化したチェックポイントを使って組込むモデルの評価」ができる(らしい)。

cd ../ai8x-training

source .venv/Scripts/activate

python train.py --model ai85cdnet --dataset cats_vs_dogs --confusion --evaluate --exp-load-weights-from ../ai8x-synthesis/trained/qat_best-q-YYYY.MM.DD-HHMMSS.pth.tar -8 --device MAX78000 "$@"
 結果、下記のような出力があります。  (日時の表記は、量子化ファイル出力時の日時とプログラム実行時の日が混在しますので、ご注意ください)  (パスの部分も伏字にしています)

Log file for this run: パス\ai8x-training\logs\YYYY.MM.DD-HHMMSS\YYYY.MM.DD-HHMMSS.log
Configuring device: MAX78000, simulate=True.
No CUDA, ROCm, or MPS hardware acceleration, training will be slow
=> loading checkpoint ../ai8x-synthesis/trained/qat_best-q-YYYY.MM.DD-HHMMSS.pth.tar
=> Checkpoint contents:
+----------------------+-------------+-----------+
| Key                  | Type        | Value     |
|----------------------+-------------+-----------|
| arch                 | str         | ai85cdnet |
| compression_sched    | dict        |           |
| epoch                | int         | 184       |
| extras               | dict        |           |
| optimizer_state_dict | dict        |           |
| optimizer_type       | type        | Adam      |
| state_dict           | OrderedDict |           |
+----------------------+-------------+-----------+

=> Checkpoint['extras'] contents:
+-----------------+--------+---------------+
| Key             | Type   | Value         |
|-----------------+--------+---------------|
| best_epoch      | int    | 184           |
| best_mAP        | int    | 0             |
| best_top1       | float  | 80.0          |
| clipping_method | str    | MAX_BIT_SHIFT |
| current_mAP     | int    | 0             |
| current_top1    | float  | 80.0          |
+-----------------+--------+---------------+

Loaded compression schedule from checkpoint (epoch 184)
=> loaded 'state_dict' from checkpoint '../ai8x-synthesis/trained/qat_best-q-YYYY.MM.DD-HHMMSS.pth.tar'
Optimizer Type: <class 'torch.optim.sgd.SGD'>
Optimizer Args: {'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0.0001, 'nesterov': False, 'maximize': False, 'foreach': None, 'differentiable': False, 'fused': None}
torch.compile() not available, using "eager" mode
Dataset sizes:
        test=59
--- test (ckpt) ---------------------
59 samples (256 per mini-batch)
Test: [    1/    1]    Loss 1.585910    Top1 50.847458
==> Top1: 50.847    Loss: 1.586

==> Confusion:
[[18 12]
 [17 12]]


Log file for this run: パス\ai8x-training\logs\YYYY.MM.DD-HHMMSS\YYYY.MM.DD-HHMMSS.log
 この意味については、まだ、わかっていません。  わかったら、記述したいのですが・・・追而書。

6. 参考


scripts/train_catsdogs.sh
 これが、下記のようなエラーになります。

Traceback (most recent call last):
  File "C:\Users\ユーザ名\AppData\Local\Programs\Python\Python311\Lib\pydoc.py", line 457, in safeimport
    module = __import__(path)
             ^^^^^^^^^^^^^^^^
  File "ai8x-training\datasets\cats_vs_dogs.py", line 25, in <module>
    import albumentations as album
  File "ai8x-training\.venv\Lib\site-packages\albumentations\__init__.py", line 6, in <module>
    from .augmentations import *
  File "ai8x-training\.venv\Lib\site-packages\albumentations\augmentations\__init__.py", line 1, in <module>
    from .blur.functional import *
  File "ai8x-training\.venv\Lib\site-packages\albumentations\augmentations\blur\__init__.py", line 1, in <module>
    from .functional import *
  File "ai8x-training\.venv\Lib\site-packages\albumentations\augmentations\blur\functional.py", line 9, in <module>
    from albucore.utils import clipped, maybe_process_in_chunks, preserve_channel_dim
ImportError: cannot import name 'preserve_channel_dim' from 'albucore.utils' (ai8x-training\.venv\Lib\site-packages\albucore\utils.py)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "ai8x-training\train.py", line 1523, in <module>
    main()
  File "ai8x-training\train.py", line 173, in main
    ds = locate('datasets.' + name[:-3])
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\kitay\AppData\Local\Programs\Python\Python311\Lib\pydoc.py", line 1802, in locate
    nextmodule = safeimport('.'.join(parts[:n+1]), forceload)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\kitay\AppData\Local\Programs\Python\Python311\Lib\pydoc.py", line 472, in safeimport
    raise ErrorDuringImport(path, sys.exc_info())
pydoc.ErrorDuringImport: problem in datasets.cats_vs_dogs - ImportError: cannot import name 'preserve_channel_dim' from 'albucore.utils' (ai8x-training\.venv\Lib\site-packages\albucore\utils.py)
 ここは、参考サイトを読んで。

python -m pip install albucore==0.0.16
AbemaTV 無料体験
JETBOY