SANMAN

思いつきの考えを垂れ流すブログ

独学に必要なこと(個人の感想)

なんかながい

いま、ポエムを書くとき

電子計算機はどのように実現されているのか?
どうやってアプリケーションが実行されているのか?
インターネットはどうやって実現されているのか?

「コンピュータに関するすべて」を理解したくて情報系の学科に入ったはいいが、本を読んでも、授業を受けてもピンとこない。本での独学厳しい...という愚痴を見た。前半は日本語でおkと言いたくなる文だが、気分が落ち着いてから書かれた後半は割と普通。
anond.hatelabo.jp

興味はあるみたいだけど、立ち止まってるという「なにしに金払って情報学科に通っているんだ?」という状態。 教員にメールでも送って、その良く理解できない本を持参してアポとって質問しに行けばいいじゃないか。
独学の仕方がわからないとか、そういうのも質問すればいいじゃないか。
と言いたいが、この受け身な状態や、イメージがつかない感覚は非常に身に覚えがあるのでわからんでもない。

ブコメではボロカスに言われているが、興味を持っている対象はとても良いと思う。

OSより下の階層、たとえばALUとメモリの組み合わせで、program counterを進めながら動いてるんだよーという感覚はあるので、 それがOSとどういう風につながってるのか、とか、100均で売ってる電卓、あのデジタル表示の部分がどういう仕組みで動いてるの、ということを考えたり、 インターネットプロトコルでパソコンが具体的にどういうパケットを送信しているんだろう

どうなっているんだろうと不思議に思えるというのはひとつの才能だと思うから、立ち止まらずに取り組めば良いエンジニアになれるのではないか。
今、理解したいと思っている内容は正解やお手本がある段階のものだし、まだ若さも時間もあるし、指導者もいる。
天才でもなければ、まずはよくわからないまま手を動かして失敗して、たくさんの文献から正解を探したり、ネットできいてまた手を動かして...をひたすら繰り返すしかないと思う。 百均の電卓バラしてFPGAにつないでベアメタルソフトウェア(OSなしのソフトウェア)でも書けば、だいぶ理解が進むと思う。
ラズベリーパイとかでもまぁいいけど、CPUに必要なものが自作できるし試せるから、再開発可能な車輪がたくさんある。 ARM搭載FPGAとかにしておけば、FPGA領域に手を出せなくてもラズベリーパイと同じくARMマイコンボードとして使える。

学校の授業は無意味なものではなく、やりなおしの勉強するときや、技術的に新しいことに挑戦する際の基礎体力みたいなものとして意味がある。多くの人にとっての英語や数学みたいなものだろう。

自分は就職活動しているときの求人情報でFPGAの存在を知って、「CPUとか作れるんだ。へー、おもしろそう」ってだけの興味本位で潜り込んだために、半導体関連のまともな教育を受けていなかったデメリットをとても感じている。とりあえずの仕事になれてきて色だそうとすると今までのツケがのしかかる。 記憶の片隅に残っているのと、ゼロからスタートではだいぶ辛さ違うと思う。数学の勉強しなおしとかでよくある「あー!そういやこれやったわ」みたいなのが全くないし、単語すら見たことも聞いたこともなかったり。
かしこい頭脳は持ち合わせてないわ、スキルも足りない。でも、なんだかんだいって興味が収まらないからできないなりにやるわけです。

実務ではどうやってるのか具体的に知りたい気持ちもわかる。けれども、具体的となると職場によって様々なので、実際に働くしかない。働けなくても、MISRA-Cみたいなある種の業務上要求されることがある規格もののコーディングガイドラインとか、Linuxのコーディングガイドラインを読んで、従ってみるというのもあるが。

なお、LSI/FPGAでのハードウェア開発だと以下の本が、平易で良いと思う。筆者の実務経験を交えて、筆者はアーキテクチャをどう決めるかについて書いてある。浮動小数除算器の設計コードや、軽量CPUの設計コードとか簡易アセンブラの作製法とかまで書いてある。

独学に必要なこと

自分が思うに以下の4つ。言うは易く。

  • プライドを捨てる
  • 手を動かす
  • 検証する
  • 環境を活用する

