環境の再構築

悲しい事に、OSが立ち上がらなくなってしまいました(2019年2月)。
Cudaのバージョンを上げようとして、色々リンクをいじっていたのが良くなかったのだと思います。
まずは大事なデータの救出から入ります。
その後、せっかくなので初めから入っていたCentOSからUbuntuに乗り換える事にしました。
機械学習ではUbuntuを前提としてライブラリが開発されている事が多く、特別な思い入れが無い場合はUbuntuを選択した方が良いようです。

…しかしこれが嵌まった…

何しろsshも利かないのでデータの救出も一苦労。
OSもバージョン違いなどでうまく入らなかったりして。

苦労したので記録しておきます。
後続の皆様のお役に立てますように。

1. レスキューモード
私の場合は、まったくOSにアクセス出来なくなっているところから始まります。
まずはレスキューモードで起動しましょう。
これにはライブDVDを作ります。

CentOSのページから、DVDイメージをダウンロード。生きているWindows PCを用いて、ISOイメージをDVDに書き込みます。ISOからの書き込みは、以前は別途ソフトが必要でしたが、Windows10であればそのまま書き込む事ができるようです。DVDをPCにセットして、ダウンロードしたファイルを右クリックして、イメージの書き込み、でOK。なんてお手軽な!

DVDドライブを持っていない場合でも、USBメモリを用いても作れます。

次にDVDからOSを起動します。
BIOSに入り、DVDドライブから起動するように設定を行います。
BIOSへの入り方は環境によって違いますが、再起動してBIOS起動中にF2やDelキーを押すのが一般的かと。
Bootの優先順位をHDからDVDへ変更します。
あまり見慣れない画面ですが、触れるところも少ないので大して迷う事もないかと。
もし間違えちゃった場合は、BIOSをExitする項目を選んでセーブしなかったら元に戻ります。
BIOSまで壊れてしまったらもう直せませんので気を付けて。

起動したらTroubleshootingモードを選択します。

このモードでは、通常の場所とは違うところにrootがマウントされています。
システムの復旧を目指すために、boot出来ないところ以外を使うって感じなのでしょうか。

通常のrootをマウントするには、

chroot /mnt/sysimage

との事ですが、ここで嵌まりポイント1。

/bin/bash

が無い、とのエラーが出てうまく行きませんでした。う~ん、、、lsで調べたところあるんですが。。。

しばらくwebを漁ったところ、これはライブDVDとシステムのアーキテクチャが違うと出るエラーの様。
アーキテクチャとは32bitなのか、64bitなのか、という事ですね。
しかしながら私は両方とも64bitを使っているのにこのエラーが出てしまいます。
色々考えて、、、chrootは諦めました。
うまく行けば、Troubleshootingモードから、変更したリンクやドライバの入れ替えを行う事で、システムの復旧ができるのではないかと思っていましたが、rootがマウント出来ないのであれば、ドライバの変更もままならず、無理です。もしかしたら何か方法があるのかもしれませんが、、、しばらく調べてやめました。

2. データの救出
あまり量は多くないのですが、時間をかけて作ったいくつかのコードが、どこにもバックアップされていない状態で眠っています。これを消してしまうのは惜しい。。。なんとかこれだけでも救出したいのです。
しかしながらsshもftpもアクセスできません。仕方ないのでUSBのHDをつなげてみましょう。

レスキューモードで起動した後、

dmesg

と打ちます。続けてUSBのHDを接続し、再度

dmesg

と打つと、先ほどのコメントにいくつか足されます。
その際、[sdb: sdb1]のような文字が現れるかと思われます。
その場合、つなげたHDはsdb1という名前で認識してますよ、と言う意味になるそうです。

次にHDをLinux用にフォーマットします。
この作業により、HDの中身は全て消されますので注意してください。

fdisk /dev/sdb1

で、pを押すと現在のパーテーションが表示されます。
一度全部消すので、dを押してください。
パーテーションが一つだけの場合はこれだけ。
複数ある場合は選択肢がでるので、全部のパーテーション削除を繰り返します。
終わったらwで書き込みます。
その後もう一度

fdisk /dev/sdb1

で起動し、今度はnでパーテーションを作ります。
救出用ですので、パーテーションは1個だけでいいですかね。
終わったらwで書き込みます。

次にHDのフォーマットを行います。

mkfs.ext3 /dev/sdb1

ここで嵌まりポイント2。
現在Linuxで主流なファイルシステムはext4です。
レスキューしたファイルをそのまま復旧したLinuxに入れるのであれば、ここはext4で良いのではと思うのですが、私は他にLinuxマシンを持っていないので、一度Windowsに退避させたいと思ったわけです。
一方Windowsの方での主流システムはntfsです。Linux用フォーマットをWindowsに読み込ませるには、後述するExt2Fsdというソフトを用いるわけですが、これが何故かExt4には反応しませんでした。(いや、Ext4に反応しない問題はWeb上でも指摘されていて、解決策も提示されているのですが、現在の私の非常時環境では実行できなかったのです。色々試して、仕方なくExt3を使う事にしました。)

