読者です 読者をやめる 読者になる 読者になる

ディープラーニング向けパソコン自作(マザーボード編)

ディープラーニング向け自作には、いくつか押さえるべきポイントがあろうかと。

 

 マザーボードmini-ITXATX が良くて、 

 結論から言えば、

 

将来追加投資する気があるなら

 ATX:SLI対応 Z270マザーボード

  20万円コース!! (将来の投資10-15万円を想定)

 

追加投資はしたくないなら
 mini-ITXチップセット何でも良いがwifi付き

  ざっくり 10万円コース

 

(お大尽されるのでしたら、X99チップセットで 4-way SLI 対応のマザーボード!!)

   どーんと30万円コース!!

 

 で、まずマザーボードを決めるわけです。

 上に結論書いてるけど、ここからめっちゃ長い。

 

 マザーボードの大きさにはいろいろあるので、まずそれを決めないと先に進めない。マザーボードのサイズには、他にも micro-ATX とか extended-ATX とかあって、

マザーボード - Wikipedia

 

 小さい方から

 

 mini-ITX < micro-ATX < ATX < extended-ATX

 

 なんだけど、初めての、DL 向け自作なら mITX か ATX のどっちかになると思われ。

(mATXも良いとは思うけど問題もあり)

 

 ポイントは、グラボを2枚以上挿したいかどうか。

 あと、パソコンのサイズ。

 

 DL の学習速度を決めるのは、グラボの性能。当然2枚以上挿した方が性能は良くなる(いろいろ制限あり)。しかし、グラボは高いし、実際に2枚(以上)挿すか分からない。

 ATX はグラボを2枚(以上)させる訳なので、拡張性は ATX のがいい。mITXは1枚しかさせないけど、なにしろパソコンをコンパクトに作れるのでありがたい。

 

 で、さておき迷ったら、ちっさい ITX 買うのが良いです。なにしろ「小さい」と「安い」は正義です。将来ATXに移行したくなったら買い換えないと行けないですが、マザボとケースは買い換えて3万円くらいでしょうか?

 確かに3万円は高いですが、グラボ2枚差し仕様と思ったら10万円とか飛んでいったりするので、それと比べれば安い。まぁ比べないか。

 

 で、パソコンのサイズ。Amazonなんかで「ITX ケース」 「ATX ケース」などで検索すると、いろいろ出てくる、出てくる。

 

 で、自分としてどのくらいの大きさを許容できるかが問題なわけです。

 

 また、パソコンのサイズと関係してくるのが「形」。

 パソコンの形にもいろいろあるんですが、

 

 

  キューブとか

kakaku.com

 

 

  タワーとか。

kakaku.com

 

 

 

 初心者はタワーが良いです。キューブ型は高さと奥行きは小さくても、厚みがあって圧迫感が出るし。中には制作・パーツ交換がめんどいのもある。あ、上で提示したキューブは、おしゃれで、パーツ交換も楽なやつです。念のため。

 タワーは部品へのアクセス良好で、幅も狭いので圧迫感も少ない。

 

 ぶっちゃけ上級者もタワーが良いんではと思いますが。まぁいいや。

 

 mITXのタワーというと

kakaku.com

 こんなの。

 これは結構評価高いみたいです。

 

 ケースいくつか買ってみて分かったのは、「安いのは塗装が悪い、板もまっすぐしてなくてねじれてる」と言うこと。ま、ケースとしては使えますけど。

 高いケースと安いケース比べて(と言っても10000円のケースと、4000円のケースの違いですが)、高いがしっかりしてました。実際組んでみて。

 4000円のはゆがんでるし、塗装はげるし。

 

 まぁ高い方が良いものですよね。

 じゃないと

 

kakaku.com

 こんな ITX のくせに3万円近くするケースが売れるわけない(これかっこいい!!欲しい!!! けど買えない。かっこいいなぁ)。

 

 まぁいいや。

 

 とにかく、mITXか、ATXか決めて、ケースを買う。

 

 micro-ATX をオススメしないのは、なぜか、ですが。

 「mITXに勝る利点が少なく、ケースサイズは結局ATXと同じくらいになる」からです。

 micro-ATX を買うなら、より拡張性に優れている(場合が多い)ATXのを買った方が良い。

 

 micro-ATX が mITX に勝っているのは、

  1.メモリーの最大搭載量が64GB(mITXは32GB)

  2.グラボ2枚差しが可能

 と言う点です。多分多くの場合は メモリー32GBで足りるでしょうから、メモリーはメリットが少ない印象。グラボ2枚差しはメリットなのですが、これがトラップでして、「マザーボードは2枚差しできるのが多いのに」「グラボ2枚差しに対応していないmATXケースが多い」からです。

 

 例えばおされなこのケース、私購入して、そして返品したんですけど(手数料自腹で払って)

kakaku.com

 良いケースなんです。質感も良いし。デザインも凝ってる。おしゃれ。

 しかし、背面の拡張スロットが4つしかありません。

 体積32760cm3

 

 一般にグラボはスロット2つ消費します。4つあれば、グラボ2枚分の4スロット? 十分? と思いきや。

 グラボ2枚差しに対応しているマザーボードを見てみると、大体、グラボ2枚の間に1スロット開けているデザインが多い。

 

 例えばこのボード

ASTRIX Z270 GAMING

 

 間に1スロットあるので、拡張スロットが5つないと、グラボ2枚差しできないです。で、拡張スロット5つとなると、PCケースもでかくなる。

 

kakaku.com

 

 例えばこれは、拡張スロットが5つある、 microATX 対応のケースです。拡張性が高く、水冷や簡易水冷、大きなCPUクーラーもつけられ、6面のうち2面がクリアなデザイン。デザイン性も良いです。

 HDD/SSD搭載数も多いしすばらしい。このケースの良いところは、上下左右につなげて、2つのケースを1つのケースみたいに設置できること、みたいです。たとえばしっかり水冷を組む場合、2つのケースに1つの水冷ユニットを組んで、それでCPU/GPUを全部冷やしちゃうとか、できそうです。

 電源を大きいの1つで、2台を同時に動かすとかもね。

 

 ただ、サイズ的には結構でかい。ケース1個で幅が32cmもあります。体積は 45500cm3。

 さっき例に挙げた、ATXのタワー型ですと、42500cm3

kakaku.com

 

 まぁ、このケースはタワー型の中でも、5インチベイをなくすことで小型化したモデルなので、小さめなのですけどね。

 でも、micro-ATX よりも大きな ATX ケースの方が、体積が小さいという、逆転現象になっています。

 

 5インチベイがあるケースですと

kakaku.com

 50300cm3。

 これだと、先ほどの micro-ATX ケースよりも大きいです。

 

 さておきさておき。

 

 ATX ケースでもタワー型は幅が狭くて取り回しが良く、圧迫感は少ないです。ケースを選べば体積の小さなものもありますしね。

 しかし、その小さなケースでも、拡張スロットは7本あります。組み合わせるマザーボードにもよりますが、マザーボードによってはグラボ3枚差しまで可能です。 ケースサイズはほぼ同じでも、拡張性は高いわけです。

 

 いずれにせよ、microATX はなかなか中途半端となってしまいます。

 mini ITX でしたら、先ほど上げたのが

kakaku.com

 

 34000cm3 ですし、もっと小さなケース

 

 

kakaku.com

 11500cm3 もあります。

 これなんかちっさくて、さっきの ATX ケースの1/4以下です!

 とはいえ、このちっさいケースですと、パーツ交換が大変・内部で電源ケーブルできつきつになってしまって、冷却も悪いはず。

 

 やはりタワー型か、せめて

kakaku.com

 

 18600cm3 一回り大きいやつ、こちらは風の通りは、上のよりは良いはず。しかし、Volumeも2倍くらいになってますけどね・・・

 

 

 

 で、マザーボード

 

 mITX 買うなら、wifi 付きが良いです! ケーブルと比べたら遅いけど、なんせ便利だから。大体デスクトップパソコン使おうとすると、ケーブルだらけでぐるぐるになってしまいます。一本でも少ない方が楽!

 

 で、ATXのボードを買うなら、「SLI」対応のがオススメ。SLIはグラボ2枚(以上)を同期させて、速度を2倍近く(以上)に引き上げるやつです。 2枚挿すのを 2-way SLIとか呼びます。

 SLIしなくても、グラフィックメモリーが増えるという利点はあり、SLIしなくても良いのですが。しかしせっかく2枚挿すなら SLI した方が。

 

 さて、タワー型のケースを買うにはいろいろ考える必要あります。ケース、いろいろありますからね。

 個人的には「静音型」のケースがオススメです、っていうか、「静音型」にすれば良かった、と後悔しています。意外とファンの音がうるさかったので。

 (これについては後で、CPUクーラーについて書きたいと)

 

 静音型とは、例えばさっき上げた

