ysaz (ImanazaS) blog

最近はデータ分析や機械学習が中心。たまに音楽や書評。

Floydhubのセットアップから基本的な使い方まで

前回の投稿で、FloydHubというクラウドサービスへたどり着き、GPUを試すようになるまでの過程を綴ってみた。

nami3373.hatenablog.com

今回は、FloydHubの利用方法について、簡単にまとめてみた。

セットアップの流れ

まずは以下のサイトへアクセスし、アカウント設定をおこなう。
Floyd Zero Setup Deep Learning

アカウントが取れたら、pipを使ってCLIをインストールする。

$ pip install -U floyd-cli

その後、以下のコマンドでログインを入力するとWebブラウザでマイページへ移動する。
表示されたトークンをコピペすることでログインが完了。

$ floyd login

ローカル上でのプロジェクトソースコードの準備

使いたいソースコードがある場合は、cdで該当フォルダへ移動、
特にない場合は、チュートリアルにあるRNNなんかをgitからローカルへレポジトリする。
※以下、例としてチュートリアルから抜粋。

$ git clone https://github.com/floydhub/tensorflow-examples.git
$ cd tensorflow-examples/3_NeuralNetworks

新しいプロジェクト開始時はinitコマンドを使って定義する必要があり、以下のように入力する。

$ floyd init <プロジェクト名>

FloydHubでJupyter Notebookを使う

初期設定が終わったら、floyd runを使っていよいよ実行。
Pythonファイルをそのままサーバー上で走らせることも可能だが、
インタラクティブに作業が進められるJupyter Notebookの使い勝手が良いため、
個人的には--mode jupyterを加えてJupyterを立ち上げるのがオススメ。

具体的には、以下のようにコマンドを入力する。

$ floyd run \
   --mode jupyter \
   --env theano:py2 \
   --gpu

モードの次に--envを加えているが、これによりディープラーニングフレームワークPythonのバージョンを指定することができる。
上記の例の場合、TheanoとKeras 1.2.2をPython2環境で用意してくれる。

その他、詳しくは以下をご参照のこと。
Environments - FloydHub

また、runコマンドの最後に--gpuを加えているが、これによりGPUサーバーを使えるようになる。
GPUを必要としない作業を低コストで実行したい場合は、これを--cpuへ変更することで、CPUサーバーが利用可能。

ちなみに17年7月1日現在、GPUのコストは1時間あたり$0.4で、CPUはその10分の1の$0.04。

データセットのアップロード

データを新たにアップロードしたいときは、プロジェクトのときと同様に、initを使って初期設定をする必要がある。

$ floyd data init <ファイル名>

続けて以下を入力するとアップロードが開始される。

$ floyd data upload

アップロードが完了するとID名が発行されるため、以降呼び出すときはそのID名を使用する。

アップロードしたデータがzipファイルであるとき、
以下のコマンドを使うとJupyterを立ち上げることなく、CPUサーバー上で解凍してくれる。

$ floyd run --cpu --data <ID名> "unzip /input/<ファイル名>.zip -d /output"

なお、ローカルからアップロードするのではなく、どこかweb上のサーバーから直接Floydサーバーへダウンロードすることもできる。
この場合、floydでJupyter Notebookを立ち上げたあとTerminalを起動し、
wgetコマンドなどを使って指定したURLからデータをダウンロードすればよい。

アップロードしたデータの呼び出し

既にアップロードをし、IDを取得したデータを別のプロジェクトで使いたい場合は、
次のようにrunコマンドの中でデータのIDを指定すればよい。

$ floyd run \
  --mode jupyter \
  --data  <ID名>\
  --env tensorflow-1.0:py2 \
  --gpu

なお、プロジェクトファイルはoutputディレクトリにあるが、読み込んだデータはinputにある点に注意する必要がある。
そのため、ファイルパスを../inpu/で指定する必要がある。

プロジェクトおよびデータセットの消去について

同じプロジェクトでも立ち上げる度に新しいバージョンが作成され、
モジュール及びアウトプットの数が不必要に増えてしまうことがある。

