2016年4月6日水曜日

Jetson TK1購入

さて、早速Jetson TK1が家に来ました。(なんかよくわからないけど、2月末に商社が偶然ある程度の数量を入手できたみたいで、まだ在庫がありました)



(机の上キーボード、マウスが散らかってますが、そのあたりは気にしないように)
ここからが、苦難の道の始まりです。ネットで色々設定方法を調べたのですが、どれも変わっており、どうしたらいいのか全然わからなくなりました。大きな問題が2つ。ホストPCとして、Ubuntu14のマシンが必要なのはわかっていました。(flashromに最新版のromイメージをUSB経由で書き込むのに必要)
しかし、最初にぶつかったのが以下の2つのトラブル。

①Jetsonが/etc/defaults/saneで問題があるといってきて、USBによる接続を拒否する。
 saneはスキャナーのIFらしく、どうもこれを使ってホストPCと接続しているようです。JetsonのDefaultではこれをnoにしてあり、viでyesにしてやる必要があります。(だったら、最初からyesにしておけよ!)
②romイメージの書き込み最中に、なにか127.0.,0.1:33335が開けないと怒られてとまる。
 これはだいたい想像がつきました。ホストPCはUbuntu64bitをセットアップしたばかりです。sshdがインストールしてありませんでした。単にインストールして終わり。

しかし、その後も全然設定ができません。そもそも、設定に使うtoolがぐぐったのと全然違います!進化の早いとこなので、しかたないにしても全然対応がわかりません。(どうやってもうまく行きません。(T_T))

散々、ぐぐった結果やはりJetsonのLinuxはぼろぼろだとのこと。grinch版がいいとのこと。そこで、それをROMに焼くことに決定。
まずはまっさらなUbuntu、L4Tをいれます。

wget http://developer.download.nvidia.com/embedded/L4T/r21_Release_v3.0/Tegra124_Linux_R21.3.0_armhf.tbz2
wget http://developer.download.nvidia.com/embedded/L4T/r21_Release_v3.0/Tegra_Linux_Sample-Root-Filesystem_R21.3.0_armhf.tbz2

展開して、ROMに書き込みます。

tar -xvf Tegra124_Linux_R21.3.0_armhf.tbz2
(中略)
cd Linux_for_Tegra/rootfs
sudo tar xpf ../../Tegra_Linux_Sample-Root-Filesystem_R21.3.0_armhf.tbz2
cd ..
sudo ./apply_binaries.sh

このあと、Jetsonをrecovery-modeで起動して、イメージを焼きます。(一応、同封してあるダンボールの紙にボタンの説明はありました。注意しましょう。当然、英語です)

sudo ./flash.sh jetson-tk1 mmcblk0p1

これをやる前に、USBで接続されていることを、lsusbコマンドで確認。NIVIDIAが見えます。あと、本当ならdeviceとして、/dev/mmcblk0p1が見えるはずなんですが、自分の環境では見えませんでした。 ただ、一応これで書き込みはできました。 さて、ここからはJetson側で起動イメージの差し替えです。ネタは元にありますので、コマンドだけ羅列しておきます。

wget http://www.jarzebski.pl/files/jetsontk1/grinch-21.3.4/zImage
wget http://www.jarzebski.pl/files/jetsontk1/grinch-21.3.4/jetson-tk1-grinch-21.3.4-modules.tar.bz2
wget http://www.jarzebski.pl/files/jetsontk1/grinch-21.3.4/jetson-tk1-grinch-21.3.4-firmware.tar.bz2
sudo tar -C /lib/modules -vxjf jetson-tk1-grinch-21.3.4-modules.tar.bz2
sudo tar -C /lib -vxjf jetson-tk1-grinch-21.3.4-firmware.tar.bz2
sudo cp zImage /boot/zImage

ちょっと不親切ですみませんが、まあこの世界はこんなもんです。
結局、最新版のライブラリはTX1用だけで、TK1にはでていないようです。その後、以下のリポジトリを登録します。

sudo apt-add-repository universe
'universe' distribution component enabled for all sources.
sudo apt-get update
sudo apt-get upgrade

