備忘録とか日常とか

学んだこととかを書きます。

linux 新規アカウントを追加、管理者権限を付与

よく調べては忘れるのでメモする。
システム設定>ユーザーアカウントから追加することもできるが、
十分な強度のパスワードを設定しないとアカウントを有効にできない。

都合により短めのパスワードを設定しなければいけなかったので
コマンドからアカウント追加して管理者権限をつける。

ユーザー作成

「user_name」というユーザーを新規作成する。
以下のコマンドを使う。

sudo adduser user_name

これだけ。
するとUNIXパスワードを求められるので、好きなパスワードを設定する。
その後は名前とか電話番号とか聞かれるが、特に必要なければ空エンターでおけ。


useraddではホームディレクトリが生成されないので注意する。

管理者権限を与える

作ったアカウントに管理者権限を与える。

sudo usermod -G sudo user_name

これでおけ。
確認するには

su - user_name

として、@より左がuser_nameになっているかを確認する。

試しにsudo権限が必要なコマンドを打ってみる

sudo reboot

実行できたら完了。
次回からGUIでそのままログインできる。

Ubuntuアップデートしたらログインできなくなった(nvidia GPU使用)

いつものようにUbuntu14.04のアップデートが来たので、
促されるままにアップデート・再起動したらGUIでログインできなくなった話。
何とか直せたのでメモしておく。
結論から言うとnvidiaGPUのせいらしい。
かなり試行錯誤したのでもっとスマートにやる方法も多分あるけど一応。。

環境:
Ubuntu14.04
GeForce GTX970

参考元は以下
Ubuntuで認証画面を無限ループさせる方法と対処 - 拾い物のコンパス
本の虫: Ubuntu 14.04のUnityの設定をぶっ壊した場合の修復方法
Ubuntu14.04にCaffeをインストールしたらCUIでしか起動しなくなったからどうにかした話 - モノクロタイム
ubuntuにnVidiaドライバを入れたらUnityが起動しない場合の対処 - Qiita
Ubuntu 14.04 で 最新の NVIDIA ドライバーにアップデートする - ZONDEEL BLOG


症状

「あ・・・ありのまま今起こったことを話すぜ!
パスワードを入力すると、一瞬真っ暗な画面になったと思ったら
もう一度ログイン画面に戻っていた・・・
何を言っているのかわからねーと思うが
おれも何をされたのかわからなかった・・・」

と、冗談はさておき
いわゆるログインループにハマったわけである。
ログイン時の「ポコポンっ」みたいな音がトラウマになってしまった

画面の解像度が低くなっていたので
この時点でおそらくグラフィック周りの問題だろうなーとは思ったが
とりあえず色々試す羽目になった。
Ctl+Alt+F1で仮想コンソールは立ち上げることはできた。


試したこと

色々調べてみた結果、
ログインループにハマった時にまず試してみることがあるらしい。
Ctl+Alt+F1で仮想コンソールを立ち上げてログインしたあと、
homeディレクトリ直下にある以下のファイルを削除する

rm .Xauthority .ICEauthority

Xサーバの認証に使うファイルらしい。削除しても次回ログイン時に再生成される。
アップデートの時にこのへんの設定に不具合が生じる場合があるとかないとか。

ちなみに自分の場合は直りませんでした。


次、Unityの初期化をやってみる。
このサイトに従って以下のコマンドで初期化を図る。

sudo apt-get install unity-tweak-tool
unity-tweak-tool --reset-unity

unity-tweak-toolは公式のレポジトリに入っており、Unityの設定初期化とかを1行でやってくれるすごいやつらしい。
これを試してrebootするも、自分の場合ではダメでした。


めげずに次、そういえばDeep learningのライブラリであるcaffeを導入した時も
同じようなログインループに陥ったことを思い出す。その時は確かnvidia周りのファイルが原因だったような・・・

てことで以下のコマンドを叩く。

sudo apt-get purge nvidia*

で、rebootする。やっぱりログインできない。
ぶっちゃけこれで出来なかったら自分の知ってる範囲でやれることはやったので
やむなしクリーンインストールも視野に入れてた。。


nVidiaドライバのアップデートで解決

苦し紛れにやってみたら直った。
かなり苦し紛れなので正しい手順かどうかはわからん