そのため、ストレージの容量を減らしたいときは、少々面倒だが以下のようなコマンドを実行することになる。
なお、消去したい対象が複数あるときは、IDを続けて足していけば、一行でまとめて処理することが可能。

・プロジェクトを消去するとき

$ floyd delete <ID名>

・データセットを消去するとき

$ floyd data delete <ID名>

まとめ

プロジェクトの数が増えてくると管理が煩雑になることもあるが、
コマンドがシンプルだったり、ポータルサイトが使いやすかったり、
なにより100時間分の無料利用がついてきたりするので、手を動かしながらDeep Learningを学ぶ場として重宝しています。

Deep LearningとGPU環境

ちょっと前からfast.aiの提供するディープラーニングのオンラインコース、「Practical Deep Learning For Coders」に取り組んでいる。

course.fast.ai

このコースでは定番の犬猫分類などを扱ったりするのだが、私は手持ちのMacBook Pro上でプログラムを走らせるために、オリジナルのデータからいくらか画像データを抽出した小規模なデータセットで課題に取り組んでいた。

しかしコースが進むにつれ、Kaggleの過去コンペで使われたデータセットを扱う課題が出てくるなど、CPUで処理していては何日かかるかわからないようなタスクに対処するため、GPU環境を利用してみることにした。

AWSGPUを動かす

そこで、fast.aiが推奨しているAWSAmazon Web Service)でGPUNVIDIA Tesla K80)が使用できるp2インスタンスをしばらく試してみることに。
MacBook ProのCPUに比べて圧倒的に早い処理速度を体感することができたが、気になるのはそのコスト。

課金は1時間あたり$0.90であり、しかも立ち上げる度に課金されてしまうため、うまくいかなくて短時間に何度も再起動を繰り返していると、その分コストが跳ね上がる。

インスタンスもさることながら、更に厄介なのがストレージであるEBS(Elastic Block Store)。
fast.aiのチュートリアルに沿っていくと128 GBのストレージが出来上がり、インスタンス動作の有無や保存データの量にかかわらず、ストレージの維持だけで月$12.8もかかってしまう。

結果、ちょこちょことAWS上で作業するだけで、軽く月$30〜$40は超えてしまう。趣味の延長で使うには、お財布にやさしくない。

FloydHubとの出会い

もっと安く、手軽にGPUを触る方法はないものかとあれこれ調べていたところ、FloydHubと呼ばれるDeep Learning専用のサービスを発見した。

Floyd Zero Setup Deep Learning

単価は1時間あたり$0.40とAWSの半分以下、ストレージも保存量に比例して課金されるということで、ライトユーズに適している。
さらに嬉しいことに、最初の100時間は無料で利用できるということで、気持ちに余裕がもてる。
良いサービスだと思うので、これからも大きなトラブルなく、安定的に稼働し続けてほしい。

FloydHubの使い方については、次回の記事で少しばかりまとめてみたい。

Chromebookは今後盛り上がるのか?

Chromebookを購入してからおよそ半年が経つが、動作の軽さ、電池のもち、キーボード付属といった点から使い勝手がよく、2〜3万円で買える端末としては十分だと感じている。

nami3373.hatenablog.com


しかし、日本語でChromebookについて書いている記事やブログを探しても、大した数が引っかからないのが現状で、相変わらず日本での注目度が高まっていないことが伺える。出荷数が年々伸びているとはいえ、その殆どが教育機関向けらしいので、小売店で見かける機会は正直多くない。
世の中スマホさえあれば事足りるという人が増えているようだが、個人的にはスマホの小さい画面だとできることに限界があるし、タブブラウザの使いにくさや文字の打ち辛さなどから、それだけでは不十分と感じてしまう。

じゃあ、使い慣れたWindowsMacを使えばそれで済むのでは?、という意見もきっとあるだろう。けれども、プライベートでマイクロソフト・オフィスとか業務で使うようなアプリケーションを使う場面はそれほど多くないし、正直ブラウザ(Chrome)さえ開ければことが済む場面が非常に多いので、それなら最初からChromeしか入っていないパソコンの方がシンプルだし、やりたいことのほとんどが実現できるんじゃないか、ということ。


