自分のための備忘録的なブログです。

Ubuntu14.04LTS を使って、ディープラーニングの勉強をしています。
記載されているコードは、他の OS には互換性がない可能性があります。


DNN:
マシン性能別 学習速度の比較, TFチュートリアルをmodifyする

python3:
オブジェクト指向プログラミングとは, モジュールとインポート、パスを通す, システムコマンド(os), ファイル・フォルダ名取得, 画像の前処理,

Ubuntu14 の初期設定:
Ubuntu14初期設定, 初期設定-2, cudaなども, 初期設定-3

拡張性を考えてディープラーニング用パソコンを組むときに重視したいポイント(ネットや本で見なかった意見)

ディープラーニングの勉強を初めて1年程度たち、ディープラーニング用パソコンを組んでから半年程度立ちました。二台のパソコンを組みましたが、パーツ交換・買い替えや、二台の間でのパーツ交換、OS 再インストールなど何度も行いました。

 

最近、自分の使っているニューラルネットワークが肥大化してきたため、速度低下を痛切に感じるようになりました。アップグレードを検討しているのですが、選択肢が多いため混乱しています。そのため、検討した事項などを頭の整理のためにまとめまています。

CPU, GPU などのスペックについてはネット上や書籍に色んな意見が既にあります。

ですので、そういった記事で見なかった意見を中心に記載します。

 

ちなみに英語ですが、

http://timdettmers.com/2015/03/09/deep-learning-hardware-guide/

このサイトはやや古いですが、私には理解できない深いことが色々書いており良さそうです。

 コメント欄に 2018 年 初頭に PCIE 4.0 と Vota GPU (テスラは既に出てますね、コンシューマー向けの Volta でしょうか)がアナウンスされると書いてありました。買い時が悩ましいですが、しかし PCIE 3.0 x 8 でも 8Gbps という割と十分な速度をサポートしており、大幅な性能向上にはつながらない気はしますが、果たして。

 

  

 

必要なパーツ 

ケース

E-ATXマザーボード対応

 パソコンパーツを設置する板、すなわちマザーボードの規格には様々なものがあり、小さな mini-ITXから、続いて micro-ATX, ATX, Extended-ATX (E-ATX)と大きくなる。大きなボードほど、たくさんのパーツを設置でき、拡張性も高い傾向に。

 

 一般に拡張性について、mini-ITXmicro-ATX, さらに ATX との間には超えられない壁がある。したがって、本格的にディープラーニングを行う場合、mini-ITXmicro-ATX よりも、ATX や EATX を選びたい。

 

 ATX ボードには、EATX と同程度の拡張性のものも。しかしそういった ATX ボードは限られ、値段も高い傾向。個人的には EATX 対応が無難と。なお、mini-ITXmicro-ATX, ATX の間ではケースサイズの違いが大きいですが、ATX 対応と EATX 対応の間ではわずかなので、なるべく EATX 対応を選びたい。

静音・ファンコントローラー付き

 ディープラーニングではパソコンを長時間動かすため、平安のために「静音」ケースがベター。

 

 パソコンの騒音は、主に冷却のための「ファン」に由来。ファンの速度が速いほど騒音が大きくなり、ファンの速度は CPU の温度に同期。

 

 CPU の温度変化に由来する、突然の高速回転も不快な騒音の一因。静音ケースは、CPU 温度に依存せずファンの速度をコントロールできる「ファンコントローラー」が付いていることが一般的で、これも「静音ケース」を重視する一因(BIOS で CPU fan のなんちゃらを off にする)。

長尺電源対応(できれば >= 22cm)

 電源は一般に、「ATX規格」。電源容量が大きい物ほど、たくさんのパーツを動かせる。容量が大きい電源は、より長い(長尺)傾向。将来の拡張性を考え、長尺電源対応を買うべきでした(後悔)。

 

 まず、コンセント一本あたりの電流は 15A までになり、電圧 100V と合わせると、電源の最大サイズは 1500W 。 1500W クラスで各社の電源を見てみると、

 

 EVGA SuperNOVA 1600W G2: 22cm (Amazon star x 4.6)

 EVGA SuperNOVA 1600W Platinum: 22.5 cm

 Corsair AX1500i: 22.5 cm (x 4.0)

 Rosewill Tokamak: 18 cm (x3.5)

 SilverStone: SST-ST1500-GS/TI 18cm  (star x4)

 Enermax EMR1500EWT 18cm (star x3)

(アメリカアマゾンはレビューが多いので)

 

 概ね 18cm あれば 1500W まで使える様子。しかし 18cm のものは、Amazon レビューが悪い傾向。実際、STAR x3 台では star x1 レビュー(数週間〜数カ月で壊れたとか、相当ひどいレビュー)があることが多く、 star x4 台を選びたいところ。 

 高機能なものをコンパクトにつくろうとすると各所に無理が出て値段が高くなるのは容易に想像できる。パソコンの安定動作に重要な電源に高機能なものを選ぶには、長尺電源対応のケースを選びたいところ。

水冷対応・五インチスロットなし。

 ディープラーニングでパソコンのパーツは激しく発熱するが、高温になると動作が制限される(遅くなる:サーマルリミット)。CPU や GPU は電力消費も大きく、発熱も大きく、これらを効率的に冷却するための「水冷」「簡易水冷」を選べるケースがベター。

 

 水冷対応のパソコンケースは、水冷・簡易水冷のパーツを取り付けられる場所を多めにとっている。

 

 五インチスロットは、かつては CD-ROM や DVD-ROM を読み込むために必須だったが、これらは近年 USB で外付けでき、現状では不要。一方でフロントの(簡易)水冷取り付けが制限されてしまう。

 

 (簡易)水冷を取り付けるポイントは「フロント」「トップ」「リア」の3箇所。「リア」はミドルタワーでは 12cm の冷却力が低いものしか付けられないケースが多い。14cm 取り付けられる製品もあるが、14cm の感椅子入れはメジャーではない様子:14cm の簡易水冷パーツ自体が少なく、12cm などと比べて最新ではない製品が多い印象。

 

 トップは 24cm 以上の、冷却力高いのを取り付けられるものの、PC 起動時にホコリカバーを外すのが面倒。また、パソコンの取り回しが面倒になる(排気マネジメントから、机の下に設置は事実上無理。トップなら必然的に排気になり、ケース換気がアウトフロー傾向に。ホコリが入りやすく、長期的にケア面倒そう)。やはり基本はフロント吸気・リア排気のインフロー傾向に仕上げたいところ。5インチスロットがあると、フロントの簡易水冷が制限されてしまう。

