simulink モデルの高速化手法...5 キーメッセージ...

Post on 20-Jan-2020

170 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1 © 2012 The MathWorks, Inc.

Simulink®モデルの高速化手法

MathWorks Japan

アプリケーションエンジニアリング部

チームリーダー / シニアアプリケーションエンジニア

宅島 章夫

2

はじめに、

何を高速化する話なのかを明確にします

Simulinkモデルに対する

ユーザのアクション

• モデルのオープン/クローズ

• モデルの編集

• シミュレーションの実行

• コード生成/ビルドの実行

• レポートの自動生成

• テストベクタの自動生成

• …

シミュレーションフェーズ

1. 初期化処理

2. シミュレーションループ

3. 終了処理

「高速化」にも色々ありますが…

ここではシミュレーションループでの高速化手法を紹介します

(Tips / トラブルシュート法)

3

いきなりですが、クイズです

シミュレーション速度低下の要因を

このモデルからいくつ見つけられますか?

4

いきなりですが、クイズです

シミュレーション速度低下の要因を

このモデルからいくつ見つけられますか?

どんな対処法・改善法が考えられるでしょうか?

5

キーメッセージ

様々な課題に対して、様々な高速化手法があります。

時にはモデルの本質を洞察することも必要でしょう。

本講演では、身近な例を使って、突破口を開くための基本的な指針を与えることを目標にします。

パフォーマンスを引き出すためのコツ・ノウハウを知って、品質改善・コスト低減・生産性向上につなげましょう。

6

アジェンダ

まずはここから – 今すぐ簡単に試せる高速化手法

本質を探ろう! – 3つのケースから得られる教訓

まだある高速化手法 – アドバンストトピックス・関連情報

まとめ

7

アジェンダ

まずはここから – 今すぐ簡単に試せる高速化手法

本質を探ろう! – 3つのケースから得られる教訓

まだある高速化手法 – アドバンストトピックス・関連情報

まとめ

カテゴリ Tips トラブルシュート

想定レベル 初級 中級 上級

対象ソルバー 連続 離散

可変ステップ 固定ステップ

8

ぜひ試してください

ワンクリックでできるシミュレーション高速化

ドロップダウンリストから

選択するだけ

2つの高速化モードを提供

– アクセラレータ

– ラピッドアクセラレータ

モデルの一部/全体をビルドして

バイナリ変換(DLL, 実行ファイル)することで高速化を実現

– シミュレーション開始前にコード生成・コンパイル・リンクを自動実行

9

どのくらい高速化できるのでしょうか?

シミュレーション実行時間:約10倍~50倍

オーバーヘッド時間?

ノーマル アクセラレータ ラピッドアクセラレータ

シミュレーション時間

シミュレーション実行時間オーバーヘッド時間

ブロック総数: 77

連続状態量の数: 10

シミュレーション終了時間: 1000(秒)

約10倍

約50倍

10

考慮すべきトレードオフがあります

オーバーヘッド時間の

大部分は、ビルド/再ビルドに要する時間です

ビルド/再ビルド時間が

支配的なモデルでは

効果が上がりません

– ノーマルモードが

最速ということも…

シミュレーションの

実行時間が支配的な

モデルほど効果が

あります シミュレーション終了時間 or タイムステップ数

実行に要する時間

実線部

モデルのビルド/

再ビルドを要する場合

破線部

モデルのビルド/

再ビルドを要しない場合

11

R2012b Simulinkの最新ツールでは

トレードオフを予測し、指針を与えてくれます

「パフォーマンスアドバイザー」を使ってみましょう

ノーマルモード使用時とアクセラレータモード使用時の

トレードオフ予測値を計算

シミュレーション回数 実行に要する時間

ノーマル

アクセラレータ

12

この方法だけでは

大きな高速化がのぞめないケースもあります

タイムステップの総数が少ないモデル

コンパイル済みS-Functionを多用したモデル