とりあえず使っているドライバのバージョンを調べるため、以下のサイトでGPUの型番を入力する。
NVIDIAドライバダウンロード
自分の場合はGTX970だったので、バージョン361.28と出た(2016/2/25現在)

その後、以下のコマンドを打ち込む

sudo add-apt-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-cache search 'nvidia-[0-9]+$'

するとインストール可能なバージョン一覧がずらっと出てくるのだが・・・

nvidia-173 - NVIDIA legacy binary driver - version 173.14.39
nvidia-310 - Transitional package for nvidia-310
nvidia-319 - Transitional package for nvidia-319
nvidia-304 - NVIDIA legacy binary driver - version 304.131
nvidia-331 - Transitional package for nvidia-331
nvidia-340 - NVIDIA binary driver - version 340.96
nvidia-346 - Transitional package for nvidia-346
nvidia-352 - NVIDIA binary driver - version 352.63

ふむふむ。バージョン361ないやんけ!
やっていいかどうかわからないけど、仕方なく352を入れてみる。

sudo apt-get install nvidia-352

で、おそるおそるrebootするとログインできた。
解像度も元の高解像度に戻ってました
たすかった・・・これでよかったのかはわからんけど・・・


theanoが使えなくなってた

ここからは個人的な環境の話だが、deep learningに使うtheanoのライブラリで問題が発生した。
GPUを使っての演算ができなくなっていたのである。

これでは困るので再度NVIDIAドライバダウンロードのサイトでドライバをダウンロードしてくる。
再起動後、GRUBメニューでUbuntuを選択した状態で'e'キーを押し、起動オプションをいじる。
'quiet splash'と書いてあるところの直後に'text 3'を追加してF10キーを押す。

するとランレベル3でCUIログインになるはずなので、
予めドライバをダウンロードしたディレクトリに移動して以下を実行。

sudo service lightdm stop
sudo service gdm stop
sudo chmod 755 ~/Downloads/NVIDIA-Linux-x86_64-361.28.run 
sudo ./NVIDIA-Linux-x86_64-340.32.run

するとインストールが始まる。
何を省いていいかわからないので基本yesで答えたが、32bitドライバは入れなかった。

終わってから再起動し、

python
import theano

として問題なく動いたので一安心。


後日談

ひと通りやったあとにこんなサイトを見つけた。
www.rokudw.net

もしかしたらこのサイトの方法で一発だったのかもしれない。
まあ直ったのでよしとしようか。


linuxではなにかとGPU関係で問題が起こるので
そのへんもっと情弱にもわかりやすくしてほしいです(怒)


【追記16/5/1】
どうやらnvidiaのドライバダウンロードのサイトから入手できる最新版(ここでは361.--)のドライバは
ubuntu14.04LTSの最新アップデートでは動作しないようです.
CUDAのインストーラに付いてくるGPUドライバのバージョンも352になっているので
公式がgpgpuには361を使わないことを推奨しているのかもしれません.
おとなしく352を入れておきましょう.

【追記18/1/27】
二年越しの更新
日付でわかるかと思いますがかなり古い情報です。
現在もこのバグが存在するかは不明ですが、原因はnvidia公式サイトのrunfileによるドライバインストールであると思われます(たぶん)
ubuntunvidia GPUを導入する場合はubuntuの公式リポジトリからドライバをインストールすることをお勧めします。

sudo apt search nvidia

nvidia-xxxみたいなやつをインストールすればおkかと。

windows8で仮想デスクトップ環境を導入する

仮想デスクトップの便利さに今更気づいたので、windows8でも使えるようにしようと思った。
windows10では標準で仮想デスクトップ機能がついているらしいがまだアップデートする気になれない・・・
たぶん何も不具合とかないとは思うけど、慣れた環境を手放すのは割と勇気がいると思う

仮想デスクトップアプリ「Dexpot」

使うのは「Dexpot」というアプリケーション。
最大20の仮想デスクトップを構築でき、カスタマイズ性も高いことで評判になってるらしい。
ショートカットキーやらマウスジェスチャーやら壁紙やら色々自分で設定できる。
そして個人利用だと無料で使える。

とりあえず以下からダウンロードできる
2016/2/23現在でバージョン1.6が最新
http://dexpot.de/?id=download

普通にインストールできます

設定