拡張スロット八本(以上)

 ディープラーニングでは GPU を使って計算を高速化しますが、GPU の設置に拡張スロットを使用。一般に、一台の GPU につき二本のスロット。そして一台のマザーボードに、一般的には四台までの GPU を設置できる(のが一般的)。

 

 一般的な ATX/EATX パソコンケースでは拡張スロットは七本のみ。基本的にはコレで困ることはないが、こういったケースでは、GPU の設置数は最大三台(実際にはマザーボードとの兼ね合いで、最大二本となる場合が多い)。拡張性を重視するなら、スロット八本ほしいところ。

 

 が、実際に GPU 4本刺しにすると電源が厳しくなり、2-3 本が現実的でしょう。しかし3本刺しするにも、マザーとの兼ね合いで 拡張スロット 8本が必要な場合が多い。

(ただし3本挿すと RAM が嚴しくなって Swap 使って結局遅くなるとかごにょごにょ。やっぱり 2本で十分かもですが、メモリ消費が少ないタスクなら、GPU 追加で単純に高速化可能)

 

結局どれを買うのか

 上記すべてを満たす製品は見つからなかった。

 

Corsair 600q (長尺電源が 20 cm まで。倒立ケースが好きかどうか)

Corsair 400q (電源 18cm, 拡張スロット 7本)

Fractal Design Define R5 (EATX対応なし、拡張スロット7本、5インチスロットあるが取り外し可能)

Fractal Design Define S(EATX対応なし、拡張スロット7本)

 

 あたりが大体満たしている。

 

 ただし条件を満たすケースは当然「でかい」ので、コンパクトさと値段と重さといろいろなトレードオフで。

 

電源

1000 ~ 1500W対応

 ディープラーニングでは大量の電力を消費するため、家庭用コンセントの上限(15A x 100v = 1500W)である 1500W の電源を選択したいところ(すべきだった、初期投資が高くても)。

 

 ロスもあるので、このワット数でも、使えるのはせいぜい 1200 ~ 1350 W (1500 * 0.8 ~ 0.9) 程度。

 

 個人で最高性能のパソコンを求めるなら、

 

 Threadripper 1950X (TDP 180W) + GeForce 1080ti x 2 (TDP 250 x 2)

 くらいになると思いますが(これだけで30万円になりますが)、これに必要な電源は

 (180 * 2 + 250 * 2) / 0.8 = 860 W / 0.8 (80 Plus電源) = 1075 W

 

(計算は、

  電力消費は CPU の TDP x2, GPUTDP

  電源のロスを考慮して 0.8 で割る。

最近の電源は Gold 認証 の 87% 以上保証するものが多いので、0.85 くらいで割るので十分かも。ただし結果はほとんど変わらない。

 

 となります。ここに GeForce 1070 を 2枚追加すると

 + 300w / 0.8 = + 375W

 にて、合計 1450W で、1500W の限界に達する。

 

 もう少し安価・節電で行くなら

core i7- 6800 (TDP 140W) + GeForce 1070 x 2 (TDP 150W x2)

 必要な電源は

(140 * 2) + (150 * 2)) / 0.8 = 725 W

 

 というところ。

 やはり 1000 W の電源がほしいところ。 

 

 今のところ考えているのは

core i7-8720X (140w) + GeForce 1080ti x2 (250W x 2)

 で、975W

  

 

 

 また、静音との兼ね合いも。一般に、電源の最大電流を供給しようとすると発熱も大きくなり、ファンの回転数が上昇する傾向あり。大容量ですと、各種製品の電力・ファン回転数のグラフを見る限り、ファンノイズが小さくなる傾向。

 また、大容量電源のほうが大きなファンを持ち、ファンノイズが小さいはず。多分。

 モジュラー、またはセミモジュラー

 私が初めて組んだ PC では、値段を重視して電源を選んだ結果、モジュラーではない電源。モジュラー電源とは、パソコンパーツに電源を供給するケーブルを付け外しできる電源。

 

 拡張性を考えてディープラーニング用パソコンを組む場合、ケース内にパーツが多くなりがち。不要なケーブルを取り外すことのできる「モジュラー」電源を選びたいところだった(けど知らなかったので、安易に安いのを選んだ)。

 

 「セミモジュラー」とは、PCIE や peripheral ケーブルは外せるものの、マザーボード電源ケーブルや、CPU用電源が取り外しできない(PCIE や Peripheral ケーブルが取り外しできる)タイプ。「セミモジュラー」でも良いのが、1000W を超える電源になると、CPU 甩電源が 2本ある場合があり、x99, x299 や x399 のようなハイエンド構成なら 2本必要なので OK。z270 や z370, x370などを使う場合は 1本しか使わない。

 「セミモジュラー電源」の購入を考える場合、マザーボードの CPU 電源も確認したほうが無難ではある。

マザーボードとの兼ね合いも

 後述の x99, x299, x399 などのチップセットを採用したマザーボードの場合、CPU 電源ケーブルが 2本必要に。

 

 安いタイプですと、この CPU 電源ケーブルが 1本しかないことがあり(というか、私の購入した初めての電源は、1000W 大容量にも関わらずノンモジュラー、CPU が 1本なので、将来ハイエンド構成に変更したければ、電源買い替え必須)

 

 電源が足りなくなったら、足りない容量の電源を追加購入・ケース外から引き入れる手もありますが。ただし電源の給排気の管理や設置場所が面倒。

 