何故か、g++がないので、個別にインストール。

sudo apt-get install  g++

これでやっとCUDAの開発用ライブラリをインストールできる準備ができました。(これまでのはあくまで準備作業です。おいおい、ってな感じですが先は長いです。)
さてやっと、CUDA-6.5のライブラリをインストールします。(最新は7.5ですが、7.0からARMのサポートがなくなったとのこと。TX1しか対応していない。どうするんだNVIDIA)


wget http://developer.download.nvidia.com/embedded/L4T/r21_Release_v3.0/cuda-repo-l4t-r21.3-6-5-prod_6.5-42_armhf.deb

sudo dpkg -i cuda-repo-l4t-r21.3-6-5-prod_6.5-42_armhf.deb
(中略)
sudo apt-get update
(中略)
sudo apt-get install cuda-toolkit-6-5

これで、CUDA6.5までインストールできました。あとはGPUを使えるように、自分をvideoグループに登録し、PATHを通しておきます。

sudo usermod -a -G video $USER
echo "export PATH=/usr/local/cuda/bin:$PATH" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc

うまくいけば、専用コンパイラのnvccのバージョンが確認できます。

 nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2014 NVIDIA Corporation
Built on Tue_Feb_17_22:42:19_CST_2015
Cuda compilation tools, release 6.5, V6.5.45

最後に、時間がUTCのままなので日本(Tokyo)にしておきましょう。

さて、Sampleを動かさないと、実感が湧きません。

cuda-install-samples-6.5.sh

このコマンドがインストールされているはずです。これでHOMEにSampleがインストールされますから、そこでmakeします。結構時間がかかりますが、無事Sampleは動きました。昔だったらなんの計算に使おうかと考えますが、今はAIですね。まずはディスクの容量がFlashの16GBしかないので、これをなんとかしないと。

2016年3月31日木曜日

CUDAを試してみたい

何となく、CUDAを試してみたくなりました。
昔から興味はあったんですが、中々やってみる時間がなくて。。。 手近のPCでNVIDIAを積んでるマシンというと、WinXPの頃に買ったGame用PCがあります。ただ、GPUがちょっと古い!(GT-9800)NVIDIAのHP見てみると、一応対応はしているとのこと。

このPC、Ubuntuの32bitをインストールしてありますが、せっかくなので64bitをインストールして、CUDAをインストールしてみました。しかし、大失敗(-_-;) 画面の解像度は落ちて、ドライバはうまくインストールできたようなのですが、サンプルプログラムを動かすとなぜか「デバイスが掴めません」(意訳)みたいなことを言ってきて動きません。
実は、事前にnvidiaを積んでるMacBookAirでも試してみたんですが、そちらでもそんなことを同じサンプルプログラムで言われました。(T_T)

Ubuntuならいけるかと思ったんだが。。。しかし、問題はここからでした。CUDAをアンインストールできません。インストールは必要なものの塊をNVIDIAのHPからDLしてきましたが、アンインストール方法がどうしても見つからず、しかたなく関連しそうなものをひとつずつapt-get removeしたんですが、どうにも元に戻りませんでした。

あきらめて、Ubuntuを再インストールしてしまいました。(このPC、別の用途で古いUbuntu-10も入れてあったんですが、これを残すためにインストール方法はかなり苦労しました。何度かgrubを壊してしまいました)

やっと復帰して、このブログを書いているわけですが、まだ以前のUbuntu14の状態には戻せていません。そちらはおいおいやるとして、CUDAのためにJetson TK1をポチりました。こっちの専用マシンのほうが試すのにらくでしょうから。(今だったら、TX1だろうという声もあるかもしれませんが、あちらは気軽に試すにはちょっと勇気の必要な価格です。)

2016年2月21日日曜日

AWSを使ってみる:Deep-learningのために

このところ、Deep-learningの勉強をしているんですが、サンプルでとにかく処理時間のかかるものがあります。
chainerやTensorFlowは64bit環境が前提(chainerはそうでもないんですが、そっちのほうが望ましい)なので、自宅のLinuxは32bitでアウト。そうなるとMac OSXになるのですが、ノートPCなので電源つなげっぱなしはバッテリーへのタメージから考えると避けたい。
自宅のLinuxを64bitにしてもいいんですが(古いPCですが、Core2なんで一応64bit OSはインストールできます)、せっかくなのでAWSを試してみます。

