2016年8月9日

docker ? (2)

Docker for Windowsを使うと、Hyper-Vが有効になるらしいが、これのせいでVirtualBoxを動かすことができない。
手軽に変更できないだろうか?

http://www.atmarkit.co.jp/ait/articles/1511/13/news032.html

できないようだ。。。。
Dockerのアンインストールは不要だが、再起動はせんといかんらしい。
ちっ。

 

いろいろ考えたあげく、うちの環境ではDockerというかHyper-Vを有効にした場合のデメリットが大きいということで、Docker for Windowsはアンインストールして、Hype-Vも止めることにした。
やってみらんと、わからんね。


元に戻しておいてなんだが、Hyper-V上でGPUは使えたのだろうか。
http://msyksphinz.hatenablog.com/entry/2016/03/16/024623
使えるらしい。。。

http://msyksphinz.hatenablog.com/entry/2016/03/17/020000
あれ、無理だったのか。

 

ホストがLinuxだったらPCIパススルーとかあるけど、それだったらホスト環境に直接インストールすればいいし、環境を分けたいならDockerでもよさそうだ。

あまりWindowsホストでがんばっても仕方ないと思うので、もうこの辺で止めるとしよう。
CUDAが使いたかったら、デュアルブートでもいいからLinuxをネイティブにした方がいいよ。

docker ? (1)

caffeをインストールしていると、docker上にインストールした、というリンクがしばしば載っている。

どっかー。
仮想化に関係したやつよね、くらいのイメージしかないのだが、WindowsホストのVirtualBoxでも、Windows Subsystem for LinuxでもnVIDIAのGPUが扱えなかったので、次はdockerなるものを調べるとしよう。


いくつか入門記事を見たのだが、VirtualBoxのようなマシン自体を仮想化するのではなく、プロセスだけを仮想化する、という説明と、ホストと同じOSで動く、という説明と、Linuxだけ、という説明が出てきた。
Linuxカーネルに既にある機能を流用するので、Linuxカーネルがホストじゃないと動かないということらしい。

じゃあ、Windowsがホストだったら、話が矛盾するじゃないか。。。
間に何か挟まらないと、解決できないはず。

image


http://docs.docker.jp/windows/step_one.html

Docker for Windowsのインストールを説明したページがあった。
ちょっと前のバージョンらしいが、まあそこまで話は違わないだろう。

ここでも「Linux特有のkernel機能を使います」と書かれている。
そのため、docker-machineというLinux仮想マシンを構築するとのこと。
上の図の緑枠は、Linux仮想マシンになるというわけか。

image

 

しかし、Dockerツール群なるものの中に、VirtualBoxが入っている。
なぜだ、なぜなんだ。。。

もう疲れてきたので、インストールしてみよう。https://docs.docker.com/engine/installation/windows/

方法が2つある、と書かれている。
1つは、さっきのDockerツール群で、もう1つがDocker for Windowsで、こっちの方が新しいそうだ。

Windows10 Proの64bit版では動くようなので、こちらをやってみよう。


https://docs.docker.com/docker-for-windows/

インストールする前に読め、という項目がある。
Hyper-Vを有効にすると、VirtualBoxはもはや動かなくなる(no longer work)、と書かれている。
Docker Toolboxは、Hyper-Vの代わりにVirtualBoxを使っていたと言うことらしい。

インストール後にVirtualBoxのVMをインポートできる、とは書かれているのだが、ちゃんと動いてくれるのだろうか。。。
まあ、動かなかった元に戻せばいいや。

インストール自体はすぐに終わった。
そのあと、dockerが起動されてダイアログが出てきたので「はいはい」とクリックしていたら・・・気を抜きすぎてて再起動がかかってしまった。
しかも、システムの構築をするような長いタイプの再起動だった。
よくわからないが、起動に固まってリセットボタンを押さないといけなかった(これはPCのせい?)。

image

とりあえず、何かインストールされた。

説明では、次にどうしたらよいかダイアログが表示されるようだが、再起動されたせいかこの画面は見ていない。
PowerShellに「docker run hello-world」と入力するようだから、やってみよう。

image

pullとか出てるから、どこかから「hello-world」というイメージを取得したらしい。
この「Hello from Docker!」というのが、hello-worldイメージの動作結果ということか?
うーん。。。