マザーボード

 4-way SLI 対応

  ディープラーニングGPU を使うことで高速化できる。GPU をたくさん使うことで、タスクを並列で動かしたり、複数の GPU を同期させてさらに高速処理も可能(SLI)。

 GPU を挿せる数はマザーボードにより様々で、一般に 1 から 4 本。 ただしマザーボードに「3本挿せる」と書いてあっても、ケースとの兼ね合いで 2ほんまでしか刺せなかったりする。4-way SLI 対応であれば(かつ、ケースに拡張スロットが 8本あれば)確実に 4 本挿すことができる。

 ただし、GPU を増やしていくと、その他のパーツも高性能なものにアップグレードしていく必要が出てくるため、GPU は 2本で十分な気もする。

wifi, bluetooth 付き

 ディープラーニングでは拡張スロットは GPU に専有されることになる可能性が高い。wifibluetooth は必須の機能ではないが、あると大変便利。

 

 ディープラーニング甩では(GPU と競合して)拡張スロットを使えず、これらの機能を後から追加できない可能性があるため、これらが組み込まれているマザーボードが良いです。ただし高スペックとなり、値段が高い傾向に。悩ましい・・・

 

 しっかしマザーボード見てると、こういう余計な(失礼)機能が付いている方が多くの電源ケーブルを要求するようで、CPU ケーブルが多くなってますね。Wifi と BT を諦めれば、X299 ボードで今の電源 (1000W)で行けますが、これらを欲しがると電源も買い替え必須。悩むところ。

x99, x299, x399など、RAM 128 GB 対応

 GPU を使ってディープラーニングを行う場合、データは一旦、GPU のメモリー(Video RAM, VRAM) に格納される。データが膨大だと VRAM に収まらず、パソコン本体の RAM を使うことに。このため、パソコン本体の RAM は多いほうがよく、RAM を 128 GB まで増やせるタイプにすべきでした(後悔)。

 

 128 GB 以上に増やせるマザーボードもあるが(Xeon 対応のなど)、種類が少なく高価。また、RAM 自体も大変高価。実際、128 GB 揃えるのに 10万円以上かかり、本当に 128 GB 買うかどうかわからないけれど。将来的な拡張性ということなら 128 GB まで積めるようにしたい。

 

 ただし、高解像度の画像を使ったディープラーニングでマルチプロセスを動かしたりすると、データ量が膨大となるためにデータが RAM に載り切らず Swap を使うことになる。結局 Swap を使うならば、データを RAM に載せることを諦めて、コスト重視で RAM 少なめでも良いかもしれない。その場合、速度低下(と SSD の消耗)に悩むことにはなるけれど。

80mm m.2 NVMe スロットが 2本以上 

 ディープラーニングでは大量のデータ読み込み・書き込みが発生し、大量のストレージが必要。現在一般的なストレージには、 2.5 inch HDD, 3.5 inch HDD, 2.5inch SSD, m.2 NVMe SSD があり、前者ほど遅く、後者ほど速い。

 

 当代最高スピードを誇る、m2 NVMe を複数接続できるようにしたいところ。接続数は一本でも良いが、将来の拡張性を考えると、1本だけだと足りなくなった時「買い替え」に対し、複数本あれば「追加」可能。

 

 (Swap についても、 m.2 NVMe 2本に分散したほうが、アクセスが速くなりそうな気はします。適当ですけど)

 

 ちなみに現状、上述のチップセットとの絡みでは、

x99: 1本

x299: 2本

x399: 3本

 の製品が多いみたい。

 

 ただし x399 は CPU が Ryzen ThreadRipper 限定となり、これは TDP180W と消費電力が高く(ただしベンチマークを見ると、実際の電力消費は Skylake-X と同程度の模様)、電源容量の戸の兼ね合いもあり、悩ましいことに。

Ryzen Threadripper 1950X/1920Xファーストインプレッション - 期待の16コア/12コアCPUのパフォーマンスを検証 (17) ベンチマークテスト「消費電力測定」 | マイナビニュース

Thunderbolt 3 ポート

 近年では外付け GPU (eGPU)が色々と販売されておりますが、それらは Thunderbolt 3 ポートを介して接続します。 eGPU はノートパソコンでも使用可能であるし、PCIE レーンが埋まっていても追加可能というメリットがあります。

 拡張を考えるなら、なるべく多くの Thunderbolt 3 ポートを持つモデルが良いです。

 

ストレージ

500GB 以上の m.2 NVMe SSD

 ディープラーニングでは「Swap」を用いる場合があり、Swap 用にストレージを(概ね 100GB 以上)確保したい。500GB 以上の m.2 NVMe SSD がほしいところ。

れ以外は割とどうでもいい

 ストレージは m.2 NVMe SSD があれば問題ないし、そもそもどんな PC ケースでも、 2-3 台程度の 3.5 inch HDD が置けるようになっていて、容量も確保できる印象。ストレージは外付けもできるし、m.2 NVMe SSD 以外は、後からどうにでもなる。

 

GPU

メモリ量と価格のバランス

 GPU で重視すべきはメモリ(Video RAM, VRAM)量。一般に GPU は価格が高いほど速いが、価格が 2倍になっても、速さは 2倍にはならない。安い GPU 複数本を並列に使えば速度を数倍にできる。高いものより、安い GPU を複数の方がコスパが高い。

 しかし、高い GPU 「メモリ量が多い」という点も重要。

 

 

 GPU で計算を行う前に、はじめにデータを VRAM に載せる。データが VRAM に載りきらなかった場合、

  1.計算ができなくなる

  2.パソコンのメモリ (RAM) を使って計算する

 のどちらかに。

 

 2. の場合、’RAM は VRAM と比べて圧倒的に低速のため、学習速度も遅くなる。

