ほとラボ

It works!

沖縄に移住する

f:id:hoto17296:20180102160537j:plain

一年ほど前に id:amacbee から「沖縄に会社作る」という話を聞いて「え、沖縄良さそう、行く」ってなったの沖縄に行くことにした。

今月からは沖縄にあるちゅらデータ株式会社というところでデータ分析マンとして働いていく。

churadata.okinawa

沖縄には縁もゆかりもない。 「海ぶどうおいしい✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌ 」とか言っちゃうレベル1の沖縄力。 移住を決めたのも「暖かくて過ごしやすそう」程度のテキトーな動機しかない。

どちらかというと「沖縄に行く」ことよりも「東京を離れる」ことに大きな意味がある。

首都圏一極集中つらい

東京の良いところは「人がたくさんいる」ところで、
東京の悪いところは「人がたくさんいる」ところ。

日本は世界的に見ても極端に人口が首都圏に集中している国で、それによる弊害もまた顕著に現れている。

日本での首都圏一極集中はざっくりと以下のような流れ。

  1. 大企業が本社を移転するなどして東京に集中するようになった
  2. 人口が首都圏に集中した
  3. 首都圏の地価・物価が跳ね上がった
  4. 労働者、特に家族持ち世帯は郊外で暮らすようになった
  5. 郊外から東京への過酷な通勤ラッシュが生まれた
  6. 疲弊した結果、労働生産性は低下し少子化も進んだ

イケダハヤト氏は気に入らないけど、「東京の人は消耗してる」というのは事実だと思う。

べつに「少子化問題を解決したい!」みたいな大それたな話がしたいワケではなくて、これはただ単にイチ労働者として「疲弊したくないな」という話に過ぎない。

でももしひとりひとりが「疲弊しない働き方」ができるようになれば、労働生産性は上がるし少子化問題も解決する・・・ような気がする。 根拠はない。

東京に通勤しない方法

首都圏一極集中で疲弊しないためには東京に通勤しないこと。 これに尽きる。

具体的なやり方としては以下の4つが考えられる。

1. 地方の企業で働く

それが簡単にできたら誰も苦労はしない。

「日本の IT 企業の9割は東京に集中している2」と言われていて、IT 業界マンとしては非常に厳しい。 自分の場合はたまたま沖縄の話があったのでこのパターンでいくことができたが、普通の IT 業界マンにとっては選択肢が少なすぎる。

2. 東京の企業の地方拠点で働く

昨年の YAPC::Fukuoka で「LINE / pixiv / nulab などは福岡にもオフィスがあって〜」という話を聞いた。

かなり魅力的な選択肢だと思う。 こういう IT 企業がもっと増えてくれると嬉しい。

3. 東京の企業に務めながら在宅リモートワークする

リモートワークはすごく難しい・・・。 チームの他メンバーからの信頼が厚くて、なおかつちゃんとしたコミュニケーション手段が確立されていないとうまく回らない。

会社側からもおいそれと「みんなリモートワークしていいよ」とは言えない。 だからリモートワークは万人に適用できる解決策ではない。

むしろ今リモートワークできる環境にある人はとても恵まれているので、どんどんやってみたらいいと思う。

4. フリーランスになって在宅リモートワークする

(3) とほとんど同じようなものだけど、企業側のハードルが下がる。 「社員にはリモートワークさせられないけど、業務委託契約であれば構わない」という会社はあるらしい。

東京を離れる不安

東京を離れることの不安はいろいろある。 特に「せっかく東京で関われた人たちとの繋がりが薄くなるんじゃないか」というのは大きい。 あとは「東京にいないと最新の技術動向を追っていけないんじゃないか」とか。

とはいえ東京にいる限りはその不安を拭うことはできないので、とりあえず引っ越してから考えることにする。

まぁなんとかなるでしょ。

沖縄での暮らし

沖縄の暮らしがどんなもんかはまだわからないけど、とりあえず家探しをした限りだと家賃は安い。 東京都内のクソ狭ワンルームで暮らしていたときと同じ家賃で 2LDK が借りれた。

知人各位においては、我が家を宿にしてくれていいのでぜひ沖縄に遊びに来て欲しい。

沖縄で最前線を走りたいデータサイエンティスト WANTED !!!

沖縄とデータ分析に興味がある方は是非ご連絡ください。 Twitter で僕に DM 飛ばしてくれてもいいです。