もっと野心があるなら「docker run -it ubuntu bash」とやるとUbuntuコンテナが走るよ、と書いてある。
でも、これもやったらpullされるんだろう、きっと?
そういうのの前に、Step3に書かれているチェックをやっておこう。

image

Step4を続けて行っていると、ここでhello-worldやubuntuのコンテナが出てきた。
時間がかかりそうだけどやってみたが、やはりダウンロードが始まって時間がかかった。

image

一度exitしてやり直したが、それはすぐにプロンプトが出た。
確かに、軽い。


この状態で、VirtualBoxのXubuntuを起動させた。

image

ああ、本当だ!
VT-xが有効になっていない、というエラーが出た。
アクセラレーションの設定を変更すればよいかと思ったが、タブが開けなくなっていた。
タスクトレイに常駐していたdockerも停止させてみたが、同じだ。

最初に読んだ説明ではインポートできると言うことだったので、やってみようとしたのだが、タスクトレイの「Settings」を開いたものの、それらしきものがない。
KitemanticというのがGUIツールっぽいので、それを使ってみよう。
「Kite」はゲイラカイトのカイトだろうから、アイコンからすると飛ぶエイなのかね。

zipがダウンロードされた。
インストーラではなく、直接起動するタイプのようだ。

image

PowerShellで動かしたhello-worldとubuntu、cmdで動かしたubuntuの3つが出ているようだ。
ubuntuは、2つ別々に扱われるのか?
cmdで動かすと、またコンテナに追加された。
コンテナはイメージとは別で、My Imagesタブで表示される。

image

しかし、importっぽいものが見当たらない。。。

それに、importして動いたとしても、ハードウェアについては何もしないのだから、VirtualBoxみたいに画面を開いたりはできないと思う。
やるなら、リモートデスクトップなどの手段でやるんじゃなかろうか。

2016年8月8日

[caffe]caffeをWindows Subsystem for Linuxにインストールしてみる

WindowsがHostのVirtualBoxでCUDAが使えないなら、Host側にインストールしたらいいじゃないの、と思いついてやってみた。

結果としては、caffeやCUDAはインストールできるものの、nVIDIAのボードがあるというところを認識できないようで、make runtestでコケた。

その後で、WSLでCUDAというかGPUが使えるのか調べて、使えなさそうだという掲示板を見つけたのだった。
ちょっと今はどこかわからなくなってしまったのだけど、Big Challengeとか書いてあったから、けっこう大変なのだと思う。

 

ちなみに、インストールするところまでは、そんなに悩まなかった。
どうやらUbuntu14.04と同じ扱いのようだ。
CUDAは、runじゃなくでdebの方じゃないとインストールできんかった。
debも、Windows側のファイルシステムからコピーせんといかんかったのだが、それくらいだ。
それ以外で動かないところは、ubuntuの解決策で調べれば良かった。

 

以前、CNTKで参考にしたFPGA開発日記の方もTensorFlowをインストールされたようだ。
http://msyksphinz.hatenablog.com/entry/2016/04/13/020000

うーん、みんなTensorFlow、TensorFlowいっているので、がんばってcaffeしようとしているのだが、TensorFlowだとGoogleのCloud環境でもすぐに試せるところがよいのかな。

CNTKでがんばってみようとしたのだけど、使っている人が見当たらなくて、初心者には厳しいのだ。
ものがよいとか悪いとかじゃなくて、時代の流れとか雰囲気で決まったりすることもあるから、なかなか曖昧な世界だ。

[c/c++]pthreadはちょっと別扱い

久々にFFFを使って単体テストをやっている。
いつの間にか「FAKE_VALUE_FUNC_VARARG」が追加されていて、引数の...にも対応できるようになったのだ。
いやあ、ちょうどよかった。

 

さて、今回はpthreadを使ったアプリで、これらもスタブというかモックというか、張りぼてにしてごまかしていた。
しかし、なぜかpthread_exit()をFAKE_VOID_FUNC()で追加すると、ビルドしたときにwarningというかnoteが出てくる。