お試しなので、作れるインスタスは小さな"t2.micro"になります。(64bit redhatですが、メモリが1GBしかありません)それでも、まあchainerは動くだろうと、インストールを始めますが色々問題が出ました。

1.rootのパスワードは何?
まず、pipをインストールしようとしたらエラーがでました。まあ、この手のものはroot権限が必要ですから、sudoコマンドを使おうとすると、passwdを聞かれました。でも、AWSでEC2にインスタンスを作ったばかり、passwdは何?最初、AWSのアカウントのパスワードかと思いましたが、初期状態ではpasswdが設定されていないので、

$ su -
$ passwd

で、rootのパスワードを設定してやるものなんだそうです。

2.chainerのインストールができない(gccが必要)
さて、pipのインストールができたので、それでchainerをインストールしようとすると、エラーがでます。はじめは何が問題なのかわからなく、色々ぐぐってみました。でもどれも見当はずれ。よくよくエラーメッセージをみると、gccコンパイラがないと・・・
そうです、AWS EC2のインスタンスでは最低限のものしか入っていなくて(でもpythonは入っていた)、gccがなかったのです。

$ sudo yum install gcc
$ sudo yum isntall gcc-c++  ←これわかり難い
$ sudo yum install gcc-gfortran ←これも通常の名前と違うみたい
$ sudo yum install python-devel  ←これが一番悩んだ。pipで、Python.hがないと怒られた。

と、いろんな開発用パッケージをインストールしないといけません。AWS内ではyumリポジトリがAmazon専用のものが設けてあるのは知っていましたが、なんかパッケージ名が違うのか?ググったものと”微妙”にパッケージ名が違い困りました。(何かパッケージ名が微妙に違う気がしますが、これは自分が数年間RedHatから遠ざかり、Ubuntuを使い続けたからかもしれません)

3.virtualenv環境でchainerが動かない
これはまだ原因がわかりません。上記、各種パッケージのインストールをしたあと、virtualenv環境下でchainerをインストールしたのですが、なぜかnumpy等のパッケージが見つからないと怒られます。しかたなく、virtualenvの使用をあきらめるとうまくいくので、色々試行錯誤してるうちにどこかで間違ったかもしれません。

と、かなりとまどいました。とりあえず、今回はここで力つきました。AWSでDeep-learningを試してみるのは次にします。

2016年2月20日土曜日

TensorFlowで学習プログラム

TensorFlowで学習するプログラムを作ってみました。
一番単純な、2入力1出力です。(論理積を学習させます)
以前、chainerとかのサンプルも探しましたがどれも学習結果を使う所が見つかりませんでした。TensorFlowだとダイレクトにプログラムしないといけないので、その辺りは楽にできました。

とりあえず、サンプルです。


# -*- coding: utf-8 -*-

import tensorflow as tf
import numpy as np

# 入力データの定義 4行2列(データの定義方法がchainerとは違うようです)
# x_data = [
#   np.array([0., 0.]),
#   np.array([0., 1.]),
#   np.array([1., 0.]),
#   np.array([1., 1.])
# ]
x_data = np.array([
  [0., 0.],
  [0., 1.],
  [1., 0.],
  [1., 1.]
])

# 結果データの定義(4行1列)
# y_data = [
#   np.array([0.]),
#   np.array([0.]),
#   np.array([0.]),
#   np.array([1.])
# ]
y_data = np.array([
  [0.],
  [0.],
  [0.],
  [1.]
])


# 機械学習で最適化するWとbを設定する。Wは4行2列のテンソル。bは4行1列のテンソル。
W = tf.Variable(tf.random_uniform([4, 2], -1.0, 1.0))
b = tf.Variable(tf.zeros([4, 1]))
y = W * x_data + b

loss = tf.reduce_mean(tf.square(y_data - y))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# 学習を始める前にこのプログラムで使っている変数を全てリセットして空っぽにする
init = tf.initialize_all_variables()