churadata.okinawa

仕事で使えるメモアプリ 2017

大学生の頃から社会人になって今に至るまで、かなりの数のメモアプリを触っては様々な理由で辞めてきた。

最近 Bear という最高のメモアプリに出会ってようやく落ち着くことができそうなので、これまでの試行錯誤の歴史を一度振り返ってみたい。

メモアプリに求めるもの

いくつものメモアプリを使っていると、自分がメモアプリに何を求めているかなんとなく見えてくる。

  • PC で書きやすい
    • 会話しながら殴り書きしていくことが多いので、書きやすさが一番大事
    • Markdown に慣れているので Markdown が良い
    • スマホでも書けるとベター
  • 複数端末で同期できる
    • 複数端末で使いたいというよりは、ローカルマシンのストレージを全く信用していないので
  • 他のメモアプリに移行しやすい
    • 気に入らなかったときに (最悪コピペでもいいので) 他のメモアプリに移行できるような標準的なフォーマットになっていると良い

他にもいくつかあるけど、主要なのはこのあたり。

試したメモアプリ 12 種

列挙したら 12 種類あった。正気か。

だいたい試した順に書いているけど、ところどころ違うとは思う。

Google Docs

www.google.com

  • Google 版の Word 的なツール
  • 共同編集ができるので議事録とるのに向いている
  • スマホアプリが使いやすいとは言いがたい
  • メモアプリとしての用途では微妙

メモ.app

  • macOS / iOS 標準のメモアプリ
  • Mac + iPhone の組み合わせの人であれば、けっこう使える
  • Google Docs 同様、Markdown で書けないのがつらい

Evernote

evernote.com

  • ひと昔前はめちゃくちゃ流行っていたけど最近は使ってる人いるのだろうか
  • プラグインを入れると Markdown で書けるが、内部的には別のフォーマットに変換されてしまうっぽくてつらい

Kobito

kobito.qiita.com

  • Qiita に付随する (?) メモアプリ
  • 同期機能が無かった当時に DB ファイルを Dropbox で管理しようと頑張ったけど、かなり手間がかかったのでやめた
  • Kobito プレミアムで Dropbox 同期機能が実装されたけど使ったことはない
    • (あまりいい評判を聞かないけどどうなんだろう)
    • 月額 400 円はちょっと高い印象
  • 【追記】 サポート終了してた・・・

wri.pe

wri.pe

  • masuidrive 氏作の Web アプリ
  • リリース当時は Dropbox に保存できるメモアプリが少なかったので重宝した
  • ブラウザ拡張のショートカットキーと競合するのが使いにくくてやめてしまった

Mou

25.io

  • Mac 専用アプリ
  • md ファイルを開くだけというシンプルな感じは良い
  • しかしさすがに機能不足感が否めない

Boostnote

boostnote.io

Simplenote

simplenote.com

  • Markdown ではないが、改行時に - やインデントを補完してくれるので割とサクサク書ける
  • ほかのユーザを招待して共同編集ができるらしい・・・使ったことはないが
  • 独自のストレージに保存していてなんかコワイというあやふやな理由で使うのをやめた

Atom

atom.io

  • もはやメモアプリではない
  • Markdown もいい感じに書けるので、メモ用途として使っている人もいるらしい
  • メモ一覧をよしなに管理できないのがつらくて使うのをやめた
    • あくまでエディタなのでしょうがない

Slack

slack.com

  • これもメモアプリではない
  • 会社の Slack チームの自分の Direct Messages をメモ代わりに使っていたことがある
  • 意外と快適で「これでいいじゃん」感があった
  • とりあえず Slack に殴り書きをして、あとで必要なメモだけ別の場所にまとめる、という使い方が良い

Dropbox Paper

www.dropbox.com

  • 2016年に彗星のように突如現れたすげーメモアプリ
  • Markdown じゃないけど、だいたい Markdown のノリで書ける
  • 内部的には別のフォーマットを使っているらしく、md で Export したテキストがあまり綺麗じゃないのが惜しい

Bear

www.bear-writer.com

  • Apple 信者専用 (macOS & iOS のみ)
  • Apple Design Awards 2017 に選ばれたらしい
  • #aaa/bbb みたいなテキストをメモ内に埋め込んでおくと階層構造をもつタグとして識別されるの面白い
  • iCloud 同期機能は有料版のみだけど月額 $1.49 なので大した事ない
    • 継続的に課金させてくれるの、むしろ嬉しい

