Re:ゼロから始めるML生活

ミスよりグズを嫌え

PyTorchを使ってみた

f:id:nogawanogawa:20181029135436p:plain:w600

最近いろいろ忙しかったのですが、一段落ついたのでまたブログを再開します。

ここのところのディープラーニング界隈では、PyTorchなるものがなんだか流行っている感じがあって、今回はそれを使ってみます。

Pytorchとは

まず、PyTorchって何なん?ってところですが、公式ページがこちらです。 全然関係ないですけど、公式ページおしゃれだなー。。。

pytorch.org

ざっくり概要を書くとこんな感じです。

  • 開発:Facebook主導
  • 実行モデル:Define by run
  • ホスト言語:Python
  • プロセッサ:CPU/GPU

ほんとに盛り上がってんの?ってところですが、Githubのスターの数はこんな調子です。

f:id:nogawanogawa:20181029224848p:plain

イメージで言うと、人気はTensorFlow、Caffeの次くらいですね。 Caffeは結構以前からあるので、昔からのユーザーがついていたり速度的には一番速いらしく、一部では人気があるようです。

PyTorchはというと、caffeに比べて総数的には負けてはいますが勢いは同じくらいかなと言う感じでしょうか。 PyTorchのコントリビューションを見るとこんな感じです。

f:id:nogawanogawa:20181029154912p:plain

TensorFlowのコントリビューションがこんな感じです。

f:id:nogawanogawa:20181029154941p:plain

TensorFlowがよく使われているのはもちろんですが、後発組の中ではPytorchも結構盛り上がっている印象です。

実行モデル

TensorFlowとPytorchを比較するとわかりやすいのですが、TensorFlowでは"Define and run"実行モデルを採用している一方、Pytorchでは"Define by run"という実行モデルを採用しています。

まず、TensorFlowの実行モデルである"Define and run"はこんな感じでした。

f:id:nogawanogawa:20181030104433j:plain:w500

"Define and run"のモデルでは、ネットワークの構築と実行(データをネットワークに流す)が別々に記述されます。

一方、Pytorchの実行モデルである”Define by run”はこんな感じです。

f:id:nogawanogawa:20181030104451j:plain:w500

”Define by run”の実行モデルでは、実行時にまずネットワークを定義して、間髪入れずにそこにデータを流し込んで実行まで行います。

それぞれにメリット/デメリットはありますが、PytorchなどのDefine by runのフレームワークでは通常のPythonと同じ感覚で直感的にコードが書ける点が大きなポイントと言えそうです。

環境構築

基本的にはこちらのサイトの通りに打っていただければOKです。

pytorch.org

将来的にクラウドに持っていくことを見据えて、Docker(Ubuntu 18.04)にインストールしてみます。

使ったDockerfileはこちら。(まずはMacbookで動かすので今回はCudaはインストールしてません)

Docker Containerを起動すれば、Pytorchが使えるようになります。 稼働確認として、Tutorialにあるこんなスクリプトを打ち込むと

from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)

こんな感じに出力されればインストール成功です。

tensor([[0.3380, 0.3845, 0.3217],
        [0.8337, 0.9050, 0.2650],
        [0.2979, 0.7141, 0.9069],
        [0.1449, 0.1132, 0.1375],
        [0.4675, 0.3947, 0.1426]])

使い方

NNのサンプル

本題のPytorchの使い方ですが、まずはTutorialに載っているNNをそのままやってみます。

Deep Learning with PyTorch: A 60 Minute Blitz — PyTorch Tutorials 1.0.0.dev20181002 documentation

やりたいのはこんな感じです。

f:id:nogawanogawa:20181030142853j:plain

で、実際にサンプルコードを打ち込んでみるとこんな感じですね。

resultのbackwardの前後でtensorの値が変わっていて、一応計算はされているように見えます。

感想

Define and runのTensorFlowに加えて、今回はDefine by runのPytorchを見ました。 流行りなので今後はTensorFlowも使いつつ、徐々にPytorchにシフトしていこうかと思っています。 (乗るしかないこのビッグウェーブ)