食指がどうにも動かないのであれば、むいていないとか、実は大した興味でないということで、諦めるのもOK。 興味本位でいろいろ手を出してみて、自分から動きだすようなものを若いうちに見つけるほうが大事だと思う。

独学のやり方についてはベストセラーでおなじみのポリアの本が良い。独学に限らずいろんな応用ができるし、表紙めくっただけでどのようにやればいいのか即わかるのもいい。

プライドを捨てる

個人的にこれが一番難しいと思う。捨てきれない。にんげんだもの
死ぬまで気をつけるしかないと思う。

  • 他人と自分を比較しない
    他人との比較は無意識にしまうものなので、自制する。 「俺のほうがこのスキルが優れている」だとか「あいつはダメだ」、「この集団の中で俺は一番ダメだ」とか思い始めたら思い直す。 こういう比較にとらわれていると、全くと言っていいほど成長しないと経験上わかったのでしないほうがいい。
    まじめに考えるのは期末試験だとか人事評価の時くらいで十分。 そんなことをしている暇があったら調査、実験、実装、なんでもいいから手を動かす。 伸び悩んでるときとか、なんかしら問題あるときとか、老害化したときとかにこうした思考をしているので、見直す。過去の自分と現在の自分の比較はOK。やる気出る。

  • わからないこと、知らないことを把握し、隠さない
    知らないことはまあいいとして、わかっていないことが多い状態だと、わからないことの把握は結構難しい。理解が浅いと、わかっていると思っていたことが実はわかっていなかったとかよくあるし、浅すぎるとわからないことがわからない状態に。自分の知る限りだけど、賢いと感じる人ってこのへんはっきりしてるし、隠さない。

  • 間違いを認める
    難しい。ピタゴラスはサモスの賢人だったけれど、無理数の存在を認めなかったし。
    個人的には、成功体験の繰り返しが、最終的に人の成長を阻害すると思っている。今までうまくいっていたやり方に固執したり、何かで素晴らしい成功を収めて天狗になったまま帰ってこなかったり。 自分の判断や考えは正しいとはかぎらないということを頭の片隅にいれるくらいしかないのか。

手を動かす

やればできる。やらないとできない。年単位でブランク開くとできなくなる。
最初は写経のように真似して覚えるしかない。

  • 設計する
    ポリア本でいうところの第1、第2に相当。
    設計仕様書とか要求仕様書とか情報系の学校で書くんだろうか?
    学部卒で就職して一番最初に困った。
    設計というのは言ってみれば考えまくって仮説を立てることなので、類似例を調査したりいろんな案をだしては潰してつくっていく。
    つまり卒論。頭を使うので、ひたすらやるしかない。
    学部卒でなければ卒業までに論文10本くらいは書くらしいからそれが応用できる。

  • 実装する
    ポリア本でいうところの第3に相当。
    頭はあんまり使わない。
    「あれれ?」とか「うーん」って頭使い始めたら設計に不備がある。
    設計に立ち戻ることはよくあるので、気軽に戻る。

検証をする

ポリア本でいうところの第4に相当。
次につなげるために、うまくいかなかったこと、うまくいったことについてふりかえる。 自分だけかもしれないが、うまくいかなかったことは自然と考えを巡らすけれど、うまくいったことについてはあまり考えないことが多いので、注意する。 なお、組織においてPDCAのCとAがキチンと実行されることはあまりない...。Pすらもないことも。 個人的にはPよりもCとAに時間をかけたほうがいいと思う。Pの精度が上がる。

環境を活用する

学生はわからなくてあたりまえだし、新卒も若手もできないことはいろいろあるけど若いというだけで許される雰囲気がある。なのでかなりアホみたいなレベルの疑問や質問は早い段階にする。その機会を逃すと、たとえば40代になったり肩書きがいろいろついたりすると、質問がとてもし難い雰囲気がほとんど。でも、必要なことをわからないまま、できないままに年月を重ねるのが一番やばい。
ただ、周りの人次第なところがあるので、「最近の若者は〜」的な感じなことをだけ言って、ちゃんと教えてくれない人もいる。学校の教員であれば、まあメシの種だし無下に扱われることは少ないと思う。会社だったら「学校で習わなかったのかよ〜」とか小言とか言いつつも教えてくれる。教え方が合わないとかはあるかもしれないが。
専門書が多数ある一般の図書館とかそうそうないし、各種学割もあるし、なにより若さと残り時間が段違い。
SNSだとかインターネットのおかげで実際に仕事をしている人たちのあれやこれやを眺めたり、直接質問したりもできる。