まあいいか、と放置しようと思ったのだが、テストを実行するとなぜかSegmentation Faultが発生してしまう。
さんざん悩んで、ようやくpthread_exit()は何か別物なんだ、ということに気付いた。
外せばすんなり動くのだ。

 

今回はあきらめて、単体テスト用のifdefを用意した。
あまり悩むところではないしね。

[nfc]マイナンバーカードでSSHできるらしい (2)

マイナンバーカードでSSHする - AAA Blog

試してみようかと思っていたが、それにはサーバを立てないといけないのか。。。
XAMPPで何かしていたような気もするが、面倒なので、まずはどういうことをサイトで行っているのか見ておき、簡単そうだったらやってみよう。


  1. pkcs15-toolで認証用公開鍵を読んでファイルにする
    • このコマンドはopenscのもので、うちのだとaptせんと入ってなかった。
    • --read-ssh-key id、なので、例に書いてある「1」はstdoutじゃなくてidの方ね。
    • 実行したら「No smart card readers found.」だって。。。

あれれ、私がやりたいのは、署名データを得るところなのだ。
その手前の「PKCS1形式のハッシュ値」を得るための手段だと思ってやっていたのだが、そもそもSSHでログインするというのがどういうことなのかわかっていないことに気付いた。


こちらの方が、実際に行っているので、何が得られるのか見てみる。
マイナンバーカードでSSHしてみた - Okiraku Programming

まず、pkcs15-toolで、カードから公開鍵を読み出している。
得られた文字列を、~/.ssh/authorized_keysに追加する。
そして、sshログインするときに、-Iオプションで共有ライブラリを指定しておくと、PIN入力を求められるので打ち込むと、正しければログインできる。

うーん、わからん。
こういうことか?

image

 

image

 

電子署名は、プライベート鍵で本文なり本文のハッシュ値なりを符号化し、公開鍵で復号化して一致することを確認するやり方だったはず。

ユーザがサーバに送るのは、NONCEを秘密鍵で暗号化したデータだけで、マイナンバーカードのPIN番号は送る必要がない。
サーバにマイナンバーカードで暗号化したデータを復号化するための鍵さえちゃんと渡せているなら、毎回パスワードを送るよりも、違うNONCEで違う署名データを送る方が安全そうな気がする。

危険があるならば、マイナンバーカードとPIN番号が同時に他の人に奪われることだろう。
まあ、それを言ってしまえばパスワードも奪われたら同じなんだけどね。


というわけで、おそらくマイナンバーカードからは、

  • 公開鍵
  • 秘密鍵で符号化したデータ

だけを得ることができて、秘密鍵は取得できないようになっていると思われる。

Bitcoinなんかも秘密鍵だけは渡さないようにしたいから、うまいことやったら使えるのかな?
秘密鍵で復号する必要があるのかは知らないのだが、EFに署名用途認証用があるから、そっち側もできるのかもしれない。。。
いかんいかん、よくわからん知識で考えるのはやめておこう。

 

ともかく、ここでのマイナンバーカードの使い方は、署名データを得るための機械、なのだな。
だったら、メールの電子署名にだって使うことができるはずじゃないか。
以前できないという結論になった気がするのだが、公開鍵を誰が持っているのかがわからない、というのが使えない理由だったか。。。

2016年8月7日

[nfc]マイナンバーカードでSSHできるらしい (1)

せっかく無料で作れるのでマイナンバーカードを作ってみたものの、仕様が公開されるわけでもなく、遊び勝手が悪い。
この手のカードが嫌いな人も多いようで、気持ちもなんとなくわかるのだが、あるものは使ってしまえ、とも思うので、誰か何とかしてくれないだろうか、と他力本願で待っていた。

NFCの基礎的なことは調べるものの、応用には非常に弱いのですよ。


待ってみるもので、こういう記事が見つかった。

マイナンバーカードでSSHする - AAA Blog

こちらの、「個人番号カードのファイルシステム」に描いてある図は、総務省のこちらにいくつかある資料のAP構成図からできていると思う。
http://www.soumu.go.jp/kojinbango_card/kojinninshou-02.html

image

個人に関する情報が書いてあるのは、住基APとか券面APとか、そういう部分だろう。
「AP」は、アプリケーションの略だと思う。
何というか、フォルダみたいなものだけど、入り方がわからないと見ることができないのだと思う。