kakaku.com

 

 こういうのは、開口部が狭く・少なくなっている他、ケース内部に凹凸をつけて、音を吸収するようになっているそうです。

 

 あと、PCケースで恐ろしいのがムシ、特にG様の侵入。

 

 こういう記事もありました。

gigazine.net

 

 虫が侵入すると何より不潔だし、ショートなどで故障の心配もありますので。

 これを防ぐにはどうするのか分かりませんが、周囲にホウ酸団子とか置いとくとか、ですかね?

 

 あと、G様は明るい場所がお苦手でいらっしゃるので、クリアパネル式の

kakaku.com

 (これは先ほど上げた、やや小さめのATXタワー)

 

 なんかも良いかもしれません。

 

 話が前後しますが、マザーボードには「チップセット」とか言う、パソコンの部品が組み込まれてまして。これは、あまり悩む必要なく、

 

 「SLIするならZ270、しないならなんでもいい」

 

 なので基本的には、

 

 ATX:SLI対応の Z270 のマザーボード

 mini-ITXチップセットは何でも良いけど、wifi付き

 

 のが良いと思います。私は。

 

 高性能を目指すなら、ATXかeATXのボードで、X99チップセット、4-way SLI 対応のものになるのですが、グラボ(1080ti)4枚も買ったら、それだけで40万円ですしね。グラボ買うとしても、一般人は2枚まででしょう。

 ということで、ATX の 2-way SLI で良かろうと、思います(micro ATX でも良いんですけど、ケースがね・・・自分が良いと思うのがなかったので。ATX で良いんじゃないかと思います)。

 

 

 

 で、オススメはしないけど「面白い」のとして、NUC + 外付けGPUと言うのもアリ。

 

 NUCいうのはこういうやつです。

kakaku.com

 

 ざっくり言うと、めちゃ小さいパソコン。中にグラボが入らないので、グラボは Thunderbolt 3 で外付け。

 外付けグラボはまだ一般的ではないので、ケースだけでもめっちゃ高いんですけど

AKiTiO Node | Thunderbolt™ 3 eGXF expansion chassis for eGPUs | AKiTiO

 

 こういうのがあります。

 

 まぁ値段的にはメリットはないけど、とにかくコンパクトに作れる、と言うことだけメリットですかね。なんなら持ち運ぶ気にもなる。

 さすがにタワー型デスクトップとか持ち運ぶ気にはならない、SFFでも厳しい。でもNUCならアリかも。

 

 ないか。

 

 ないね。

 

 

 今後、Thunderbolt 3 付きのノートパソコン買って、買い換えの時が来たら、外付けグラボをくっつけて DL 用マシンにしても良いですが。

 その頃には事態も変わって、グラボでDLしてないかもしれないし。FPGAだっけ? Tensor Processing Unit だっけ? なんかそう言うのでやってるかもしれませんしね。

日記 いろいろ一段落

 と言うわけで どういうわけか ブログしばらく非公開にしていましたが、気が向いて再び公開設定にしました。

 

 この間に DL用 コンピューターが届き、セットアップ。いろいろ気になったので部品交換をしたりして、思った以上にコストがかかってしまいました。

 いろいろパーツを組み替えて、

  i3-7100, 1070

  i3-7100, 1080ti

  i5-7600K, 1070

  i5-7600K, 1080ti

 で CNN-MNIST を試してみましたので、近いうちにデータをまとめます。

 

 結論から言えば、言われているとおり

  GPU が重要

  CPU は速度に影響なし

 でした。

 

 この速度は、値段におおむね比例する結果でしたが、消費電力(1070:150W、1080ti:250W)考えたら、1080tiの方が効率良いですね。1080ti の方が 2倍以上早かったので。

 1080ti は Founders なので、なんというか「poor fan」モデルです。CNN を学習させると、80度くらいまで温度上がってしまいます。しかしケース内に排熱しないのは良い点です。ケース外に排熱しますので、ケース内に熱がこもりません。消費電力はおおむね 180-250W あたりをうろうろするので、熱のために頭打ちにはならず、性能は出てるんだろうと思いますが。こんなで高温で、何日も動かして大丈夫か不安です。

 一方で、廃熱のために「わざと」高熱にしてるのかもしれずよく分かりません。

 熱を放出するには、当然、周囲との温度差が大きい方が、一定時間に大量に熱を捨てることができますから。「高熱で壊れるか心配」と書きましたが、「通常利用で壊れるようなものを売らないよね」とも考えられます。

 

 1070 はオリファンのヒートパイプモデルで、60度台までしか上がりません。「ヒートパイプってすごいなー」と思います(小学生並みの感想)。しかし廃熱はケース内なので、廃熱が良いケースでないとケース全体が熱を持ってしまいます。ま、べつにいいっちゃ良いんですけど。

 1080ti は 2台目を買おうと思いますが、ケースがかっこいい Founders にするか、冷却が効率的なオリファンにするかで悩んでおります。

 

 アメリカ Amazon をよく見ます・・・パソコン部品は日本より多いし、何より安いので。

 

 1080tiの値段は目間ぐるしく動きますね。

 アメリカでは、ゲーミング系の部品メーカーではEVGAが一番人気。ASUSが二番、MSIが三番人気のようで、同じ Founders の 1080ti でも、EVGAが最も上段に来ています。EVGAが最上段というのは、オリファンモデルが最も早くに出た こともあると思いますが(Amazon.com内で、オリファンモデルを一番最初に発売したのはEVGA:私の観測範囲内ですが。また、オリファンと Founders をひとまとめにしているのもうまい売り方です。Founders とオリファンモデルの売り上げが加算されて順位が上がり、順位が高いからこそよく売れる好循環という印象)。

 Foundersの値段は699ドルで横並びですが、面白いのはEVGAでオリファンモデルが出てきた当初、オリファンの方がFoundersより安い時期が一瞬ありました。EVGAのSC2という、銀色の2枚fanモデルです。今から思えば、これは「買い」でしたね。

 また、ZOTACと言うメーカーのFoundersは、なんと679ドル! 他はみんな699ドルなのに、一歩安くなっています! Amazonアルゴリズムで価格を自動操作していると言われますが、Zotacのはよっぽど売れていないのでしょうか・・・

 一番上の EVGA は、先日まで Founders が 699 ドルでしたが、今では700ドル超えています。人気が上がってきたのかな。

 なかなか興味が尽きません。

 

 アメリカ Amazon にはいろいろ面白い製品が売っています。例えば、GPU 用の後付けの ヒートパイプ付きオリファン(ARCTIC Accelero Xtreme III)。6000円程度。

 (日本の Amazonではめっちゃ高かったと思います。覚えてないですが)

 

 GPU の各社のモデル、ネット記事によると「オリジナルファン」「オリファン」とか言うのですよね。てっきり「fan」が重要なのだと思っていましたが。ファンも大事ですが、むしろ、ヒートパイプを用いたクーラー部分が冷却には重要みたいですね。上述の Arctic Accelero Xtreme III は後付けの  GPU クーラーで、ヒートパイプを使っています。

 各社の GPU オリファンモデルも、皆ヒートパイプを使っていますもんね。

 

 「GPUなんて2-3年持てば良い」と言って founders を買うのも良いと思うし、「冷えた方が性能が出るはず」と言ってオリファンを買うのもアリだし、悩ましいものです。

 簡易水冷モデル、あるいは本格水冷でも良いのですが、「複雑になるほど故障するパーツが増える」と思っているので、2の足を踏んでいます。水冷のモデルって、高くて重いですしね!

 

 さて、1ヶ月ほど前は「1080tiが出そう!!」だったか、「1080tiが出たけど買えない!!」的な状況でした。2週間ほど前は「1008ti Founders 売ってるけど高すぎる!! オリファン出てない!!」状況だったのが、最近はオリファンモデルも各社出そろい、水冷キットも出てきましたね。

 

 こうなると機能が乏しく感じられる TITAN X に対して、NVIDIA は TITAN Xp という、より強化したモデルを発表してきました。また、ローエンドとして GTX 1030 がもうすぐ発表されるとかいう噂もあります。

 TITAN Xp は性能的には魅力ですが、コスパ的には、自分的には「ない」ですね。多分、TITAN X (Pascal) よりお高いのでしょうから、15-20万円ほどでしょうか? それなら 1080ti 2本買って、SLI した方が性能が出るでしょうし。

 

 来月にサンフランシスコかどこかで開かれるイベントで、Nvidia の次期アーキテクチャ、Volta (GeForce GTX 20x シリーズと噂される)が発表されるそうです。行ってみたいけど、参加費(講演など聴けるようにすると)だけで10万円超え。

 残念ですが、行けないですね。ITmedia とかの、ネット記事待ちです。

 

 こういう値段を見ると「日本ってヤバいな」と思うのですが。だって日本のカンファレンスって、3-4日のものでも参加費1-2万円とかざらですからね。欧米では、1週間のカンファレンスなら普通10万くらい行きますよね。

 10万円のカンファレンスに行ったからって、知識が急につくとは思いませんが。でもそういうところで得られる最新情報に普段から触れているか・触れていないかって、大きいと思いますよ。

