Posts Issued in June, 2024

Pongと強化学習 (30)

posted by sakurai on June 14, 2024 #817

CNNのバックプロパゲーションについて聞いてみます。


CNN(Convolutional Neural Network)における重みの更新は、一般的に「バックプロパゲーション」というプロセスを通じて行われます。これは、ネットワークの出力層(下流)から入力層(上流)に向かって逆方向に誤差を伝播させながら、各層の重みを更新する方法です。バックプロパゲーションは、以下のステップで構成されます。

1. フォワードパス

  • ネットワークの入力から出力へとデータを順方向に伝播させます。
  • 各層での活性化関数を通じて、次の層への入力を計算します。
  • 最終的に、ネットワークの出力層で予測結果を得ます。

2. 損失関数の計算

  • 出力層での予測結果と、実際のラベル(正解データ)との間の誤差を計算します。
  • この誤差は損失関数(例えば、クロスエントロピー損失)を用いて表され、ネットワークの性能の良し悪しを評価する指標となります。

3. バックプロパゲーション

  • 損失関数から得られた誤差を、出力層から入力層に向かって逆方向に伝播させます。
  • 各層における重みの勾配(損失関数の重みに対する偏微分)を計算します。これは、重みをどの方向にどれだけ調整すれば損失を減少させることができるかを示します。

4. 重みの更新

  • 計算された勾配を用いて、各層の重みを更新します。この際、学習率というパラメータが重みの更新量を決定します。
  • 通常、勾配降下法(またはその変種、例えば、モーメンタムやAdam)が重みの更新に使用されます。

5. 反復学習

  • これらのステップをデータセット上で複数回繰り返し実行し(エポック)、ネットワークの性能を徐々に改善していきます。

バックプロパゲーションによる重みの更新は、CNNを含む多くのディープラーニングモデルで採用されている基本的な学習アルゴリズムです。このプロセスにより、ネットワークは与えられたタスク(例えば、画像分類)に対して最適な予測を行うための重みを学習します。


左矢前のブログ 次のブログ右矢

Pongと強化学習 (29)

posted by sakurai on June 13, 2024 #816

(前記事の続き)

ハードウェア最適化のためのアプローチ

リソース共有

  • 複数の畳み込み層や活性化関数が同様の計算を行う場合、これらの計算資源を共有することで、全体のリソース消費を削減できます。例えば、複数の畳み込み層が同時に動作しない場合、一つのハードウェア畳み込みエンジンをタイムシェアリングすることが可能です。

精度とリソースのトレードオフ

  • データの精度(ビット幅)を調整することで、計算リソースの使用量とパワー消費を削減できます。例えば、32ビット浮動小数点数から16ビット固定小数点数への変換は、精度のわずかな低下と引き換えに、計算速度とエネルギー効率の向上をもたらすことがあります。

動的なリコンフィギュレーション

  • FPGAのようなプログラマブルなハードウェアを使用する場合、動的にハードウェアの構成を変更することで、異なるタスクに最適な計算資源を割り当てることができます。これにより、一つの物理デバイス上で複数のモデルやアルゴリズムを効率的に実行することが可能になります。

カスタムデータパス

  • タスクの特定の要件に合わせて、カスタムのデータパスや計算ユニットを設計することで、標準的なCPUやGPUよりもはるかに高速な処理が可能になります。このアプローチは、特にデータフローが予測可能で、特定の計算パターンが頻繁に発生するタスクに適しています。

デバッグと検証

  • ハードウェア実装では、シミュレーションを通じて設計を検証することが重要です。特に、BSVのような高レベル合成言語を使用する場合、論理的なエラーや性能のボトルネックを初期段階で特定し、修正することができます。
  • 実際のハードウェア上でのプロトタイピングとテストを行うことで、シミュレーションでは捉えられない問題(例えば、タイミングの問題やハードウェアの不具合)を発見し、解決することができます。

ハードウェアでのCNN実装は、ソフトウェアベースの実装と比較して複雑な作業ですが、リアルタイム性やエネルギー効率の面で顕著な利点を提供します。設計の各段階での慎重な検討と最適化を行うことで、高性能なハードウェアアクセラレータを実現することが可能です。