# Launch the graph.(おきまりの文句)
sess = tf.Session()
sess.run(init)

# 学習を1000回行い、100回目ごとに画面に学習回数とWとbのその時点の値を表示する
for step in xrange(1001):
    sess.run(train)
    if step % 100 == 0:
        print step, sess.run(W), sess.run(b)

# 学習結果を確認
x_input = np.array([
  [0., 0.],
  [0., 1.],
  [1., 0.],
  [1., 1.]
])

y_res = tf.Variable(tf.zeros([4, 1]))
y_res = W * x_input + b
print sess.run(y_res)
# 4行1列の結果を期待しているのだが、4行2列になってしまう? 
# 学習が十分進めば、どちらの列も同じような結果になるからいいか。
print sess.run(b)

最後に、学習結果を確認しています。結果はこうなります。(一応、期待通りの結果になりました)
[[  0.00000000e+00   0.00000000e+00]
 [ -2.62142518e-23   1.62012971e-23]
 [  7.70256410e-23  -1.24630115e-22]
 [  9.99999881e-01   1.00000012e+00]]
[[  0.00000000e+00]
 [ -2.62142518e-23]
 [ -1.24630115e-22]
 [  6.69862151e-01]]
最後の、変数y_resとbの出力だけを貼り付けました。 どうしてもまだ理解できないのが、y_resの計算結果は4行1列になるはずなんですが、4行2列になってしまいます。(代入する直前でy_resを4行1列で定義しても上書きされてしまいます。bは4行2列でも、4行1列でも構わないようです)ただ結果をみると各行の値はどちらの列をとっても同じような値なのでよさそうです。 まだ深層学習の理論的な本を買って読み始めた所でよくわかっていませんが、TensrFlowの方がPrimitiveにプログラムしなければいけない分、直感的にわかります。(でもなんとなく、chainerの方がこの後進めていくのによさげな気もしますので、しばらく悩みます)

2016年1月31日日曜日

Mac OSX El Capitanの日本語入力について

MacのOSX、El Capitanにしてみました。(いつも通り、しばらく様子を見ていました。brewとかなんだかんだ入れているので、いきなりは怖いです)

こちらはWindowsほど劇的な変化はありませんでしたが、使い勝手で一番戸惑ったのが「日本語入力」です。デフォルトが自動変換になってました。Google日本語入力でもありましたが、強力な予測変換で、ユーザーが変換の意思を「スペースキー」を押さなくてもいいようにしてくれるんですが、自分的にはこれ大嫌いです。

OSが勝手に漢字変換を、意図しないタイミングでしてしまうのと、その瞬間どうしてもPCの動きが止まります。よどみなくタイピングしている最中に、意図しない漢字変換されてしまうとものすごいストレスを感じます。もうすぐに「自動変換」をオフしてしまいました。
MSとかApple、Googleはこの辺どう考えているんだろう?仕事でPC使っている人間には、どう考えても今の予測変換の実装はマイナスにしかなりません。(まだ、ガラケーやスマホの予測変換みたに、別領域に変換候補がでてきて、ユーザーが必要ならそれを選ぶ方式なら我慢できますが、入力しているカーソル部分で強制的に第一候補を表示してしまうのは困る。)変換候補を別領域に表示、選択はファンクションキーがいいと思うんだが、どうなんだろう?日本語意外の他の「非英語圏」のUIはどんな使い心地なのか気になります。

windows10について

自分のメインPC(Core2 Quad win7 64bit)を何時かwin10にしないといけないと思いながら、タイミングを計ってきました。他のPCは特に考えずに適当に更新をトライしてましたが、こいつだけは銀行のHP見たりするヤツなんで慎重です。
win10も発表から何度かUpdateがされ、金融機関から最初は出ていた更新を待ってくれという警告もなくなったので、そろそろ試してみるかとやってみました。

最初に感じたのが、とにかく時間がかかること!まあ、OSのメインバージョンの更新なんだから、当たり前なんですが問題は更新後です。
自宅のPCで、EPSONのノートPC(Win7)がWin10に更新できませんでしたが(最後に問題が発生しました。HDDのパーティションの切り方が特殊なようです)、プリンタ・スキャナのドライバが最初は対応してくれず、ドライバの再登録などして何とか使えるようになりました。
後、更新後しばらくは「無茶苦茶遅い!」と感じました。Win10にしたら快適になると聞いていたんですが、「ダメじゃん」という感じ。調べてみると、暫くの間は「自動メンテナンス」で調整をする時間が必要なようです。数時間から1日くらいPCの電源入れっぱなしにして、MSとデータ交換しないといけないようです。

また、安定しても基本認証にMSとインターネットで通信しまくる仕様のようで、パフォーマンスモニタとか見てると、いつもネットワーク通信しています。そうそう、PCへのログイン・アカウントがそれまでのから、強制的にMSのアカウントに切り替えられてしまいました。(設定の途中で、MSのアカウント入力をさせる箇所があり、そこで入力してしまったせいでしょう)これではネットワークがない状況だとどうなるんだろう、という感じです。(最初から、ネットワークなしの状況で設定してればいいんでしょうが、一旦ネットワークがある状況で設定してしまうと、その後はタイムアウト待ちをするしかない?)

前回のWin8がひどい出来だったので、ほとんどWin7の操作に戻った感じですが、全体的に「常時オンライン」が前提のOSになってしまったようです。これはこれで、鬱陶しい!反応が鈍くなるんですよ。しかし、セキュリティの事を考えたらWin10に更新せざるをえません。付き合い方を考えるしかありませんね。

後、困ったのがウイルス対策ソフトのDefenderです。Google Drive等からファイルをDLすると自動的にスキャンしているようなんですが、時間が10~20秒くらいかかり、その間ファイル名の変更ができません。(Defenderがファイルをつかんでいるから)ちょっとこれにはまいりました。何とかなりませんかね。(時間がかかりすぎ。もしかしてパターンチェックか、データをMSに送っているのか?)

2016年1月6日水曜日

python:virtualenvメモ

ここのところchainer, TensorFlowとpythonを使ってみることが多かったのですが、他の方はよく

$ virtualenv

というコマンドを使って、そこに環境を構築していました。名前からすると「何らか」の仮想環境を構築するものなのでしょう。ちょっと調べてみると、python専用のライブラリを「試しで」作るときに、メインの環境にダメージを与えないようにするものでした。要は、VMwareやDocker(こっちの方が間隔的に近い)の様な仮想環境ですが、python限定なのが特別です。(ただ、試しにやってみたら、頑張れば、その中でのみ連携して動くJavaやc++のライブラリ、プログラムも入れれそうな感じです。ただ、Javaやc++のライブラリが特別な別のパッケージを要求していると、かなり大変そう。)

1.インストール
pipコマンドが使えるようになっているなら簡単です。

$ pip install virtualenv

これだけです。(中身は10行くらいのpythonスクリプトです)

2.仮想環境の構築
以下のコマンドだけです。

$ virtualenv testenv

これで、testenv/というディレクトリが作成され、配下に以下のディレクトリが作られます。

bin/ include/ lib/ local/

ここに当該OS環境におけるpython環境がコピーされてきます。(後で追加したpackage等は入っていません。使いたい場合はここで再構築です。)

3.仮想環境の実行
この環境でpythonのあるpackageを試してみたくなったら、以下の手順になります。

$ cd testenv
$ source bin/activate

この"activate"は先ほどコピーされたbin/以下に入っており、これを実行することにより、pythonバイナリ、ライブラリはtestenv/以下のものを参照するようになります。(プロンプトにtestenvの文字が追加され、仮想環境下で動いていることがわかります)
つまり、この環境下で"pip"コマンドでインストールすると、testenv/以下にインストールされることになり、本体OSのpythonには影響を与えません。

4.仮想環境の終了
以下のコマンドです。

$ deactivate


5.仮想環境の削除
お試しが終了して、必要なくなったらディレクトリ毎削除すればOKです。

$ rm -rf testenv/


と、非常にお手軽に色々なpythonのパッケージを試すことができます。