オブジェクト指向プログラミング(OOP)とは

記載されている年は基本的に登場年

強調されてるところとか見ると違和感があるかもしれないけど、私は DNN のために Python を学び初めた初心者。普通のプログラミング初心者が躓かないところで躓いてると思われ、そっとしておいてください。

 

 

オブジェクト指向プログラミング(Object oriented proglaming, OOPとは

 プログラムの保守性や再利用性を向上させる技術。オブジェクト指向プログラミング言語は (OOP language: OOPL) と呼ぶべきだが、ここでは OOPL も含め OOP と記載する。

  エドガー・ダイクストラ氏による「構造化プログラミング」(1967,goto 文を廃止し、プログラムの進行を巡行・分岐・繰り返しの3つに限定すること)を発展させたものとしても語られる。

 最初期の OOP は 1967 年の Simula67OOP 自体はゼロックスパロアルト研究所(PARC)のアラン・ケイ氏が提唱し Smalltalk (Smalltalk80, 1983年発売)に引き継がれた(Alan Kay:  GUI を発明、ダイナブック構想を提唱。チューリング賞受賞:2004年)。コードの修正や保守、再利用が簡単となった。

 当初、「『オブジェクト』が『メッセージ』をやりとりすることでコンピューティングを行う」ことを意味していた(そもそも Smalltalk は OS として開発された)。

 後にビャーネ・ストロヴストルップC++ (1983年)の開発を通じて「カプセル化 encapsulation、継承 inheritence、多態性 polymorphysm」の概念を追加した。

 結果としてソフトウェアの再利用部品群(クラスライブラリフレームワーク)の開発とも関連し、多くのプログラミング言語に取り入れられるようになった。

 

現在の多くの言語が OOP (やライブラリ)を取り入れている。

特に

 Simula67, Smalltalk, C++, Perl, Python, Java, Ruby, C#...

などが OOP の例としてあげられる。

 

 

・・・

一般に、オブジェクトはすべてのクラスを含むスーパークラスである

「Object」のサブクラスに「Number」「String」・・・などがあり、「Number」のサブクラスに「Int」「float」・・・などがある、といった構造らしい。

 

 

 

クラスは、データとメソッドから構成される。

 データとは、処理される数値や文字列などのこと。クラスに属する具体的なデータをインスタンスという。

 例えば「Cat」クラスのデータとして「タマ」「トラ」「ミケ」インスタンスが属する。

 メソッドとは、処理のこと。

 

メソッド(method)とは

 プロシージャーまたは関数の一種であり、クラスに所属するサブルーチンメンバー関数 (member function) とも言われる"

 

プロシージャー(procedure)とは

 プログラミング言語によって定義は異なるが、一般的には複数の処理を一つにまとめたもの。手続きと訳され、ルーチンまたは関数とも言う。プログラム全体のルーチンをメインルーチン、呼び出されるものをサブルーチンとも言う。保守、管理を容易にする手法。

 

インスタンスメッセージをやりとりすることでシステムが動作する。

 メッセージとは、オブジェクト間のデータの送受信。

 

メッセージは相手のクラスによって、異なって解釈される。これが多態性 Polymorphysm 

 

メッセージ自体は処理を定義していない。クラスに含まれるメソッドに処理が記載されている。このため、異なるクラスに同じメッセージを送った場合でも、異なる動作を行うことができる。これがポリモーフィズム

・・・

 

 

 

 

OOP の3つの特徴

 カプセル化 encapsulation クラスなどを利用することで、インスタンスやメソッド、データ型などを見えなくすること。カプセル化により、プログラムの変更が容易になる。例えば色を扱うとき、RGBカラーを扱うプログラムを、CMYKへと変更するとき、より少ない手間で変更できる、みたいな。Javaでは、変数に private をつけることで、ローカル関数としてしかアクセスできなくする。Java には3つのアクセス修飾子public, protected, private) が存在し、この設定により、どこからアクセスできるかを決定する。

 ポリモーフィズム polymorpism メッセージが多様に解釈されること。

 継承 inheritance クラスを、他のクラスへと引き継ぐこと。引き継ぎ元がスーパークラス、引き継ぎ先がサブクラスと呼ばれる。

 複数のスーパークラスから引き継ぐのが多重継承で、これは便利な反面、プログラムが複雑化する原因ともなる。Ruby では多重継承を制限しており、複雑さを避けるため、 Mix-in と言う方法でしか多重継承できない。他の OOP, 例えば JavaPython は一般的な多重継承をサポートしている。

 

 

これらは OOP にで一般的に含まれる:

 パッケージ:複数のクラスをまとめたもの。これを導入することでプログラムが菅家右tに記載できるようになる。パッケージは、名前が一致(衝突)しないように開発されている。

 例外:エラーが発生した場合、処理を中断してエラーを返す仕組み。

 ガベージコレクション:不要になったメモリを(自動的に)解放する機能。これがないプログラムでは、メモリの解放を明示的に指定しなければならず、プログラミングが大変になる。

 

 

変数グローバル変数、ローカル関数、インスタンス変数

 それぞれアクセス可能範囲が異なっている。

 必要に応じて使い分けましょう。

 グローバル変数はプログラムのどこからでもアクセスできるため便利だが、どこからでも変更される危険があるため仕様に注意が必要。ローカル関数などはその逆。

 

 

型付け,型チェック:静的型付け、動的型付け

 静的型づけコンパイル時に型のエラーを検出する:Java, C#

 動的型づけ:プログラムの実行時点でエラーを検出する:Ruby, Python

 

 

「強い型付け・弱い型付け」は「静的型付け」に対して使われる単語らしいが(型付けとは (カタヅケとは) [単語記事] - ニコニコ大百科)定義が曖昧なので(C#は強い型付けの言語?それとも弱い型付けの言語? - 猫とC#について書くmatarilloの雑記使うべきではない用語のようだ。

 

「入門Python3(オライリー)」では、強い型づけ(Strong typing)

 「クラスがイミュータブル(変更不可能)であること」

と書いている。

 

 

 

プログラミング言語の歴史

機械語(machine code, machine language): 0, 1 によって書かれたプログラム。ヒトには理解しにくい。

アセンブリ言語(assembly laguage):1940年代から使用されてきた。簡単な単語によって書かれ、アセンブラコンパイラの一種)によって機械語に変換される。代表的な低級言語(low-level language)。マシンのリソースが限られている場合には、現代でも使われる場合がある。

高級言語(high-level language):人間が理解しやすい文法を持った言語。1957年のFORTRAN, 1960年のCOBOLが例としてあげられている。

構造化言語(structured programing):1967年(奇しくも SIMULA67 が世に出たのとと同じ年?)にオランダのエドガー・ダイクストラ氏によって提唱。プログラムを好きな順序で実行できる GOTO 文を廃止し、移動を「巡行」「分岐(if)」「繰り返し(for, while)」の3つに限定。構造化言語とされるプログラミング言語には ALGOL, Pascal, C などがある。

 巡行は、BASICで10, 20, 30, とプログラムを書いていたところに、後から 4行目に 15 と2番目の行を追記するやつ ができなくなるのかな?

 

 

プログラム実行方式

コンパイラ方式:機械の理解できる機械語に翻訳(コンパイル)してから実行する。コンパイル後のソフトウェア実行速度は速いが、コンパイルの手間がかかる。コンパイル後、他のOSに移植することはできない。C++

インタプリタ方式:実行時に機械語に変換。実行速度は遅いが、一般にOSに依存せず、共通の仕様を実現できる。Perl, Python, Ruby. これらは、同じ作業を実装するために必要なコード記載量が少ないという特徴もあり、マシンリソースが潤沢な環境では良い選択枝。マシンリソースが限られている場合には vice versa

中間コード方式:実行前にコンパイルするが、機械語ではない中間コードまでコンパイルする。両者のいいとこ取りでOSに依存しない、比較的早い。Java, C#

 

 

プログラムのメモリ利用

静的領域(static):プログラムの開始時に確保され、プログラムが終了するまで確保される領域。

シープ領域:プログラムの実行時に動的に確保するための領域。

スタック領域:スレッド制御のために使う領域。スタック、すなわちデータをどんどん積み重ねていく。

 

 