他に高速化の手立てはあるのでしょうか?

13

アジェンダ

まずはここから – 今すぐ簡単に試せる高速化手法

本質を探ろう! – 3つのケースから得られる教訓 (その①)

まだある高速化手法 – アドバンストトピックス・関連情報

まとめ

カテゴリ Tips トラブルシュート

想定レベル 初級 中級 上級

対象ソルバー 連続 離散

可変ステップ 固定ステップ

14

ケース1: 再び、冒頭のモデルに戻ります

なぜこんなに遅いのでしょうか?

>> tic, sim('sample_solver1'), toc

経過時間は 9.604059 秒です。

シミュレーションに要した時間

15

結果もおかしい?

信号 ‘y2’ の結果は妥当といえますか?

16

高速化の話から少しだけ離れて

この「気になる結果」を検証してみましょう

対象が小規模なので、厳密解を考えてみましょう

0 0.2 0.4 0.6 0.8 10

0.5

1

1.5

2

2.5

伝達関数 時間関数

伝達関数を逆ラプラス変換して

y2の時間関数を求めます

本当はこうなるはず!

17

なぜ、そうならないのでしょうか?

シミュレーションの条件を色々と変えてみましょう

ソルバーのステップサイズを強制的に小さくしてみましょう

最大ステップサイズ: 1e-6

最大ステップサイズ: 1e-7

最大ステップサイズ: 1e-5

厳密解に近い応答! 厳密解に近い応答!

最大ステップサイズ設定

18

所望の応答は得られましたが…

当然ですが、余計に計算時間が掛かってしまいます

最大ステップサイズ: 1e-6

最大ステップサイズ: 1e-7

最大ステップサイズ: 1e-5

約10秒 約30秒! 約285秒!!

アクセラレータモード、ラピッドアクセラレータモードを

使って高速化を図りますか???

19

実はこのモデル、ソルバータイプを変更すると

劇的なスピードアップ&精度を両立できます

ソルバータイプを ode15s に変更してみましょう

>> tic, sim('sample_solver1'), toc

経過時間は 0.255232 秒です。

シミュレーションに要した時間

シミュレーション速度が大きく改善!

厳密解に近い応答! 0 0.2 0.4 0.6 0.8 1

0

0.5

1

1.5

2

2.5

厳密解

シミュレーション

ソルバータイプ設定

20

このモデルは「Stiff (スティッフ)」なシステムです

(相対的に)変化の緩やかな系と

速い系が混在したシステムです

Stiff なシステムには

陰解法のソルバーを使いましょう

ソルバー

可変ステップ vs

固定ステップ

陽解法 vs

陰解法

離散 可変ステップ -

ode45 可変ステップ 陽解法

ode23 可変ステップ 陽解法

ode113 可変ステップ 陽解法

ode15s 可変ステップ 陰解法

ode23s 可変ステップ 陰解法

ode23t 可変ステップ 陰解法

ode23tb 可変ステップ 陰解法

離散 固定ステップ -

ode8 固定ステップ 陽解法

ode5 固定ステップ 陽解法

ode4 固定ステップ 陽解法

ode3 固定ステップ 陽解法

ode2 固定ステップ 陽解法

ode1 固定ステップ 陽解法

ode14x 固定ステップ 陰解法

変化の

緩やかな系

変化の

速い系

21

R2012b Simulinkの最新ツールでは

ソルバー選択の指針も与えてくれます

再び「パフォーマンスアドバイザー」が登場です

精度・計算時間の観点から

パフォーマンス改善が見込める

ソルバーを推奨

22

他の速度低下の要因を探してみましょう

Simulinkプロファイラーを

使用してみましょう

– ブロックメソッドやソルバー

メソッドの実行時間を計測

してくれます

ScopeやDisplayなど

表示系ブロックがボトル

ネックになっています

データロギング系の

処理も速度低下の

一因となります

