祭囃子は遠く、

祭囃子は遠く、

無職のハッピーエヴリディを書いていきます。

kaggleやろおぜ(環境構築編)

こんばんわ、周りのオタクたちがkaggleの機運を高めているので環境構築について色々調べていたら気になるものが

qiita.com

ば・・・爆速!?環境構築が一瞬で終わってしまう夢のような話があるのか。
読んでいくとDockerを使ってやっているらしい。

Dockerとは

f:id:ta_ichi:20190609000232p:plain
Docker(ドッカー[2])は、コンテナと呼ばれるOSレベルの仮想化(英語版)環境を提供するオープンソースソフトウェアである[3]。VMware製品などの完全仮想化を行うハイパーバイザ型製品と比べて、ディスク使用量は少なく、仮想環境 (インスタンス) 作成や起動は速く、性能劣化がほとんどないという利点を持つんですよね。

まぁ早い話が、アプリとかライブラリとかOSとかひとまとめにしたやつをガシャガシャ動かせるやつみたいなもんだと思ってます。
実際に触り始めて1日しかたってないんで間違ってたら許してね。

これを使えば機械学習とかに使うライブラリをひとまとめにしたやつがババンと作れるわけですからそりゃ早いよねって。

対象・前提

対象は僕のようなPC初心者の赤ちゃんから、この辺はよく知らない大人までです。
詳しいことは理解しなくてもnotebookを開けるように書いたつもりですが、細かいところで動作確認取ってないやつあるのでおかしかったら教えてください。

僕自身あまり詳しくないので、ふんわりとしかDockerの詳しい説明とかもろもろしません。
許してね。
上の記事とこれ読めば大体わかるから頑張りましょう。(ところどころコマンドミスってるけど)
qiita.com

導入方法

基本的には上の通りにやったら一瞬で終わります。
ただ、上のやつって自分の手元にあるPCにDocker Image(環境そのものが全部詰まってるやつ)を持ってくるわけなんで、めちゃくちゃ容量食うわけです。
kaggleの公式imageだと17Gbくらいかかります。

そこで、クラウドでやりましょう!という話になります。
今回おすすめするのはGCP(Google Cloud Platform)です。
console.cloud.google.com

AWSもよさそうですが、まじめに使ったことがないのでこちらで説明していきます。
GCPは初回特典として300ドル分のクーポンをくれるので結構アドです。

まずは左上あたりにあるところからプロジェクトを作りましょう(kaggle-ichimuraとなってるところ)
f:id:ta_ichi:20190609001310p:plain
これ初回ログインの画面ではないから、もしかしたら初ログインしたら手順通りにやっていくと勝手に作らされるかも。

そして「三」みたいなボタン押してVMインスタンスを作成します。
f:id:ta_ichi:20190609001557p:plain

その後作成を押すと実際にVMのスペックを設定するところが以下のように出てきます。

f:id:ta_ichi:20190609001823p:plain

名前は適当に決めます。リージョンとゾーンは、近いやつを適当に選びました。この画面の右側に1時間当たりいくらとか出てくるので、そこと相談しながら決めましょう。
CPUやストレージについてもお好みで設定してください。僕は画面の通りに設定しました。

大事なのが「VMインスタンスにコンテナイメージをデプロイする」ってところで、ここにチェックを入れて「kaggle/python」と打ちましょう。
そうすると勝手にkaggle公式のDocker ImageをVMに導入してくれます。
ただ、立ち上げ直後は各種DLで表示されません。しばらく待ってください(5敗)

その間に以下を導入しましょう。
cloud.google.com
GCPの操作が色々楽になります、例えばSSH認証とか通信とかもう全部勝手にやってくれます。

導入したら専用のshellができるので(windows)それで

gcloud compute ssh --zone {インスタンスのゾーン} "{インスタンス名}"

で通信ができるようになります。

入ったら、

docker images

で「kaggle/python」があるか確認してください。なかったらもう少し待つか、VMを作り直してみたりしましょう。
ここまで完了すればもう環境自体は目の前にあります。

確認出来たら

docker run  -p 8888:8888  -v $PWD:/home --name test -it kaggle/python bash