OOP に関連した再利用技術

 クラスライブラリ フレームワーク コンポーネント:これらは名前は違うが、ほぼ同じもの。

 クラスライブラリ:複数のクラスをまとめて提供するもの。ディープラーニングでよく出てくる TensorFlow は、トップに「An open-source software library for Machine Intelligence」と記載OOP ではプログラミング共通部分(言語仕様)はコンパクトにまとめ、必要な様々な機能はクラスライブラリとして提供するのが一般的。これによりプログラム本体の変更は最小限にとどめることができる。クラスライブラリは大幅に変更されることがあり、OOPを使いこなすには、クラスライブラリを使いこなす必要がある。フレームワークは複数の意味を持ちうる。クラスライブラリと同じ意味のこともあるが、開発・実行環境などを表す「Webアプリケーションフレームワーク」とか使われる場合もあり、クラスライブラリよりも広い概念のようである。日本発のディープラーニングフレームワークChainer: 「A Powerful, Flexible, and Intuitive Framework for Neural Networks」と記載。さて、ライブラリとフレームワークはどこが違うのか?同じなのか? コンポーネントVisual BasicJava で、商品として提供された再利用部品群らしい。

 

システム開発への OOP の応用

デザインパターン(design patterns):優れたライブラリ設計のアイデアを後から再利用できるように名前をつけて文書化したもの。クラスライブラリなどから抽出され、そしてクラスライブラリなどを作るために再利用される。1995年、GoFの著書、「Design Pattern」によって広く世に知られるようになった。

 

オブジェクト指向を利用したシステム開発では、データをまとめたり、メソッド(クラス内に存在するサブルーチン)にクラスを応用することで、開発を簡略化できた。どのようなデータをどのように処理するかなど、何をどうプログラミングするかなど全体のデザインを決める上流工程でも、下流工程、実際の開発や製造すなわちプログラミングなど で OOP をどう生かすかを考える様になった。

 

UML, Unified Modeling Language:ソフトウェアの機能や内部構造を2次元の図に表現する形式を定めた世界標準。以前は多数の表記法が、様々なメソドロジストによって提唱されていた。3人のメソドロジストが1990年代中盤にまとめ、OMG(Object Management Group)が採択したことで広まった。

UMLの使い方

OOPを表現する:クラス図(クラス間の関係、継承などを表記)、シーケンス図(時系列的な動作)、コミュニケーション図(動作時のオブジェクト間のやりとり、すなわちメッセージ)

OOPをどう利用するか:ユースケース図(どのようにプログラムを使うか)、アクティビティ図(時系列的な業務の流れ。シーケンス図に似ている)、ステートマシンズ(状態遷移図と同一。業務フローチャート的な)

 

どのように開発するのかを決めるにはUMLを使ったモデリング、すなわち、図示することで理解が深まるため、システム開発を円滑にすることが期待される。

 

アジャイルAgile)ソフトウェア開発