ISO/IEC 14443のType-BのカードはIC運転免許証しか見たことがないのだけど、アクセスが面倒だった。
NFC Forum規格ではType2とType3しか読んだことがないのだが、あれは簡単だった。読みたいアドレスの仕様が決まっているので、そのアドレスを指定すれば読める。

Type-Bは、NFC Forum規格ではType4Bになるんじゃないかと思う。
MIFARE DESFireはType4Aだろうか。
実物を持っていないので読んだことがないのだが、運転免許証をアクセスした感触からすると、カード自体の仕様書が提示されていないと、どうやってアクセスしてよいのかわからない。

運転免許証は仕様書が公開されているので、まだアクセスすることができたが、PIN番号無しで読めるデータは免許証の表面を見ればだいたいわかるし、PIN番号は3回間違うとロックされて、解除には警察に出向かないといけないらしいので、暗証番号が3回で特定されるようなものでなければ、ランダムで試してみても読むのは難しいだろう。

 

このページで紹介している「公的個人認証AP」は、これなのかな。
https://www.jpki.go.jp/

ブラウザでもJREでの利用を前提にしているようなんだけど、ブラウザでカードを使うのだったらこの方法以外無いということだろうか。
https://www.jpki.go.jp/download/win.html


ともかく、総務省の説明通りであれば、公的個人認証AP=JPKI-APは個人情報どうのこうのではなく、別物なのだ。

その別物を表すものの1つが、「マイキーくん」だ。
http://www.soumu.go.jp/kojinbango_card/kojinninshou-01.html#rogo

まあ、前も紹介しましたな。
マイキーくんについては、Googleなどで検索した方が皆の印象がわかる気がする。

 

私としては、せっかくこのレベルの個人認証が無料で手に入るのだから、自由に使いたい。
そういう目的で調べたのが、メールの電子署名で使えないか、というやつだったのだが、どうやら無理そうだ、というところで終わった。
個人事業主で仕事をしていると、自分が自分であることを証明するのが難しいので、せめてメールの署名で「私なんです!」というのを日本から認めてくれると、改ざんなどの心配がなくてよかったのだけどね。

使い道がないなー、と思っているところで、AAA Blogさんの記事を見つけた、というところだ。


記事の「署名プロトコル」だが、Type-Bのカード(ISO/IEC 7816のカード?)を読むときの手順と同じで、SELECT FILE(INS=0xA4)で希望するところまで潜って、VERIFY(INS=0x20)で認証用PINが正しいかをチェックしてもらい、秘密鍵のところまでSELECT FILE(INS=0xA4)し、ハッシュ値を書込むと署名データが返ってくる。

INS=0x2A、は手持ちの資料では出てこない。。。
たぶんアクセスできるのだろうけど、後追いでやっているので、このコマンドがどういう意味で行われているかを見ておきたいのだ。
エラーコードとしては出てくるんだけどねぇ。

http://www.centrenational-rfid.com/docs/users/file/14443%20PCS%20-%20passive%20RFID%20interrogator.pdf
"Perform Security Operation"なのか?
ということは、この手順はISO/IEC-7816の手順ということか。
まあ、もともとICカードの規格だしね。

 

なんというか、せっかくマルチアプリケーションになっているのだから、個人情報とは関係なく使えるところは技術者向けだけにしても公開してよいと思うのだがね。
そっちの方が、公開していないけど使えます、というよりも安全だと思うのだ。
今までの漏洩って、そういう場合の方が多い気がするのですよ。

[caffe]初心に戻ってサンプルを動かす

[ai]Caffeの画像分類を説明しているサイトをなぞる

全部入れ直したし、私も全部忘れているので、もう一度同じことをやってみようと思ったが、いやあ、説明文が悪いですな。
読み返しても、何をして良いかよくわからなかった。

 

この辺りを参考に動かそう。
OSX10.10でCaffeをインストール、リファレンスモデルで画像を分類 - Qiita
caffeのサンプルを動かす - スチールウールの活動記録


途中までやっていて気付いたのだが、これはexamples/imagenetは関係ないんだな。。
あれはトレーニングの仕方に関するexamplesなのだろう。