おわりに

卒論のおかげで能動的に物事を探求する行為、いわゆる学問をするということを自分なりにでもイメージがはっきりしたのが、大学へいってもっともよかったこと。
覚えが悪かったり、かしこさが足りないとか、これまでの勉強不足とかは気にしたところで今更どうしようもないので、折り合いつけてやっていくしかない。 でも、一回就職してから大学行くような世の中にするといいんじゃないかなぁ、とか思いながら社会人院生とかたまに見てる。 やりなおせるなら小学生からやりなおしたいところだが。

GoogleのTensorFlowのハードウェア高速化について

まとめ

  • ソフトウェアとしてのTensorFlowを公開する前に専用ASIC作ることを決めてたGoogleの決断力
  • 戦略的に使われる金の力はすごい
  • 手持ちのTeslaなどのGPUは売り払い、その金でGoogle Cloud Platformを使おう
  • 貧乏人はFPGAGPU使ってろ

はじめに

Googleが自社の機械学習向けライブラリTensorFlowを高速化するハードウェア「TPU」を1年前以上から稼働させていたという記事が流れてきた。

jp.techcrunch.com

GPUFPGAを使ったハードウェアアクセラレーションはいまとなっては珍しいものではなくなったが、この記事の恐ろしいことはASIC、つまり完全なるカスタムなLSIGoogleが作ってしまったということ。
ASICを作るというのはだいぶヤバい。
GoogleはVP9のRTLを提供していたり、ハードウェアエンジニアも結構雇って怪しげなハードウェアを研究開発させているので、作ろうと思えばいつでも作れる会社だ。なので技術力が特別すごいという意味ではない。インターネット系企業と考えると異常だけど。
http://www.webmproject.org/hardware/vp9/

TPUは機械学習の学習のアクセラレーターということだそうなので、今回一番痛手を受けるのはGPUベンダだろう。 スループットも消費電力も負けたGPUなど、おとなしくゲーム画面作っていろという感じだ。 FPGAは第3のプロッセサーなどというのは妄想に終わりそうで痛手を受けるけれども、本来の魅力であるIOの柔軟性などもあるので、その方面からある程度はくいこめるかも?

ハードウェア開発について

ハードウェアやったるぜ!という意気込みはあっても、1品種のLSIを作るとなると時間もかかるし金もかかる。
開発期間年単位、開発費は億単位。
何百万個チップを作るとかいろいろと状況によるからなんとも言えないが、先端よりのプロセスでまともに1プロジェクト完遂するとなると開発期間1年で実質10億とか?

CPUのプロセスが14nmだとか言っている現代で、90nmとかでもとりあえず1億は用意しないと声を発する権利すら与えられない。
ハードウェア開発自体の技術的な難しさはあるが、そんな瑣末なことよりも金の心配がすべてだ。
よく金に物を言わせるというので「札束での殴り合い」などと表現されるが、ハードウェア開発においてはそれが「金塊での殴り合い」に変わる。 400トロイオンスのラージバーだ。

プロジェクト化されるような仕事は成功する保証などない(簡単なことはプロジェクトにならない)のだから、失敗を考えると10億、20億とかは捨てる覚悟が必要。
Googleですらチップのリビジョンが2あるくらいなので、1回で欲しいチップが作れるはずはまずない。
人員も、開発環境もない0から状態でハードウェアを1つ作ろうと思ったら100億くらいは用意したい。

そんなわけで、ASICを作るのは主に金がつらいので、FPGAGPUといった準汎用チップを活用していた。 FPGAGPUも20nm付近のかなりの先端のプロセスなので、90nmとかのプロセスで一から作るより、1000個くらい欲しいとかいうレベルなら非カスタムであっても買ってしまったほうがトータルで安いことが多い。

最強はASIC

