カテゴリ: 機械学習

jupyter notebookをjetson nano上で動かし、ブラウザからアクセスすることで、jetson nanoを機械学習サーバ的に利用することが出来る。

jupyter notebookを動かすjetson nano側で、jupyter notebookの設定が若干必要。その手順については、ここがわかりよい。

ただし、c.NotebookApp.ipについては上記の記事にある'*'ではなく、'0.0.0.0'に変えたのと、c.NotebookApp.allow_remote_access = Trueも追加する必要がありましたとさ。

Jetson Nanoには二つの電力モードがある。詳細は公式ドキュメントへ。
PowerMode
10W想定のMaxNと、5W想定の5W。自分のJetson Nanoがどちらになっているかは以下のコマンドで確認出来る。
$ sudo /usr/sbin/nvpmodel -q
NV Power Mode: MAXN
0
はい、私の環境ではちゃんとMaxNで動いてくれているようですね。

ちなみに電源ですが、これをamazonで買いました。J25の電源端子に差しています。USBは使っていません。1300円くらいだったかな。

3月末にスイッチサイエンスで発注していたJetson Nano。在庫が切れているとのことだったが、本日(2019/4/19)到着した。

内容物は、Jetson Nano ボードとそれの搭載された開発ボード。ラズパイと同じで、電源とSDカードは自分で用意しなくてはいけない。あと、謎の紙製のスタンドが付いていた。そんだけ熱くなるってことか、、、

1. bootイメージのダウンロード。
公式サイトに従って、イメージをダウンロード。ざっくり30分かかりました。

2. bootイメージの書き込み
眠っているラズパイがあったので、そこからSDカードを抜き取った。容量は32GB。NanoのOSは何ギガ認識するのだろう。ダウンロードしたファイルを使って以下のコマンドで、SDカードに書き込んだ。こちらもざっくり30分かかった。
$ /usr/bin/unzip -p ~/tmp/jetson-nano-sd-r32.1-2019-03-18.zip| sudo /bin/dd of=/dev/mmcblk0 bs=1M status=progress
12882673664 bytes (13 GB, 12 GiB) copied, 2088 s, 6.2 MB/s
0+101125 レコード入力
3. 電源を入れる。
キーボードとマウスとLANケーブルとHDMIを繋いで、最後に電源(USB)に繋ぐ。が、一発目は画面にPower Buttonを押せとかなんとかのメッセージを出したまま、固まった。キーもきかないし、諦めてUSBを抜き、差し。すると今度はNVIDIAロゴと、ブートメッセージが画面を流れ始めた。そして無事にブートした。最初は言語などの設定をすることになるが、ここがとても参考になった。

4. バックアップ
一応、無事にブートして、初期設定が終わったので、SDカードのバックアップを取っておこう。これには数時間かかって、まいったまいった。
$ sudo dd if=/dev/mmcblk0 of=~/jetson_img/initialsetup.img status=progress
5. WiFI
WiFiのドングルを指すとそのまま認識してくれて、簡単に接続出来た。これで有線LANからは開放された。

6. VNC Server
リモートからもGUIを使いたいので、vncサーバをセットアップする。vnc4serverといくつかのパッケージをインストールするとともに、設定ファイルの修正が必要。
$ sudo apt search vnc4server
ソート中... 完了
全文検索... 完了  
vnc4server/bionic 4.1.1+xorg4.3.0-37.3ubuntu2 arm64
  仮想ネットワークコンピューティングサーバソフトウェア
$ sudo apt install vnc4server
$ sudo apt install gnome-panel gnome-settings-daemon metacity
$ vi ~/.vnc/xstartup
二行ほどコメントアウトして、8行追記。
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
exec gnome-session &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &
これでvncサーバーを起動する。あとは、クライアント側から繋げばOK。
$ vncserver -geometry 1280x800
7. filesystemのexand
せっかく32GBのSDカードを差しているが、12GB分しか使えていない。
$ df -m
Filesystem     1M-blocks  Used Available Use% Mounted on
/dev/root          11956 10458       868  93% /
devtmpfs            1743     0      1743   0% /dev
tmpfs               1979     1      1979   1% /dev/shm
tmpfs               1979    28      1951   2% /run
tmpfs                  5     1         5   1% /run/lock
tmpfs               1979     0      1979   0% /sys/fs/cgroup
tmpfs                396     1       396   1% /run/user/120
tmpfs                396     1       396   1% /run/user/1000
そこでgpartedを使って、ファイルシステムを拡張する。
$ sudo apt search gparted
gparted/bionic-updates 0.30.0-3ubuntu2 arm64
  GNOME パーティションエディタ