メモリの種類と速度について表にしてみた【2016秋】 - Qiita

 VRAM と RAM のアクセス速度は、こちらの記事で約 10 倍。ただし VRAM をキャッシュ的に使ってくれるようで、10倍は遅くならないけれど。なるべくたくさんのデータを VRAM に載せる用、VRAM 多いモデルを選びたい。

 

 RAM にも載り切らない場合、ストレージの「スワップ」を使用する。スワップは、最も高速な m.2 NVMe SSD を使ったとしても RAM の 10 倍くらい遅い。

プログラマが知っておくべき、メモリ/ディスク/ネットワークの速度まとめ - Qiita

 もちろん、VRAM や RAM を優先して使用するので 10 倍は遅くならないが、現在やっているオートエンコーダーのタスクで Swap を使いはじめると、2-3 倍遅くなる。

 ディープラーニングではハイパーパラメーターの調整のため、何度も何度も学習をやり直すので、2倍というのは大変に困る(ので、逆にスワップ量は少なくして、そういうタスクは行わないと決めたほうが幸せかもしれない。m.2 NVMe SSDRAID を組んで、そこに Swap をおければ、この悩みは解決できるかもなので、どこかに経験者はいないかしら)。

AMD、Ryzen Threadripper対応のX399プラットフォームでNVMe RAIDをサポート | マイナビニュース

(とはいえ 6枚の RAID 0 でようやく 10-20 Gbps なので、労力と金に見合わない感じはする・・・)

 

 データは VRAM や、せめて RAM  に収まるよう、なるべく大きな VRAM を持つモデルを買うべき(だなぁと)。

 

 そうすると選択肢としては、

 

GeForce 1080 ti, VRAM 11GB, 実売 10万円程度

GeForce 1070, VRAM 8GB, 実売 5万円程度

 

 もちろん 1080ti がいいのだけど、値段がバカみたいに高いので、半額で 2/3 の VRAM を確保できる 1070 は魅力的。

 (これ以上では Titan X/Xp が 12GB で 20万円くらい。その上は Quadro P 4000 24GB で 50-100万円くらい。研究費とかもらえないと、このへんは無理だなぁ・・・)

 逆に、「VRAM に載せることは諦めて、RAM から計算する」と諦めればより安いモデルで十分になる。

 こういったコスパ重視の方向で

 

GeForce 1050 VRAM 2GB 実売 1万円程度

 

 (GeForce 1030 GT というより安価な機種がありますが、こちらはNVIDIA の CUDA enable GPU に出ていないので、ディープラーニングに使えないかも。いや、載せ忘れてるだけなんじゃと思うけれど)

CUDA GPUs | NVIDIA Developer

 

 というのもありうる。ただし、256x256 みたいな高解像度画像(場合によっては 512x512)を 数千枚、更にRGB 3 チャンネルではなく、10-20チャンネルくらいで入力したり、3D画像を対象にして、マルチ GPUマルチタスクディープラーニングをすると、 GPU 間で RAM の取り合い・Swap の取り合いになり、結局速度低下を招いてしまう。

 こういう割と変態的なディープラーニングをするなら、やはり VRAM が大きいモデルを買うべき。

 

 価格と性能のバランスは

 

GeForce 1060 VRAM 3-6GB 実売 2-3万円程度

GeForce 1050ti VRAM 4GB 実売 1.5万円程度

 

 なども良い感じ。「別に 解像度 256 x 256 の画像とか使わないよ」なら、このへんのモデルのほうがベターな気がする。

 

 

おわり。

思いついたら追加するかも。 

 

ディープラーニングで暖房いらず

画像を使ったディープラーニングをしています。

 

が、

 

発熱とメモリ消費がすごい。

 

70℃ 

f:id:pmonty:20171109111903p:plain

37℃ 

 

 

発熱は、

 赤いのが CPU core i5K

 青いのが GPU 1070

 黒いのが GPU 1080ti 

 

見た感じ 黒いの が冷えてますけど、こやつが曲者。

 

簡易水冷なので冷えてるだけで、発熱がすごい、廃熱がすごいです。

(そのほかのは、ヒートパイプ空冷)

 

11月に入り、冷えこんできましたが、

ディープラーニングしてると、暖房がいらないくらい。

 

VRAM 使用も激しく、ニューラルネットワークを複雑にすると、

VRAM 足りなくなって落ちることもあり

(コードが悪いという話も...)

 

f:id:pmonty:20171109111936p:plain

 

 VRAM がでかい GPU 買っといて良かったなぁ。。。

 

RAM 40GB 積んでるのに、swap を半分近く使ってます。

 

f:id:pmonty:20171109111959p:plain

 

(仕方がないので、RAM を max の 64 GB まで買い足した)

(RAM 使ってるのは、ユニファイドメモリなのかな)

(Swap を広げたいけど、やり方がわからへん)

 

ディープラーニングって、つくづく人間が勉強するプロセスと似てます。

 

札束で殴るところが。

そして札束で殴ったからと言って、いい成績が出るとは限らないところも。

 

 

ヒストグラム比較に使ったコード

うろ覚え

 

 

 

 

import numpy as np
import matplotlib.pyplot as plt
import argparse

 

parser= argparse.ArgumentParser()
parser.add_argument("-infile", nargs = 1)

 

try:
    decoded = args.infile[0]
except:
    decoded = "保存ファイル.npy"

 

a = numpy.load(decoded)
b = numpy.load("ほにゃらら.npy")

 