機能まるわかり表

Google Docsメモ.appEvernoteKobitowri.peMouBoostnoteSimplenoteAtomSlackDropbox PaperBear
Markdown 記法が使える△ (プラグイン)
元の md テキストのまま保存される----
複数端末で同期できる◯ (有料)◯ (有料)
信頼できるクラウドストレージに保存できる◯ (Dropbox)◯ (Dropbox など)-◯ (Dropbox)✕ (独自)-◯ (Dropbox)◯ (iCloud)
PDF に変換できる△ (Plugin)△ (docx に変換できる)
マルチデバイス対応△ (macOS, iOS, Web のみ)✕ (PC のみ)△ (Web のみ)✕ (macOS のみ)△ (PC のみ)△ (macOS, iOS のみ)
タグで管理できる
横断的に検索できる
コードがハイライトされる△ (snippet を使えば)

※ テーブルを横にスクロールさせると見れます

まとめ

いまオススメするとすれば

  • Mac & iPhone 使ってるなら Bear
  • それ以外は Dropbox Paper

かなー

当分は Bear を使うと思うけど、これよりも更に良いメモアプリが出たらまた乗り換えてしまうかもしれない。

来年はどんなメモアプリが現れるだろうか。

伝説のブラウザクラッシャー "You are an idiot" を現代に蘇らせる

このエントリは Dark Advent Calendar 2017 12 日目のエントリだよ。

伝説の闇の技術について紹介するよ。

ブラウザクラッシャーとは

まずはこちらの動画をご覧いただきたい。(音が入っているので注意)

Windows 98 上の Internet Explorer で開いた Web ページが何やら奇妙な動きをはじめ、ブラウザを終了させようとした途端にウィンドウが増殖して大量のポップアップウィンドウが画面上を跳ね回っている。

これは You are an idiot というブラウザクラッシャー (ブラクラ) の一種。 crashme と並んで「二大有名ブラクラ」だと勝手に思っている。

一応コンピュータウィルスには分類されないが、リソースが大量に消費されることでマシンが不安定になったりクラッシュしたりする、悪意のあるプログラムである。

自分の記憶では 2000 年代前半に大流行していたので、その頃にインターネットをよく使っていた人は見覚えがあるかもしれない。 当時小学生だった自分も、学校の友達と交流していた BBS (掲示板) に「これ面白いよ!」とブラクラのリンクを貼られたり、桃色な Web サイトをコッソリ見ているときに誤ってブラクラのリンクを踏んでしまったりしていた。

当時はブラクラのことを「迷惑なサイト」としか思っていなかったが、いま思い返すとブラクラによって「インターネットはこういう場所なんだ」ということを学んでいた節があり、十数年経ったいま改めてブラクラの動画を見返してみると、嫌な思い出というよりは「あ〜懐かしいなーーー」という気持ちになる。

You are an idiot を現代に蘇らせる

ノスタルジーのあまり、ブラクラをもう一度動かしてみたくなってしまった。

しかし現代のブラウザはセキュリティが堅くて同じようなものを実装してもコレジャナイ感が出てしまう。 あの小さなポップアップウィンドウを大量に生成して画面内を動き回らせたい。

そこで Electron である。

Electron であれば、Window まわりの実装の自由度が高いし、ブラウザによってポップアップをブロックされる心配もない。

そして完成したものがこちら。

github.com

※ ちなみにライセンスは CC0 (パブリックドメイン) なので、煮るなり焼くなり好きにして欲しい。

!!!注意事項!!!

  • 動かすときは自己責任で
    • ジョークアプリとはいえ、ウィンドウを増やしすぎると本当にマシンが死にます
    • というか開発中に動作確認してたら自分の Mac が一度死にかけました
    • 万が一のことがあっても作者は一切の責任を負いません
  • ビルド済みパッケージは配布しません
    • 自身で Node.js をインストールしてよしなに起動できる程度に解っている人のみ、ご利用ください
  • macOS 以外では動作確認をしていません
    • macOS では ⌘ + W で増殖 / ⌘ + Q で終了 するようになっていますが、macOS 以外の OS だとどういう挙動をするかわかりません

動かしてみた様子

良くないですか、この活き活きとしたポップアップウィンドウ達。

まとめ (?)