金や時間といったコストが最強に高いASICだが、このコストを回収できるような算段ができていれば、消費電力、性能、1チップあたりの単価において最強のパフォーマンスを発揮するのがASIC。 たとえばAppleiOSバイス向けに自社のカスタムASIC(CPU)を作っている。
以下の記事をみるとiPhoneは3ヶ月間の集計で4、5000万台売れている(本当か?)とか書いてあるので、一ヶ月あたり1000万個はカスタムCPUチップが消費される。iPadなどにも同様のCPUは使っているので2000万個くらいかもしれん。

CNN.co.jp : アップルの「iPhone」販売台数、10億台近づく

これだけ数が出るといくら初期に開発コストがかかるとはいえASICが最強。 回収できてしまえば最強。 これくらいの数になると、たとえ瑣末であってもカスタム要望あるのにASICしないとか頭がおかしい疑惑が出てくる。

なお、MacbookなどのAppleのパソコン系は四半期で500万台とかいうレベルなので、タプティックエンジンみたいなiOSバイスでも使えるものでもなければカスタムASICをおこすメリットは低いと判断されているっぽい?

高度な戦略

すでに1年もの期間、カスタムハードウェアを稼働させていたという点から、Googleが早い段階から機械学習とTensorFlowに並々ならぬ関心を持っていることがわかる。

以下の記事は今回のTPU設計に関係したベテランハードウェア設計者へのインタビュー記事。 www.eetimes.com

これを見ると

  • 3年以上前にはFPGAGPU、CPUでの評価をしていた
  • その結果(3年くらい前)にTensorFlow専用ASIC作る決断をした
  • 2016年秋が楽しみ

ということが書いてある。
2013年頃というとGoogleが16000個のCPUを使って猫を認識するDeep Learningらしきものをやった頃。 wired.jp

2013年頃はDeep Learningは一般レベルでは今ほど騒がれず、まだまだ未知も部分が多かったため、機械学習といえばデータマイニングためでSVMとかが幅をきかせた頃のように思う。

Google Cloud Platformのリリース(Compute Engine基準で2013とする)、TensorFlow(2014,5)、そこへTensorFlowを高速化できるハードウェアの存在を公表(現在)というコンボがすごい。 普通はASIC作ったらいかに大量に製造して、販売して、投資を回収するか?という物理的にモノをどう売りさばくのがポイントになる。 でもGoogleはTPUは自分たちのサービスの差別化のためだけに使い、TPU自体は販売するつもりはない。
www.eetimes.com

Googleストリートビューなどの自社サービスの改善や、Google Cloud PlatformでTPUのパワーを使わせてしまえば(すでに使わされているが)、クラウドサービス含め、これまでの本業経由から回収できる。TensorFlowはどマイナーなフレームワークではないと思うし、むしろ利用情報が多くてとっつきやすいものだと感じているので見込みが良い。
TPUがもたらすであろう消費電力に対するパフォーマンス効率からランニングコストGPUなどより格段に下がるはず。はず。
詳しいことは秋に期待。

Microsoftのハードウェアアクセラレーターはオワコン?

目的がわりと汎用的で、機械学習専用機でもTensorFlow専用機でもないのでFPGAは妥当だろう。
GoogleみたいにTensorFlow専用機つくる!と絞り込みしてないし。
仮にASIC作るならFPGA間通信などをハードマクロ化したり、リコンフィギュレーション部に手を入れたりしたカスタムFPGAを作るほうがマッチしていると思う。 ハードウェア設計部隊はいるし、金もあるからからやろうと思えばできるはず。 重要顧客だしIntel神がもたらすであろうXeon+FPGAとか関わってそう。

その他

8bitの精度があればよいというのはアクセラレート対象であるTensorFlowにくわしくないとわからん。事実だとすれば、CPUやGPUはだいぶ無駄な演算している。8bit以上あると性能上がる、例えば16bitなら2倍の性能とかであれば、今回の8bitは必要十分な精度でしかないのであまり注目してもしょうがないきがする。

ムーアの法則が7年うんぬんは忘れても良いと思う。 「同等の性能を持つGPUが登場するにはあと7年必要だ」的な見積もりとかそういうレベルの話みたい。 性能的にはGPUの10倍あたりらしいので、ムーアの法則とからめると7年というのはそのへんからきてるっぽい。