デフォルトだと使いにくいので最低限の設定をする
タスクバーからDexpotを右クリックして「Settings」を選択する。

まずスタートアップで動いてほしいので、「general」の項目をいじる
f:id:may46onez:20160223224149p:plain

「Start」の欄の「Start with Windows」と「Hide splash screen」にチェックを入れる。
管理者で実行とかもできるのでその辺はご自由に。


次にデスクトップ切り替えのコマンドを設定する。
これは「Controls」の項目
f:id:may46onez:20160223224454p:plain
「Switch desktop」の中の「Next desktop」と「Previous desktop」を追加する(デフォルトではたぶん空になってる)
Ubuntu14.04と同じにしたかったのでCtl + Alt + 矢印キーを設定した。

あと「Move window and switch」を設定する。
これはウインドウを隣のデスクトップに移動し、デスクトップを切り替えるときに用いる。
「Move window」はウインドウを移動させるだけで、デスクトップ切り替えは行われない。

例によってUbuntuと同じにするため
「to next desktop」と「to previous desktop」をCtl + Alt + Shift + 矢印キーとした。


最後にタスクバーに仮想デスクトップの縮小版を表示する(これはまあお好きに)
「Plugins and Extras」の項目
f:id:may46onez:20160223225345p:plain
「Plugins」の中の「Taskbar pager」にチェックを入れる

作業がはかどる

各デスクトップで別々のウインドウを立ち上げておくと、いちいち他のウインドウに切り替える手間が省ける
ウインドウいっぱい立ち上げる人は使うと便利かと。

scikit-learnでsvm 基本的な使い方

今更だがsvmを使いたかったのでscikit-learnで使い方を調べた。
公式ドキュメントが整っているのでそっち見ただけでもわかる。
1.4. Support Vector Machines — scikit-learn 0.19.2 documentation


以下参考
Scikit-learnでハイパーパラメータのグリッドサーチ
scikit-learnによる多クラスSVM
2013.07.15 はじパタlt scikit-learnで始める機械学習

とりあえず使う

とりあえず使うというだけなら何も考えず

from sklearn import svm

clf = svm.SVC()
clf.fit(train_features, train_labels)

とすれば識別器の学習ができる。
その後テストデータに対して推定を行うには

test_pred = clf.predict(test_features)

でおけ。
変数test_predには推定ラベルが羅列したnumpy.ndarrayが入る。
これを真値と比較して結果を見るには、

from sklearn.metrics import classification_report, accuracy_score

print classification_report(test_labels, test_pred)
print accuracy_score(test_labels, test_pred)

とすれば、結果をF値と認識率で評価してくれる。
F値については以下参照
F値 - 機械学習の「朱鷺の杜Wiki」


いやそんなの興味ねーから、Confusion matrixくださいよって時は

from sklearn.metrics import confusion_matrix

print confusion_matrix(test_labels, test_pred)

で表示できる。F値とかは何か結果がごまかされてる感があるけど
Confusion matrix見せとけばとりあえず誰でも納得する、ような気がする


カーネルなどのパラメータを指定する場合は

clf = svm.SVC(kernel='rbf', C=1, gamma=0.1)

のように指定する。
デフォルトではRBFカーネルで、C=1.0, gamma= 1/特徴数 となっている。

チューニングする

svmの性能を引き出すには各種パラメータを調整する必要がある
まずカーネルだが、上で述べたようにsvm.SVCはデフォルトではRBFカーネルを使う
基本的にはRBF、特徴の次元数が大きい時は線形カーネルでもいいらしい
RBFカーネルでは調整するパラメータは{\gamma}{C}、線形は{C}だけ
これをグリッドサーチで探索する
(詳しいことは勉強中・・・こことかわかりやすいのかも)

なんとscikit-learnでは一行でグリッドサーチする関数が用意されている。

parameters = [{'kernel':('rbf'), 'C':numpy.logspace(-4, 4, 9), 'gamma':numpy.logspace(-4, 4, 9)},
              {'kearnel':('rbf'), 'C':numpy.logspace(-4, 4, 9)} ]
clf = grid_search.GridSearchCV(svm.SVC(), parameters, n_jobs = -1)
clf.fit(train_features, train_labels)

print clf.best_estimator_