かくして Flash 黄金時代の悪しき文明は、Electron という最新技術との融合によって見事復活を遂げたのであった。

インターネット老人会の諸君、いま一度あのときの気持ちを思い出してみてはいかがだろうか。

スマートスピーカーはあくまでスピーカーっぽい

Amazon Echo Dot を買った。

Amazon Echo Dot (Newモデル)、ブラック

Amazon Echo Dot (Newモデル)、ブラック

欲しかったというよりは「流行ってるからコレ系1なにかひとつくらい触っておかないと」という使命感で買った。

所感

  • 部屋のどこにいても呼びかけたら反応するのすごい
    • 逆に、部屋のどこで会話してても「Alexa」ってワードに全部反応するのでウザい
  • iOS の Alexa アプリが使いにくすぎる
    • そのうち改善されるだろうから気にしてない
  • 音声認識の精度はよくわからない
    • (普段 Siri もあまり使わないので比較できない)
    • ストレスがない程度にはちゃんと聞き取ってくれる

「スマホの音声認識でいい」感

AI 的な機能を触れば触るほど、それ「スマホの音声認識でいいのでは?」という気持ちになってくる。

そこで、思いつく限りの「スマホの音声認識じゃできないこと」を書いてみる。

「音質が良い」

「スマートスピーカー」なので、そこは良くてもらわないと困る。2

音楽を再生する手順も話しかけるだけなので、「スマホから Bluetooth スピーカーなり Apple TV なりに接続して...」という手間がないぶん便利ではある。

「手が離せない状況でも使える」

どういう状況なの・・・?

唯一「料理中」という状況だけはわかる。
料理中に声だけでレシピを確認できるのは便利そう。

しかしリビングに Alexa があってキッチンが離れている場合、声が届くのか謎。 料理するならスマートウォッチの方が向いてるんじゃ・・・?

「家電を操作できる」

これは全く関係なくて、「家電を操作できるブリッジ」「スマートホーム対応の家電」「Homebridge サーバ + IRKit」のいずれかが必要なのはスマホ音声認識も各種スマートスピーカーも変わらない。

「子どものおもちゃとして」

「Alexa, ピカチュウを呼んで」と言うとピカチュウが出てきて会話 (?) できたりする。

これはちょっとおもしろかった。

まとめ

スマートスピーカーはあくまでスピーカーであって「革新的な AI ガジェット」を期待してはいけなかった。

「音楽ライフを充実させるためのガジェット」として購入すると良さそう。


  1. Amazon Echo 以外だと Google Home とか LINE Clova WAVE とか

  2. Amazon Echo Dot はコンパクトなぶん音がすごく良いわけではないが、外部スピーカーを接続すればよい

さらば Firefox

約 10 年使った Mozilla Firefox をやめて、Vivaldi に乗り換えた。

Firefox の思い出とか、Vivaldi にした理由とか、そのあたりについて。

10 年前の Firefox

Lunascape というブラウザを使っていた当時高校生の自分は、きっかけは覚えていないが何かの拍子で Firefox を使い始めた。

10 年前の Firefox はバージョン 2.0 で、まだ Google Chrome も登場しておらずアドオンという概念も一般的でなかった時代に「カスタマイズするブラウザ」としての地位を確立していた。

f:id:hoto17296:20171103200044p:plain
一世を風靡した伝説のアドオン「中止ボタンがしいたけに見えて困る」

ユーザーコミュニティによるアドオンという文化は本当に面白くて、いくつものアドオンを入れては消してを繰り返して楽しんでいたし、いくつか自分で作ってみたりもした。

2大最強アドオン

数多あるアドオンの中でも「これがないと生きていけない」レベルだったのが以下のふたつ。

Tree Style Tabs はタブバーを横に表示してタブをツリー構造のように並べられるアドオンで、 Vimperator は vim ライクなキーバインドでブラウザを操作できるアドオン。

人よりも多くタブを開き、人よりも多くブラウザを触る機会が多い Web ブラウザヘビーユーザーな自分にとって、ブラウジングの効率を高める上でこれらのプラグインは欠かせないものだった。

IT 業界で働き始めてからは、周囲に Web ブラウザのヘビーユーザーが多くなったからか 「Firefox + この2つのプラグイン」を使ってる人にかなり出会うようになった。 効率を突き詰めるとやはりここに行き着くんだなー、という感覚があった。