23

必要な箇所だけ可視化しましょう

R2012b Simulinkではブロックを「コメントアウト」できます

ブロック線図を編集することなく、

動作を無効にすることが可能!

簡易操作でボトルネックを最小化!

24

必要な箇所だけ可視化しましょう

本質は同じですが、こんな方法もあります

25

このケースから得られた教訓

時には、モデルの本質を洞察することも必要です。

– ソルバーの設定で計算時間・結果が大きく変わる場合があります。

結果が変わらなくなるまで精度を厳しくしてみましょう。

Stiff なシステムには陰解法のソルバーを使いましょう。

– 最終的には試行錯誤ですが、「パフォーマンスアドバイザー」が

ソルバー選択の大まかな指針を与えてくれます。

データ表示、データロギング系の処理は、必要最小限の使用が望ましいです。

– ただしタイムステップの総数が少なければ影響は少ないでしょう。

– Simulinkプロファイラーを使用するとボトルネックを調査できます。

26

アジェンダ

まずはここから – 今すぐ簡単に試せる高速化手法

本質を探ろう! – 3つのケースから得られる教訓 (その②)

まだある高速化手法 – アドバンストトピックス・関連情報

まとめ

カテゴリ Tips トラブルシュート

想定レベル 初級 中級 上級

対象ソルバー 連続 離散

可変ステップ 固定ステップ

27

ケース2: 次に、このようなモデルを考えてみます

複数の連続システムが

離散的なイベントで切り替わる

「ハイブリッドシステム」

– 1階の連立微分方程式で表さ

れる連続システムが3つ存在

– 3つのシステムを状態変数の

値に応じて切り替え

28

このモデルで何が起こるのでしょうか?

シミュレーションを実行してみましょう

シミュレーションが固まってしまった?!

シミュレーションが先に進まない…

固まってしまった???

29

「ゼロクロッシング」が頻発している可能性があります

なぜ、シミュレーションが進まないのでしょうか?

拡大

状態ゼロ近傍で遷移が

繰り返し発生

30

本来、ゼロクロッシングは

とてもパワフルなメカニズムです

タイムステップ間のゼロ交差点、

不連続点を検出し、計算精度を

向上させるためのメカニズムです

ゼロクロッシングを検出すると

ソルバーが計算時間点を追加します

可変ステップソルバーで使用する

ことができます

ゼロクロッシング

ポイント

問題がないケースでは

とてもパワフルなメカニズム!

31

「ゼロクロッシング」は

こんなシステムで頻発する傾向があります

連続状態、離散状態が混在した

システム

– 特に、離散的なイベントでシステム

の特性が頻繁に切り替わる場合

不連続性を有するシステム

チャタリング挙動を含むシステム

+

+

32

ゼロクロッシングが頻発すると

シミュレーション速度が著しく

低下します

ゼロクロッシングが既定回数

以上「連続して」発生すると、

エラーでシミュレーションが

停止します (デフォルト設定では1000回)

「ゼロクロッシング」が持つ側面

朗報:対処法が2つあります!

33

対処法1: ゼロクロッシング検出を無効にします

モデル全体を一括無効に

する方法と、ブロック単位で

無効にする方法があります

シミュレーションの進行を

妨げる要因を排除できます

正確な不連続点を検出でき

ないため、計算精度が犠牲

になることがあります

モデル全体への一括設定

ブロック単位での設定

34

対処法2(R2008a以降対応): 適応ゼロクロッシングアルゴリズムを使います

シミュレーションが固まらなくなります

ステップサイズが設定値を下回るか、ゼロクロッシングの

連続発生回数が設定値を超えると、検出を「あきらめて」 次のタイムステップに移ります

ステップサイズ、連続発生回数の

設定で計算精度をコントロールできます

この対処法が

おすすめです

35

このケースから得られた教訓

ゼロクロッシングは本来、計算精度向上のメカニズムです。