説明されている内容は、こうだ。

  • サンプル画像を取ってくる : www.vision.caltech.eduからダウンロード
  • モデルファイルを取ってくる : dl.caffe.berkeleyvision.orgからダウンロード
  • モデルファイルに関連するデータを取ってくる : get_ilsvrc_aux.shを実行

 

最後にpython classify.pyを実行してクラス分けをするのだが、ここにはサンプル画像しか引数に与えていない。
モデルファイルとトレーニング済みデータは必要なのだろうか?
いや、いるのだろうけど、dataにもmodelsにも他のフォルダがあるので、どうやって使い分けているのだろうか、と心配になるではないか。


pythonはよくわからないので雰囲気で見てみよう。

https://github.com/BVLC/caffe/blob/master/python/classify.py

  • --model_defがなかったら、models/bvlc_reference_caffenet/deploy.prototxt
  • --pretrained_modelがなかったら、models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel

あれ、data/が出てこないぞ?
確かに、classify.pyを実行するときにはdata/自体がなくても動作した。

data/を使うのは、show_result.pyだけだ。
これはcaffeが提供しているわけではないので、提供元を見てみよう。
変数categoriesにタブ区切りのテキストとして読込んでいるようだ。
show_result.pyで出力される内容の、この部分ですな。

#1 | n04552348 warplane, military plane | 84.1%
#2 | n04008634 projectile, missile |  5.8%
#3 | n02690373 airliner |  5.0%

classify.pyでは「n04552348に分類される確率が84.1%です」というところまでやってくれるから、それを名前解決する役割をしていると言うことだろう。


get_ilsvrc_aux.shはトレーニング済みデータを取ってくるのかと思っていたが、それはモデルファイルと一緒に提供されると思って良いのだろう。
まあ、ネットワークとトレーニングデータはセットじゃないと意味がないだろうしね。

今回使ったbvlc_reference_caffenetには、以下のファイルが入っている。

  • bvlc_reference_caffenet.caffemodel(自分でダウンロード)
  • deploy.prototxt
  • solver.prototxt
  • train_val.prototxt

classify.pyに与えるのは、最初の2つだけだ。

deploy.prototxtは、ネットワークの構成のようだ。
最初にこういうのが書かれていた。

input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } }


10 x 3 x 227x227。

227x227は画像のサイズで、3はRGBだろう。
10は?
http://docs.chainer.org/en/stable/reference/caffe.html
ミニバッチのサイズなのかな。


自分でトレーニングデータを作る必要がなければ、このようにどこかからもらってくればよいので、GPUがなくてもそんなに困らないように思う。

でも、症例をたくさん入れて診てもらう、みたいなことをしたかったら、自分でトレーニングデータを作らにゃならんだろう。
データはあるけどネットワークの構成を考えるのはちょっと・・・という場合は、既にあるprototxtを使ってトレーニングさせることができますよ、というのがexamples/imagenetサンプルのやりたいことだと思う。

 

うん、前よりは多少理解が早くなったように思う。
深層学習に対する理解と言うよりは、caffeなどのフレームワークを使うときの考え方への理解なのだけど、まあいいのだ。

Xubuntu16.04にアップグレードしたら起動が遅くなったが、swapだった

Xubuntuを16.04にしたのだが、久しぶりに起動したせいもあるかもしれないが、ずいぶん起動が遅くなったように感じた。
こんなもんだったっけ、と思ったが、起動時にぐるぐる回っているときにAlt+Rを押すと起動ログが見えるようになることがわかり、見てみた。
なんか、diskなんちゃらというところで1分半待った後でタイムアウトしていた。

その後にswapどうたらこうたらと出ていたので検索すると、/etc/fstabに書いてあるswapのUUIDと、実際のUUIDが不一致だからだろう、というのが見つかった。

見てみると、確かに違った。
これって、GPartedで「swap on」にしても書き換えてくれないんですな。。。
手動で/etc/fstabを開いてUUIDを変更すると、普通になった。
16.04にしたせいなのか、実は以前からだったのに気付かなかったのかは不明だ。

2016年8月6日

Xubuntu 16.04にcaffeを入れ直す (4) - end

もう、燃え尽きてきました。。。

まずは対象となるnVIDIAのボードがないと話にならないので、古いPCから持ってきた。
NVIDIA GeForce GT710とのこと。
Windows10のデバイスマネージャでは、こう見えている。

