PythonでCUDA (…ならず)

CUDAをローレベルで書くとか言っても、ゴリゴリとコード書くほどではないので、なんだかな〜…と思っていたのだけどcupyとかpycudaとか見つけてしまった。

で、とりあえずcupyを入れるも、なにやらアーキテクチャが合わないみたいなエラーで止まってしまい動作確認できず。
pycudaはCUDA2.0〜対応しているというので、インストールしてみたのだが、これまた動かず。

どうやら、どちらもビデオカードに積んでいるCUDAのバージョンが古いので動かない…という結果に。

いやいや、待ってよ…
「pycudaはCUDA2.0〜対応」じゃないんかよ!って思ったんだけど、そもそもCUDAの動作環境としてインストールしている「CUDA toolkit」なる動作環境が間に噛んでおり、toolkitにもまた対応するCUDAのバージョンが…。

toolkit9.1の場合、それが3.0以降なので対応できぬ、という話だった。

現状linux機に積んでいるGPUはFermi世代(CUDA2.1, 具体的にはquadro600)なので、Kepler以降のもの(例えばquadroK600など)に変えないと駄目そう。
敢えてtoolkit9.0にダウングレードするという選択肢もあるみたいだけど、ソースからインストールするのではゴリゴリコード書く人と変わんなくないですか…ってことで、そのうちGPUを変えたら再度検証したい。
(Windows機に乗ってるGTX950でもKeplerの次のMaxwell世代なのでそっちなら動かせるんだけど、個人的にlinux活用週間なのでこっちで遊びたい…)

…考えてみるとpycudaではコードゴリゴリ書くのとあまり変わんないような気もするし、その際はnumpy準拠(?)のcupyで行きたい。

そもそもCUDAのローレベルのコードというのは

 どんなものか? という話もあるのか…

 CUDAの基本的な動作パターンは、大雑把には以下の通り。

 ・予めCPU側で計算する値の配列情報を用意
 ・用意した配列をGPU側に転送(メモリ確保&コピー)
 ・GPU側で実行する計算処理を指定してGPU側の計算を実行
 ・GPU側の計算が終わったら、GPU側からCPU側に結果を転送(メモリ確保&コピー)
 ・GPU側のメモリを開放

 pycudaの場合は、これを概ねそのままPythonで記述する感じ。
 cupyの方は、基本numpyと同じような記述で済む。

 どっちだって同じじゃね?と思うかもしれないが、例えば「GPU側で実行する計算処理」はPythonではなくて nvcc でコンパイルするものをそのまま書く感じなので、ここはC言語に準拠した記述になる。これをpycudaでは文字列で扱うし、他の要素に関してもあまりPythonぽい手続きには感じない。
 numpyはそもそもPython記述で処理を書き連ねる感じになっているので、Pythonコードを書くというその部分でストレスを感じずに済む。それだけで、numpy準拠であるcupyは意味がある。

SSHを再接続した際に、接続断までに処理していたプロセス状況を引き続き表示したい

タイトルが異様に長い…

SSHでネット越しにlinuxに繋いで時間の掛かる処理をさせた場合。
一旦接続を切りたいけど、切ると実行中のプロセス状況が確認出来なくなる…という事に少し悩んでたのですが、ふとググると見つかりました…

あるんですね。
再接続後に状況もう一度表示させる手が、、、

screenを使ってssh経由のコマンドを便利に

ついでに raspbian jessie lite を使おうとしたら、ssh接続でハマった..

 めも。

 PuTTYでWindowsからSSH接続しようとしたら、”connection refused” のエラーが…
 前のraspbianで出たことなかったと思うので、ググったら出てきた。

 What is causing PuTTy to not connect to Raspberry Pi?