続いてHDをLinux上にマウントします。

mkdir /mnt/usbhd
mount /dev/sdb1 /mnt/usbhd

一つ目の行は始めに一度実行するだけで良いです。
mntにusbhdというフォルダを作成しています。
次の行ではここにsdb1をマウントします。
これで/mnt/usbhdにデータをコピーする事ができるようになりました。
これまで作っていたファイルは/mnt/sysimage/homeの下にありますので、これをcpコマンドでひたすらコピーします。
コピーし終わって、HDを外すときはアンマウントを忘れずに。

unmount /mnt/usbhd

最後に救出したファイルをWindows上で保管します。
他にLinuxマシンがあるなど、HDにデータを入れっぱで構わない場合はこのステップは必要ありません。
Windowsマシンに、上述したExt2Fsdをインストールします。
ダウンロードはこちらから。

先ほど述べた通り、HDのフォーマットがExt4では反応しませんでしたので気を付けて。
今回はバックアップが目的なので、もう余計な事はせずにExt3にしています。
なんとか無事に大事なデータを救出する事ができました。助かった・・・

3. OSのインストール
はあ、はあ、はあ、、、もう大変。でもあと一息です。
データはレスキュー出来ましたが、やはりOSはブートしません。
色々考えましたが、ここまでで結構時間を使ってしまっているし、ここは思い切ってOSを入れ替える事にしました。
しかも、CentOSからUbuntuに乗り換えます。
ドライバなどの問題で何か不具合が起きないか不安。。。

まずはUbuntuのDVDを作成します。これはCentOSの時と同じステップですね。

と、、、ここで嵌まりポイント3。
UbuntuのHPに行くと、最新の18.10がダウンロードできるようになっています(2019年2月)。
始めは、やはり新しい方がいいだろうと18.10を入れた訳ですが、後々になって、Cuda-9.0が入れられない事が判明しました。
こういう事があるから、素人さんは手を出さない方が良い訳ですね。そうですね。

Cuda-9.0が問題なく入れられるUbuntu 16.04.6 LTSを入れます。
ダウンロードはこちらから。
日本語版ありますが、またなにか変な事が起きたらイヤなので、通常版にしました。
日本語版のダウンロードはこちらから。

結構時間がかかりますが、なんとかOSをインストールできました。

4. 環境の構築
続いてドライバを入れたりCudaを入れたりしていきます。
まずはGPUのドライバから。
手持ちのGPUにあったドライバを下記から手に入れます。
ダウンロードはこちらから。

今回はクリーンインストールからなので必要ないのですが、ドライバの入れ替えの場合は既存のものを消す必要があるそうです。
ただでさえやっかいなドライバのインストール。削除なんて極力やりたくないですね。

nvidia-uninstall

うわぁ、気を付けて。
ドライバを入れなおします。

sudo sh ./NVIDIA[のドライバ]

うまく行きましたでしょうか?

うまく行ったとして、どんどん行きます。次はCuda。NVIDIAのページからダウンロードして、ダウンロードしたフォルダで下記のコマンドを実行します。

sudo dpkg -i cuda-repo-ubuntu1604_9.0.*_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt update
sudo apt install cuda-9-0

次にパスを設定します。設定ファイルは.bashrcです。
ちなみに初めに.(ドット)が付いているファイルは隠しファイルです。ls -aコマンドで見られます。

export PATH=/usr/local/cuda-9.0/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:${LD_LIBRARY_PATH}

を追記して、ターミナルを一度閉じ、再度開けると設定完了です。
nvidia-smiと打って、GPUの情報が出れば良し。

どんどん行きます。お次はcuDNN。こちらのダウンロードには会員登録が必要ですが、無料です。
ダウンロードはこちらから。
cudaのバージョンにあったcuDNNをダウンロードすればよろしいかと。

ダウンロードしたフォルダに移動して下記を実行します。

sudo dpkg -i libcudnn7_7.0*+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.0*+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.0*+cuda9.0_amd64.deb 

うまくいきましたでしょうか?

5. Tensorflowのインストール
最後にTensorflowを入れます。
その前にpyenvを入れます。
その前に必要なパッケージをいくつか入れます。

sudo apt-get install -y git build-essential libssl-dev language-pack-id

そしてpyenvをgithubからクローンします。なんですかこれは。
実はイマイチありがたみが分かっていないのですが、複数のpythonのバージョンを管理できる、仮想環境だそうです。
バージョン違いによって使っているライブラリが動いたり動かなかったりするらしいので、なるべく環境を揃えておきたい人向けなのかな。

git clone https://github.com/yyuu/pyenv.git ~/.pyenv

また、パスを編集します。.bashrcなどに下記を追記。

export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH

本当に最後にTensorflowをインストール。

pip install tensorflow

GPU版の場合はこちら。

pip install tensorflow-gpu

長かったですね。大変でした。
クリーンインストール自体は一度やってみたかったので良しとしますか。
今後不具合が起きなければいいな。