$ sudo apt-get install gparted
$ sudo gparted
gpartedでは、たしかに未割り当て領域が存在している。が、/rootにマウントしてあって手が出ない、、、さてどうしたものか。
NVIDIAに以下のエラッタがあった。拡張できないと書いてある、flash.shというのがなんだかわかってないけど。しばし、保留するが、/rootが残り1GB程度しかないので、何か対策しなくては。nfs/cifsか?
Nano /dev/root device size is restricted to 14 GB when using flash.sh to write to an SD card. User cannot create additional partitions on the root device, so any excess space is unavailable.
一旦、SDカードをPCに差し替えて、そちら側でGPartedを起動。該当するパーティションのリサイズを試みるも、なぜかグレーアウトしている。そこで「チェック」というメニューがあることに気がついたので、動かしてみるとなんか壊れているという言う。恐る恐るパーティションの修復を行うと、それがうまいこといって、ちゃんと32GB全体を使えるようになった。

8. tensorflow環境のインストール
https://blog.hackster.io/getting-started-with-the-nvidia-jetson-nano-developer-kit-43aa7c298797
$ sudo apt-get install libhdf5-serial-dev hdf5-tools
$ sudo apt-get install python3-pip
$ sudo apt-get install zlib1g-dev zip libjpeg8-dev libhdf5-dev  ← すでに最新版が入っていた。
$ pip3 install -U numpy grpcio absl-py py-cpuinfo psutil portpicker grpcio six mock requests
$ pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42

いま、ここ。
===========================================
こんごの予定。


*. unminimize
デフォルトでsshログインが可能になっているらしく、いきなりログイン出来た。そして以下のメッセージが。システムが最小化されているから、unminimizeしろとのこと。仰せのままに。
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.9.140-tegra aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

160 個のパッケージがアップデート可能です。
0 個のアップデートはセキュリティアップデートです。

Last login: Fri Apr 19 21:55:00 2019 from 192.168.1.2
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

$ sudo unminimize
日本語モードになんのキーを使うかきかれたので、とりあえず"Alt + Shift"としておいた("Alt + Space"だったかな、、、)

今はここまで。

tensorflowを使って数値予測モデルを構築中。普段使っている古いPCが古すぎて、tensorflowのv1.5しか使えないので、ライズパイに開発環境を構築できないか、さらにdockerを使ってハード環境はきれいなまんまで出来ないかトライ。

ハード:
  raspberry pi 3 B+
  Raspbian GNU/Linux 9.8 (stretch)

Docker環境のインストール
# インストール.
$ curl -sSL https://get.docker.com/ | sh

# Version確認
$ sudo docker -v
Docker version 18.09.0, build 4d60db4

# root以外も使えるようにdockerグループにユーザ追加
$ sudo usermod -aG docker xxxx

# 自動起動設定
$ sudo systemctl enabel docker

# 再起動
$ sudo reboot

# Hello World
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1eda109e4da: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
試しにコンテナ作成
# -t:  コンテナの入力に、ホストの出力をttyで繋ぐ。
# -i:  コンテナの出力とホストの入力を繋ぐ。
# --priviledged: コンテナがハードに触る権限付与
# resin/rpi-raspbian:stretch: イマイチ何者かわかっていない、、、
$ docker run --name rpi-raspbian-stretch -ti --privileged resin/rpi-raspbian:stretch /bin/bash