左矢前のブログ 次のブログ右矢

bsvのMakefile作成 (2)

posted by sakurai on June 12, 2024 #815

トラブルシュート

当初、以下のbsvからverilogをコンパイルするというふつうの依存関係が動作せずに苦労しました。

# Verilogファイルの生成
mk%.v: %.bsv
        time bsc -verilog -u -steps-warn-interval 1000000 -steps 8000000 -suppress-warnings T0054 $<

そこで以下のコマンドによりデバッグ情報を出力したところ、原因がわかりました。

$ make -rd

原因は、makeがtop-original.vという原始ファイルの元となるtop-original.bsvを探しに行ったためでした。探しに行って無ければ無視すれば問題ないのですが、動作としてはこのルール全体を却下する動作をするため、このルールが無効になっていたものです。ChatGPTと相談して.SECONDARYキーワードでなんとか無視させることができました。

パターンマッチ

さらにC/C++等だと拡張子のみが変化するのですが、bsvではUart.bsvをコンパイルするとmkUart.vとなるなど変則的な変化をするため、それがなかなか表現できませんでしたが、

mk%.v: %.bsv

このように変化しないところを%で記述することで対処できました。

原始ファイルからのファイル名生成法

汎用的に使用できるように、原始ファイル名から中間ファイル名を生成するようにしました。例えば、

$(addprefix mk, $(addsuffix .v, $(basename $(wildcard *.bsv))))

これにより原始ファイルのbsvファイル名からverilogファイル名を自動生成します。このようにすればMakefileに具体的なファイル名を書く必要がありません。誤ってwildcard *.v等としてしまうと、make cleanを行った後には何もないためmake処理が正しく行えないので、全部を集めるリンクのような場合は必ず存在するファイルに基づき必要なファイル名を生成します。一方、一対一の場合は%.v: %.bsvのような記法で十分です。

top.vの役割

忘れがちですが、top.vは直下の端子とemacsのマクロにより自動結線するため、テストベンチのverilogであるmkTb.vが必要です。そのため、Makefileにはその依存関係も加えました。

そもそもtop.vはverilog.vcdを出力するためのものです。

$ bsc -verilog -e mkTb -o mkTb.exv

一方、このようにbsimシミュレーションと同様、フラグを-verilogに変えるだけでiverilogを使わずとも*.vファイルをリンクし、実行ファイルまで生成されます。ではなぜtop.vを使ったかというと、verilog.vcdをダンプするためで、mkTb.exvを実行するだけではvcdが出力されなかったからです。

ところが、

$ ./mkTb.exv +bscvcd=verilog.vcd

このフラグ設定によりvcdが出力できることがわかりました。これによってtop.v等は不要となります。従ってemacsで結線する手段やiverilogが不要となるため、Makefileもだいぶ簡潔になります。


左矢前のブログ 次のブログ右矢

bsvのMakefile作成

posted by sakurai on June 11, 2024 #814

Makefile

ChatGPTの助けを借りながらbsvのMakefileを作成しました。bsvソースはBSVの問題点?を作成したときのファイルです。完成したMakefileを示します。

# ファイル名の生成
BSRCS = $(wildcard *.bsv) # BSVソースファイル
BASRCS = $(addprefix mk, $(addsuffix .ba, $(basename $(BSRCS)))) # BA中間ファイル
VSRCS = $(addprefix mk, $(addsuffix .v, $(basename $(BSRCS)))) # Verilogファイル

# .PHONY ターゲットの定義
.PHONY: all bsv_view verilog_view clean

# 全体のターゲット定義
all: bsv_view verilog_view

# BSV波形ビューアの起動
bsv_view: bsim.vcd
    gtkwave -A bsim.vcd

# BSV波形ファイルの生成
bsim.vcd: mkTb.exe
    ./mkTb.exe -V bsim.vcd

# BSV実行ファイルの生成
mkTb.exe: $(BASRCS)
    bsc -sim -e mkTb -parallel-sim-link 4 -o mkTb.exe

