ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

PyTorch始めます(予告編)

[technology][PyTorch]Chainerの開発が終了したので、PyTorchに移行するための勉強をします

今月初めに告知されたChainerの開発終了。

chainer.org

Chainerで初めてディープラーニングに触れた身としては非常に残念なんですが、自分が残念がってもどうなるものでなく、PyTorchへの移行がお勧めされているっぽいので、過去にChainerで作ったディープラーニングの実験スクリプトを題材に、PyTorch勉強して移行させようと思っています。

仕事で使うなら、この際Keras + TensorFlowが鉄板な気もするのですが、まあ仕事で必要になればそっちはそっちで覚えると思うで、まずはPyTorch。

最初は定番のMNISTからchainerで書いたMNISTの学習スクリプトをPyTorchに移行させるのをやってみようと思っていますが、まずはその前にPyTorchのインストールです。

自分の環境はUbuntu16.04LTS+Anaconda3。
適当にググると下記のサイトを見つけ、pytorchの公式サイト
https://pytorch.org/
のGetting Started見れば適切なインストール方法を教えてくれるとのことで公式サイトに行ってみました。

hoge49.hatenablog.com

現在の環境、

  • Linux
  • Anaconda(Package manager=conda)
  • Python3.6
  • Cuda 9.2

を指定すると、

$ conda install pytorch torchvision cudatoolkit=9.2 -c pytorch

でOKとの表示が出たので、AnacondaでChainerの実験に使っている環境に上記コマンドでPyTorchを足す事にしました。
PyTorch専用環境を作った方が安全そうではあるものの、Chainerからの移行にあたって、両方が同時に動く環境を作っておきたい意図があり、ダメならcondaで新たに環境作れば良いや..ということでポチっと実行。

特に何の問題もなくインストールは完了。
先ほどのサイトに書かれていた様に一応pytorchがimportできて動く事を確認。

Python 3.6.9 |Anaconda custom (64-bit)| (default, Jul 30 2019, 19:07:31) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> x = torch.rand(5, 3)
>>> print(x)
tensor([[0.2527, 0.9592, 0.1244],
        [0.6672, 0.3627, 0.9215],
        [0.6611, 0.7179, 0.5947],
        [0.4514, 0.1175, 0.3888],
        [0.4018, 0.8230, 0.7900]])
>>> 

はい、とりあえずこんな感じで動きました。
明日以降に時間を作ってMNISTのテストコードをPyTorchに移植してみます。
(続く...はず)

[technology][PyTorch]追記: Ubuntu 16.04LTS+Anaconda3+PyTorch環境でエラーが出たので対策

上記でPyTorchのインストールが上手く行ったの書いたのですが、pythonをREPLモードで起動するとimport torchが通るのに、スクリプトファイルにimport torchと書いて

$ python <scriptファイル名>

と実行すると、こんな感じのエラーが出ます。

Traceback (most recent call last):
  File "mnist_test_torch.py", line 9, in <module>
    import torch
  File "/home/toy/anaconda3/envs/py36/lib/python3.6/site-packages/torch/__init__.py", line 81, in <module>
    from torch._C import *
ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.11' not found (required by /home/toy/anaconda3/envs/py36/lib/python3.6/site-packages/torch/lib/libtorch_python.so)

自分はAnacondaのbaseではなくpy36という環境上でPyTorchのインストールを実行し、py36上でPyTorchを使おうとしたのですが、どうやらlibstdc++.so.6をロード出来ない様です。
色々確認した結果libstdc++.so.6は
/home/toy/anaconda3/envs/py36/lib
(つまり/anaconda3/envs/<環境名>/lib)の下に存在したのですが、このパスが環境変数LD_LIBRARY_PATHに入っていない様です。

conda activate <環境名>した際にLD_LIBRARY_PATHにこの環境(py36)固有のライブラリパスが追加、conda deactivateで元に戻る様に以下の細工をします。
stackoverflowの下記の記事を参考にしました。
stackoverflow.com

以下、ホームディレクトリ直下にanaconda3をインストールしている前提で。

1. <ホームディレクトリ>/anaconda3/envs/<環境名>/etc/の下に以下のディレクトリを作成する。<ホームディレクトリ>/anaconda3/envs/<環境名>/etc/conda/activate.d/<ホームディレクトリ>/anaconda3/envs/<環境名>/etc/conda/deactivate.d/

2.それぞれのディレクトリの下にenv_vars.shというファイルを作る。
3. <ホームディレクトリ>/anaconda3/envs/<環境名>/etc/conda/activate.d/env_vars.shの中身

#!/bin/sh
export OLD_LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=<home directory>/anaconda3/envs/<環境名>/lib:${LD_LIBRARY_PATH}

自分が作った実際のファイルは、

#!/bin/sh
export OLD_LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=/home/toy/anaconda3/envs/py36/lib:${LD_LIBRARY_PATH}

4. <ホームディレクトリ>/anaconda3/envs/<環境名>/etc/conda/deactivate.d/env_vars.shの中身

#!/bin/sh
export LD_LIBRARY_PATH=${OLD_LD_LIBRARY_PATH}
unset OLD_LD_LIBRARY_PATH

これでconda activate <環境名>を実行するとLD_LIBRARY_PATHに必要なパスが追加され、conda deactivateでactivate前の状態に戻ります。

なお、そもそもlibstdc++.so.6がanaconda環境下に無い場合は、

$ conda install libgcc

でインストール出来るという情報が有りますが未検証です。