WebExtension への移行

そんな Firefox は、今月 Firefox 57 (別名 Firefox Quantum) がリリースされる。 このリリースでは従来の XUL ベースののアドオンが利用できなくなり、WebExtensions に完全移行される。

従来アドオンの WebExtensions 移行は、ほとんど1から書き直すことを意味する。

Tree Style Tab は既に WebExtensions 対応版がリリースされているが、作者の Piro さんのブログを読むとそれがいかに想像を絶する労力が必要かわかる。

piro.sakura.ne.jp

Vimperator は今もなお方向性を模索中1で、その他のアドオンも WebExtensions に移行されないものも数多くあると思われる。

Firefox のアドオンというエコシステムは、完全に一からやり直しになってしまった。

他ブラウザへの乗り換え検討

窮地に立たされた Firefox ユーザは一体どうしたらいいか。

大雑把には、自分で Firefox のエコシステム作りに関わりに行くか、他ブラウザに乗り換えるか、の二択しか無い。

本当は「自分が新しい Vimperator を作るんや」と言えたらカッコよかったが、 そもそも自分が Firefox を使う理由は魅力的なアドオンがあるからで、 そのアドオンが使えなくなってしまった時点で Firefox を使い続ける理由は特になかった。

じゃあ他のブラウザに乗り換えてやっていけるか。

多少操作性は変わっても、タブが横に表示できてキーボードでブラウジングができれば良くて、 そんな都合のいいブラウザがあるものかと探していたら、Vivaldi という選択肢があった。

vivaldi.com

Vivaldi の所感

f:id:hoto17296:20171103214943p:plain

まず最高なのは Tree Style Tab や Vimperator でやりたかったことが拡張機能無しでできる 点。 タブを横に並べられるし、キーボードショートカットも柔軟にカスタマイズ出来る。

とはいえ横タブ表示はツリー型に表示することはできないし、Vimperator で出来たすべての操作を Vivaldi でもできるわけではない。やはり Firefox のアドオンの方が便利だったと思う点も少なくない。

それ以外の点で言うと、ベースが Chromium なのでレンダリングや開発者ツールなどは他の主要ブラウザと比較しても遜色ない、というか Google Chrome と全く同じ。

最大の不満点を上げるとすると「複数の端末で設定やブックマークを共有できない」ことだが、現在 Sync 機能を開発中とのことなのでこれは気長に待ちたい。

総じて、これならなんとか乗り換えてもやっていけそう、と思った。

まとめ

別に Firefox が死んでしまったわけではないが、XUL ベースのアドオンの廃止は自分にとっての Firefox が死んだようなものだった。

さらば Firefox、最高の Web ブラウザだった。

これからは Vivaldi という新時代のブラウザで次の 10 年を生きていきたい。

ISUCON 7 予選落ちを支えた技術

去年に引き続き id:arata3da4 id:jp_taku2 と ISUCON に出場した。

今年の最終スコアは 26,772 点で、決勝進出することはできなかった。

しかし昨年の最終スコア 0 点と比較すると +Infinity 倍のスコアを記録できたことになる。

圧倒的成長!!!

blog.hotolab.net

(昨年の人権を失っていた頃の様子)

開始時間の遅延

気合い入れて7時に起床して8時半には準備完了して集中力を高めていたら、まさかの開始時間が3時間もの遅延。

時間が空いたからといって何か作業をするべきではない。

競技中の8時間にすべての集中力を注ぎ込むことが重要であり、今はリラックスして集中力を温存することが勝利への鍵であることは間違いない。

カバンから Nintendo Switch が取り出されたのはもはや必然であったと言える。

事前にやったこと

  • 使用言語を決める
    • 今年は PHP でやることにした
  • プロファイリングの素振り
    • アクセスログ: alp
    • アプリケーションコード: Blackfire
    • スロークエリ: pt-query-digest
  • 当日使うリポジトリなどの準備
  • 開始直後にやる作業の整理・スクリプトを書いて自動化

特に変わったことはしていない。

当日にやったこと

f:id:hoto17296:20171022225830j:plain

開始直後

  • ルールを把握する
    • 当日マニュアルを読む
    • アプリケーションを動かす
    • 構成を把握する
  • 作業環境を整える
    • アプリケーションをバージョン管理する
    • 言語実装を切り替える
    • 各種プロファイラを入れる

ここまでで1時間。