従来のウォーターフォール型ソフトウェア開発(に対する言葉。小さなリリースを繰り返しながら段階的にソフトウェアを作り上げる。

ウォーターフォール型ソフトウェア開発とは、開発プロジェクトを時系列に、「要求定義」「設計」「プログラミング」「テスト」などの作業工程に分割し、前工程を完了してから次工程に進む開発手法。背景としてプログラミングが進行するにつれて前工程の変更コストが大きくなることがある。このため、変更を少なくし、開発の進捗を管理するのに有効な方法であった。

 将来の見通しが(一見)立てやすいメリットがあるが、プログラミングは実際には予定通りに進むことは少なく、時に「デスマーチ」に突入する。「みずほ銀行 システム開発」等の検索結果参照のこと。

 開発において、「要求定義」「設計」の成果物として大量の文書が発生するがこれは「プログラミング作成のコストよりも文書作成のコストの方がずっと低いこと」が背景にあった。

 問題点として、1.仕様変更(現場の仕様変更の希望に追従しにくい)、2.全体テストが最終段階にある(全体像に関わる問題が最終段階になるまで気付かれなくなり、変更コストが上昇する)ことがある。

アジャイル型ソフトウェア開発(初出, 2001年)反復型開発プロセスとも言う。開発対象の小さな機能に分割し、1つの反復 (イテレーション:1-4週間程度の期間)で1つずつ機能を開発し、それら中間リリースごとにユーザーからフィードバックをもらい適切なソフトを開発していく手法。反復を繰り返すことで開発を進めていく。要求定義、設計、実装、テスト、文書化といった全ての工程を、1つの反復内で行う。反復が終了するごとにプロジェクトにおける優先度を評価し直す。ウォーターフォール型と比べて見通した立ちにくいが、実態に合った開発手法である。

RUP, Rational Unified Process(ラショナル:理性的な統一プロセス):RUP は商用の開発プロセスであり、ラショナル・ソフトウェア社(UML標準化に大きな役割を果たした。2003年に IBM により買収)後に IBM 社により販売されている。

エクストリーム・プログラミング(extreme programming, XP, 初出1999年)は Agile開発の一種というか。Agileよりも先に出てきたもので、書籍で提案された概念?。その特徴は、テスト駆動、ペアプログラミングリファクタリング等、19の「プラクティス」と称される。従来は開発が進むにつれ変更コストは大きくなることから、変更が少なくてすむ(予定の)ウォーターフォール型の開発がなされてきた。XPでは様々な対策により、変更コストが大きくならないように工夫し、変更に対する柔軟性を実現する。ソースコードプログラマ中心のアプローチであり、それゆえ発注者・管理者側の忍耐が必要な開発手法である。「テストがうまくいったら鐘を鳴らして皆で喜べ」とか「お菓子を食べながらプログラミングせよ」などと書かれているらしい。

 

テスト駆動(Test Driven Development, TDD):まずテストコードを作成し、テストが失敗することを確認する。次に本体コードを作り、テストを通ることを確認。さらにリファクタリングする。不具合の早期発見、仕様変更への早期対応、モジュールの独立性維持などに役に立つ。

リファクタリング(refactoring):完成したプログラムの外部仕様を変えずに、内部構造を改善する。書籍「リファクタリング(1999年)」年に詳しく記載。従来は「動いているコードに触るな」が常識だったが、ソフトウェアを長期間にわたり、手を加えて使い続けるために有用なプラクティス。

継続的インテグレーション(Continuous Integration, CI):専用のマシン環境を用意し、数時間おきにテストを実行すること。モジュールの統合でトラブルが発生しないように、問題点を早期発見する。xUnit は様々な言語の単体テストフレームワークを総称する単語。JavaJUnit、.NETのNUnitRubyのRubyUnit、Pythonのunittestなどを総称。

ペアプログラミング:一人がコードを書く、もう一人がレビューをする(定期的に入れ替える)ことで、コードの質を改善するほか、コードの相互理解に繋がり、保守できる人を絶やさないようにする手法。

 

OOP後のトレンド

アスペクト指向プログラミングOOPを使っても、プログラムの様座な部分に分散してしまう共通な処理を分離して記述する仕組み(横断的関心と呼ぶ)。

エージェント指向プログラミング:能動的に活動する「エージェント(ユーザーの代理)」を設定。外部からのメッセージ受信により初めて仕事をするOOPに大使、エージェントを中心にプログラムを作り上げる。では「エージェント」とは具体的になんなのかは、はっきりしていない。

サービス指向:複雑で巨大化したシステムを、独立性の高いサブシステムの集合に作り替えると言うコンセプト。 

関数型言語プログラミング言語の仕組み。OOPと対立する概念ではなく、OOPかつ関数型の言語もある(例:Python)。対立する概念は命令が多言語で、機械語を表す単語を組み合わせてプログラムを記述する。7つの特徴がある。関数型プログラミングの平行が異変として、命令的プログラミング(従来のプログラミング)や論理プログラミング(logic programming)がある。

 

関数型言語の特徴

関数でプログラムを作るOOPではクラスとメソッドを使う(引数を指定して関数を呼び出す)。関数型では関数:引数と戻り値を必ず持つ を使う(引数に関数を適用する)。

すべてが式。すべての式が値を返す:従来の命令的プログラミング(imperative programming)では命令(statement)を実行(execute)する手続き的プログラミング(procedural programming)と言われるところ、式(expression)を評価する(evaluate)ことでプログラムが進行する宣言型プログラミング(declarative programming)と言われる。関数や計算のみならず、データに対しても値を返す。必ず値を返すため、関数型言語で、式は return ステートメントがない(ことが一般的)。

関数を値として扱える:関数を引数や戻り値として扱うことができる(高階関数,higher order function)

関数と引数を組み合わせられる:「部分適用」二つ以上の引数を持つ関数において、一部の引数だけを適用して別の関数を作成する(これをカリー化と呼ぶ:Haskell Curry 氏の名前より)。「関数の合成」

副作用を起こさない:副作用とは、「引数から戻り値を求める以外の仕事」。副作用を認めない関数型言語純粋関数型言語。引数を一度設定したら変更できないため、変数に値や式を設定することを代入(substitution)と呼ばず、2度と変更できないことから束縛(binding)と呼ぶ。副作用がない場合、引数が同じなら戻り値も同じになる。これを参照透過性(referential transparency)とよぶ。

 遅延評価(lazy evaluation)は式を上から評価するのではなく、必要になった時点で個々の式を評価する仕組み。

場合分けと再起でループを記述する:for や while は関数型言語と相性が悪い。終了判定のための変数を制御できないらしい。一般にパターンマッチと再起でループ処理を行う。パターンマッチは引数の値に応じて場合分けし、関数を定義するしくみ。

コンパイラが型を推測する(型推論 type inference):型変数と呼ぶ仮の型をコンパイル時に指定。型変数を使って定義した型のことを多層型と呼ぶ。ポリモーフィズムとは違う仕組みである。

 

 

プログラミング言語について 

OOP以前の高水準言語

FORTRAN(1957年):史上初の高水準言語(ジョン・バッカスIBM)。「数式翻訳」を意味する英語「formula translation」に由来する。最新バージョンは2008(2010年)。現在でもスーパーコンピュータ向けの言語として、C/C++と共に提供される。

LISP(1958年)関数型プログラミング言語らしい(ジョン・マカーシー)。いろいろと先進的な部分があり、多くのプログラミング言語に影響を与えた、らしい。関数型言語 (functional language)は、「関数型プログラミングを基本スタイルとして推奨する機能を持つプログラミング言語」で、その例として他に Haskell(1990年)、Scala(2003年)、Julia (2012年)がある。

ALGOL(1958年):命令型プログラミング言語。「アルゴリズム言語」を意味する英語「algorithmic language」に由来。ヨーロッパの研究者が、世界共通のプログラミング言語として開発した。1958年にチューリッヒ工科大学で行われた国際会議で提案されたのが起源とされる。多くの言語に影響を及ぼし、ACMや教科書や学術論文などでアルゴリズム記述のデファクトスタンダードとして30年以上使われた。使われ「」。「使われた

COBOL(1959年):グレース・ホッパーその他。アメリカ合衆国の強い関与の元で作られた言語で、政府や公的機関を中心に採用されていた。Common Business Oriented Language

 

OOP以降

Simula67:1967年登場(オルヨハン・ダール、クリステン・ニガード:ノルウェー)。最初期の OOP と言われているシミュレーション目的に作成されたプログラミング言語。SIMUlation LAnguage の abbriviation で、ALGOL60を拡張する形で1960年代に開発が始められた。

C言語 :1972年 AT&Tベル研究所にて開発。OOPではない。あらゆるコンピューターで動く古い言語で汎用性が高く、動作も速い。実行にはコンパイルが必要。低級言語と高級言語の両方の特徴を持ち、習得が難しい。C++, Java, C# など、様々なプログラミングの基礎となっている。

MATLAB:1970年代にクリーブ・モラーによって開発。学生がFortranを学ぶことなくLINPACKやEISPACKにアクセスできるようにと設計した。これを販売するために Mathworks 社が設立され、現在では半年に1度のバージョンアップを繰り返している。

Smaltalk:1980年公開。世界初のオブジェクト指向プログラミングを謳った言語? ゼロックスパロアルト研究所(PARC)で1970年代に約10年かけ3世代(Smalltalk-72、76、80)を経て整備された。元々は dynabook 「Alto」 の OS として開発された。現在はシンコムより VisualWorks(ビジュアルワークス)という製品名で主要なオペレーティングシステム向けに販売されている。

C++:1983年登場(ビャーネ・ストロヴストルップ:デンマーク)。Cの拡張版で、当初の名前は C with class であったことから分かるとおり、OOPである。クラス、仮想関数、多重定義、多重継承、テンプレート、例外処理といった機能が追加されていった。

Objective-C:1983年(ブラッド・コックス:米)。ほぼ MacOS, iOS の開発専用言語だが、2014年に Swift が出たことで今後はどうなるか。

Perl:1987年(ラリー・ウォール:米)、 AWK、BASIC-PLUS、C、C++LISPPascalsed, シェルスクリプトなどに影響を受けて作成された、コンパイル不要な動的型付け言語。元々はOOPではなかったらしい。

Python:1991年(グイド・ヴァンロッサム:蘭)。Google 3大言語の一つ(C++, Java, Python)。元々はOOPではなかったということ。

Java:1995年登場(サンマイクロシステムズ, OOP)。Java Runtime Environment JRE を使う。Java とは 開発施設の近くにあった喫茶店の名前から、とか、いくつかの由来が言われている。元々は Oak と言う名前で開発されていたが。CやC++などから多くを引き継いでいる。C++になかったガベージコレクションが追加されている。コンパイル時に中間言語コンパイルされてJavaプラットフォーム(JVM)上で動作するため、特定のOSに依存しない。プログラミング言語人気ランキング1位の常連である。

JavaScript:1995年に登場(ネスケ/Mozilla)。スクリプト言語。主にブラウザ上で実行される。JavaJavaScriptは名前は似ているが、パンとパンダくらい、オーストリアとオーストラリアくらい違うらしい。

Ruby:1995年(Mats:日)。PerlSmalltalk、Eiffel、Ada、Lispの一部をブレンドして作成された、 関数型プログラミングと命令型プログラミングが絶妙に調和された新しい言語。

php:1995年登場(1995年はプログラミング言語特異点だ。ラスマス・ラードフ:加:オランダ系)。名称の PHP再帰的頭字語である "PHP: Hypertext Preprocessor" を意味し、「PHPはHTMLのプリプロセッサである」とPHP自身を再帰的に説明している。Webページを作成することに特化した言語らしいが、いろいろだめなところが多いため、定期的にネタにされる。それでも初心者が学びやすいらしく、プログラミング言語人気ランキングをすると大体10位までに入ってくる。

R言語:1996年登場(Ross Ihaka, Robert Clifford Gentleman:ニュージーランドオークランド大学)。動的型付け関数型・オブジェクト指向プログラミング言語。統計解析向けとして開発されたフリーソフトウェアだが多機能で、機械学習ディープラーニングにも使用されている。ニュージーランドオークランド大学のRoss IhakaとRobert Clifford Gentlemanにより作られた。

C#:2002年マイクロソフトが開発。Microsoft .NET Framework 上で動き、Linux上でも(互換ソフトにて)動く。C++, Delphi, Eiffel, Java, LISP に影響を受けた。

パソコンの稼働状況を確認する。

1.Win10:タスクマネージャー

 Win + X

 Win + T

にて起動。

 

 

2.Ubuntu:システムモニター

 Super," system monitor"

とタイプする。

 

 

3.UbuntuGPUの使用状況を確認する。

 NVIDIAなら

ターミナルから

nvidia-smi

にて表示。

 

経時的に観察する場合、

nvidia-smi -l 2

で2秒おきに取得するので、使用状況を grep する。例えば

nvidia-smi -l 2 | grep Default

にて使用状況のみが表示されるはず。

 

 

4.Ubuntu, Psensor 

 CPU の稼働状況、温度、GPU の温度を図示できて便利。

 ソフトウェアセンターからインストール可能。

 

 

5. Ubuntu, バッテリー残量表示

 upower -i /org/freedesktop/UPower/devices/battery_BAT0

 upower -i /org/freedesktop/UPower/devices/battery_BAT1

パソコン設定備忘録、デスクトップDNNマシン

1.Ubuntu 14をインストール

 パーティション自分で切っても良いが、「お任せ設定」でのインストールが方が楽だし失敗しない。

 

 

2.LANを認識しないので、インテルからファイルを落としてインストールする。

 

Download Intel® Network Adapter Driver for PCIe* Intel® Gigabit Ethernet Network Connections Under Linux*

 ダウンロード

tar/zipコマンドで解凍・圧縮一覧まとめ(gz、zip、tar.xzなど)

 解凍

 tar zxvf filename

UbuntuでNICを認識しない場合の対処法 - Qiita

 解凍したフォルダー内の e1000e-3.3.4/src/ に移動し、

 sudo make install
 sudo modprobe -r e1000e
 sudo modprobe e1000e

 

 ネット 繋がったら、お約束の

 sudo apt-get update

 sudo apt-get upgrade

 

ひゃーめんどくさい。別で買った mini-ITXwifi 付きボードではこんなことはなかった。簡単に wifi 繋がっちゃうし。やっぱ wifi は便利!

 

 

3.Ubuntu 14 インストール

 日本語キーボードなら日本語Remix、英語キーボード使うなら英語版入れちゃう方が楽。

 

 

3.基本設定

 クローム、Team Viewerを入れて、しばらくはノートPCから操作する。

 Teamviewer はダブルクリック(パッケージマネージャー)でインストールできないので、

 sudo dpkg -i filename

 でインストール

 

 

4.基本設定

Ubuntu 14.04 LTSをインストールした直後に行う設定 & インストールするソフト

 

プロンプトの色変更

 nano ~/.bashrc

 

# to change color of the prompt on terminal

PS1="\e[1;36m\u@\h \e[1;24m\w \e[0m$ "

 を追加する。

 

 

5.Anaconda

 Anaconda 4.2.0

ダウンロードしてインストール

最新版はPythonがあたらしすぎて、ライブラリが対応していない場合がある。私の場合は、現状 Python3.5 を使用。

※いつの間にか TensorFlow が Python 3.6 に対応してました。

※ Conda でバージョン管理するなら最新の Anaconda でなんの問題もない。というか、一般的には最新の Anaconda を入れてバージョン管理をするべきだろう。

 

 git

 OpenCV

sudo apt-get install git

conda install opencv

 

 

 ここまで使ってみた感想ですが、ファンがうるさいですね。普段はノートパソコンを使ってますが、今時のノートは消費電力が低くファンなんてほとんど回りませんから・・・

 どうしたものか、困ったものです。。。

 

6.cuda/cudnn

  デスクトップパソコンを直接操作にて。

 

cuda

MacBookPro + Ubuntu 14.04にCUDA-6.5をインストールしようとして7.5をインストールした話 – note at home lab

インストール後、PC再起動。

ターミナルで

nvidia-smi

で確認

 

cudnn

CUDA 8.0とcuDNN 5.1をUbuntu 16.04LTSにインストールする - Qiita

 

意外と簡単にインストールできました(^^) 

 

GPGPU、むっちゃ速いです。

2016年の core-i7 積んだノートパソコンに比べて、100-200倍速でした!

あとは何をやるかですね・・・もう逃げられない感。

 

 

 

以下未検証(今後の予定) 

 

7.WOL

 遠隔で電源を入れられるようにする。

 これができれば、あとは LAN につないで目立たないところに置いておけば宜し。

TensorFlow、マシン性能/OS/仮想環境でどのくらいの差が出るか

本格的に Deep Learning を行うのに、どの程度のスペックのパソコンが必要でしょうか? 分からない場合には、実際に自分でやってみる(人柱)が有効です。

ということで、試してみます。

 

 

TensorFlow, tutorial, MNIST

http://pmonty.hatenablog.com/entry/2017/02/11/153820

隠れ層一層の、単純な NN

 

 RAM 使用量:ほぼ 0GB

 

Panasonic laptop ('12):   2.55 sec *1 *2

Ubuntu14 on VMware:    1.99 sec *3 *4

Lenovo laptop ('16):        1.31 sec *5 *6

Laptop ('16):                    1.28 sec *7 *8

i3/1070/BTO('17):            Coming soon! *9 *10

 

i5/1080Ti/BTO('17):         Coming soon ! *11

 

 

ハイスペックほど速い、順当な結果。

第三世代 core i5 から第六世代 core i7 にかけて、クロック周波数とコア数は変わってなかったけれど、明らかな速度差が出ました。また、m2-NVMe SSD が一番速い結果。

Ubuntu 14 on VMware もそれほど遅くない結果、このネットワークでは。

 

 

 

TensorFlow, tutorial, MNIST, CNN

http://pmonty.hatenablog.com/entry/2017/02/13/103000

 

    RAM使用量:5.4GB

 

Panasonic laptop ('12):    37min 52 sec *12

Lenovo laptop ('16):         48 min 56 sec *13

Laptop ('16 RAM 4GB):   走らず!

Ubuntu14 on VMware     5 hr  *14

i3/1070/BTO('17):            Coming soon!*15 *16*17

i5/1080Ti/BTO('17):         Coming soon ! *18*19 *20

 
*21

*22

*23

*24*25

 

 

メモリ(RAM)が足りないとクラッシュすることを確認。なるほどね~だから必要なんだね。

新しい Lenovo laptop が、古い Pana に負けるという衝撃の結果!!

Panasonic連続2回走らせると、2回目に 10% 程度遅くなり、排気がものすごく熱くなります。冷却が間に合わず、クロックに上限かかってそうな経過です(2165,  2379秒)

3回目の途中から、排気がスムーズになるよう、排気口を少し持ち上げ、テーブルの端に設置。排気の温度は下がり、速くなりました(2107秒)

4回目は最初から、排気に気をつけた設置です。最も速い結果でした(2088秒)。

 

Lenovo laptop (2016) は当初、3面ディスプレイ環境。Jupyter Notebook:  2995 sec、2回目、コマンドプロンプト、3005sec,)。Web 見たりもしてました。

3回目からは外部ディスプレイを切断、ほぼ無操作で計測。約 2800 秒、これが実力に近いのでしょうか。それにしたって Pana よりも遅すぎます。

 

そして Ubuntu14 on VMware はむちゃくちゃ遅い。少し複雑なネットワークになると圧倒的に遅くなってしまいますね。

早く GPGPU を試してみたい。。。

 

 

 

RAM と Windows, どちらのせいで遅いのか

先ほどの結果、最新の Lenovo は遅く、古い Pana の PC の方が速い。こりゃおかしいわけです。

さしあたって考えられる原因は2つ

  1.RAM dual channel

  2.Windows

Lenovo は 4 + 16 GB ですが、Pana は 8 + 8 GB できちんとデュアルチャンネルにしています。Lenovo の方がシングルチャンネル。この影響で、遅いのかもしれません。

 

また、Windows の影響かもしれません。Windows では様々なプロセスが動いているはずで、それで遅い可能性もあります。

とりあえず、検証してみます。

 

Lenovo ('16) with Ubuntu32 min 22 sec *26

Pana ('12) with Ubuntu:     37 min 52 sec *27

Pana ('12) with Win7:         48min 13sec *28

Lenovo ('16) with Win10:   48 min 56 sec *29

 

やはりというべきか・・・

Deep Learning やるなら Linux、みたいなことが書いてあったりしますが、なぜ先人がそのように言うのか確認できました。

 

最新の Windows ほど遅いという結果が得られました…。

 

同一 OS での速度差を考えてみます。

Ubuntu 14 を使えば、Pana より Lenovo の方が速い結果。Pana は中古で買えば 5万円くらいかな、というスペック。Lenovo のは新品で、パーツ交換含め、20万程度だろうと。ディープラーニングのハード整備で言えば、中古の方が圧倒的にコスパ良さそうですね。

 

 

 

検討マシン

Panasonic laptop (2012)

    Let's Note SX2

    core i5-3320M  @ 2.60 GHz, 2 core, with hyperthreding (HT)

    RAM 16GB  DDR3L-1600 (8+8GB)

    SSD (SATA3)

    Ubuntu 14.4LTS日本語Remix, Anaconda 4.2.0, Python 3.5, TF 1.0.1

  ※ Win7/Ubuntu14 デュアルブート

 

Lenovo laptop (2016)

    Thinkpad T460

    core i7 6600U  @ 2.60 GHz 2 core, with HT

    RAM 20GB, DDR3L-1600 (4 + 16GB)

    SSD (SATA3)

    Windows 10, Anaconda 4.2.0, Python 3.5, TF 1.0.1

        ※ Win10/Ubuntu14 デュアルブート

 

i3/1070/BTO('17)

    ASUS TUF270-2

    Core i3-7100 @ 3.9GHz, 2 core with HT

    RAM 8 GB, DDR4-2400

    SSD SATA 525GB + 3TB

    GeForce GTX 1070

    Ubuntu 14.4, Anaconda, Python 3.5, TF1.0.1, CUDA 8.1, CuDNN 5.1

 

 

i5/1080Ti/BTO('17)

    ASUS TUF270-2

    core i5-7600K  @ 3.80 GHz, 4  core, no HT

    RAM 32 GB, DDR4-2400

    SSD m2-NVMe 500G + 3T HDD

    GeForce GTX 1080Ti

    Ubuntu 14.4, Anaconda, Python 3.5, TF1.0.1, CUDA 8.1, CuDNN 5.1

*1:2.63, 2.48, 2.53

*2:Ubuntu14.4 第三世代 core i5, 16GB, SATA3-SSD

*3:1.95, 2.01, 2.00

*4:on Lenovo Win10

*5:1.30, 1.31, 1.31

*6:Win10 第六世代 core i7, 20GB, SATA3-SSD

*7:1.36, 1.22, 1.26

*8:Win7 第六世代 core i7, 4GB, m2-NVMe SSD

*9:1.00sec: 1.09, 0.96, 0.95

*10:参考:i3-6100,  NO GPU: 1.24 sec

*11:0.94sec: 0.92, 0.95, 0.95

*12:Ubuntu 14, ave: 2272; 2165,  2379,  2107, 2088 sec

*13:Win 10, ave: 2936; 2995, 3095, 2781, 2873 sec

*14:on Win 10, 186.2, 177.8 sec x100, on Lenovo Win10, 1/100 session のみ行い100倍。超遅い!

*15:28.36sec, 29.13, 27.91, 28.36。パーツ代10万円くらいです。コスパ的にはすごく良いです

*16:10万ステップ(5倍)で 136.93, 136.60sec

*17:100万ステップで 1495秒、発熱69度まで。EVGAオリファンモデル

*18:15.39sec, 15.36, 15.41。なお、初回のみ70.36秒かかりました。sess global_variable_initializer で時間がかかっていました

*19:10万ステップ(5倍)で41.73, 41.14sec

*20:100万ステップで 417 sec 発熱84度まで。GIGABYTEファウンダーズ

*21:参考:i3-6100, RAM 4GB, SATA3-SSD + 1080ti: 15.97sec: 15.95, 15.98, 15.98

*22:参考:i3-6100, RAM 4GB, SATA3-SSD NO GPU: 23 min

*23:参考:i5-7600K, RAM 32GB, NVMe-SSD + 1080ti: 27.04sec: 27.78, 26.66, 26.68

*24:参考:i5-7600K, RAM 32GB, NVMe-SSD + 1080ti + 1070, No SLI: 8.68 sec/20000, 9.18, 8.43, 8.43

*25:10万ステップで42.68sec, 100万ステップで 421sec

*26:ave 1917; 1893, 1870, 1980 sec

*27:2272 sec; 再掲

*28:ave 2824; 2714, 3072, 2687 sec

*29:2936sed; 再掲

ついに Deep Learning 用パソコンをオーダーしました。

表題通り。

 

基本スペック

 OS なし(Ubuntu14LTS or CentOS 7 予定)

 Core i5-7600K

 RAM 8GB (32GB追加予定)

 HDD 3TB (SSD 追加予定)

 GeForce GTX 1080Ti

 Chipset Z270 (2 way-SLI可能、RAM max 64GB)

 Cosair Carbite 300R

 

以上で約20万円。

さんざん悩んだのが

 

CPU, RAM, GPU

 

CPU/RAM は、

 Xeon (RAM 最大 1T 以上)

 i7-6800K (RAM 128GB, 6 core 12 thread)

 i7-7700K (RAM 64GB, 4 core 8 thread)

 i5-7600K (RAM 64GB, 4 core 4 thread) 

 

GPU は、

 1080 (空冷 or 水冷)

 1080 SLI (空冷 or 水冷)

 1080ti

 

選択肢がありすぎる(選択肢がありあまる)。

ただ、GTX 10系では、値段と速さ、値段と RAM 量が相関するので、悩んだら高いのを買っておけば良い。

 

 

悩んだ原因になったのが

gihyo.jp

 

お勧め構成として、

 「RAM 128 GB 程度を推奨」

とある。

 

これを読む前は、

Lenovo Ideacentre Y710 cube 

kakaku.com

みたいな、コンパクトデスクトップを買おうと思ってたんですけど・・・

この本読んで早々に除外。なぜなら、RAMmax は 32GB。

 

RAM 128 GB で買おうとすると、

 CPU Core i7-6800K 以上 (5万円以上)

になるので、必然的にお高くなり、30万円〜と言うところ。

 

d.hatena.ne.jp

しかし、同著者の過去のブログには

 SSD 480GB

 RAM 32GB

 GPU 980ti

位で良いと書いていますね。

980ti は、今で言えば 1080 相当程度でしょう。

 

    SSD 500GB

    RAM 32GB

    GPU 1080

でも良かったかも。

 

いずれにせよ、core i5-7600K を選びました。7700K と悩みましたが、一万円以上の差があり、core i5 に。

冷却では、水冷せず、空冷のみにしました。

 

水冷は、

 トラブル面倒。

 重い(水冷1個で 1kg 。重いのは嫌い)

 金がかかる

ので却下。

 

CPU クーラーも Intel 純正に。

 

数日連続で GPU を走らせる状況では、冷却水も熱くなり、クロックに制限がかかりそう。水冷のメリットは少ないと判断。 

 

基本的リモートで使う予定なので、水冷で静音化必要なし。

 

BTOで選べるパソコンケース、ゲーミングPC だけあって、

側面透明なタイプが多かったですが、

kakaku.com

(こんな感じの)

 

かっこいいですが、GPU 空冷効率も考えて、側面は透明ではないパネルで、開口があるタイプ、14cm大口径ファン対応を選びました。

jisakutech.com

 

側面透明タイプは、アクリル部分の強度を保つためか重い傾向があり(10kg程度。自分が選んだ、側面不透明タイプは7kg台)ました。また、透明モデルは側面開口なしがほとんど。空冷に不安あり。

 

速く遊んでみたいです。

Deep Learning 向けの PC/GPU その3(まだ買ってない)

Deep Learning 用の PC ですが。

 

 結局「ゲーミングデスクトップPC」を買えばいい

 値段と性能が比例するので、買える中で高いのを買っておけばいい

 

というところで落ち着きました。

 

以前はいろいろネットで調べて、

 

 消費電力の低い Quadro がいいんじゃないか

とか

 FP16 とか ユニファイドメモリとやらに対応した、Pascal アーキテクチャがいい

とか

 将来の拡張性(SLI)を考えて、Z170 chipset のパソコンがいい

とか

 

 

思っていたのですが、いざ練習を始めてみると、

 ディープラーニングのライブラリを使うので、FP16 とかユニファイドメモリとかは自分で設定しない

ことが分かってきました(できるのかもですが、やり方わからず)。

 また、「将来を考えて Z170」は間違ってはいないのですが、GeForce GTX 9系から 10系への進化を見て(特にメモリ増量)、パソコン購入後 4−5年は使い続けるだろうことも考えると、GPU は買い替えになる可能性が高く、Z170 にこだわらなくて良い気がします。

 

 Z170 にこだわるとすれば GPU-RAM 関連ですが、値段との兼ね合いから

  1070 x 2, 16GB, GPU 2枚で 10万円程度

  1080ti x 2, 22GB, 20万円程度

 になるでしょう。

 しかし、SLI が必要なほどにデータ量が多くなれば、学習時間も自ずと長くなるでしょう。実際にはハイパーパラメータの調整で何度も試行錯誤するでしょうから、SLI が不要な程度までデータ圧縮するほうが良いかもしれません。

 また、本当に SLI 必要になった時に PC を買い足せば、2台体制で何かと便利かもしれません。別のプロジェクト を走らせるとか。

 さておき、GTX 10系のゲーミング PC として、何を選ぶべきか。

 ハイエンドの 1080ti は、性能引き出すのに水冷が必要でしょうから、私のような素人が選ぶのは躊躇します。そうなると、素人にとっての最高性能、GTX 1080(メーカー品、20万円超え。BPOメーカー、20万円切る程度)、または、性能が少し劣るがメモリ量十分の GTX 1070 を載せたゲーミング PC (BPOで、15万円〜)が、無難なような気がしています

 

突然のトラブル

ThinkpadUbuntu 14.04.5 にトラブルが起こり、急ぎ検証しました。

 

しばらくタッチパッドをオフにして、トラックポインタのみにしていました。あるときトラックポインタとボタンが効かなくなり、電源ボタンにてシャットダウンを余儀なくされました。

 

また、日本語入力の切り替え(日本語入力←→直接入力)ができなくなりました(Mozc + iBus)。

 

・・・

日本語入力に関しては、Mozc + fcitx が一般に勧められているようで、そちらへの移行を試しましたが、どうにもうまくいきません。

 

日本語入力の切り替えができないのは、terminal、chromeでした。

gedit では切り替え可能でしたので、アプリの種類も関連しているようです。

Terminalはネット記事を参考に解決しましたが、肝心の Chrome のが解決できませんでした。

 

クリーンインストールになれた Win user としては、クリーンインストールしたくなります。

・・・

 

日本語入力のトラブルは、日本語Remixをインストールすれば防げます(プリインストールされていますので)。

日本語 Remix ブータブルディスクを使って起動してみます。すると、問題がありました。

 

 16.04 LTS 日本語リミックス : 画像解析ソフトインストールに必要な、一部パッケージがインストールできない。解析ソフトというのは AFNI ですが、

  libmotif4, libXp6

 というパッケージが、 sudo apt-get install にてインストールできません。

 libmotif4 は、ネットに落ちているのを拾うことができましたが、libXp6 は見つかりませんでした。AFNI を入れない、という割り切りもありですが、大変高機能なので一応入れておきたいわけです。

 

 14.04 LTS 日本語リミックス:LAN を認識しない。

 古い PC, Ivybridge を積んだ laptop にインストールすると、問題なく LAN を認識してくれますので、ドライバ周りのトラブルかと思いました。自分でドライバを見つけられれば解決する問題ですが、大変そうなのでチャレンジしませんでした。

 また、トラックポインタとクリックボタンが作動しないという致命的問題もありました。

 AFNI は問題なくインストールできました。

 

 

・・・

解決策は

 Ubuntu 14.04.5(英語版) を使うこと

です。

 

 これは、当初 2014 年に出た Ubuntu 14.04 をアップデートしたもので、 2016 年に発表されました。

 AFNI の問題と LAN の問題は解決します。

 なお、この OS を入れていた現在のパソコンでトラックポインタが効かなくなったので、その点は心配です。また、日本語入力で再びトラブルが起きる可能性があります。

 

Ubuntu14.04 のセットアップで参考にしているページがあるのですが、

Ubuntu 14.04 LTSをインストールした直後に行う設定 & インストールするソフト

 

この中での 日本語入力の fcitx-Mozc の設定はやっていませんでした(iBus-Mozc使用)。

この設定をきちんとやれば、問題は起こらない、かもしれません。

 

d.hatena.ne.jp

d.hatena.ne.jp

 

Ubuntu のリカバリの記事はいくつか見つかりましたが。

まだ入れて日が経ってないし、今回はブータブルUSBからクリーンインストールしようかと。

 

・・・

2016/3/14追記

 

Ubuntu 14.04.5 を再インストールしまして、上記の問題は解決しました。

ただし、今後、長期に使って行くには、よりサポート期間の長い CentOS7 に移行した方がいいのかな、と 最近は思っております*1

 

*1: Ubuntu のサポート期間は 2年または 5年:長期サポートを約束している14 LTS, 16 LTS は5年、そのほかは 2年。私の使っている Ubuntu 14 は 2019 年まで。CentOS のサポート期間は 10年。現行の CentOS 7 は 2024 年まで!

Ubuntu 14.04初期設定

 

ThinkpadUbuntu 14 を入れて dual boot としました。

軽い OS で使いやすいですね。

 

Windows 側のパーティションは簡単にマウントできるため、Win10 のファイルも扱うことができます。逆に Windows 側からは Ubuntu 側が見えません。

このため、今後は Ubuntu がメイン OS になりそうです。

 

さておき、やったことを、リカバリー時のため、備忘録として残しておきます。

 

 

1.  パーティションを切る*1

 

2.  Ubuntu 14.04.5 をインストール*2

 

3.  バッテリー管理ツールのインストール*3

 

4.  インストール後、まずやること*4

 

5.  Chrome のインストール*5

 

6.  LINE のインストール*6

 

7.  AFNI のインストール*7

 

8.  freesurfer のインストール*8

 

9.  FSL のインストール*9

 

10.  exFAT を認識できるようにする*10

 

11.  Anaconda のインストール*11

 

12.  RStudio のインストール*12

 

13.  TensorFlow のインストール*13

 

14.  ウィンドウズの復元ドライブを 1GB → 11GB に拡大*14

 

15.  ファイアーウォールを設定する(gufw)

 

16.  アンチウイルスをインストールする (ClamTK)*15

 

17.  ターミナルのプロンプトの色変更。*16

 

18.  ブータブルディスク作成(USB)

 

19.  Mozc を default の IME に設定。IME の ON/OFF を、「Ctrl + `」に割り当て

 

現状を確認しておく。

 

SSD使用 35GB, 空き 56GB

 

$ free -h

RAM は total 19G, used 6.3G

Swap は total 29G, used 0B

 Swap こんなにいらないのかな?

 ハイバーネート、しなそうですし。 

 今後の課題です。

 

 

$ sudo parted -l

モデル: ATA Crucial_CT2050MX (scsi)
ディスク /dev/sda: 2050GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt

番号 開始 終了 サイズ ファイルシステム 名前 フラグ
1 17.4kB 134MB 134MB msftres                       # ブートローダ
2 135MB 408MB 273MB fat32 boot                   # Windows ブート領域?
3 408MB 1910GB 1909GB ntfs msftdata          # Windows 10
5 1910GB 1910GB 256MB ext4                        # Ubuntu 14.04.5 ブート領域
7 1910GB 2007GB 97.4GB ext4                       # Ubuntu 14.04.5 データ領域?
6 2007GB 2039GB 31.2GB linux-swap(v1)       # Lnux Swap 領域
4 2039GB 2050GB 11.8GB ntfs msftdata          # WinRE DRV

 

SSD 2TB はたまらんです。

データにずいぶん余裕があります。

でもやっぱり高いので、次の買い替えでは 1TB に断捨離したいです。。。

 

*1:Windows 管理ツールにて。Ubuntu 用に 100GB, Swap に 30 GB 、合計 130GB を「未割り当て領域」として確保

デュアルブートと言っても、こんな複雑なことはしないで| ライフハッカー[日本版]  データは Windows 領域に保存する方針です

*2:最初 BIOS に入れなくて焦る。画面には「スタートアップを妨げるには press enter」  と出るのだけれど、本当は「F1」!!。

途中でインストールが何度か止まって焦った。コマンドラインで「Enter」を押したり、「Skip」をクリックしたりしたけど、良かったのか分からない。

*3:ThinkPadのバッテリーの充電・放電閾値をLinuxから設定tpacpi-bat と言うソフトを使い、バッテリー充電開始と充電終了を管理できる。

ブログによっては tp-smapi というソフトを押しているが、最近の thinkpad では tp-smapi は使えないtp_smapi - ArchWiki

なお、どちらも "tp" が示すとおり、thinkpad 専用ユーティリティ。他社では使えるか不明

*4:Ubuntu 14.04 LTSをインストールした直後に行う設定 ブログを参考に、気になるものだけ適当に設定。日本語入力は第297回 Ubuntu 13.10でインプットメソッドFcitxを活用する:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社を愚直に実行する

*5:Ubuntu 14 と 16 とで方法が違い、これに失敗するとその後のインストールに差し障りが出るので本当はやりたくなかった。が、その後の setup に必要なので、仕方なく

Ubuntu 14Ubuntu16

*6:Chrome 用の拡張機能Ubuntu:LINEを使う方法。Webベースで動く。これも後にしたかったが必要だったので。

Wineを使ってデスクトップアプリ版の LINE もインストールできるらしい。【Ubuntu14.04】LINEインストール

*7:HP 記載通りで簡単に終了1.1.2. The essential system setup for: Ubuntu Linux — AFNI

*8:HP 記載通りで簡単に終了Ubuntu 14.04 へのFreeSurferのインストール

*9:こちらHow to install FSL on Ubuntuでは一部パッケージがインストールできず、英語だけどこちらからInstall a package — Debian Neuroscience Package Repositoryのほうが良い。と言ってもコピペするだけなので楽。

*10:外部 HDD, SDXC 認識のためUbuntu 14.04 でexFATをマウントする

*11:最新版 4.3.0 (Python 3.6) は起動しなかった。Python 3.5 版の Anaconda3-4.2.0-Linux-x86_64.sh インストール にて無事 起動

*12:ダウンロード、ダブルクリックで簡単にインストール完了Download RStudio – RStudio

*13:

conda create -n TF

source activate TF

pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.0-cp35-cp35m-linux_x86_64.wh

*14:こんな恐ろしいブログ記事を見つけた。Win10 のアップグレードの際に回復パーティションの容量が足りないと、アプデ時に新たなパーティションを作るということ。これによって Ubuntu をブートするパーティションの位置が変わってしまい、ブートローダーの情報と合わなくなることで Ubuntu が起動しなくなるということ。

元々 1GB だった Windows の 回復パーティション(WinRE DRV)を、Ubuntu 14 ライブ CD の GParted を使い、10GB まで広げておきました。現在使用料が 300MB くらいなので、Ubuntut 14 のサポートが切れる 2019 Apr までは問題なく保ってくれるはず

*15:スタートアップを試したが、結局手動で使うことにした。

自動で起動・ウイルスデータアップデートするが、scan は時刻固定か手動。起動時 Window 最小化もできず(ソフト: devilspie, gdevilspie を試す。python2 らしく、今の python 3 環境では動かない。アンインストール。今から思えば

$ conda create -n py2 python=2.7

$ source activate py2

で仮想環境を作って、動くか試してみれば良かった。

*16:

~/ にある .bashrc に一行追加する。

PS1="\e[1;32m\u@\h$\e[0m "    # light green は acceptable.

PS1="\e[1;33m\u@\h$\e[0m "    # light yellow はかぶらないしこれにしようか。

PS1="\e[1;34m\u@\h$\e[0m "    # light blue は ディレクトリと色がかぶる

PS1="\e[1;36m\u@\h$\e[0m "    # 結局 light cyan は ln -s と色がかぶる。

 上記の 1:36m とかの "1:" の部分を削除すると、濃い色になるみたい。良く分かってないので嘘かも。

結局

# to change color of the prompt on terminal

PS1="\e[1;36m\u@\h \e[1;24m\w \e[0m$ "

とした (名前がシアン、ディレクトリがブルー。プロンプトは白)。

編集には、

nano ~/.bashrc

sudo gedit ~/.bashrc

などを使用。