– シミュレーション速度を低下させることがありますが、問題にならな

い程度なら常に使用するようにしておくことが望ましいでしょう。

– しかし、ゼロクロッシングが「連続で」検出されると、上限回数を超え

たところでエラー停止します。

シミュレーション速度・結果に問題があれば、2つの対処法を試してみましょう。

– ゼロクロッシングの有効/無効設定

– 適応ゼロクロッシング設定

36

アジェンダ

まずはここから – 今すぐ簡単に試せる高速化手法

本質を探ろう! – 3つのケースから得られる教訓 (その③)

まだある高速化手法 – アドバンストトピックス・関連情報

まとめ

カテゴリ Tips トラブルシュート

想定レベル 初級 中級 上級

対象ソルバー 連続 離散

可変ステップ 固定ステップ

37

ケース3: こんな状況に遭遇したことはありませんか?

シミュレーションを実行すると警告メッセージが…

38

代数ループを構成するモデルの典型例です

フィードバックされた出力が

同じタイミングで自身の入力に

戻っています

数学的には、代数ループの

入出力関係は代数方程式で

記述されます

常微分方程式のソルバーとは

別に、代数ループソルバーが

機能します

代数ループ

39

代数ループの困りごとは…

計算コストが増大します

– 代数ループソルバーは数値

探索解法です

– 毎時間ステップで代数解の

探索が実行されます

– 解が得られなければエラーで

停止します

コード生成することができません

– 代数ループを含むモデルからは

コード生成を行うことができません

– (アクセラレータモードの使用は

可能です(R2011b以降))

代数ループのないモデルが理想です

40

一見、分かりにくいですが、

こんな代数ループもあります

問題の無さそうなディジタルローパスフィルタですが…

「直接フィードスルーあり」の

ブロック出力が、同じタイミングで

入力に戻されていないか

チェックしましょう!

積分手法:後退型オイラー

Discrete-Time Integrator

ブロックのヘルプドキュメント

左記と等価なモデル

代数ループ

41

代数ループの発生箇所は

このようにして確認できます

ソルバーの診断設定で、

「代数ループ」の診断レベルを

「エラー」に変更します

シミュレーションを実行すると

エラーとともに代数ループの

発生箇所が赤色でハイライト

表示されます

42

2つの回避方法を紹介します

対処法1:モデリング前に数式を見直す

モデリング前に数式を見直して

代数ループが発生しない表現に

直します

これで回避ができれば、最も

本質的・効果的です

しかし、微分/差分方程式が

多数混在するシステムでは

大変な労力が必要でしょう

43

2つの回避方法を紹介します

対処法2:微小な「遅れ」要素を追加

フィードバックループに微小な

「遅れ」要素を与えて近似します

– Transfer Fcnブロック

微小な時定数をもつ1次遅れの

伝達関数を挿入

– Unit Delayブロック

離散信号に対して1サンプル分の

遅延を挿入

– Memoryブロック

連続信号に対して1積分ステップ分

の遅延を挿入 (可変次数ソルバー(ode15s, ode113)

使用時にはお勧めできません)

44

このケースから得られた教訓

代数ループを構成しないモデルが理想です。

– 代数ループソルバーの計算コストが高く、シミュレーション速度が著

しく低下する場合があります。

– 代数解が探索できない場合、エラーでシミュレーションが停止します。

– 代数ループを含むモデルからは、コード生成ができません。

モデルの本質を押さえ、代数ループの解消を図りましょう。

– モデリング前に代数ループの発生しない数式に直す

– フィードバックループに微小な遅れを与える

45

アジェンダ

まずはここから – 今すぐ簡単に試せる高速化手法

本質を探ろう! – 3つのケースから得られる教訓

まだある高速化手法 – アドバンストトピックス・関連情報

まとめ

カテゴリ Tips トラブルシュート

想定レベル 初級 中級 上級

