Predator's Vision

画像処理、3D点群処理、DeepLearning等の備忘録

PyTorchの実行速度 CUDA on Windows10 vs WSL2

Windows10 Insider Program ではWSL2からCUDAが使えるとのことで、下記を参考にインストールしました。qiita.com

その上で、WindowsからCUDAを叩くのと、WSL2から叩くのとでどれぐらい実行時間に差があるのか試しました。

環境

コード

torch_test.py

#!python3
import torch
import torchvision.models as models
import argparse
import time

def run(use_gpu: bool, dtype: torch.dtype):
  # Prepare model and data
  model = models.resnet18()
  tensor = torch.rand((40, 3, 480, 640), dtype = dtype)

  # To GPU
  start_time_total = time.time()
  if use_gpu:
    start_time_gpu = time.time()
    model = model.cuda()
    tensor = tensor.cuda()
    elapsed_time_gpu = time.time() - start_time_gpu
    print('toGPU time = {:3f}[s] ({})'.format(
      elapsed_time_gpu,
      dtype
      )
    )

  # Process
  start_time_proc = time.time()
  _ = model(tensor)
  finish_time = time.time()
  elapsed_time_proc = finish_time - start_time_proc
  elapsed_time_total = finish_time - start_time_total
  
  print('{} proc time = {:3f}[s] ({}), total time = {:3f}[s]'.format(
    'GPU' if use_gpu else 'CPU',
    elapsed_time_proc,
    dtype,
    elapsed_time_total
    )
  )

if __name__ == '__main__':
  print('PyTorch %s' % torch.__version__)

  device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
  print('device: %s' % device)

  run(False, torch.float32)
  run(True, torch.float32)

実行結果

それぞれ3回実行しました。

Windows

>python torch_test.py
PyTorch 1.7.1+cu110
device: cuda:0
CPU proc time = 2.412968[s] (torch.float32), total time = 2.412968[s]
toGPU time = 1.028965[s] (torch.float32)
GPU proc time = 1.586547[s] (torch.float32), total time = 2.615512[s]

>python torch_test.py
PyTorch 1.7.1+cu110
device: cuda:0
CPU proc time = 2.465967[s] (torch.float32), total time = 2.465967[s]
toGPU time = 1.031965[s] (torch.float32)
GPU proc time = 1.586000[s] (torch.float32), total time = 2.617966[s]

>python torch_test.py
PyTorch 1.7.1+cu110
device: cuda:0
CPU proc time = 2.976967[s] (torch.float32), total time = 2.976967[s]
toGPU time = 1.005968[s] (torch.float32)
GPU proc time = 1.590999[s] (torch.float32), total time = 2.596968[s]

WSL2

$ python torch_test.py
PyTorch 1.7.1+cu110
device: cuda:0
CPU proc time = 2.276961[s] (torch.float32), total time = 2.276962[s]
toGPU time = 2.526399[s] (torch.float32)
GPU proc time = 0.220261[s] (torch.float32), total time = 2.746719[s]

$ python torch_test.py
PyTorch 1.7.1+cu110
device: cuda:0
CPU proc time = 2.329590[s] (torch.float32), total time = 2.329591[s]
toGPU time = 2.428853[s] (torch.float32)
GPU proc time = 0.219387[s] (torch.float32), total time = 2.648300[s]

$ python torch_test.py
PyTorch 1.7.1+cu110
device: cuda:0
CPU proc time = 2.325431[s] (torch.float32), total time = 2.325431[s]
toGPU time = 2.907129[s] (torch.float32)
GPU proc time = 0.219199[s] (torch.float32), total time = 3.126382[s]

結論

おおむね所要時間は同じでした。
ただ細かいことを言うと、CUDA使用時は

  • cuda()を呼ぶとき
  • 推論するとき

の所要時間が異なっていました(2つを合計すればほぼ一緒のようです)
WinとWSL2(またはLinux全般?)で書き方の違いで時間がかかるタイミングが異なるかもしれないことに注意しないといけないのですね…

マウスカーソルを見失ったときに所定の場所に強制移動させる

マルチディスプレイしているとマウスカーソルを見失うことも多いが、そのたびにマウスをバタバタと左右に動かして画面のどこにあるか探す時間が勿体ない。