# BSVファイルのコンパイル
mk%.ba: %.bsv
    time bsc -sim -u -steps-warn-interval 1000000 -steps 8000000 -suppress-warnings T0054 $<

# Verilog波形ビューアの起動
verilog_view: verilog.vcd
    gtkwave -A verilog.vcd

# Verilog波形ファイルの生成
verilog.vcd: mkTb.exv
    ./mkTb.exv -V verilog.vcd

# Verilog実行ファイルの生成
mkTb.exv: top.v $(VSRCS)
    iverilog -y /usr/local/lib/Verilog/ top.v $(VSRCS) -o mkTb.exv

# top.vの生成と更新
top.v: top-original.v mkTb.v
    cp top-original.v top.v
    chmod 644 top.v
    emacs --batch top.v -f verilog-batch-auto

# BSVファイルからVerilogファイルを生成
mk%.v: %.bsv
    time bsc -verilog -u -steps-warn-interval 1000000 -steps 8000000 -suppress-warnings T0054 $<

# クリーンアップ
clean:
    @rm -f mk*.v top.v
    @rm -f *.bi *.bo *.ba a.out \#*
    @rm -f *.cxx *.h *.o *.so *.bexe
    @rm -f *.exe *.exv
    @rm -f *.vcd *~ *.fsdb *.log

# 中間ファイルを保持するための設定
.SECONDARY: top-original.v

依存関係グラフ

ここで、’Makefile'の依存関係の可視化の記事のプログラムをそのまま用いて、

$ LANG=C make -np | python3 make_p_to_json.py > graph.json; python json_to_dot.py workflow.png; xv workflow.png

このコマンドにより作成した依存関係図を図814.1に示します。

図%%.1
図814.1 依存関係図

左矢前のブログ 次のブログ右矢

bscのコンパイルとインストール

posted by sakurai on June 10, 2024 #813

bscのコンパイルとインストールをChatGPTの助けを借りながら実行しました。OSはFedora 40の場合です。

$ sudo dnf -y install ghc stack libX11-devel libXft-devel gperf bison flex itk-devel tk-devel itcl-devel tcl-devel g++ iverilog autoconf
$ git clone --recursive https://github.com/B-Lang-org/bsc.git bsc
$ cd bsc

bsc.cabalとstack.yamlを作成します。

$ echo "name:                bsc
version:             0.1.0.0
synopsis:            Brief description
description:         Longer description
license:             BSD3
author:              Author name
maintainer:          example@example.com
category:            Category
build-type:          Simple
cabal-version:       >=1.10
executable bsc
 main-is:             Main.hs
 build-depends:       base >=4.7 && <5
 hs-source-dirs:      src
 default-language:    Haskell2010" > bsc.cabal
$ echo "resolver: lts-18.0
    packages:
    - .
    extra-deps:
    - regex-compat-0.95.2.1
    - syb-0.7.2.4
    - old-time-1.1.0.4
    - split-0.2.5" > stack.yaml

Haskellのパッケージのバージョンを調べるためには、StackageHackageを利用します。ChatGPTに依頼しても調べて貰えます。

次にsrc/Main.hsが無いため作成します。

$ echo 'module Main where
    main :: IO ()
    main = putStrLn "Hello, BSC!"' > src/Main.hs

stackを用いて必要なライブラリをインストールします。

$ stack install regex-compat syb old-time split; stack update; stack build --only-dependencies; stack build
$ stack exec -- make install-src

これでコンパイルが始まるので、しばらく待ちます。終わったら以下のコマンドでインストールします。