GPUFPGAでのアクセラレーションを検討する程度のことは当たり前レベルな雰囲気。検討結果がよければASICつくるのも当たり前になるのか。

編集画面がいろいろ変わってて戸惑った。

MicrosoftがFPGAでDeepLearningしてた

Alteraのリリースノートで知ってはいたが、Microsoftリサーチのホワイトペーパーを発見した。2015年にUCLAXilinxFPGA使って同様のこと(CNNの実装)をしているが、それより3倍くらい性能良い模様。

http://research.microsoft.com/pubs/240715/CNN%20Whitepaper.pdf

DeepLearningの一種Convolutional Neural NetworkをFPGAというか、自社製FPGAボード「Catapult」上にのせた。 このCatapultについては以前記事にした。 tkysktmt.hatenablog.com

Deep Learningについて

自分がどう考えているか簡単に。
Deepな層構造(3層以上)をもったNeural Networkを、どうにかして学習させることができたものをDeep Learningと呼ぶ。どうにかして学習させるその工夫はいろいろあり、現在のホットな研究対象だが、基本的には古い教科書にのっているNeural Networkを巨大にしたもの。そんなわけでDeep Learning自体が具体的なアルゴリズム1つを指すわけではなく、DeepなNeural NetworkをLearningさせる手法すべてに適用される呼称。

で、Deep Learning以前から、Neural Networkは生物のそれと同じく、Neuronモデルをたくさん用意すれば表現力が増すと考えられてきたのだが、実際はせいぜい3層ちょいが扱える限界だった。深い多層Neural Netをつかうには、ニューラルネットワーク職人が丹精込めてネットワーク構造や、パラメーター調整するしかなかった。 それが、近年のハードウェア性能の向上&学習アルゴリズムの改良により、実用的な限界を突破。昔からの予想通りNeruronモデルが増えることで表現力が増し、いままでコンピューターにできなかったことが出来るようになってきて注目を浴びている。

話題になるタイプのDeep Learningの特徴としては、「低層の自己組織化」が主流だと思う。特に汎用目的の場合、ネットワーク構造は全結合か結合なしで、内容に応じて適切なネットワーク構造が構築される、生物っぽいのが望まれていると思う。与えられた時空間な刺激からいかにして判別しやすいパターンを抽出してもらうかいった感じ。

CNNとはなにか

Deep Learningの一種で、画像認識に向いたDeepなNeural Network。端的にいうと人の視覚野のV1,V2の出力結果のようなものを得られるような工夫が低層でされている。

以下が詳しい。 vaaaaaanquish.hatenablog.com

どうやったか

こんな感じ。この次層のために再循環させるアイデア自体は自分も思いついていたが、ちゃんと実装されるとは。

ポイントは以下の3つ。

  1. 実行時に、複数の層構成をサポートすることができるソフトウェア構成エンジン。 これはハードウェアの再コンパイルを必要としない。これははハード的にはどの層にもなれる汎用のNeural Net(PEアレイ)を用意しておき、シーケンスによってソフトウェア的にカーネルの重みを変更するというものだろう。

  2. 効率的なデータバッファリング方式とオンチップの再配信ネットワーク。オフチップメモリへのトラフィックを最小限に抑えることができる。この仕組みと1の再構成の仕組みがあることで、1チップ上にDeepなNeural Network実現できる。

  3. 容易にスケールアップすることができるPE(処理要素)を空間的に分散配列。1000ユニットとかいける。PEの中身、特に演算部はUCLAとそんな変わらないと思う。 以下のような小規模Neural Netを表現可能にした演算ユニットだと思われる。

一般的なオペレーション

このCNNアクセラレータは、連続して複数の畳み込みの層を処理できる。 初期層の間に、入力画像ピクセルがローカルのDRAMからストリーミングされ、その後、マルチバンクの入力バッファに格納される。 これらの入力は、3Dコンボリューションのステップで独立した内積演算を実行するため、複数のPEのアレイにストリーミングされる。 トップレベルコントローラは、シーケンスシング、アドレッシング、各PEアレイへのデータの配信を調整する。 蓄積された結果は、特殊なネットワークオンチップに送信され、入力バッファへ再循環させる。これは次層の計算でつかうため。