もっと早く出来たような気がしなくもない。

戦略を立てる

  • とりあえず /icons/* をなんとかしないと話にならない
  • /fetch は扱いが特殊っぽいので試行錯誤
  • Nginx, MySQL のパラメータチューニング
  • スロークエリを潰していく

あたりをやっていくことに。

/icons/* を倒しきれず死亡

/icons/* を倒す戦略としては主に以下の3つを試みた。

  1. データを返さない
    • 画像がデカいのでそもそも毎回データを返したくない
    • 304 Not Modified を返してよろしくやりたい
    • この時点で Cache-Control を思いつかなかったのが悔しい
  2. Varnish を立ててキャッシュする
    • 画像リクエストは Nginx と php-fpm の間に Varnish を挟む
    • サーバ再起動時にキャッシュデータを配置してから Varnish を起動する
  3. MySQL のリードレプリカを作って負荷分散させる
    • Master DB サーバ以外の2台を Slave サーバにした
    • 画像はすべて Slave から読むようにアプリケーションを修正

結果的には Varnish のキャッシュしか効果がなかった。

304 を返すのは、クライアントから If-Modified-Since ヘッダが送られてきてなかったので不可。

MySQL のリードレプリカは、ベンチマークのアクセス速度に対してレプリケーションが追いつかずに fail 連発してボツ。

Varnish + その他チューニング色々積み重ね で 20,000 点を超えたあたりで時間切れで終了。

まとめ

決勝行ったチームを見ていると「/icons/* を倒したあとに見えてくるボトルネックをどう倒すか」で争っているようなので /icons/* を倒せなかった時点で決勝進出争いの土俵にも上がれなかった模様。

キャッシュまわりの知見が足りなさすぎたのが敗因と言える。

ぐぬぬ・・・。

圧倒的感謝

今年も良い問題でした運営の皆さんありがとうございます 🙏 🙏 🙏

おまけ

終了1時間前から「スプラトゥーン2で残り1分になったときのBGM」を流していたけど、だいぶ焦燥感があってよかった。 オススメ。

f:id:hoto17296:20171023010821j:plain

機械学習用の GPU マシンを組んだ

4ヶ月前にこんな Qiita を書いた。

qiita.com

しかし自宅に GPU マシンを組んだとしても四六時中計算し続けるわけでもないからもったいないし、ここはクラウドサービスを活用して安く済ませたい。

とは言ったものの普通に学習回すと月1,2万は飛んでいくし、これもう普通に GPU マシン組んだほうが良いのでは、となったのでやっていくことにした。

結論からいうとベアボーンキットを買ってメモリと SSD を挿しただけなので「組んだ」というのはちょっと微妙なんだけども、自作 PC とか全然慣れてないなりにあれこれ悩んだログとして書いておく。

GPU はどれがいいか

Tesla V100 欲しい!

GPU がメインなのでまずは GPU から選ぶ。

候補としてはこのへん。

GPU 種類 価格帯 CUDA コア数 メモリ メモリバス SLI
GTX 1080 Ti 10 万くらい 3584 GDDR5X 11GB 352bit
GTX 1080 8 万くらい 2560 GDDR5X 8GB 256bit
GTX 1070 5 万くらい 1920 GDDR5 8GB 256bit
GTX 1060 4 万くらい 1280 GDDR5 6GB 192bit

GTX 1080 Ti は高いけど手が届かない価格帯ではない。

でも機械学習する場合は計算リソースよりもメモリのほうがすぐキツキツになるので、1080 Ti 買うよりは 1070 を二枚挿して SLI 構成1にしたほうがメモリを増やせて良い。 だたし二枚挿すと消費電力がかなりいくので、あらかじめ容量大きめの電源を買っておく必要がある・・・。

そういう意味だと 1060 は SLI 対応していないので選択肢からは外れる。

まぁ 1070 が無難っぽい。 一枚買っておいて足りなければもう一枚追加すればいい。

マザーボードとかケースとか

休日に秋葉原行ってマザボとかケースとかを見て回った。

え、デカくない?

自作 PC 勢ってみんなあんな巨大なやつ自宅に置いてるの? 正気???

MicroATX サイズのケースでもだいぶデカい。
できれば MiniITX サイズで組みたいけど、それだと GPU 二枚積むのは無理ぽい。

もはや GPU 二枚積めなくていいから Intel NUC くらいコンパクトなやつねーかなー、と無茶なことを考えながらググってたら、ZBOX EN1070K という GPU 積んでるコンパクトなやつを発見した。

GTX 1070 + Core i5 積んでるし、もうこれでええやんけ。

「拡張性ゼロ」という強烈なデメリットがある けど、「コンパクトなやつが欲しい」という欲求の方が勝ったのでこれを購入した。

米 Amazon.com から輸入

日本で買うと ZBOX 単体で18万円くらいで、さらにベアボーンキットなので SSD とメモリを買う必要があって、そうするとどうあがいても20万円は超える。

Amazon.com 見たら $1,100 くらいで売ってたのでこっちから購入。

SSD とメモリも一緒に買って、送料と関税込みでトータル 18万円くらいで済んだ。

ただしアメリカ版を買うと電源プラグがアメリカ仕様 (3ピン) なので注意。2

SSD とメモリ

ZBOX EN1070K は m.2 と SATA の SSD をそれぞれひとつずつ挿せる。

今回はとりあえず m.2 買って OS 入れておいてデータ保存場所が足りなくなったら SATA のやつ買って追加すればいいか、と考えてとりあえず m.2 SSD 250 GB だけ買った。

メモリスロットは DDR4 2400/2133 S.O.DIMM x 2 で、最大 32 GB とのこと。

とりあえず MAX 積んでおくか、という雑な感じで 16GB x 2 を買った。

届いた

ちゃんと届くか不安だったけど、二週間くらいで普通に届いた。

f:id:hoto17296:20171012211941j:plain

テンション上がる。

組み立てる

以下の記事がすげー詳細に書いてあって参考になった。

手の平にハイエンドPCを! 「MAGNUS EN1070 / EN1060」を比較レビュー : 自作とゲームと趣味の日々

最初メモリの取り付け方をミスって起動できなくて焦った。

ちゃんと斜め45度から挿してから倒す、ってやらないとダメなんだな・・・。

Ubuntu 16.04 を入れる

「BIOS はもう古い、時代は UEFI !!!」

みたいなのを耳にしてたので「ちゃんとインストールできるだろうか...」と震えていたけど、普通に minimal の ISO を USB に焼いて挿したらインストールできた。

ちなみにデスクトップ版も試したけど、むしろこっちのほうが面倒だった。 NVIDIA の GPU が載ってると GUI が起動できないので、カーネルオプションで nomodeset を指定する必要がある。

qiita.com

機械学習するのに GUI は要らないので、何も考えずに minimal をインストールするのがいい。

Wake on LAN の設定をする

機械学習用マシンは常時使っているわけではないので、使ってないときは電源落としておきたい。

自宅に要るときは電源ボタンを押せばいいけど、外出中にリモートで自宅のマシンを起動したいという場合には Wake on LAN を使うとできる。

ZBOX は Wake on LAN に対応していて、UEFI の設定画面から Wake on LAN の設定を切り替えるだけで有効にできた。

あとは電源が落ちている ZBOX に対して Wake on LAN パケットを投げつけると起動してくれるのだけど、VPN 経由でリモートからパケットを投げるときにちょっと苦労した。

qiita.com

学習環境を作る

あとは冒頭の Qiita に書いたのとほとんど同じ。

qiita.com

P2 インスタンスを使っていたときは Tesla K80 だったのでドライバは nvidia-375 を入れたけど、今回は GTX 1070 なので nvidia-367 を入れる、という点だけ違う。

Mackerel で GPU 温度を監視する

コンパクトさが欲しくて ZBOX にしたとはいえ、排熱効率が悪くて GPU 温度が上がりまくったらどうしよう...という不安はある。

なので、とりあえず Mackerel で監視することにした。

mackerel.io

GPU の温度を Mackerel に飛ばすのどうやってやるんだろう、と思ったら公式のプラグインに NVIDIA GPU を監視するやつがあったので楽勝だった。

mackerel-agent-plugins/mackerel-plugin-nvidia-smi · GitHub

あとは、Mackerel の監視設定で GPU 温度が一定以上になったら自宅の Slack に通知が飛ぶようにする。

雑にググったところ 80℃ くらいまでは問題ないっぽいことがわかったので

  • 80℃ で Warning
  • 100℃ で Critical

に設定してみた。

これで一安心。

ベンチマーク

Qiita の記事と同じく、NVIDIA Docker のコンテナ上で Keras の MNIST CNN のサンプルを実行した。

root@(container):/# python3 mnist_cnn.py
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz
11255808/11490434 [============================>.] - ETA: 0sx_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
2017-10-09 09:23:35.248521: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2017-10-09 09:23:35.248540: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-10-09 09:23:35.248546: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-10-09 09:23:35.248565: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2017-10-09 09:23:35.248570: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
2017-10-09 09:23:35.405920: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:893] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2017-10-09 09:23:35.406452: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 0 with properties:
name: GeForce GTX 1070
major: 6 minor: 1 memoryClockRate (GHz) 1.645
pciBusID 0000:01:00.0
Total memory: 7.92GiB
Free memory: 7.83GiB
2017-10-09 09:23:35.406466: I tensorflow/core/common_runtime/gpu/gpu_device.cc:976] DMA: 0
2017-10-09 09:23:35.406471: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 0:   Y
2017-10-09 09:23:35.406477: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0)
60000/60000 [==============================] - 7s - loss: 0.3325 - acc: 0.9000 - val_loss: 0.0779 - val_acc: 0.9755
Epoch 2/12
60000/60000 [==============================] - 5s - loss: 0.1147 - acc: 0.9661 - val_loss: 0.0542 - val_acc: 0.9830
Epoch 3/12
60000/60000 [==============================] - 5s - loss: 0.0872 - acc: 0.9741 - val_loss: 0.0433 - val_acc: 0.9858
Epoch 4/12
60000/60000 [==============================] - 5s - loss: 0.0742 - acc: 0.9778 - val_loss: 0.0383 - val_acc: 0.9870
Epoch 5/12
60000/60000 [==============================] - 5s - loss: 0.0628 - acc: 0.9814 - val_loss: 0.0361 - val_acc: 0.9878
Epoch 6/12
60000/60000 [==============================] - 5s - loss: 0.0585 - acc: 0.9828 - val_loss: 0.0352 - val_acc: 0.9882
Epoch 7/12
60000/60000 [==============================] - 5s - loss: 0.0517 - acc: 0.9847 - val_loss: 0.0355 - val_acc: 0.9883
Epoch 8/12
60000/60000 [==============================] - 5s - loss: 0.0480 - acc: 0.9855 - val_loss: 0.0312 - val_acc: 0.9892
Epoch 9/12
60000/60000 [==============================] - 5s - loss: 0.0432 - acc: 0.9871 - val_loss: 0.0314 - val_acc: 0.9901
Epoch 10/12
60000/60000 [==============================] - 5s - loss: 0.0423 - acc: 0.9872 - val_loss: 0.0323 - val_acc: 0.9893
Epoch 11/12
60000/60000 [==============================] - 5s - loss: 0.0390 - acc: 0.9880 - val_loss: 0.0284 - val_acc: 0.9905
Epoch 12/12
60000/60000 [==============================] - 5s - loss: 0.0398 - acc: 0.9883 - val_loss: 0.0294 - val_acc: 0.9900
Test loss: 0.0294402698388
Test accuracy: 0.99

あれっ AWS P2 インスタンスより速くない???

P2 インスタンスだと 1 epoch あたり 9 秒だったのが 5 秒で終わる。

Tesla K80 のほうが良い GPU なのになぜ・・・?
クラウドサーバだと GPU との I/O が遅かったりするんだろうか。

謎だけどまぁ速くなったのでよし。

f:id:hoto17296:20171014132309p:plain

ベンチマーク回してたときの GPU 温度はこんな感じ。
最大 67℃ だったのでこの程度なら楽勝。

あとは長時間回したときにどこまで上がるかなーというところが気になるけど、未検証。

まとめ

  • 機械学習するために自宅に GPU マシンを買った
  • ベアボーンキットだと拡張性を失う代わりにコンパクトさを手に入れられる
  • GTX 1070 でもなぜか AWS P2 インスタンスの Tesla K80 より学習が速い

自宅に機械学習環境を作りたい人にとって割とアリな選択肢だと思うので、パーツ選びを始める前にこっちも検討してみてはいかが。


  1. 複数枚の GPU を繋げられるやつ。SLI ブリッジと SLI 対応のマザーボードを使う必要がある。

  2. 我が家は電源タップが3ピン対応だったので特に問題はなかった。愛三電機の電源タップは良いぞ。