$ sudo cp -r ./inst/bin/* /usr/local/bin/; sudo cp -r ./inst/lib/* /usr/local/lib/

何か不明な点があったらリファレンスマニュアルbsv例を調べてからフォーラムで質問します。


左矢前のブログ 次のブログ右矢

5月の検索結果

posted by sakurai on June 7, 2024 #812

弊社コンテンツの5月の検索結果です。

表812.1 上昇率上位のページ(前月との比較)
タイトル クリック数
PMHFの意味 +22
SPFM, LFM, PMHFの計算法の例 +21
確率論 (8) +16

表812.2 パフォーマンス上位のページ
タイトル クリック数
機能安全用語集 133
1st Editionと2nd Editionとの相違点 (Part 10) 132
ASILデコンポジション 112

表812.3 上昇率上位のクエリ
クエリ クリック数
SPFM +10
FHTI 機能安全 +8
FTTI 機能安全 +7

表812.4 パフォーマンス上位のクエリ
クエリ クリック数
FTTI 69
SPFM 28
PMHF 27


左矢前のブログ 次のブログ右矢

posted by sakurai on June 6, 2024 #811

昨日RAMS委員会からアブストラクトの採択の連絡がありました。ほぼ論文は完成してはいるものの、これから論文のブラッシュアップ及びプレゼンテーション原稿の作成を開始します。

表811.1 RAMS 2025へのマイルストーン
期限 マイルストーン 状態
2024/5/3 アブストラクト投稿締め切り(システム入力) 投稿済
2024/6/10 アブストラクト採択結果 採択済
2024/8/1 論文、プレゼン投稿締め切り(名前、所属無し版)
2024/9/1 第1回論文、プレゼン資料査読コメント受領
2024/10/9 改訂版論文、プレゼン投稿締め切り(名前、所属無し版)
2024/10/22 最終査読コメント受領
2024/10/10 学会出席登録締め切り
2024/10/10 最終論文、プレゼン投稿締め切り(名前、所属有り版)


左矢前のブログ 次のブログ右矢

Pongと強化学習 (28)

posted by sakurai on June 4, 2024 #810

(続き)以下に、ハードウェアでCNNを実装する際の追加的な考慮点を示します。

パラメータとウェイトの管理

  • ウェイトの格納: CNNの性能は、学習されたウェイトに大きく依存します。これらのウェイトは、ハードウェア内のメモリに効率的に格納され、アクセスされる必要があります。FPGAの場合、オンチップのブロックRAM(BRAM)や、より大きなデータセットの場合は外部メモリとのインターフェースが必要になる場合があります。
  • ウェイトの更新: 学習プロセス中にウェイトを更新する場合、これを効率的に行うメカニズムを設計する必要があります。多くの実装では、ウェイトは事前に学習され、ハードウェアに固定されるため、更新は行われません。しかし、オンライン学習やアダプティブなシステムを設計する場合は、この点を考慮する必要があります。

データフローの最適化

  • パイプライン処理: データを連続的に処理する畳み込み層やプーリング層では、パイプライン処理を用いることで、各ステージの遅延を重ね合わせ、全体のスループットを向上させることができます。
  • 並列処理: CNNの各層で複数の演算を同時に行うことができるため、並列処理を活用して計算の高速化を図ります。特に、Depthwise Separable Convolutionでは、Depthwise畳み込みとPointwise畳み込みの両方で並列化の機会があります。

リソースの制約と最適化

  • リソースの利用: FPGAのリソースは有限です。使用するロジックブロックの数、メモリの使用量、I/Oの利用などを最適化することが必要です。
  • 性能と精度のトレードオフ: ハードウェアの制約の下で、性能(例えば、推論の速度)と精度(例えば、分類性能)のバランスを取る設計決定を行う必要があります。例えば、ウェイトの量子化を行うことでメモリ使用量を減らすことができますが、これが精度に影響を与える可能性があります。

ハードウェア実装におけるデバッグと検証

  • シミュレーションとテスト: 設計したモジュールの正確性を検証するために、BSVのシミュレーション環境を利用して広範なテストを行います。これには、単体テストから統合テストまで、さまざまなレベルのテストが含まれます。

ハードウェアでのCNN実装は、特にリアルタイム処理やパワー効率が重要なアプリケーションにおいて、大きな利点をもたらすことができます。しかし、その設計と実装は複雑であり、ハードウェアの特性や制約を十分に理解する必要があります。上記の考慮点を踏まえて設計を進めることで、効率的かつ効果的なハードウェアベースのCNNを実現することが可能になります。


左矢前のブログ 次のブログ右矢


ページ: