MATLABのコードを MATLAB Compiler で実行可能にしてAmazonEC2上で動かす

画像処理は,重い.

しかもメモリを食う.

普段はメモリもCPUも要らんから,必要な時だけスパコン借りて処理したりできないものか.

・・・と,いうわけで,普段使っているMATLABの重い処理をEC2に投げられたら幸せになれる(かもしれない)と思ってやってみました.

コスパはまだよくわからないけど,金とちょっとの手間さえかければ時間単位で大量のメモリ・CPUを借りる選択肢があるってのはいいかもしれませんね.

たとえば論文の提出直前にデータが取れてないときとか.


1.AmazonWebServicesのアカウントを取ってWindowsを立ち上げる

http://www.slideshare.net/kentamagawa/3aws

http://www.slideshare.net/kentamagawa/ec2windows

非常にわかりやすい解説がありました.

2.MATLAB Compiler Runtimeをインストール

EC2のサーバーにはMATLABが入ってない(そりゃそうだ)ので,MATLAB Compilerが必要です.

これを使ってやると,MATLABのコードを実行形式のファイルにできます.

ただ,MATLABそのものはないにしても,MALTAB Compiler Runtime (MCR)ってのをインストールしてあげないとやっぱり動きません.

http://www.mathworks.co.jp/support/solutions/ja/data/1-C233QN/index.html?product=MJ&solution=1-C233QN

ソリューション:

特定のプラットフォームで使用するための MATLAB Compiler Runtime(MCR) を取得するには、その特定のプラットフォーム上にて、MATLAB Compiler をインストールしてください。インストール後、以下の場所より取得可能です。

※$MATLABROOT は、MATLAB インストールディレクトリを示します。

※<Arch> は、OSを示します。(例:Windows 32bit OS の場合-> win32)

  • Windows の場合(MCRInstaller.exe)

$MATLABROOT\toolbox\compiler\deploy\<Arch>

とのことなので,このMCRInstaller.exeをEC2のインスタンスになんかの方法で送り込んでインストールしましょう.

これで,今後同じ環境でMATLAB Compilerでコンパイルした実行ファイルが動かせるようになります.

3.適当なサンプルプログラムを作成して実行してみる

とりあえず,動作検証にこんなのを作りました.

(note120216_magic.m)

magic(5)

pause(3)

コンパイルするには,

mcc -mv note120216_magic.m

これを同様にEC2のインスタンスに送り込んで実行します.

今回は無料枠で使える,メモリもCPUも一番小さいやつで動かしたので動き始めるまで時間がかかりましたが,

しばらく経って5×5の魔方陣が表示されて,数秒後に勝手に終了すると思います.

つまり,これでMATLAB実行ファイルがAmazonEC2上で動かせたわけですね!

======================

ついでなので,ベンチマークをとってみた.

そのうち,ハイメモリインスタンスのクアドラプル エクストララージと,ハイ CPU オンデマンドインスタンスのエクストララージも試してみたいところですな.

  • =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

CrystalMark 2004R3 [0.9.126.451] (C) 2001-2008 hiyohiyo

Crystal Dew World http://crystalmark.info/

  • =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

——————————————————————————

CrystalMark Result

——————————————————————————

Display Mode : 1920 x 1080 16bit (None)

CrystalMark : 23861

[ ALU ] 5661

Fibonacci : 3779

Napierian : 196

Eratosthenes : 95

QuickSort : 1569

[ FPU ] 2965

MikoFPU : 949

RandMeanSS : 391

FFT : 129

Mandelbrot : 1474

[ MEM ] 3000

Read : 314.45 MB/s ( 314)

Write : 321.99 MB/s ( 321)

Read/Write : 206.77 MB/s ( 206)

Cache : 21379.06 MB/s ( 2137)

[ HDD ] 11328

Read : 89.62 MB/s ( 3584)

Write : 14.52 MB/s ( 580)

RandomRead512K : 96.37 MB/s ( 3854)

RandomWrite512K : 9.18 MB/s ( 367)

RandomRead 64K : 58.68 MB/s ( 2347)

RandomWrite 64K : 14.90 MB/s ( 596)

[ GDI ] 725

Text : 22

Square : 119

Circle : 213

BitBlt : 371

[ D2D ] 0

Sprite 10 : 0.00 FPS ( 0)

Sprite 100 : 0.00 FPS ( 0)

Sprite 500 : 0.00 FPS ( 0)

Sprite 1000 : 0.00 FPS ( 0)

Sprite 5000 : 0.00 FPS ( 0)

Sprite 10000 : 0.00 FPS ( 0)

[ OGL ] 182

Scene 1 Score : 181

Lines (x1000) : ( 12018)

Scene 1 CPUs : ( 4)

Scene 2 Score : 1

Polygons(x1000) : ( 15)

Scene 2 CPUs : ( 1)

——————————————————————————

System Information

——————————————————————————

OS : Windows NT6.1 Datacenter Edition (Full installation) Service Pack 1 [6.1 Build 7601]

Display Mode : 1920 x 1080 16bit

Memory : 615 MB

DirectX : 10.0

——————————————————————————

CPU

——————————————————————————

CPU Name : Intel

Vendor String : GenuineIntel

Name String : Intel(R) Xeon(R) CPU E5645 @ 2.40GHz

CPU Type : Original OEM processor

Number(Logical) : 1

Family : 6

Model : C

Stepping : 2

Feature : MMX SSE SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 XD Intel 64

Clock : 2000.09 MHz

Data Rate : QDR

——————————————————————————

Device

——————————————————————————

ChipSet : Intel 440FX (Natoma)

North : Intel 82441FX

South : Intel 82371SB (PIIX3)

Video : Cirrus Logic GD 5446

IDE Controller :

——————————————————————————

HDD

——————————————————————————

Type Size Model ( Buffer Mode )

膨らみすぎて手が付けられないコードの管理方針を考えてみた

皆様,こんにちは.

もう今年の残りが一年の24分の1程度しかないことに先ほど気づいたところであります.

年末と言えば,大掃除.

私は片付けが苦手すぎて服とか本とか捨てられずに困っているのですが,パソコンの中も同じです.

3年近く同じ環境で引き継ぎもなくコードを書き溜めていたので,収拾がつかなくなってきました.

これはまずい.

いろいろ苦労しながら書いたコードも,どこにあるか探せなくなってしまっては宝の持ち腐れです.

というわけでこれからコードをまともに管理できるようにするために,

現状分析と指針を箇条書きでまとめてみました.

「もっといい方法があるのに」とか「こういう管理方法があるよ」とか,

「それはないわーww」でもいいので突っ込みお待ちしております.

======

何の為にコード管理をするのか?

  • 効率の良い開発のため
    • 新規の処理の追加
    • バグ取り
  • 効率の良い引き継ぎのため
    • 機能単位の把握
    • 必要なファイルだけ着目できる(不要な/非本質的なコードの除外/不可視化)
  • 効率の良いバックアップのため
    • 変更履歴の追跡
    • 漏れのないバックアップ

現状はどうしているのか?

  • スクリプトはnote(yymmdd)_(script_name).m
  • 関数はfnote(yymmdd)_(function_name).m
  • matlab/code ディレクトリにまとめて配置
  • 最近Gitを導入した

どのような問題があるのか?

  • 古いコードが多すぎて,どれが使えるのかよくわからない
  • Gitの管理単位が大きすぎて(Codeディレクトリすべて)変更を追いにくい
  • ファイル名は確実にユニークだが機能ベースでの検索に向いていない

解決方策

  1. プロジェクト単位でディレクトリを分ける
    • プロジェクトの中だけパスを通せばいいようにする
      • 逆に他のプロジェクトと相互依存しないようにする
      • 関係のないプロジェクトはパスから外す
      • 違うプロジェクトと同じ名前の関数があってもぶつからなくなる
      • 同じ機能の改良版なども比較的容易に作れるし扱える
    • 何をしているのかわかりやすい
      • ドキュメントもプロジェクト単位で作成すればよい
  2. Gitをもっと使いこなす
    • 卒論サーバーにでもリポジトリを作る
      • 本体が壊れても大丈夫
    • プロジェクト単位でGitのリポジトリを作成
      • 同名ファイルの重複が避けられる
  3. ファイル名のルールを変更する
    • 機能だけちゃんとあらわしている名前を付ける
      • ファイル名の一意性が必要ない
    • プリフィクスなどもつけない(関数に”f”など)
      • 基本的に関数ベースにする
  4. 開発方針の変更
    • 機能単位の分割(カプセル化)
      • 本文の長いコードは読みにくい
      • できるだけこまめに分割し,コメントだけでなく名前で機能を語らせる
      • 基本的に関数ベースにする,テスト以外はスクリプトを使わない