コマンドラインで raspi-config を実行. > 8 Advanced Options > A4 SSH > make sure SSH access is “enabled”

 単にデフォルトでは、ssh の daemon が起動してない設定だったというオチ。。
 いや、これオチですらないな。。(=_=;

その後

 もっと楽な方法があることを知った。

 ssh対策を行う@RASPBIAN JESSIE WITH PIXELのインストール

 root に ssh フォルダを作るだけで良いとは…

Visual Studio Code

めでたく、1.0公開されてた。
https://www.visualstudio.com/ja-jp/products/code-vs.aspx

Win/Mac/LinuxとOSを選ばずにエディタを統一できるし、最近の統合型エディタにお決まりの便利機能も満載で、ショートカットとか慣れればいい感じかも。

ま…高機能メモ帳としてつかう。という選択肢もある。

OSXでの日本語ファイル名がちょっと独特だった件

めも。

>Mac OS X上のUnicode
https://unoh.github.io/2007/09/04/unicode-on-mac.html

>convmv
http://kaiseki-web.lhd.nifs.ac.jp/wiki/index.php/Convmv

>Windows上で、UNICODEの結合文字が含まれるファイル名を、正規化したファイル名にリネームするスクリプト
https://gist.github.com/pekeq/6182948

上のままだとPowerShellのバージョンが違うのか「Get-ChildItem」の引数に -Directory, -Fileが使えなくてエラーが出た…
下記のようにコマンドを変えて、とりあえずカレントフォルダの対象のファイル名を強制リネームするように書き換えたら動いた。。

PowerShell実行権限に関しては、セキュリティポリシーの変更が必要かも。。
http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html

シグナルというのは、どんなものなのか..?

linuxに明るくないので、これも調べてみた。

signalについて(@CodeZine)
シグナルとコールバック(@Super Technique 講座)

とりあえず大雑把な概要は、”割り込み処理を実現する機能のこと” だった。(プロセス間で非同期に割り込み処理を発生させるのが主な目的。)
Python使っていてなじみ深い割り込みっぽい動作というと例外処理だけど、シグナルはホントに処理中になんの脈絡もなく(いや..実際はちゃんと脈絡はあるんだけど。処理的にはコードの実行順序に全く関係ないタイミングで)他の処理を割り込ませることができる。

例外処理は、あくまでも実行している処理に問題があった場合に特別な分岐を発行できるだけなので、”割り込み処理”ではない。
割り込み処理は字面通り、今行われている作業を中断して別の処理を行わせるもので、仕事の最中に電話が割り込みで掛かってきたので電話を受けた、みたいな感じ。このなんの脈絡もなく電話が掛かってくる、というのがシグナル処理のイメージ。
※電話を受けるには、机に電話があり、掛けてくる相手も必要。シグナルを準備する部分(図の”生成”)は、電話を受ける為の下準備としてそういうものを用意していると考えれば判る?
※実装上は、どういう種類のシグナルが上がった場合にどのハンドラ関数が呼ばれるか、を記述する。

シグナル

シグナルの方は、何秒後に自動的に発行とか、子プロセスにシグナルを送るとか、そういう感じで使われる。
昔のTVゲームでは(ハードウェア)割り込み処理というのは頻繁に使われていた。
※割り込み発行することで、音源モジュールを叩いて一定のテンポでBGM再生させたり、画面の垂直同期を拾って一定のfpsで画面の書き換えを促したり。主に速度調停用に使っていた。

最近のPCは処理速度がやたら早く待ち時間の方が多くなっているので、昔のように目の前の処理でいっぱいいっぱいにはならず、むしろポーリングで次のタイミングをひたすら待つ感じ?? あまり馴染みのない機能かもしれない..
自分は、linuxのようなOSレベルの割り込み処理も使ったことがないので、そっちのほうに具体的なイメージがわかなくて、まだいまひとつピンときていない。

Pythonのシグナルの例は、タイムアウト処理を実現していた。(⇒例)
※普通にファイルをopenすると応答なしになってしまう場合を想定して、事前のシグナル設定で「(タイムアウト処理として)5秒後に、例外を発生させる割り込みが起こる」というもの。