そこで、マウスカーソルが画面上の所定の位置に来るようなbatを作成した。これをpathが通るところにおいて、Winキー→bat名入力で即座にマウスカーソルを取り戻す。

@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 1})-join\"`n\");&$s" %*&goto:eof

add-type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Cursor]::Position = new-object System.Drawing.Point(960, 540)

C, V, H キーが打てない問題の解消法 (When C, V, H keys don't work...)

TL;DR (English)

  • It might depend on each environment, but in my case, "Right Windows" key is regarded as pressed down.
    • Of course my keyboard doesn't have such a key... So I can't press it.
  • To solve this problem, simulate "R Win" key (VK_RWIN) with some tool.
    • You can create it by yourself using Win32API keybd_event()
  • My guess is that this problem might occur due to the malfunction of keyboards.

TL;DR (Japanese)

  • この問題の発生原因は人それぞれかもしれないが、私の場合は「右Windowsキー」が押しっぱなし状態と判定されていることが原因だった。
    • ちなみに使っているキーボードには「左Windowsキー」しかなく、当然「右Windowsキー」を押した覚えはない。
      • たぶん今時「右Windowsキー」のついたキーボードの方が珍しいはず
    • なおWindowsに標準でインストールされているソフトウェアキーボードも「左Windowsキー」しかないので、解消できない。
  • キーボード入力をシミュレートするツールで「右Windowsキー」を話したことにして対処。
  • (恐らくだが)原因はキーボードの誤動作。無線キーボードを使っているのだが、伝送する信号を間違えたのかな…あくまで想像。

詳細

結構長い間、下記の問題に悩んでいた:

  • テキスト入力欄にC, V, Hキーが打てない
  • C, V, H, Aキーを押すと変な動作をする
  • etc

ネットで調べても同様の症状の人は世界中でいるようである。
検索欄に「c v h」と入力したら他の人も検索しているみたい。

f:id:presan:20190622222311p:plain
c v h suggestion

実際いくつかの質問サイトでQ&Aがあるが、人それぞれ原因は違うようでいろんな対策が載っている。

ちなみに私は検索して出てくるやつでは一向に改善しなかった。
これまでは、しばらく我慢してたらどういうわけか直ったりしていた。
(いつか直るまでどうにも我慢できないときは、一度ログオフしたり再起動したりしていた)

ちょっと真面目に原因を探ろうと思い、何か特殊キーが押された状態になっているのではないかと仮説を立ててキー入力状態を見てみたら、当たりだった。

Structure Sensor を Windows へ接続

f:id:presan:20140619021657p:plain

はじめに

"Structure Sensor" というiOS向けの超小型デプスセンサーについて、いろいろな方が既にレビューをされています。(ちなみにデプスセンサーとは距離情報を取得できるセンサーで、MicrosoftKinectを契機にかなり有名になりました。)


ただ、書かれている記事のほとんどが「iOSに繋げてみた」「デモアプリを使ってみた」ばかりのようなので、私は「iOS以外にUSB接続して、自力でデータを取り出す方法」を書きたいと思います。具体的には、今回はまず「Windowsから Structure Sensor を触る方法」を書いて、後に「Windowsで深度画像とポイントクラウドを取り出す方法」を書く予定です。

環境の準備

Structure Sensor は iOS からは Structure SDK というものを使えば触ることができます。そしてiOS以外の場合は OpenNI2 (OpenNI1ではダメ) を使えばよいそうです。

というわけで、まずOpenNI2を用意。
OpenNI2は今はStructure Sensorの下記のサイトからバイナリやドキュメントがダウンロードできます。

インストール後はOpenNI2のフォルダ内のどこかにあるPS1080.ini内の

;UsbInterface=2

になっているところを

UsbInterface=0

に修正します。これでStructure Sensorからデータを読み出すことができるようになりました。

接続確認

サンプルプログラムのNiViewerを起動したところ下記のようにちゃんと動作しました。(Win7Win8でそれぞれ動作を確認)左側がデプスで、右側が赤外線です。

f:id:presan:20140619020545p:plain

f:id:presan:20140619020556p:plain


次回は深度画像とポイントクラウドを取得したいと思います。