対象ソルバー 連続 離散

可変ステップ 固定ステップ

46

複数回シミュレーションの

実行効率改善を図りましょう

シミュレーションを複数回

実行する際の高速化手法

を紹介します

どんなユース・ケースが

ありますか?

– モンテ・カルロシミュレーション

– パラメータ・スタディ

– 設計パラメータ最適化

– …

47

並列処理を上手く活用しましょう!

Computer Cluster

Workers

Desktop System

Workers

Simulation 1

Simulation 2

matlabpool open parfor idx = 1:iterations load_system(mdl); set_param([mdl '/Road-Suspension Interaction'],... 'MaskValues',{'Kf',num2str(Cf_sweep(idx)),'Kr','Cr'}); simout(idx) = sim(mdl,'SimulationMode','normal'); end matlabpool close

Parallel

Computing

Toolbox™

MATLAB®

Distributed

Computing Server™

並列計算プロセスの初期化

並列 for-ループ

シミュレーション実行

48

計算プロセス (Worker)の数を増やせば

確実に高速化できます!

Worker の数が多いほど

高速化の効果が高くなります

– Parallel Computing Toolbox

のみでも12 workers まで使用可能

(R2011b以降)

シミュレーション回数が多いほど

オーバーヘッド時間の影響が

少なくなり、高速化の効果が

高くなります

0 5 100

2

4

6

8

10

12

Number of Workers Used

Sp

ee

d u

p (

se

ria

l tim

e/p

ara

llel t

ime

)

100 iterations

500 iterations

5000 iterations

0 5 1010

-1

100

101

102

103

Number of Workers Used

Tim

e (

min

ute

s)

49

並列処理を上手く活用しましょう!(番外編) モデルのビルドプロセスの高速化も実現できます

モデルリファレンス使用時に効果があります(R2009a以降)

ビルドプロセスを高速化

することができます

– アクセラレータ

– ラピッドアクセラレータ

– Stateflowチャート初期化

– MATLAB Functionブロック初期化

– 自動コード生成 etc.

各レベルの参照モデルを

並列処理でビルド

50

関連情報の紹介: カバーしきれなかった内容がたくさんあります

モデルの更なる快適実行にお役立てください

– オンデマンドWebセミナー

「Simulinkモデルの高速化: 複数シミュレーションの並列実行」

「Speeding Up Simulink Applications(英語)」

– 技術資料

「Simulinkシミュレーション精度の改良例」

「Improving Simulation Performance in Simulink(英語)」

– Simulinkヘルプドキュメント

「シミュレーション – シミュレーションの構成」

「シミュレーション – システム動作の検証」

「シミュレーション – テストとデバッグ」

「パフォーマンス – モデルの最適化」

「パフォーマンス – 速度の向上」

51

アジェンダ

まずはここから – 今すぐ簡単に試せる高速化手法

本質を探ろう! – 3つのケースから得られる教訓

まだある高速化手法 – アドバンストトピックス・関連情報

まとめ

52

まとめ

Simulinkにはシミュレーション高速化を図るための様々な手段が用意されています。

– ワンクリックで簡単に高速化できるものから、モデルの本質を捉える

必要があるものまで様々なレベルがあります。

– 新機能や並列計算オプションなどもフル活用し、精度・速度のトレー

ドオフをうまく最適化しましょう。

紹介したコツ・ノウハウが、品質改善・コスト低減・生産性

向上のブレークスルーの一助となれば幸いです。

お悩みの点があれば弊社まで

お気軽にお問い合わせください!

53

ご清聴ありがとうございました MathWorks 宅島 章夫

akio.takushima@mathworks.co.jp

© 2012 The MathWorks, Inc. MATLAB and Simulink are registered

trademarks of The MathWorks, Inc. See www.mathworks.com/trademarks

for a list of additional trademarks. Other product or brand names may be

trademarks or registered trademarks of their respective holders.

top related