a = np.reshape(a, [a.shape[0] * a.shape[1] * a.shape[2])
b = np.reshape(b, [b.shape[0] * b.shape[1] * b.shape[2])

 

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist(a, bins=256, normed=True, color='red', alpha=0.5)
ax.hist(b, bins=256, normed=True, color='gray',alpha=0.5)
fig.savefig("1.png")

# 表示して見て確認したいなら fig.show()


fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist(a, bins=256, normed=True, color='red', alpha=0.5)
ax.hist(b, bins=256, normed=True, color='gray',alpha=0.5)
ax.set_xlim(0, 80)
ax.set_ylim(0, 0.1)
fig.show("2.png")


fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist(a, bins=256, normed=True, color='red', alpha=0.5)
ax.hist(b, bins=256, normed=True, color='gray',alpha=0.5)
ax.set_xlim(40, 200)
ax.set_ylim(0, 0.02)
fig.show("3.png")

 

参考

qiita.com

 

 

python xxx.py -infile yyy

 

見たいにファイル名を指定して実行できる。

はずだけど、できなかった。。。

 

精進が足りない。。。

 

対話的に使えばファイル名を指定できるから、まぁいいや。

labeling_for_object_detection の使い方

faster R-CNN, YOLO, SSD 等で用いる、学習データの生成ツール?  labeling_for_object_detection

 

セットアップに苦労しました。

ので、まとめておきます。

 

コードはこちら

github.com

 

セットアップの際に参考にしたサイトです。

ほとんど、このサイトの記載通りですが、少し違います。

ai-coordinator.jp

 

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

 

 

A. ソフトのインストールと起動

0. 環境

 Ubuntu 14.04 および、Windows 10

 1. Processing のダウンロード 以外はほぼ同じ。

 

1. Processing のダウンロード・インストール

 Processing というソフトをダウンロードします。

Download \ Processing.org

 

 32-bit, 64-bit は自分の OS に合わせて。普通は 64-bit を使っているはず。

 わからなければ 32-bit をダウンロードすれば、どちらでも動くとは思いますが・・・

 

 labeling_for... コードの対応は Processing 3.3 となっています。

 しかし、現在はダウンロードページから 3.3 をダウンロードできません。

 現時点では Processing 3.3.5, および, 3.3.6 にしかアクセスできませんが、3.3.5, 3.3.6 でも動きました。

 

 Windows でしたら、 .exe を使ってインストール。

  ウィザードで簡単にインストールできます。

スタートメニューには登録されません。

デスクトップに生成されたショートカットをダブルクリックして起動。

ショートカットは邪魔なので、生成されたフォルダ "processing-3.3.x" に移動しました。また、 "processing-3.3.x" フォルダも、邪魔にならない適当な場所に移動しておきます。

 

 Ubuntu 14 でしたら、

ダウンロードしたファイルを unzip で展開

ターミナルで展開されたフォルダ内に移動、

bash install.sh

にてインストールします。

 

デスクトップ上にショートカットが生成されます。私はわかりやすいように、展開されたフォルダ "processing-3.3.x" に移動しました。また、 "processing-3.3.x" ディレクトリ自体も適当な場所に移動しておきます。私は /home におきました。

 

ダウンロードしてきた processing-3.3.x.zip はあとは不要なので、

rm

するなり、保存フォルダに置いておくなり。

 

私の場合は、将来の再インストールに備えて、NAS に保存しておきます。  

   

 

 

2. github から コードをダウンロード

# terminal

cd

git clone https://github.com/slowsingle/labeling_for_object_detection

 

※私は /home にダウンロードしました。

 お好みで、お好きな場所に

 

 

3. Processing を起動、設定

1. Processing を起動します。(ショートカットのダブルクリック)

 

2. 「labeling_for_object_detection」内のファイル移動

labeling_for_object_detection 内に mainGUI ディレクトリーを作成。

すべてのファイル・ディレクトリをこの中に入れます。

cd labeling_for_object_detection

mkdir mainGUI

mv *.pde mainGUI

mv xml mainGUI

 

2. Processing で、 mainGUI.pde を開く、「フォルダ」「開く(Ctrl + O)」から、

メニュー「フォルダ」「開く(Ctrl + O)」から

「labeling_for_object_detection/mainGUI.pde」を開きます。

 

3. labeling_for_object_detection の起動

「labeling_for_object_detection/mainGUI」ディレクトリ内の mainGUI.pde をダブルクリック。

processing が起動します。

processing ウィンドウの左上の三角ボタン(再生ボタン)を押すと、使用可能状態になるはず。

 

 

 

B. コードの修正 と ラベル付け

コードの修正: mainGUI.pde

このプログラミング言語は使ったことがなので

間違ってたら申し訳ない。java なのかな。

1種類のみのラベル, lesion を使う方針。

 

コードの修正前に、mainGUI.pde はどこかにコピーしておいて、バックアップしておくのが吉。私の場合は

mkdir backup

cp mainGUI.pde ./backup

のように保存。

 

line 10

final int N_CLASS = 1;


line 12

final String[] index2name = {"lesion"};

 

line 51-54 コメントアウト

/* radio.addItem(index2name[1], 2);
radio.addItem(index2name[2], 3);
radio.addItem(index2name[3], 4);
radio.addItem(index2name[4], 5); */

 

ラベルする

このソフトでは、画像を表示する領域の広さは 600x600程度

このため、対象画像も 512x512 程度以下のピクセルに縮小しておいたほうが無難。

 

1. processing の起動

 mainGUI.pde のダブルクリックで開くのが楽。

 左上の参画じるしをクリックすると、ラベルするためのウィンドウが開く。

2. ファイルを開く

 右上の LOAD IMAGE ボタンより

3. ラベルする

 ラベルしたい名前のボタン(Chiyo, Cocoa など)をクリックしたあとで、ラベルしたい場所の「左上と右下」、または「右上と左下」をクリック。赤い四角で囲まれるはず。

 場所が良ければ SAVE RECT をクリックして保存する(赤い四角は消えるはず)

 ラベルしたい場所が他にもあれば、3. を繰り返す。

4. 保存

 OUTPUT XML ボタンを押すと、同一ファイル名(拡張子が.xmlに変わったもの)が、/labeling_for_object_detection ディレクトリ内に保存される。

 ひとしきり保存が終わったら、

mkdir xml_data

mv *.xml xml_data

 などで全部移動してしまうこと。

 5. DELETE RECT ボタン

 現在書きかけの赤い四角を消去する。

 SAVE RECT を押し、保存しておいた赤い四角は消えないので注意 

 

 

ディープラーニング用GPUの選択 - リライト

本記事は、ページビューを集めている記事のリライト、修正版です。

リライト前の記事:

pmonty.hatenablog.com

 

2種類のCPU, 2種類のGPUの速度比較した記事:

pmonty.hatenablog.com

 

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 

ディープラーニングを行うのに、GPU があると、すごく高速になります。「CUDA」というソフトで GPU を動かすそうなんですけど、 

CUDA :NVIDIA 社の GPU を,計算で使うためにプログラム

CUDA - Wikipedia

 

で、CUDA に対応した NVIDIA 製の GPU を探すと、 

developer.nvidia.com

TESLA、QuadroGeForceNVS と製品がたくさんあります。初心者はどれを選べばいいのか?

 

店頭でたくさん売ってるのは GeForce ですし、ブログ記事を見ても、 GeForce がほとんど。GeForce の一択でしょう。

上記サイトでは、性能の指標で Compute Capability  というものがあります。これは新しい GPU ほど数値が高く、数値が高いと最新バージョンの CUDA に対応しているようです。 

 

ディープラーニングをする場合、普通、 tensorflow, Chainer などの "フレームワーク" を使うことになります。すべてのフレームワークが最新の CUDA に対応しているわけではありません。GPU 購入前に、自分の使いたいフレームワークが対応している CUDA を確認するべきです。ただし今のところ、最新モデルは、過去の CUDA にも対応しているようで、基本は最新モデルを買えばいい(CC高いのを買う)となります。

 

GeForce で最新というと、 10系(1030, 1050, 1050ti, 1060, 1070, 1080, 1080ti) です。モ基本はデル番号の数字が大きいほど値段が高く、高性能ですので、後はお財布と相談。

 

お財布に合うってことは重要で、ディープラーニングの教科書でも、

shop.ohmsha.co.jp

 

GeForce GTX 750 という旧機種を導入してたりします。教科書を書いた先生が、旧機種を使っている・・・それでもずいぶん高速化できています。できれば高性能のを買いたいですが、高速化できるのなら、安いのでもいいですよね。因みにこの本、Chainer v2 に対応した新版が出ましたね。これから買う人は、お気を付け下さい。

 

で、もし画像(データ量が多い)を対象にディープラーニングをするなら、メモリーが大きい方が良いでしょう。 最新モデルで、メモリーが大きめと言うことで、候補を上げると、1050ti(4GB), 1060(6GB), 1070(8GB), 1080ti(11GB)、この中から、財布が許すのを購入すれば良んだろうと思います。ちなみに、1060 にはメモリーが少ない 3GB のモデルもあるので、注意してください。

 

 

いくつか気になってるモデルがあります。まず、1050ti はロープロファイル(小さい)モデルがあります。小さいのを買えば、コンパクトな PC ケースにも入りますね。こういうの

www.ask-corp.jp

 

コンパクトケースの一例。

apac.coolermaster.com

 

コンパクトは正義です。これくらいの GPU なら、CPU も 1万円以下の pentium とかで良いでしょう。

kakaku.com

5万円程度で組めると思います。それでもGPUなしのノートパソコンより十分速いはずで、最初は安いのでいいんではないかと。

 

安く作る上での注意点は、SSD を入れず、ストレージは HDD only にすることです。SSD 入れると起動とか速いですけど。ディープラーニング専用機なら、長時間立ち上げっぱなしにするでしょうから、起動が遅いのは無視できる。それに、ディープラーニングで処理する big data は結局HDD に入れますよね? それで、SSD の速さがあまり生かせない訳です。ディープラーニング専用のパソコンなら、SSD を入れるメリットは大きくないと思います。

 

高性能な GPU を買うなら、1080ti か、1080 の簡易水冷モデルが良いでしょうね。

1080

kakaku.com

こういうやつ。でも10万円くらいしますね。たっかい。この辺の GPU で組もうとすると、CPU も core-i7 とか、ストレージも SSD が欲しくなり、20万円以上するはず。個人でやるなら、このへんが限界かな。

 

ディープラーニングすると、CPU, GPU が非常に熱を持ちます。次のエントリに具体的に書いていますが、

pmonty.hatenablog.com

私の場合で、CPU は 80度近く、GPU は 85度まで行きました。

まず、GPU について。ディープラーニング中、GPUは本当に熱を持ちます。触ってみると本当に暑いです。冷却には、空冷、ヒートパイプ空冷、簡易水冷、本格水冷があり、この4つのうち後ろに行くほど冷却効果が高いです。1080 や 1080ti を買うなら、本格的にディープラーニングをやる(つもり)のはず。それなら、簡易水冷モデルを買いたいところです(本格水冷は初心者にはハードルが高いです)。

ディープラーニングで CPU もかなり発熱します。しかし、触ってみると、GPU ほど暑くはありません。CPUの冷却は、空冷(CPUにバンドルされてる奴)もしくはヒートパイプ空冷で十分だと私は思っています。

ところで、アメリカはこういったパソコン製品が安いので、アメリカに旅行する機会があれば、ホテル付で買ったりするのもありです。なお、アメリカアマゾンは、日本と違い、 Prime でも2日後がデフォ。基本的にもっと日数がかかります。なので、アメリカ旅行中に購入する場合、日程には余裕を持って。

 

 

本当は 1080ti の簡易水冷が良いんですけど

kakaku.com

あまり在庫がないし、

バカみたいに高いので。

 

最近は、GPUで、仮想通貨マイニングがはやってるみたいなので、

そっち方面でも どんどん売れていくんでしょうね。。。

 

私は GPU をもう一枚買って高速化(SLI)しようかと、時々値段を見ていますが、

10万円クラスの高性能モデル(1080ti)になると、かなり値動きが大きいです。1万、2万とか変化しますので、購入される場合、値動きにご注意下さい。

 

Amazonについては、過去の値動きをグラフ化してくれる「Keepa」というアドインがあります。

安く買いたいとき、参考になります。

chrome.google.com

 

憧れの NAS と現実

憧れの NAS を買いました。

Synology の 216j.

2ドライブの入門機です。

 

www.synology.com

 

数ヶ月運用したので感想。

 

まず、購入した目的は、複数 PC でのデータ共有でした。

 

これまで、複数 PC でのデータ共有は、

Dropbox の無料容量で頑張ってきました。

 

PC母艦は家に置いてあります。

外でノートでちゃっちゃとコード書いたり、処理を試すこともあり。

 

データのやりとりが必要。

で、メインで使ってる Dropbox では足りなくなってきたと。

 

Onedrive や GoogleDrive を併用しても良かったのですが、

それほど容量が増えるわけではないし。

 

複数のソフトを常駐させると、

  遅くなったり、

  消費電力が増えたり

しそうだから嫌。

 

OneDrive は Ubuntu で使えないし(使い方が分からない)。

 

MicrosoftGoogle は、Dropbox と比べ、

プライバシーに不安もありました。

 

アップルはテロリスト(疑い)の個人情報を守りましたし、

アップルなら信頼しますけど。

 

一部の企業は、サービス最適化のため、

顧客データで機械学習とか回してるでしょうしね。

 

ディープラーニングは「研究」でやってるんで、

虎の子の「データ」を、企業に渡すわけにはいかんのです。

 

で、クラウド上でデータやりとりするために、

憧れの NAS を導入しました。

 

(ホントにデータを守りたければ、クラウドなんか使っちゃダメで、

全部ローカルで管理しなきゃなんですけどね。)

 

 

RAID で冗長性確保。

データをロスする危険も減ってウハウハ!!

 

 

かと思っていたら!!

 

まず、Dropbox の様に使おうと思い、Synology-Cloud-Station-Drive と言うソフトを各 PC に導入、常時同期をやっていました。するといくつか問題が。。。

 

問題点

1.遅い

 LAN ケーブル1本、RAID 1 ですから、書き込みがめっちゃ遅い。

 しかも複数の PC で常時同期してるので、遅い、遅い。

 

2.時々同期されなかったり。

 いつまで待っても同期されなかったり。

 PC再起動、NAS再起動したりして、なんとか同期してくれました。

 

 けど、まぁ不安ですわね。

 「データを保存してるつもり」で「保存されてないかもしれない」訳ですから!

 

 

で、Dropbox って本当に優秀なんだと、今更気付きました。

高速

複数 PC からも常時同期。

世代管理で以前のファイルを復活

 など

 

良いんですけど、おかげさまでお値段も良い訳です。

当然ですね。

1TB で月々1000円という。

navi.dropbox.jp

1TB っていうのは、ちょっと少ないですね。

日常的に使う分なら十分ですけど、ビッグデータとなると足りないですね。

悩ましい。。。 

 

 

ビジネスのスタンダードとか言うサービスなら、2TB あるいはそれ以上使えるんですけど、「5名様から」なので、お値段は75ドル/月からですか。高いですね。

Dropbox plan comparison - Dropbox Business

 

 

 

でも、Dropbox の 1TB 有料プランって、本当に高いのでしょうか?

今回の NAS 導入費用はざっくり 4万円, で 3TB です。

4万円あれば Dropbox 1TB のでも 3年以上使えますね。

 

でも目的は、ディープラーニングビッグデータ管理。

1TB では足りません。

 

 

 

で、札束で殴って、

NAS を高速化することを考えてみます。

 

 

ボトルネック

データの入出力の LAN ケーブル

データ書き込みの HDD

なので、これらを複数帯域確保すれば、速くなるでしょう、と。

 

 

実際の RAID の速度比較 については

こちらのサイトを参照。

https://hikaku.cman.jp/raid/

 

 

例えば 5本差しの RAID 6

  (5本のうち2本が壊れても大丈夫)

  ざっと2-3倍に高速化するようです。

 

 

Synology は 5本モデルからは LAN の差し込み口が4本。

  LAN を複数挿せますし、

  PC とダイレクト接続もできますね。

  ルーターを介さず、ダイレクトの方が速いんでしょう。

 

 

しかしまあ、5本差しモデルというと、本体 10万円くらいになっちゃうし。

HDD も 3 本、買い足さないと。

なんか「沼」にハマる感じ。

 

DS1517 とか、DS 1517+ とか言う機種を考えてたんですけど

(これらは 5ベイだけど、拡張ユニットで 15 ベイまで増やせる)

 

カカクコムのレビューなんか見ると、

  「CPU は性能低い」

とかディスられてたりもして。

うーむ。悲しい。

 

自分に知識があれば、Ubuntu でデータサーバー組むんだけどなぁ。。。

 

と、妄想しています。

 

とりあえず、現状、運用方法を変えてます。

 

NAS はデータのバックアップのみで使用。

 

1.メインのノートパソコンのクラウドバックアップ

 

2.ディープラーニングの大量データ保存。

  常時同期はやめる。

  データバックアップは、FTP? みたいに、

   ブラウザ上でアップロード・ダウンロード。

  重いデータは USBメモリとか、外付け HDD でやりとり

 

という感じ。

 

メインの PC のバックアップは、不安なんですけどね。

NAS にうまく同期されてないことがありましたし。

一応 外付け HDD にも時々保存しています。

 

 

現状に不満あって。

なんと言っても、転送が遅いので。

 

今から思えば、

ふつーに 2.5 か 3.5 の HDD を裸で買って

USB でつないで外付け HDD 風に使う

 

のが、一番ストレスなかったかもです。

 

Keras を使って驚いたこと:インストールの不具合に気付く。

と言うわけで、Keras を始めて約 1日が過ぎました。

 

Keras は簡単で良いですね。

 

できたこと

 

1.VGG 風の簡単なモデルを試す。

2.Keras に実装済みモデルを使う:Xception

3.Imagenet 学習済みモデルの転移学習を試す。

 

結果:これまで 精度 0.90 までしか出なかったのが、最高 0.97 を叩き出す。

 

これまで tf で、何ヶ月も苦しんでいた

1.batch normalization とか

2.既存の高精度なモデルの利用 とか

3.Imagenet 学習済みモデルの転移学習 とか

 

が解決してしまいました。

(tf で実装できている、学習過程の保存とか、tensorboard の利用は、まだ Keras ではできないのですが) 

 

その学習過程は壮絶で、これまで 65度程度だったオリファンの GTX1070 が、80度越えまで頑張ってくれちゃいました。

これを何日も回すのは不安・・・

 

もちろん、ここ数ヶ月の、tf での苦しみから学んだこともあります・・・

 

エラーを見て、どこの問題か推測する とか

エラーが出ても慌てず、手順を経て解消する とか

 

の経験が積めたし。

 

おかげで、Keras を短期間で使えるようになったと思いたい。。。

無駄じゃなかったと思いたい。。。

 

さておき、とんでもないことに気付きました。

 

私はディープラーニング用に2台のパソコンを使っていますが、

メインマシンでトラブル発生です。

 

気付いたのは些細なこと。

今回なぜか、サブマシンで Keras を使い始めました。

 

とりあえずの実装ができたので、メインマシンへコピー。2台でハイパーパラメータの調整を始めたところ、どうもメインマシンの精度が安定しないのです。

サブマシンだと val_accuracy は 0.95-0.99 に張り付いてるのが、メインだと 0.00 - 0.99 までめまぐるしく動く感じ。Seed 取ってないせいかもしれませんが、それにしたって上下動が激しすぎます。

 

で、なんだか変だと。

 

よくよく考えると、

 

「Python3.6 で、出るはずの pandas エラーが返らない!」

 

ことに気付きました。

Keras は python 3.5 までの対応でして、サブマシンの方で 3.6 で動かすと「pandasがなんちゃら」とか エラーを出して止まるのですが。

メインマシンだと、3.6 でも曲がりなりに動いてくれますが、 val_acc が 0 ~ 0.99 までめまぐるしく動きます。そうすると test accuracy も当然悪いと。

 

学習速度は 1080ti のおかげで 1.5 倍くらい速いのですが、どこかがおかしく、使い物になりません。 

 

pandas 関連の問題だとすれば Anaconda のインストールの問題なんでしょうけど。

前 Anaconda を入れ直した際、なんか設定ファイルがうまく消せなかった経験があり(再インストールで環境引き継がれてしまった)。

また、どこに問題があるか切り分けられず、そのうちにさっくり、 Ubuntu インストールからやり直そうと思っています。

 

 これで一日潰れるし、再インストールして再発した否にはどうしようって感じですけど。。。

 

Keras のインストール

というわけで、Keras に挑戦することに相成りました。

Keras Documentation

 

バックエンドに TensorFlow, CNTK または Theano を使い、

フロントエンドでディープラーニングを楽にしてくれるものらしい。

Tensorflow はインストール済み。

CNTK も Theano も定評あるモデルで、いつかは触ってみたいけど、

今回は Tensorflow でいこう。

 

それでは Keras のインストール。 

pip install keras

 

 ただし、対応は Python 2.7-3.5 だそうなので、 Python 3.6 を入れている私は

source activate py35 

しないといけない。

さて、依存パッケージがあるそうで、

 

Kerasは以下のライブラリに依存しています.

numpy, scipy
yaml
HDF5とh5py (モデルの保存や読み込み関数を使う場合のみ)
cuDNN: オプションですが,CNNを使用する場合は推奨

Anaconda で入れてる人は、 numpy, scipy は導入済みのはず。

HDF5っていうのは見つからなかったけど、ぐぐったらどうも HDF5 = h5py らしい。

いつの間にか PyPI でインストールされていた: h5py

 

yaml というのは、データの保存や読み込みに使うようなのだけど、

このインストールは

sudo apt-get install libyaml-dev

 とのこと。

 

かんたん!

 

Keras は公式ドキュメントが日本語化されているし、使い方も TensorFlow よりも簡単!

データの取り回しも numpy で行うようですね。

tf だと、 tf. なんちゃら みたいな Tensor でデータを保持したりしますが、そうすると 

sess.run

しないと中身が見えなくて使いづらいし、

私の中で RAM をバカ食いしている疑惑も。

 

ちうことで、しばらく Keras で遊んでみます。

 

Keras とは、ギリシア語で「角」のことだとさ。

 

 

apt で公開鍵登録

sudo apt-get update

で、

 

パッケージリストを読み込んでいます... 完了
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: http://dl.google.com stable Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 0000A0A0000A000A

などと表示されるとき。

 

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 000A0A0000A000A

で公開鍵を登録したあとに

 

sudo apt-get upgrade

 

pip-review で python パッケージ一発アップグレード

pip-reviewのインストール

pip install pip-review 

 

pip でインストールされているパッケージ検索

pip freeze 

 

アップデートの有無を確認

pip list -o

または

pip-review

 

一括アップデート

pip-review --auto

 

依存関係が壊れていないかを確認

pip check 

 

もしも依存関係が壊れていたら、必要なパッケージをインストールし直す

pip install bleach==1.5.0

pip install html5lib==0.9999999 

 のように、

pip install [モジュールの名前]==[バージョン番号]