でコンテナ(VM上にできる実際の環境)を作成します。
docker runは、基本的に「docker run -it {image名} そいつにやらせたいこと」みたいな形をしています。
上のコマンドは
 -pでポートのなにがしか(このあたりわかんなすぎて辛い)
 -vでVM上のディレクトリをコンテナ内の:以下から参照できるようにする(コンテナの中にデータを蓄えることは基本しない)。$PWDVMのカレントディレクトリを勝手に代入してくれます。
 --nameでコンテナの名前
 -itで用いるimage
bashを実行しますとなります。

例えば

echo "print(\"Hello World\")" > test.py
docker run -v $PWD:/home -w /home --rm -it kaggle/python python test.py  

とやるとなるほどにゃんこになれると思います。

 --rm は実行ごとにコンテナを使い捨てるオプションで、-wはコンテナのカレントディレクトリになります。
 -vでコンテナのhomeディレクトリとVMのカレントディレクトリを引っ付けてるので、そのままtest.pyで実行できているわけです。

そんなこんなでコンテナの中に入れたら

jupyter notebook --ip=0.0.0.0 --allow-root

と打ちましょう。オプションはどんなipアドレスからの接続も受け付けますとかそんな意味だった気がします。

画面にjupyter notebookが起動され、tokenが表示されると思うのでこれをコピーしましょう。

ここでsdkのshellに戻って

gcloud compute ssh "インスタンス名" -- -N  -L 28888:localhost:8888

と打ち込みます。
その後ブラウザのURL打つことろに「localhost:28888」と打ってアクセスします。

f:id:ta_ichi:20190609004709p:plain

すると上みたいな画面になって、tokenを聞いてくるので上のやつを張り付けてゴールです。

入れたら色々importしてみて各種ライブラリが入っていることを確認してください。

終わりに

さっき成功して忘れないうちにかいてるので、もしかしたら上の通りにやってもだめかもしれません。
その時は教えてください。

あとkaggleにはkernelってやつがあって、notebook形式で人の成果を読むことができるすごいやつなんですが、なんと本当にnotebookのようにプログラムを実行できます。
参加しているコンペのページからNew kernelで作成すると訓練データなど一通り導入してある仮想環境が立ち上がります。
最初はここで遊ぶのが一番いいでしょう(無料だし、GPU使えるし)。ただ、外部からデータ持ってきたりとかその辺はいろいろできなかったりするので。
もっといい環境でやりたい場合に今回の方法がおすすめです。

公式imageはまだGPUをサポートしてないぽい?ですが、git読んでる感じそのうちリリースされそうなので待ちましょう。

ちなみに僕はこれに出ようかなぁと思ってます。なんか分子間のカップリングを予測するやつっぽいですね。
僕は物理科出身な上にこのあたりが割と近い専門なのですが、不勉強なので何のアドバンテージもありません。頑張ります。
www.kaggle.com
 

追記

kaggleを始めようぜって前提で記事書いたのに、データセット落とすとこ説明してませんでしたね。
kaggle APIを使いましょう、imageの中には導入されていなかったので以下に従って導入などを済ませてください。(僕はコンテナでやった)
qiita.com
基本この通りやればいいんですが、jsonファイルをアップするの面倒なんで~/.kaggleに入って、DLしたjsonの中身をコピペしましょう

echo "{\"username\":\"scibean\",\"key\":\"key\"}" > kaggle.json

echo以下は中身のコピペで、"をバクスラでエスケープするのを忘れないでください。その結果をkaggle.jsonに書き込んでいます。
この設定が終われば後は自由に使えます。

画像のようにコンペのページに行くとdataタブの右下にapiでデータ落とす際のコマンドがあるのでコピペしましょう
f:id:ta_ichi:20190609120208p:plain

この時

mkdir data
cd data

とやっておいてコピペしたコマンドに-wをつけるとカレントディレクトリにDLされます。
基本zipなのでunzipコマンドで解凍しましょう。
解凍先はなるべく指定した方がいいです。たまにファイル数がとんでもないやつがモリモリ出てきて大変なことになります(rm,mvコマンドにはファイル数に上限あるがので面倒なことになります)

では