parametersで指定したパラメータでグリッドサーチを行う。
n_jobsでCPUのコア数を指定して並列計算してくれる。(-1で自動決定)
ただしその分使用するメモリ量も大きくなる。当たり前だけど。
特徴量の次元が大きい場合、メモリが足りなくなってエラーになることがあるので注意。

print clf.best_estimator_でベストパラメータを表示できる。


ここでGridSearchCVcvという引数を整数で指定すると、
指定したfold数でCross-validationをやってくれる。もういたれりつくせりである。

結果はclf.grid_scores_に入っているので下みたいに表示できる。

print"mean score for cross-validation:\n"
for params, mean_score, all_scores in clf.grid_scores_:
    print "{:.3f} (+/- {:.3f}) for {}".format(mean_score, all_scores.std() / 2, params)

clf.grid_scores_には
params(cross-validationのパラメータ),
mean_score(cross_validation後の平均認識率),
all_score(各foldでの認識率)が格納されている。
ついでにall_score.std()標準偏差を求めて{\pm \sigma} を表示するようにしてる。
format関数って便利だね


結果はこんな感じ↓

mean score for cross-validation:

0.782 (+/- 0.004) for {'kernel': 'rbf', 'C': 0.0001, 'gamma': 0.0001}
0.854 (+/- 0.002) for {'kernel': 'rbf', 'C': 0.0001, 'gamma': 0.001}
0.786 (+/- 0.006) for {'kernel': 'rbf', 'C': 0.0001, 'gamma': 0.01}
0.798 (+/- 0.003) for {'kernel': 'rbf', 'C': 0.0001, 'gamma': 0.1}
...

パラメータによってはすごい数になる。

詳しくはドキュメント参照。
sklearn.grid_search.GridSearchCV — scikit-learn 0.19.2 documentation

テストデータの推定は上と同じようにできる。

One-versus-Rest か One-versus-One か

多クラス分類を行う場合、一つの特徴量がどのクラスに分類されるかを決定するのに2つの方法がある。

  • ある特定のクラスに入るか、それ以外に入るか(One-versus-Rest、以後ovr)
  • ある特定のクラスに入るか、別のある特定のクラスに入るか(One-versus-One、以後ovo)

{K}クラス分類問題を考えた時、
ovrでは{K}個の分類器を利用し、
ovoでは{K(K-1)/2}個の分類器を利用する、という違いがある。


svm.SVCdecision_function_shapeという引数でこれらを指定できる。
デフォルトでは'ovo'となっているが、'ovr'のほうが推奨されている(識別性能が良い?)
2016/2/20の時点ではバージョン1.7.0が最新だが、1.8ではデフォルトを'ovr'にすると公式で宣言されてるから
結構性能が違ってくるのかもしれない。

感想

アホでも使えるレベルにしてくれていて助かる。
あとは理論的なことを勉強せねば・・・

deja-dup-monitorに振り回された話

普段は基本的にPCつけっぱなので,たまに再起動したりすると何かしら起こることがある.
ログインできなかったりとか.

今回もその一つで,起動数分後にPCが急激に重くなる症状が出た
(環境はUbuntu14.04LTS)
一応解決したのでメモ。参考元は以下
google chrome - How to prevent deja-dup-monitor from running, or completely delete it? - Ask Ubuntu


何回再起動しても同じなので,システムモニターで挙動を見てみると
起動後何もしてないのにメモリ使用量がどんどん上がっていき、100%近くまでいってフリーズした
RAM128GBでフリーズとかどんだけだよ。。

プロセスをみると"deja-dup-monitor"なるプログラムがほぼ全メモリを食っていた。
調べてみたところ、Deja Dup Backup Toolというアプリによるものらしい。
が、このソフト自体は最初からインストール済みなのでこれが直接の原因ではない

さらに調べるとGoogleが提供するリモートデスクトップアプリである
Chrome remote desktopを導入するとこの問題が起きるらしいということがわかった
確かにLinux版はベータ版とか書いてたけどまさかこんな不具合があるとは・・・てか普通気付くだろこれ


とりあえず解決法としては

  • Deja Dup Backup Toolを消す
  • Chrome remote desktopを消す

のどちらかでいいっぽい。
ほとんど使ってないのでChrome remote desktopを消すことにした。


これのせいで1時間ぐらいあたふたしてしまった
なんにせよベータ版は油断禁物ってことで。