# コンテナの中に入った
root@8c328e6941b5:/# ls
bin   dev  home  media    opt   root  sbin  sys  usr
boot  etc  lib     mnt    proc  run   srv   tmp  var
root@8c328e6941b5:/# exit
exit

# コンテナから出た。
$ docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                      PORTS               NAMES
8c328e6941b5        resin/rpi-raspbian:stretch   "/usr/bin/entry.sh /…"   9 minutes ago       Exited (0) 7 minutes ago                        rpi-raspbian-stretch
42c14cac07bd        hello-world                  "/hello"                 31 minutes ago      Exited (0) 31 minutes ago                       friendly_lichterman
ちなみにexitでコンテナが停止してしまっているので、再び接続するにはstartで起こして、attachで接続すればOK. なお、コンテナIDは全部入れなくても探してくれるらしい(気が効く)
$ docker start 8c3
8c3
$ docker attach 8c3
root@8c328e6941b5:/#
ここまでは順調だったが、DOCKERFILEを作る段階になった、pycharmのインストール方法がわからなくなった。そもそも、このイメージの上でちゃんと動くのか?Pycharmの公式によると、snapを使ったインストールと.tar.gzを使ったインストールの二つがある。snapを使う方法だが、コンテナにはsnapなんか入っていないので、まずはそこからい、しかし、snapdが起動してくれない、、、断念(早い)
# apt update
# apt install snapd           ← 一応文句は言われなかった。
# snap install pycharm-community --classic
2019/04/06 01:22:34.344403 main.go:220: WARNING: cannot create syslog logger
error: cannot communicate with server: Post http://localhost/v2/snaps/pycharm-community: dial unix /run/snapd-snap.socket: connect: no such file or directory
しかし、snapdの起動が出来ていないらしく、失敗
ここでsnapによるインストールは断念。tar.gzを使ったインストールに変更。まずは、公式からインストーラをダウンロードし、続いてコンテナ上にコピーした。
# ホスト上のインストーラをコンテナにコピー
$ docker cp jetbrains-toolbox-1.13.4801.tar.gz 8c3:/jetbrains-toolbox-1.13.4801.tar.gz

# コンテナ上で展開
# tar -xzf jetbrains-toolbox-1.13.4801.tar.gz -C /opt

# インストーラの実行
root@8c328e6941b5:/opt/pycharm-community-2019.1.1/bin# ./pycharm.sh
また、怒られた、、、インストールスクリプトを見ると、コンテナ上での実行など想定していない(当たり前)。

開発環境そのものをコンテナで構築というのは、諦めよう。まぁ、そもそもコンテナ/Docker環境はデプロイ向けなので、コンテナに開発環境を構築するというのは主旨とあってないかもね。開発環境を汚さずに構築したいならVMを使いなさい、ということかな。

condaなどの環境を使って、tensorflow環境を構築することとしよう。そして、実行環境はコンテナ使って配備するという方針にしよう。

うっかりgithubの制限(100MB)を越えるサイズのファイルをコミットしてしまい、前に進めなくなってしまったが、ここを参考に解決。先人に感謝。

解決方針としては、「そんな大きなファイルはそもそもなかったふりをする」である。先人のように大きなファイルもコミット出来るように対処というまっとうな道もあるが、安易な道をすすんだ。

BEFORE:
①大きなファイルがコミットしてある(pushするとrejectされる)
②その他に、修正の入ったファイルがある(pushしたいが、大きなファイルのせいで出来ない)

対処:
1. コミットを一つ巻き戻す。
   $ git reset --soft HEAD^
上のコマンドでコミットが一つ巻き戻ってくれる。つまり、大きなファイルのコミットをなかったことにしてくれるのだ。もちろん、コミットをなかったことにしてくれるだけで、ファイルは巻き戻らないので、BEFORE②のファイル修正も活きたまま。

2. 大きなファイルを消す
改めて②をcommit/pushしたいところだが、先に大きなファイルを消しておく。でないと、またBEFOREの状態に戻ってしまうので。

3. commit/push
邪魔者がいなくなったところで、改めてcommit&push。これで、②をgithubにあげることが出来ました。


↑このページのトップヘ