複数の端末を所持しているが、それぞれの端末でおこなっていることをなんとなく棚卸ししてみた。
スマホiPhone):LINEやSMSのやり取り、写真の撮影・管理、SNSInstagramTwitter)のチェック、電話、たまにゲーム
タブレットiPad):Webブラウジング、動画鑑賞(YouTube)、メールやスケジュールの閲覧、雑誌の閲覧、RSSリーダーやメモアプリの使用、音楽鑑賞(Spotify
電子書籍リーダー(Kindle):電子書籍の閲覧
・メインPC(Macbook):プログラミングでの高度な処理、音楽鑑賞(iTunes)、楽曲制作(Ableton Live)、Slingbox鑑賞
・サブPC(Chromebook):WebブラウジングRSSリーダーのチェック、動画鑑賞(YouTube)、ブログの作成、音楽鑑賞(Spotify


ということで、リアルタイムなやり取りや写真の管理という用途では持ち運びに優れたiPhone、Webからの情報インプットにはiPadChromebookを状況に応じて使い分け、アウトプット(タイピング)要素が強くなってくるとややChromebookよりになる、という感じ。MacbookProの出番は、ややヘビーでクリエイティブな作業をするときに限られてきている。

今年は2-in-1のリリースが多いのと、Androidアプリ対応機種の幅が広がることから、日本でも益々盛り上がってくれることを期待する。

www.techradar.com

グーグルに学ぶディープラーニング

少し前に読了した「グーグルに学ぶディープラーニング」。
分量はさほど多くなくさらっと読んでしまった本なので、あまり頭に残っていないのではと危惧し、振り返ってみることにした。

グーグルに学ぶディープラーニング

グーグルに学ぶディープラーニング

ディープラーニングの定義

前回の記事でも少し触れたが、ディープラーニング機械学習の一部である。では、機械学習はどんなものかというと、本書に書かれている定義によると、
「機械が答えを出すための手法を、機械が自動的に膨大なデータから学習してモデルを作る」ということ。ここでいうモデルとして、決定木や機能推論、ニューラルネットワークに加え、ディープラーニングが代表的な手法として挙げられている。機械学習の仕組みは、本書の例えにある通り子どもが知識を獲得していく過程を想像するとイメージがつかみやすい。
これに対してディープラーニング(深層学習)は、「複数の層の処理を重ねて複雑な判断をできるようにする技術」とあり、計算の量が膨大となるのが特徴であると書かれている。

なお、本書は「ディープラーニング機械学習の一部である」ことを強調しているために触れられていないようだが、私の理解では従来の機械学習ディープラーニングとの大きな違いの一つとして、前者では特徴量の抽出・設計作業を人間がおこなっているのに対して、後者では特徴を自動的に抽出して学習する、というものがある。
特徴量の抽出とは、例えば何かの動物を認識する場合、入力されたデータから身長、体重、顔の形、毛の長さといった特徴を数値化する作業のことを指す。これは職人芸と揶揄されることもある領域であり、機械学習の精度は特徴量抽出の良し悪しに左右されることも多い。ディープラーニングではこうした特徴量抽出の手間が省けるため、画期的な技術と見なされているように思われる。

ディープラーニング活用事例

最初に出てくる例が「Google Home」という音声認識自然言語処理機能を活用した端末であり、日々の情報収集やエンターテイメントの利用、家電類のコントロールを可能にするもの。この分野ではAmazon音声認識サービス「Alexa」を搭載したEchoという競合が存在するので、今後両者、はたまた第三者がどのように発展していくのか、興味深いところである。

次に紹介されているのは自動運転技術であり、この分野に関しては日本の自動車メーカーも大いに関係してくるということで、ニュース記事を目にすることも多い。

その次のデータセンターでの省エネ化事例も興味深く、設備運転の最適化にディープラーニングが活用されており、電力使用量の15%を削減可能にしたとのこと。

将来展望

企業での活用事例などは割愛して、最後に今後の展望について少しだけ触れてみたい。
ディープラーニングはたくさんのデータを必要とする「データハングリー」な技術であるが、少ないデータでの画像認識やノイズが含まれたデータから有意義な情報を取り出すといった課題に取り組んでいくことや、複数の分野の専門知識を融合させた新しいアプローチ(例えば動画認識)が必要になることも触れられていた。「AIの民主化」をミッションの一つとして掲げるグーグルが、今後こうした課題に対してどのように取り組み、どんなサービスを生み出していくのか、引き続き注視していきたい。

人工知能ブームを捉えてみる

最近、やたらとAI、人工知能というキーワードが流行っており、ニュース記事や雑誌でもその文字を目にすることが多くなっている。まさにブーム。専門家の方々によると、今のブームは第三次ブームということらしい。僕は人工知能の研究者でもなんでもないが、近い将来、ますます人の生活に入り込み、多大な影響を及ぼすであろうこの分野の動向を捉えたいという動機から、文献や各種記事に目を通すようにしている。

さて、第三次ブームを牽引しているのはディープラーニング(深層学習)という技術である。この技術が登場して以来、画像や音声認識精度の目覚ましい向上が見られ、Facebookにアップされた写真から自動で顔が認識されることや、Googleの翻訳サービスが海外旅行や出張でもある程度使えるレベルにまでパワーアップしていることなど、身近なサービスを通じてディープラーニングが広く浸透してきていることが感じられる。
また、一年ほど前であるが、Google DeepMindの開発したAlphaGoが囲碁の世界チャンピオンを倒したことも象徴的な出来事であった。囲碁AIの勝利はディープラーニングの汎用性を示すとともに、「コンピュータ vs 人間」の構図の中で、しばらくは人間に追いつけないであろうと言われていた領域にコンピュータが一気に侵略してきた、という印象を与え、人工知能の新たな時代の到来がメディアを伝じて一斉に世間へ広まることとなった。

シンギュラリティ(技術的特異点)という言葉も聞く機会が増えているが、機械がほんの僅かでも人間の知能を超えるような状態に達すれば、自ら学習し続けることで、人間が追いつけない領域へ入っていってしまうことが懸念されている。これに対しては賛否両論様々な意見があり、機械の暴走を危惧する声や、特定の分野はありうるとしても、あらゆる分野で人間を超えることはない、などの声が挙がっている。

一方で、5年ほど前にブームとなったスマートにはじまり、ビッグデータ、IoT、AIと、進歩している技術をメディアは一緒くたに扱いがちなことが多い。そのために、実は以前からある技術・商品なのに「AI家電」として新たに紹介されることがあるなど、新たなラベルで焼き増しされているだけの技術に気をつける必要がある。たとえば、生活家電がネットワークにつながり、センサーがデータを提供したり制御したりということは以前から存在していたが、ディープラーニングの出現によって大きく変わったことがあるかと聞かれても、特段そのようなことはないように思われる。
広義の人工知能は非常に汎用性が高いため、良いように使われがちだが、メディアの作り出すブームに惑わされすぎないよう、しっかりと本質を見極める必要がある。

プログラミングを学ぶ上で心がけるべきこと

多少入門書を読んだり、CourseraをはじめとするMOOC (Massive Open Online Course) を履修したりして学んではきたが、ここでは、プログラミング(python)初心者として読んでよかった本・受講してよかったコースの紹介ではなく、僕が重要だと感じた心構えや意識といった観点から、記事を綴っていきたい。

共に学ぶ仲間の存在を感じること

プログラミングに限らず何か新しいことを始める上で重要だと思うのは、自分と似たような立場で同じように取り組んでいる人の存在を知り、刺激を受けることだと思う。自分の場合は大学院の講義がそれにあたり、宿題の締切があるからきちんと取り組むという姿勢が保てたし、わからないことがあれば経験値の高い他の学生や教授に質問して、教えてもらっていた。

ただし、こういうふうに書くと、教室における対面授業が最も有効で手っ取り早い手段のようにも聞こえるが、必ずしもそうではない。なぜなら、自分が受講した上記の講義は、機械学習の理論的な部分が主であり、Rとpythonの使い方については触りの部分を少しやっただけであったため、講義を最後まで履修することには価値があるが、そこで満足してそこから継続して学びを続けたり発展的な学習をしない限り、本当の意味での知識やスキルは定着していかないのだと思う。
逆にMOOCなどのオンライン講座を受講する形であっても、Forumを活用して他の受講者に質問したり回答を返したりすることで仲間の存在を感じることができるし、その気になれば形式は何だっていいと思う。ちなみにオンライン講座の利点として僕が感じていることの中には、対面と違って期中での受講開始が可能であることや、講義を受けるにあたって場所や時間を選ばないこと、最新・最先端の知識を学べることなどがある。

実際に手を動かしてみること

Googleで「python 入門」と検索すると非常にたくさんの結果が返って来て、pythonの使い方を紹介してくださっている様々なBlogや個人ページにたどり着くことができる。しかもその多くを無料で閲覧することができるため、非常にありがたいことに、情報は取ろうと思えばいくらでも簡単に入手可能である。しかし、与えられた情報をただ漠然と眺めていても何も身につかない。もちろん優れたコードを読み参考にすることで、より簡潔で美しいコードが書けるようになるかもしれないが、それ以前に重要なのは、人の書いたコードを真似るだけでもいいから、実際にコードを自分で書いてみて、コンピュータ上で動かし、何が起こるのかを自分の目で確かめることだ。これはスポーツをすることや楽器を演奏することと同じで、よほど特異な才能でもない限り、ギターの譜面をじっと眺めただけで、初心者がいきなりギターを演奏できるようにはならない。譜面を追いかけながら一つ一つ音を鳴らし、体に覚え込ませることで、上達していくものである。

次に、人の書いたものを真似することの有効性について、「新しいアイデアは既存要素の組み合わせによって実現される」というジェームス・ヤングの言葉を踏まえて考えてみる。新しいアルゴリズムやプログラミングにより実現される新たなサービスは、既存のコードを新しく組み直したものにすぎない、とも言えるため、人が書いたものを真似してどんどん試し、「こう入力すればこんなアウトプットが出る」という経験をたくさんストックしておくことは、非常に有用なことである。必要に応じて引き出しを開けて組み合わせていくことで、新しい価値を生み出すことができる。このとき、必ずしもコードをすべて記憶しておく必要はないと思う。こういうことをする場合にはあの本を参照すればいいとか、Stack overflowのあの回答に書いてあったなとか、必要な情報にすぐにアクセスできるようにさえしておけば事が足りるんじゃないかと感じている。

アイデアのつくり方

アイデアのつくり方

30才から向き合うプログラミング

プログラミングを学ぶことを通じて論理的思考が鍛えられたり、問題解決力が身についたりと、現代社会において、プログラミングは英語と並ぶくらい有用なスキルとして注目されている。当然早くからスタートするほうがより定着するだろうということで、プログラミング教育を取り入れる小学校が増えていたり、習い事の一つとしてプログラミングを組み入れる親が増えているなど、子どもの頃からプログラミングに触れられるような機会が広がっているように思う。

今回の記事では、プログラミング(主にpython)を始めたきっかけと、pythonに出会うまでの自分とプログラミングとの接点について、簡単に振り返ってみたい。

 

 

30才からのプログラミング

一方、私がプログラミングを学び始めたのは30才を過ぎ、31に差し掛かってきた頃。留学先の大学院でデータサイエンスの授業を履修したことがきっかけで、Rとpythonに出会った。それまでにもStataを使ったデータ分析はやったことはあったが、いわゆるプログラミング言語に興味を持ち始めてから学ぶのはこのときからである。

当時、データサイエンスという言葉がバズワードのように取り上げられていて、「データサイエンティストは21世紀最もセクシーな職業」とも言われていた。

hbr.org

 

また、RStudioというIDEの扱いやすさや、機械学習系のパッケージが充実しているということなどからR言語がもてはやされていた時代でもあったが、ipython notebook(現jupyter notebook)の使い勝手の良さに触れたり、たまたま参加したKaggleのコンペで、Rでは処理できないほどの行数をもつデータセットを扱ったりしたこと、webアプリづくりにも適していたりすることがきっかけで、pythonをメインに学習するようになった。

どちらが良いというわけでもないが、昨今取り沙汰されているDeep Learningのフレームワークpythonを中心に数多く存在していることを鑑みると、pythonをメインにしていて良かった気もする。

 

過去の自分とプログラミングとの接点

思い返せばそれよりもずっと前にプログラミングとの接点はあったはずだが、どちらかという苦手なほうだった。記憶にある限り最初に触れたのは中学校の技術の授業。何をやったかはっきりと覚えていないが、簡単な野球ゲームのようなものを作ったような気がする。当時からパソコンを触るのは好きだったが、直感的な操作が可能なインターフェースを持つアプリケーションを好む一方で、真っ黒な画面に白色の字を一行ずつ打ち込んでいき、動作を一つ一つ確認していくという作業はかったるかったように思う。

 その次にプログラミングに触れたのは大学一回生のときで、必修の授業の中でFortranを学んだ。簡単な計算処理から分子軌道計算の触りまでをやったような気がするが、得意だと感じることもなければ、のめり込むようなこともなかった。そもそも私のいた学科は化学系であり、汗水垂らして化学実験に没頭することが醍醐味という雰囲気があったため、机上のシミュレーションはそれほど人気もなく、教育カリキュラム的にもあまり重視されているように思えなかった。

 

なぜそれまで、プログラミングは自分を惹きつけるものではなかったのか?

これまで振り返ってきたように、大学を卒業するまでに触れたプログラミングに対する印象は大して記憶に残らないようなものであったが、それはプログラミングがどんな形で活用されているのか、実態を把握することができなかったからのように思われる。それはプログラミングだけでなく数学や哲学のような抽象的な学問に対しても言えることで、「有機化学の技術によって合成された化合物が新薬の成分として使われている」、という具体的な事例を聞くと、化学が世の中でどんなふうに役に立っているかをそれなりにイメージできるのに対し、「相対性理論や三角測量がGPSの技術として使われている」と言われても、目に見えないのでピンとこない。このようにプログラミングは、身の回りの生活において実態がなく、ブラックボックス化されていて特に知らなくても問題ないという存在であったため、惹きつけるような魅力を感じさせないものであったように思う。

 

プログラミングは実社会において有用か?

そんな自分のプログラミングに対する印象が少し変わったのは、社会人になって経験したことがきっかけである。大量のテキストファイル(csvファイル)をエクセルで扱うにあたり、VBAを用いたマクロ処理に業務を通じて触れたことで、人がチマチマと時間をかけておこなっていた手作業が、ボタン一つで簡単に自動化できてしまうという便利さを実感することができた。

これ以外にも、例えばBlogの見栄えをよくするのにhtmlが一役買っているとか、いろんなアプリケーションを動かしているのはJavaだとか、色んなことを見聞きするようになり、プログラミングに対する興味は少しずつ高まってはいた。

しかし、VBAのコードも先輩が書いたものやインターネットで見つけてきたものを適当に切った張ったして使っていた程度の知識しかなく、自分で書くにはハードルが高そうだし、自分のなかでは英語などに比べて勉強するインセンティブも優先順位もそれほど高くないと捉えていたため、それっきりであった。

 

新しいことを始めるのに遅すぎることはない

VBAを少しかじったものの、そこから特に進展することもなく4年ほどが過ぎた頃、冒頭で述べたようにpythonに出会った。「何か新しいことを身につけたい!」と思っていた時期だったので、自分としては良いタイミングだったと捉えている。

次回の投稿では、微力ながら、これまでどうやってpythonを学んできたか、どんなことを心がけているかについて、まとめてみたい。