image

 

https://www.virtualbox.org/manual/ch09.html#pcipassthrough

よくわからんが、VBoxManageコマンドを使ってアタッチさせるらしい。
サイトでは「02:00.0@01:05.0」となっていて、@の前に書いてある方がlspciで見えている。

00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter

これがうちのguestで見えているグラフィックスボードなので、まねしてみた。

> vboxmanage modifyvm "xubuntu" --pciattach 00:02.0@01:00.0

エラーが出た。
3行くらい出るのだが、最初がこう。

VBoxManage.exe: error: Host PCI attachment only supported with ICH9 chipset

Hostって、今だとWindows10側ということだよな。
ICH9チップセットしか対応していないというのは、この設定項目のことか?

image

後から変更して動くのかなぁ。。。やってみるけどさ。

> vboxmanage modifyvm "xubuntu" --pciattach 00:02.0@01:00.0
>

変更したら、エラーは出なかった。
では、VMを起動して・・・・しなかった。
VERR_PDM_DEVICE_NOT_FOUNDとかで、セッションが開けないんだとか。
vboxmanageを実行する前に起動させていたのだが、これは成功したので、ICH9に変更したことが理由ではなく、vboxmanageで変更した方が影響していると言うことになる。

> vboxmanage modifyvm "xubuntu" --pcidetach 00:02.0

うん、起動した。

エラーダイアログに、Extension Packがどうのこうのと出てくるが、今は5.1.2のPackが入っているので大丈夫だと思う。


ん、VirtualBoxのPCIパススルーの章の1行目になにか書いてあるぞ?

When running on Linux hosts, with a recent enough kernel (at least version 2.6.31) experimental host PCI devices passthrough is available.

ぐはぁ。。。
最初の一歩から道を踏み外していたとは。。。

Xubuntu 16.04にcaffeを入れ直す (3)

VirtualBox上にXubuntu 16.04が入っているのだが、CUDAやcuDNNとnVIDIAのグラフィックスボードがあればGPUが使えるのだろうか?

VirtualBoxでも動かせるかもしれないが非常に面倒だったりマザーボード次第だったり、という記事は見つかった。
VirtualBox上のUbuntu14.04でwaifu2xを動かしたかった - 六彩庵

lspciで見てみたけど、当然出てこない。
まあ、nVIDIAのボードが入っていないから、出るはずはないのだけどね。
「InnoTek Systemberatung GmbH VirtualBox Graphics Adapter」の立ち位置にnVIDIAのボードが出てくれば良いのかな。

https://www.virtualbox.org/manual/ch09.html#pcipassthrough

  1. うちのマザーボード(Extreme4 Z170)は、IOMMUができるようだ。
  2. i5-6500も、対応しているような感じ。
  3. BIOS設定は、なんていう名前なんだろう? VT-dでよいのかな。
  4. 次はVirtualBoxの仮想マシン設定で、システム>アクセラレーション>仮想化支援機能の項目に両方チェック。
  5. Linux Kernelですか! と心配になったが、説明があった。
    /etc/default/grubファイルのGRUB_CMDLINE_LINUXの後ろに"intel_iommu=on"を足せば良いそうだ(うちはintelなので)。DEFAULTがついた方もあったので、両方に追加して、update-grub。
    再起動後に書いてあるとおりにgrepして「DMAR: IOMMU enabled」が出てきた。

これで、6番目までやったことになるはず。
で、どうしたらよいのだ?
lspciで見たけど、何も変わらんぞ。

00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter

最初の数字がPCIバスのアドレスらしいから、それがそれぞれの数字になったりするのかと思ったのだが。


その合間に、CUDAのRC8とcuDNNをダウンロードしていた。
あきらめて、nVIDIAにユーザ登録することにしたのだ。
承認までに数日かかると書いてあるサイトもあったのだけど、特にそういうこともなくログインしてダウンロードできた。

cuDNNはv5.1があったのだけど「available soon」だったので、v5のfor Linuxをダウンロード。
cudaはapt-getでインストールしたものが残っていたけど、せっかくなのでRC8をダウンロード。

準備だけはできたんだけどねぇ。