Microsoftの結論

結果は有望。
専用ハードウェアを構築することで、現在のGPUで構築するよりも低消費電力で高レベルの性能を達成することができることを示している。

f:id:tkysktmt:20150613160456p:plain

今回はCatapultベースなのでStratix Vだったが、今後は最新のFPGA(Arria10やStratix10)に今回のデザインをマッピングすることによる、さらなる性能の向上。 また、Catapultの利点である多数のFPGAを組み合わせを用い、トレーニングと評価の並列化を検討しているなど。

ほか

Alteraのリリースノートの日本語版。GPUより3倍の電力効率だとか。Arria10の浮動小数点演算ユニット推し。 ホワイトペーパーやMSのブログではまだだったみたいだが、もうOpenCL使ってArria10のES品で実証したっぽい? 次のCatapultにはArria10載るんだろうか。

https://www.altera.co.jp/about/news_room/releases/2015/corporate/nr-microsoft-cnn-arria10hardfloatingpoint.highResolutionDisplay.html

あと、結論で使っている表で比較されているBest prior CNN on Virtex 7 485T [5]UCLAによる実装例。こちらはCNNをFPGAにインプリする場合のデザインについての報告。具体的で詳しい。

http://cadlab.cs.ucla.edu/~cong/slides/fpga2015_chen.pdf

おわりに

自分の思いつきアイデアをベースに読んでいるので、仕組みについては間違った解釈かも。あとでちゃんと調べてみる。

Alteraが本気の買収されたし、チップとしてのFPGAだったり、DRPだったりが、電気代も気にする方面から注目されそう。GPU勢は電気代無視して性能向上に励んでほしい。 IntelはAlteraと協業してたころからXeonFPGA統合するって言ってたのと、あつかいやすさからOpenCLなどといった形で広まってくのかね。もしかしたらコンパイラディレクティブで、「この処理は高位合成によりPLD領域にマップ」みたいな感じなこともできるのかな。

退職したので東亜飯店に行ったら閉店していた件

退職しました。

f:id:tkysktmt:20150531110728p:plain  
 
今後はインターネットな感じのIT関連企業に潜り込みFPGA活用を模索する感じの仕事のはず。サーバーとか作る感じか? www.amazon.co.jp

 
 

というわけで、いざ東亜飯店へ

いわゆるWeb系の人らが退職する際によく出る謎画像の店「東亜飯店」に行こうと思った。 というのも、下のエントリのように、なんか普通に安旨な良い中華料理屋みたいなので。美味いと評判の水餃子でも食おうかと。 bugrammer.hateblo.jp

事前に調べた限りだと、退色した看板は無くなったが、営業はしているようだった。食べログでも閉店になっていない。 psn.hatenablog.jp f:id:tkysktmt:20150531111805j:plain このブログのおかげで画像のような店構えであることがわかったので地図上での位置を調べる。

場所はここ。昭和通り口から昭和通りを渡って、右側の小道を歩いていると右手側にある。という感じ。

関連ランキング:中華料理 | 秋葉原駅岩本町駅末広町駅

しかしながら、どう見ても画像にあったような店構えの中華料理屋がない。 「捜査の基本は足」とばかりに周辺をしらみつぶしに、怪しいリフレクソロジーな店がある路地まで見て回った。しかし無い。位置情報を扱うパスコ社員が同行していたので、住所番地を頼りに探すなど。 www.pasco.co.jp

だが見つからない。ドローン調達の必要性や食べログに載っている住所がまちがっている可能性が浮上するなど現場は混乱。

ひとまず地図上で正しいはずの位置に戻り、悩んでいると、なんだか目の前に見覚えがある形状が。

f:id:tkysktmt:20150531113729j:plain これだ。どう見ても。何回も通ったわ。ネパール人ぽいひとが一生懸命ペンキ塗ってるのを何度も見ていた。

おわりに

東亜飯店跡地の店はまだ開店していないので、すぐちかくにある「元気」に行った。 tabelog.com

いま、食べログの東亜飯店ページを閉店ステータスにしようかと思ったらログインを要求されたのでやめた。