PyTorch始めます(予告編)
[technology][PyTorch]Chainerの開発が終了したので、PyTorchに移行するための勉強をします
今月初めに告知されたChainerの開発終了。
Chainerで初めてディープラーニングに触れた身としては非常に残念なんですが、自分が残念がってもどうなるものでなく、PyTorchへの移行がお勧めされているっぽいので、過去にChainerで作ったディープラーニングの実験スクリプトを題材に、PyTorch勉強して移行させようと思っています。
仕事で使うなら、この際Keras + TensorFlowが鉄板な気もするのですが、まあ仕事で必要になればそっちはそっちで覚えると思うで、まずはPyTorch。
最初は定番のMNISTからchainerで書いたMNISTの学習スクリプトをPyTorchに移行させるのをやってみようと思っていますが、まずはその前にPyTorchのインストールです。
自分の環境はUbuntu16.04LTS+Anaconda3。
適当にググると下記のサイトを見つけ、pytorchの公式サイト
https://pytorch.org/
のGetting Started見れば適切なインストール方法を教えてくれるとのことで公式サイトに行ってみました。
現在の環境、
- 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
(つまり
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
でインストール出来るという情報が有りますが未検証です。