Posted at

WindowsでCUDA+PyTorchのサンプル実行するまでのメモ

More than 1 year has passed since last update.

CUDA + PyTorch + IntelliJ IDEA を使ってPyTorchのVAEのサンプルを動かすとこまでのメモです。

PyTorchの環境作ってIntelliJ IDEAで動かすところまでの番外編というか、むしろこっちが本編です。

↑の記事との違いは、GPUを使うためにCUDAを入れるところ、Anacondaを使わずにできるだけ最小限のライブラリインストールで済ませているところです。

2018/7月版。


前提


  • Windows10、GTX1080環境での手順です

  • Mac(CUDA抜き)でも同様の手順で動作を確認


環境構築


Visual Studioを先に入れる

CUDAインストール時にVisual Studio入れてね、と言われるので先に入れておきます。

C++のコンパイラ使ってるみたいです。

Visual Studio Communityで大丈夫です。

Visual Studio


CUDA入れる

nVIDIAのGPUを計算処理に使うためのツールキットCUDAをインストールします。

現時点で9.2が最新バージョンですが、ライブラリ側が対応していないことが多いため、9.0を入れておくと良いと思います。

(あと、自分の環境では9.1がエラーでうまくインストールされませんでした。)

CUDA Toolkit


PyTorch入れる

インストール方法は公式サイトを参考に。バージョン等をぽちぽち選択すると、1〜2行のインストールコマンドが出てきます。

https://pytorch.org/

python3.6ならこんな感じ。


pythonインストール

pip3 install http://download.pytorch.org/whl/cu90/torch-0.4.0-cp36-cp36m-win_amd64.whl 

pip3 install torchvision


Python環境作る

venvの機能を使って仮想環境を作っておきます。プロジェクトごとにライブラリの管理などができ、便利です。


venv

python -m venv dir_name


とすると、dir_nameディレクトリが作成され、その中は仮想環境になっています。

以下のようにすることで有効化できます。(bashの場合)


venv

cd dir_name

source bin/activate



シェル別有効化方法はこちら。

引用&参考:venv - 仮想環境の作成

無効化するときはdeactivate


サンプル実行

サンプルとしてpytorch-exampleのVAEのソースを持ってきて動かしてみます。

git clone https://github.com/pytorch/examples.git

cd examples/vae/
python main.py

ここでwindows環境ではMultiprocessing error without if-clause protectionという実行エラーが出ました。

RuntimeError:

An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.

This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:

if __name__ == '__main__':
freeze_support()
...

The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.

この場合、エラーメッセージのように実行するコードを関数化してf __name__ == '__main__':から呼び出すことで回避できます。

サンプルコードの下部、forループの部分を以下のように雑に変更しました。(全体を囲ってしまってもよいですけどね)


windows用

def main():

for epoch in range(1, args.epochs + 1):
train(epoch)
test(epoch)
with torch.no_grad():
s = torch.randn(64,2)
for i in range(0,64):
i
s[i] = epoch / 4 + 2/1024*i + (torch.range(1,2) / 1024) - 5

sample = s.to(device)
sample = model.decode(sample).cpu()
save_image(sample.view(64, 1, 28, 28),
'results/sample_' + str(epoch) + '.png')

if __name__ == '__main__':
main()


他にもwindowsで起こりがちなエラーは以下のページに解決策が載っていることもあるので、困ったら確認しましょう。

https://pytorch.org/docs/stable/notes/windows.html

これで計算結果がズラーっと出てくれば動作OKです。

また、この時代表的な引数として以下を指定できるようです。

指定
デフォルト値

--batch-size
128

--epochs
10

--no-cuda
False

--seed
1

--log-interval
10


Intellij IDEA設定する

IDEから先ほど作成したvenv環境にアクセスできるようにします。(もちろんIDE側で新規作成しても良い)

importプロジェクトでVAEのプロジェクトを指定します。



この時、途中でSDKの選択が出てくるのでvenvで作成した環境の物を選択します。



左上の+ボタンからSDKを追加できるので・・・



Base interpreterに、作成した仮想環境以下のbin/pythonを指定

これで、開発環境もOK

※キャプチャ画面がWindowsだったりMacだったりになっていますが、WindowsとMac両方で試してたからです。念のため。


おまけ 速度比較

cudaありなしでどの程度速度に差が出るかを試してみました。


  • cudaなし



  • cudaあり



結論:GPUすごい。