jupyter lab appを使ってみた
jupyter labのスタンドアローン版というのが最近リリースされたらしいです。
そういや昔ちょろっと聞いたような気がするなーと思ってたんですが、リリース履歴を見ると3年ほど放置されてたようですね。
私がjupyter labを使う時は、
- google colabで使う
- dockerからjupyter/scipy-notebook を起動して使う
のどちらかでやってたんですが、どちらの場合も起動した後で必要なファイルが不足してた時に取りに行くのが面倒 というビミョーな問題がありました。
colabの場合は、小さめのファイルなら都度アップロードすれば良いのですが、しばらく放置してるとインスタンスを落とされるという制限があります(課金すれば回避できるけど)。また、毎回アップロードするのを避けるために、必要なファイルをgoogle driveに置いて、notebookの最初の方でマウントするという運用もできるんですが、これをやると数GB単位のファイルを扱うようなコードを書いているとgoogle drive側が破綻します(こっちも課金で回避はできるけど・・・)
一方dockerの方は
docker run --rm -p8888:8888 -v${PWD}:/home/jovyan/work jupyter/scipy-notebook'
という感じで、カレントディレクトリをworkにマウントして使っているので、起動してから「しまったマウントポイントより上の階層に置いてあるファイルが必要だったorz」なんてことが稀に良くあります。
こちらも、jupyterlabの機能を使ってアップロードするなり、docker cp
で送り込むという手はあるんですが、ローカルのストレージ内にあるファイルをわざわざコピーしないと使えないというのもちょっとフラストレーションが溜まります。
というわけで、どちらも一応問題無く使えてるんだけど、微妙に使い勝手が悪いのでで、問題無いようならこの機に乗り換えてみようと思います。*1
インストール
今のところhomebrewからは入れられないようなので、githubのリリースページからpkgをダウンロードしてインストールします。
Releases · jupyterlab/jupyterlab_app · GitHub
インストールは通常のmac用のアプリと同じです。 窓の杜の記事だと、インストール時に何か聞かれてるようですが、mac版では特にインストール中にいじれる設定はありませんでした。
正常にインストールできたら、こんな感じのアイコンがlaunchpadに表示されるので、これをクリックして起動します。
初回起動時なのに、以前native環境にインストールしたjupyterlabを使っていた時のものと思われるnotebookがいきなり開いた状態で起動したので、一瞬パニックになりましたが一旦全部のタブを閉じてアプリを終了してから再度起動すると、こんな感じのlauncher画面になります。
窓の杜の記事をざっと見たところ、jupyter lab app専用にcondaでpythonもパッケージも入れてくれているという話だったので、まずはその辺を確認しましょう。
terminalタブを開いて、バージョンを確認します。
MBA:so5 so5$ python --version Python 2.7.16 MBA:so5 so5$ python3 --version Python 3.8.9
続いてterminal appを起動してpythonのバージョンを確認します。
so5@MBA ~ % python --version Python 2.7.16 so5@MBA ~ % python3 --version Python 3.9.7
確かにpython3のバージョンが違うものが使われてますね。
入っているパッケージも一応比較してみましょう。
MBA:so5 so5$ conda list # packages in environment at /Applications/JupyterLab.app/Contents/Resources/jlab_server: # # Name Version Build Channel anyio 3.3.2 py38h50d1736_0 conda-forge appnope 0.1.2 py38h50d1736_1 conda-forge argon2-cffi 20.1.0 py38h96a0964_2 conda-forge async_generator 1.10 py_0 conda-forge attrs 21.2.0 pyhd8ed1ab_0 conda-forge babel 2.9.1 pyh44b312d_0 conda-forge backcall 0.2.0 pyh9f0ad1d_0 conda-forge backports 1.0 py_2 conda-forge backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge bleach 4.1.0 pyhd8ed1ab_0 conda-forge brotlipy 0.7.0 py38h96a0964_1001 conda-forge ca-certificates 2021.5.30 h033912b_0 conda-forge certifi 2021.5.30 py38h50d1736_0 conda-forge cffi 1.14.6 py38h1a44b6c_1 conda-forge chardet 4.0.0 py38h50d1736_1 conda-forge charset-normalizer 2.0.0 pyhd8ed1ab_0 conda-forge colorama 0.4.4 pyh9f0ad1d_0 conda-forge conda 4.10.3 py38h50d1736_2 conda-forge conda-package-handling 1.7.3 py38h96a0964_0 conda-forge cryptography 3.4.7 py38h1fa4640_0 conda-forge cycler 0.10.0 py_2 conda-forge debugpy 1.4.1 py38ha048514_0 conda-forge decorator 5.1.0 pyhd8ed1ab_0 conda-forge defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge entrypoints 0.3 pyhd8ed1ab_1003 conda-forge freetype 2.10.4 h4cff582_1 conda-forge idna 3.1 pyhd3deb0d_0 conda-forge importlib-metadata 4.8.1 py38h50d1736_0 conda-forge ipykernel 6.4.1 py38h5fd9f69_0 conda-forge ipython 7.28.0 py38h5fd9f69_0 conda-forge ipython_genutils 0.2.0 py_1 conda-forge ipywidgets 7.6.5 pyhd8ed1ab_0 conda-forge jbig 2.1 h0d85af4_2003 conda-forge jedi 0.18.0 py38h50d1736_2 conda-forge jinja2 3.0.1 pyhd8ed1ab_0 conda-forge jpeg 9d hbcb3906_0 conda-forge json5 0.9.5 pyh9f0ad1d_0 conda-forge jsonschema 3.2.0 pyhd8ed1ab_3 conda-forge jupyter_client 7.0.3 pyhd8ed1ab_0 conda-forge jupyter_core 4.8.1 py38h50d1736_0 conda-forge jupyter_server 1.11.0 pyhd8ed1ab_0 conda-forge jupyterlab 3.1.13 pyhd8ed1ab_0 conda-forge jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge jupyterlab_server 2.8.2 pyhd8ed1ab_0 conda-forge jupyterlab_widgets 1.0.2 pyhd8ed1ab_0 conda-forge kiwisolver 1.3.2 py38h12bbefe_0 conda-forge lcms2 2.12 h577c468_0 conda-forge lerc 2.2.1 h046ec9c_0 conda-forge libblas 3.9.0 11_osx64_openblas conda-forge libcblas 3.9.0 11_osx64_openblas conda-forge libcxx 12.0.1 habf9029_0 conda-forge libdeflate 1.7 h35c211d_5 conda-forge libffi 3.4.2 he49afe7_4 conda-forge libgfortran 5.0.0 9_3_0_h6c81a4c_23 conda-forge libgfortran5 9.3.0 h6c81a4c_23 conda-forge liblapack 3.9.0 11_osx64_openblas conda-forge libopenblas 0.3.17 openmp_h3351f45_1 conda-forge libpng 1.6.37 h7cec526_2 conda-forge libsodium 1.0.18 hbcb3906_1 conda-forge libtiff 4.3.0 h1167814_1 conda-forge libwebp-base 1.2.1 h0d85af4_0 conda-forge llvm-openmp 12.0.1 hda6cdc1_1 conda-forge lz4-c 1.9.3 he49afe7_1 conda-forge markupsafe 2.0.1 py38h96a0964_0 conda-forge matplotlib-base 3.4.3 py38hc7d2367_1 conda-forge matplotlib-inline 0.1.3 pyhd8ed1ab_0 conda-forge mistune 0.8.4 py38h96a0964_1004 conda-forge nbclassic 0.3.2 pyhd8ed1ab_0 conda-forge nbclient 0.5.4 pyhd8ed1ab_0 conda-forge nbconvert 6.2.0 py38h50d1736_0 conda-forge nbformat 5.1.3 pyhd8ed1ab_0 conda-forge ncurses 6.2 h2e338ed_4 conda-forge nest-asyncio 1.5.1 pyhd8ed1ab_0 conda-forge notebook 6.4.4 pyha770c72_0 conda-forge numpy 1.21.2 py38h49b9922_0 conda-forge olefile 0.46 pyh9f0ad1d_1 conda-forge openjpeg 2.4.0 h6e7aa92_1 conda-forge openssl 1.1.1l h0d85af4_0 conda-forge packaging 21.0 pyhd8ed1ab_0 conda-forge pandas 1.3.3 py38ha53d530_0 conda-forge pandoc 2.14.2 h0d85af4_0 conda-forge pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge parso 0.8.2 pyhd8ed1ab_0 conda-forge patsy 0.5.2 pyhd8ed1ab_0 conda-forge pexpect 4.8.0 pyh9f0ad1d_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 8.3.2 py38hee640a0_0 conda-forge pip 21.2.4 pyhd8ed1ab_0 conda-forge prometheus_client 0.11.0 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.20 pyha770c72_0 conda-forge ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge pycosat 0.6.3 py38h96a0964_1006 conda-forge pycparser 2.20 pyh9f0ad1d_2 conda-forge pygments 2.10.0 pyhd8ed1ab_0 conda-forge pyopenssl 20.0.1 pyhd8ed1ab_0 conda-forge pyparsing 2.4.7 pyh9f0ad1d_0 conda-forge pyrsistent 0.17.3 py38h96a0964_2 conda-forge pysocks 1.7.1 py38h50d1736_3 conda-forge python 3.8.12 h17280f6_0_cpython conda-forge python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge python_abi 3.8 2_cp38 conda-forge pytz 2021.1 pyhd8ed1ab_0 conda-forge pyzmq 22.3.0 py38hd3b92b6_0 conda-forge readline 8.1 h05e3726_0 conda-forge requests 2.26.0 pyhd8ed1ab_0 conda-forge requests-unixsocket 0.2.0 py_0 conda-forge ruamel_yaml 0.15.80 py38h96a0964_1004 conda-forge scipy 1.7.1 py38hd329d04_0 conda-forge seaborn 0.11.2 hd8ed1ab_0 conda-forge seaborn-base 0.11.2 pyhd8ed1ab_0 conda-forge send2trash 1.8.0 pyhd8ed1ab_0 conda-forge setuptools 58.0.4 py38h50d1736_2 conda-forge six 1.16.0 pyh6c4a22f_0 conda-forge sniffio 1.2.0 py38h50d1736_1 conda-forge sqlite 3.36.0 h23a322b_2 conda-forge statsmodels 0.12.2 py38hbe852b5_0 conda-forge terminado 0.12.1 py38h50d1736_0 conda-forge testpath 0.5.0 pyhd8ed1ab_0 conda-forge tk 8.6.11 h5dbffcc_1 conda-forge tornado 6.1 py38h96a0964_1 conda-forge tqdm 4.62.3 pyhd8ed1ab_0 conda-forge traitlets 5.1.0 pyhd8ed1ab_0 conda-forge urllib3 1.26.7 pyhd8ed1ab_0 conda-forge wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge webencodings 0.5.1 py_1 conda-forge websocket-client 0.57.0 py38h50d1736_4 conda-forge wheel 0.37.0 pyhd8ed1ab_1 conda-forge widgetsnbextension 3.5.1 py38h50d1736_4 conda-forge xz 5.2.5 haf1e3a3_1 conda-forge yaml 0.2.5 haf1e3a3_0 conda-forge zeromq 4.3.4 he49afe7_1 conda-forge zipp 3.5.0 pyhd8ed1ab_0 conda-forge zlib 1.2.11 h7795811_1010 conda-forge zstd 1.5.0 h582d3a0_0 conda-forge
listの中にseabornが入っていますが、実はこれ初期状態でリストを取るのを忘れてて、私が後から入れてしまったパッケージなので、デフォルトでは入ってません。 しかし、pandas, matplotlib, numpy, scipyあたりは入ってるので*2この辺を使いたい人は特に追加で入れなくてもひととおり揃った環境と言えそうです。
terminal appではそもそもcondaにパスが通っていないので、違うところを見てるのは間違いないのですが 一応pip3で確認すると、これだけしかパッケージは入ってませんでした。
so5@MBA ~ % pip3 list Package Version ---------- ------- labelImg 1.8.5 lxml 4.6.3 pip 21.2.4 PyQt5 5.15.4 PyQt5-sip 12.8.1 setuptools 57.4.0 wheel 0.37.0
というわけで、こちらの環境をどんなにいじったところで、デフォルトのpython環境には影響しないようです。
私みたいにjupyter labをpytonの開発環境として使ってると、jupyter labで開発してファイルに保存したpythonスクリプトをterminaから起動しようとして依存パッケージが足りないなんていうトラブルが起きそうな気もしますが、そんときゃそん時でなんとかしましょう :p
使い方
使い方は通常のjupyterlabやgoogle colabなんかと概ね同じ感じです。
colabとjupyterlabでショートカットキーとか色々と違うだろうという意見もあるかと思いますが、正直に言うとどちらもそんなに使い込んでないので、私にはレビューのしようがありませんo...rz
とりあえず、先週末にインストールして3日ほど使った感じでは、特に違和感無く使えています。
また、webアプリとして使っていた時と違って、CTRL+TABで簡単に切り替えられるので、ブラウザのタブを大量に開いて調べながらコードを書いてる時なんかは、すぐに戻ってこれるのが地味に便利ですw
まとめ
まとめるほどの内容もないんですが、最後にひとことだけ書いとくと
「jupyter lab appはいいぞ」
docker imageのベースに何を使うのが良いか?
docker imageを作る時のベースイメージとして、なるべくサイズを抑えたい層向けにはalpine linuxがよく使われていると思いますが、あれだとソースからビルド何かビルドしようとすると、ちょくちょくトラブるんですよね。
特にalpine linuxベースでいろいろと依存ライブラリやらソフトのビルド設定を追加してすくすくと育てていったDockerfileに、最後にインストールしようとしたソフトがビルドできなかった時とか辛いですよね。
こんなに、悲しいのなら苦しいのなら・・・・愛などいらぬ!!
というわけで、alpine以外のメジャーなディストロのイメージサイズを調べてみました。
% docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest e6a0117ec169 6 days ago 272MB opensuse/leap latest 37f8370bfe62 12 days ago 126MB opensuse/tumbleweed latest 91ce1acd49a8 2 weeks ago 120MB debian latest d04e7939dfd8 2 weeks ago 118MB ubuntu latest 54ab604fab8d 3 weeks ago 65.6MB alpine latest bb3de5531c18 3 weeks ago 5.34MB fedora latest 2f61b50da868 2 months ago 208MB archlinux latest 1d6f90387c13 3 weeks ago 381MB
なお、arch linuxはM1 mac用が無いようなので、amd64のイメージ。他は全てlinux/arm64/v8のイメージサイズです。
改めて並べてみるとalpine linuxのサイズ(5.34MB)が飛び抜けて小さいですね。
でも、この後に起こるトラブルを回避すると考えると、ubuntuの65MBは十分許容範囲と言えそうです。 ま、色々とパッケージを追加したらサイズは膨れあがってくんですけどね orz
ラズパイで天体望遠鏡を動かそうその2
前回の続きで、いくつか残っている問題について調査していきます。
現状で問題になってるのは次の3点なんですが、とりあえずカメラのことは置いときます(単にモニターに出力するだけならraspividのpreview画面で見れるので、月とか惑星を見るくらいなら支障は無いですし)
1、2はどうせゲームパッドを変えれば解決するだろうと思って、最初に使っていたbuffaloのスーファミコントローラ風のものをやめて、ジャンク品置き場に放り込んであった、PS風のとか、ニンテンドーswitchのプロコン風のとか色々試してみましたが、どれも同じ症状。 Indiのforumにもざっくりと書いてみたものの無反応だったので、こりゃひょっとしてAZ-GTiとAZ-GTeで微妙に挙動が違うとかなのかと半ば諦めてたんですが、こちらにめっちゃ重要な情報が書いてありました。
経緯台モードで使用する場合のドライバは Skywatcher Alt-Az です。 紛らわしいですが AZ-GTi ドライバは EQMod ドライバをベースにしたもので、赤道儀モード専用です。
うちの、AZ-GTeは経緯台モード。で、ドライバはどれを使っていたかというと
AZ-GTiドライバですね o...rz
ドライバを入れ替えただけで無事に1、2、ともに解決しました。
あと残った問題は、ラズパイHQカメラのドライバが動かない問題なんですが、これはINDIをソースからビルドすればOKという話をちらっとみかけたので時間のある時にやってみようと思います。
ラズパイで天体望遠鏡を動かそう!
1年ほど前に生まれて初めて天体望遠鏡を買いました。
当時小4の子供の夏休みの宿題で「月の写真を撮ってくること」というのがあって、子供と一緒に一眼レフ+望遠レンズで写真を撮ってました。
その時の機材は、オリンパスのE620に50-200という構成でしたが、フルサイズ換算で400mmではイマイチ迫力に欠けるので、cannonの800mmのレンズにマウントアダプターつけて付けれないかなーとか、ニコンのP1000はどうかなーとか色々考えていたところにこの商品を見つけて5万円切ってるなんて激安じゃないか!*1という錯覚から衝動買いしてしまったのです :p
この機種はAZ-GTeという自動導入ができる架台がセットになっているもので、スマホアプリから操作できますというのがウリなんですが、買ってしばらく使っているうちに重大な欠点に気付きました。
画面を見ずにタッチパネルを操作するのは人類には早すぎる
この機種、自動導入の仕組みがついていて、アプリから目当ての星を選ぶと望遠鏡をそっちに向けてくれるんですが、この機能を使うためには最初にアライメントという操作をする必要があります。
この時、天体望遠鏡を覗きながらアプリの画面に表示された上下左右のカーソルで微調整をして、選んだ星が視野の中心にくるように微調整する必要があるんですが、天体望遠鏡を覗きながらアプリの画面も見るのは至難の技。かといって画面を見ずにタッチパネルでカーソル操作も不可能というわけで、手探りで上下左右に動したいと思っていました。
有線接続用のポートがあるので、そこにwiiのヌンチャクを繋ぐというのが定石のようなのですが(たぶん誤解)そもそもwiiのヌンチャクを手に入れるところから結構な難易度です。
幸いなことに、USBのジョイパッドとラズパイが余ってたので、こちらを使う方向で検討していました。
ラズパイでジョイパッドの入力を受け取るのは pygame https://www.pygame.org でできるし、AZ-GTeの操作自体はUDPで通信するだけで良いらしいので、これはもう楽勝でしょう。
と思って、昨年末くらいからパーツを買い集めたり情報収集したりして「おれ、このプロジェクトが終わったらラズパイで天体望遠鏡をいじって遊ぶんだ」みたいなフラグを立てたりもしてたんですが、その途中でこちらのソフトの存在を知りました。
これのdriverのところを見ていくと、AZ-GTi(AZ-GTeの上位機種、ソフト的には同じものらしいけど、ロータリーエンコーダが入ってて、モータを使わずに動かしても向きを認識してくれる)も使えるし、ジョイパッドも対応しているようです。
「巨人の肩の上には積極的に乗っていく」が信条の私としてはこりゃ使わざるを得ない、というわけで「indi libraryをインストールしたラズパイを使って、ジョイパッドでAZ-GTeを操作する」という方針に変更してようやく使えるようになったので、セットアップ方法についてメモを残しておきます(ここまで前置き)
インストール
ラズパイは、この辺でラズパイ4にインストールしてたSDカードを、その辺に転がってたラズパイ zero WHに挿して使います。
hpcmemo.hatenablog.com hpcmemo.hatenablog.com hpcmemo.hatenablog.com
まず、indilib本体のインストールですが、公式の説明どおりに進めます。
ラズパイ側は機器の制御しかしない予定なので、"To install only INDI Library with basic drivers"の部分に書かれているパッケージだけ入れます。
> wget -O - https://www.astroberry.io/repo/key | sudo apt-key add - --2021-08-29 13:27:22-- https://www.astroberry.io/repo/key www.astroberry.io (www.astroberry.io) をDNSに問いあわせています... 87.98.235.184 www.astroberry.io (www.astroberry.io)|87.98.235.184|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 4365 (4.3K) `STDOUT' に保存中 - 100%[=================================================>] 4.26K --.-KB/s 時間 0s 2021-08-29 13:27:26 (29.9 MB/s) - stdout へ出力完了 [4365/4365] OK > sudo su -c "echo 'deb https://www.astroberry.io/repo/ buster main' > /etc/apt/sources.list.d/astroberry.list" > sudo apt update 取得:1 http://archive.raspberrypi.org/debian buster InRelease [32.6 kB] ・ ・ ・ アップグレードできるパッケージが 163 個あります。表示するには 'apt list --upgradable' を実行してください。
そういえば、半年近くアップデートしてなかったので、アップデート可能なパッケージがたまってたようです。 kernelとかまで含まれているので、一応全部最新版にして再起動しておきます。
その後に、次のコマンドでindi libとAZ-GTiドライバを順にインストールします。
> sudo apt install libindi1 indi-bin > sudo apt-get install indi-eqmod
最後に、確認のため次のコマンドでindi serverを起動します。
>indiserver -v indi_eqmod_telescope indi_joystick 2021-08-29T05:14:01: startup: indiserver -v indi_eqmod_telescope indi_joystick 2021-08-29T05:14:01: Driver indi_eqmod_telescope: pid=10730 rfd=3 wfd=6 efd=7 2021-08-29T05:14:01: Driver indi_joystick: pid=10731 rfd=4 wfd=9 efd=10 2021-08-29T05:14:01: listening to port 7624 on fd 5 2021-08-29T05:14:02: Driver indi_eqmod_telescope: snooping on GPS Simulator.GEOGRAPHIC_COORD 2021-08-29T05:14:02: Driver indi_eqmod_telescope: snooping on GPS Simulator.TIME_UTC 2021-08-29T05:14:02: Driver indi_eqmod_telescope: snooping on Dome Simulator.DOME_PARK 2021-08-29T05:14:02: Driver indi_eqmod_telescope: snooping on Dome Simulator.DOME_SHUTTER 2021-08-29T05:14:02: Driver indi_eqmod_telescope: Using prefix /usr/share/indi//indi_eqmod_sk.xml 2021-08-29T05:14:02: Driver indi_eqmod_telescope: Using prefix /usr/share/indi//indi_align_sk.xml 2021-08-29T05:14:02: Driver indi_eqmod_telescope: Using prefix /usr/share/indi//indi_eqmod_simulator_sk.xml 2021-08-29T05:14:02: Driver indi_eqmod_telescope: Using prefix /usr/share/indi//indi_eqmod_scope_limits_sk.xml 2021-08-29T05:14:02: Driver indi_eqmod_telescope: EnumeratePlugins - found plugin SVD Math Plugin
こんな感じの出力が見れたら大丈夫です。続いて、indi webmanagerをインストールします。
このソフトは、リモートからindiserverの起動をしたり止めたりするためのツールで、後で出てきますがPCからKstarsというソフトでセットアップやコントロールをする時に使うそうです。
> sudo pip install indiweb > indi-web -v
別のPCでブラウザを開いて、次のURLへアクセスします。
次のような画面が表示されたら正常にインストールできています。
一旦ブラウザを閉じてPCにKstarsをインストールします。
macだと署名の関係で初回は素直に起動できませんが、(Launchpadからではなく)FinderからKStarsを右クリックして ctrlを押しながら開くを選択すれば起動できます。
初回起動時の設定を終えてメイン画面が表示されると、上の方にずらっとツールバーが並んでいます。 このうち赤枠で囲ったドームっぽいアイコンをクリックすると、EKOSというINDIの設定アプリが立ち上がるので、そちらで設定をします。
設定内容は次のとおり。
- Modeは "remote"
- Host はラズパイのホスト名を入れる
- "INDI Web Manager"にチェックを入れる
- Mountを"AZ-GTi"に
- Aux1を"Joystick"に
最後にSAVEしてこの画面での設定は終わりです。
続いて、こちらのstartボタンを押すと、"INDI Control Panel"というウィンドウがさらに立ち上がります。
まずJoyStickタブの中のMonitorタブに移動して動作確認をします。 よくあるゲームパッドの設定画面とおなじで、パッドを押すとそれに応じて画面上のボタンにチェックがつきます。一応、全ボタンが反応するか確認しておきましょう。
次にAZ-GTiタブに移動します。
画面の下の方にログが表示されているんですが、うちの場合は次のような感じで、延々と接続に失敗したというメッセージが出つづけてました。
2021-08-29T08:29:41: [INFO] AZ-GTi is offline. 2021-08-29T08:29:41: [ERROR] Error: Communication failed -> tty read failed, check connection: Read Error: Resource temporarily unavailable 2021-08-29T08:29:26: [INFO] Connecting to 192.168.4.1@11880 ...
これは、INDIとしてはAZ-GTeのAPモードのつもりで接続しようとしているけど、ラズパイのwifiは家庭内LANに繋っているのでアクセスできないというのが原因でした。
VNCでラズパイに接続して、右上の方に常駐してるアプリからAZ-GTeのSSIDを選んで接続します。接続した瞬間にPCとラズパイの接続が切れるので、VNCの画面が固まりますがもう用済みなのでそのまま閉じておきます。
PCもAZ-GTeの無線LANに繋いで、kstarsやもろもろのアプリをもう一度起動すると、正常に接続できているはずです。 *2
このままだと再起動する度に元の無線LANに繋がります。こちらのページを参考にwpa_supplicant.confを編集してAZ-GTeの方のpriorityを大きくしておきましょう。
INDI Control Panelに戻ってAZ-GTiタブの中のOptionタブで、Joystickを"Enable"に設定すると、ジョイスティックでぐるぐる望遠鏡を動かすことができます。
ひと通り動かして操作を堪能したら最後にあと2つほど設定をしておきます。
1つ目はキーアサインの変更です。なぜかデフォルト設定ではボタン1、2、3という押しやすいボタンにabort, park, unparkといううっかり押すとパニック必須の機能がアサインされているので、これを全部削除します。 といってもアサイン無しにはできないようなので、自分が使っているジョイスティックについていないボタン(私の場合はボタン10, 11,12)を設定しておきます。
この設定画面、残念ながら直感的な操作ができないUIなんですが、2列並んでいる入力欄っぽいもののうち左の列は現在の設定値を表示するだけ(編集できない)、右の列が新しい設定値を入力する欄となっています。 なので、右側の列に設定する値を入れてその右にある"set"ボタンを押すと設定できます。
設定が終わったら、optionタブに移動してsaveボタンを押しておきましょう。これで次回起動した時は、ここで設定した値が使われます。
もう1つの設定は、inidi-webの自動起動設定です。こちらの説明にあるようにsystemd経由でラズパイの起動時にindi-webが実行できるようにしましょう。
基本的には、ここの説明どおりなんですが、pipでインストールすると設定ファイル(indiwebmanager.service)はインストールされないようなので、githubからダウンロードして /etc/systemd/system/
に置きます。
https://raw.githubusercontent.com/knro/indiwebmanager/master/indiwebmanager.service
続けて次のコマンドを実行しましょう。
> sudo chmod 644 /etc/systemd/system/indiwebmanager.service > sudo systemctl daemon-reload > sudo systemctl enable indiwebmanager.service
再起動して、ps -ef |grep inidi-web
してindiwebmanagerが起動しているか確認したら設定は完了です。
いやー長かったですね。次回は今の時点で未解決の問題がいくつかあるので、その辺を書いていきたいと思います。
ITAを使ってみよう(補足編)
前回の記事からずいぶん間が空いてしまいましたが、ITAの利用方法の補足をちょっと書きます。
traceする区間の設定
ITA *1 は、ありがたいことにMPI_Initすると自動的にinitializeされMPI_Finalize時に勝手にFinalizeしてくれます。つまり何もしなければプログラムの実行開始から終了までの全ての通信をtraceしてくれます。
中身が良く分からないプログラムの解析をする時は、一回全部取ってみるというのも良いのですが、traceで記録される通信が増えるとその分trace結果のファイルサイズが増えます。このような時にはVT_traceoff()とVT_traceon()というAPIを使ってtrace対象の区間を設定することができます。
最初に書いたように、MPI_Initするとtrace区間が始まってしまうので、MPI_Initした直後にVT_traceoff()して、traceを取りたい区間の直前でVT_traceon()、区間を抜けたら再度VT_traceoffという使い方です。
ざっくり書くとこんな感じになります。
#include <mpi.h> #include <VT.h> int main(int argc, char **argv){ MPI_Init(); VT_traceoff(); ・ ・ ・ VT_traceon(); トレースを取りたい処理 VT_traceoff(); ・ ・ ・ MPI_FInalize(); return }
このAPIでtrace区間を絞り込む方法は、ある程度通信の様子を見たい場所が絞り込めている時なんかも有用です。
例えば姫野ベンチで、全体のtrace情報を取るとこんな感じで、大量に通信が発生してるなーとしか見えませんが
iteration loop内で10反復目のみを取ると
こういった形で綺麗に1iteration分の通信が見えます。
姫野ベンチの場合、外側のループは単に同じ処理を繰り返しているだけなのであんまり効果が分からないかもしれませんが iterationが経過するにつれて通信の状況が変わるようなプログラム(粒子法とかPIC法とかAMRとかも)では領域分割がうまく行っている部分を捨てて ある程度問題が発生しそうなところにフォーカスしてトレースを取るといった使い方ができます。
ま、トレース結果のファイルサイズさえ気にしないなら、一旦全部取っておいて後の方のiterationのあたりを狙って拡大表示するという使い方でも見れますが、 実アプリでしかも実運用の規模のデータでとなると、ちょっとハンドリングに苦労する規模になるのでお勧めはできません。
単体版のアプリ
こちらのURLから単体版のアプリをインストールすることもできます。
ITAは(Vtuneとかとの連携機能はあるっぽいですが)基本的にはHPCtoolkitの他のアプリには依存していないので、 スパコンでトレース情報を取って、トレースファイルを手元のPCに持って帰ってきて見るような使い方であれば、単体版の方が良いかもしれません。
ちなみに、前回の記事で紹介したHPC toolkitのdockerコンテナは23GB、ITAのインストールサイズは(windows版の場合)だいたい80MBなので200倍以上容量の節約になります。(ま、mac版が無いんでdockerを使ったわけですが・・・)
macで(docker版の)ITAを使ってみよう
Intel Trace Analyzer (以下ITA)という、MPIの通信プログラムのTrace情報を採取&表示してくれる便利ソフトがあります。*1
去年、VTuneとかAdviserとかの単体製品が無償になってて、小躍りしながらこちらの記事を書いた時には、相変わらず有償のみでしかも単体販売が無いからParallel Studio Cluster Editionを導入しないと使えないというものでした。
これ、named user licenseが実質使えなくて、商用利用だと2ユーザのフローティングライセンス(ご新規だと100万円超)以上のライセンスを購入しないと使えないという高嶺の花だったんですが、なんとoneAPIに入ってます!!
* + 巛 ヽ 〒 ! + 。 + 。 * 。 + 。 | | * + / / イヤッッホォォォオオォオウ! ∧_∧ / / (´∀` / / + 。 + 。 * 。 ,- f / ュヘ | * + 。 + 。 + 〈_} ) | / ! + 。 + + * ./ ,ヘ | ガタン ||| j / | | ||| ――――――――――――
思わず懐しいAAを探してきてしまうほど嬉しいので、M1 macからdocker版のITAを使ってみましょう。*2
セットアップ&起動
事前に、XQuartzをインストールしておきましょう。
インストール方法は、dmgをダウンロードしてインストーラの指示どおりに操作するだけなので省略します。 なお、インストール後一回macからログアウトしておかないと正常に使えない(少なくとも私が数年前にインストールした時は駄目でした)ので、インストール作業を行なったら一回ログアウトして再ログインしてから以降の作業を続けてください。
続いて、intel oneAPIの HPC kitのコンテナを立ち上げて、中身を確認してみましょう。以降のこの記事内では%
はホストOS側のコマンドプロンプト、#
はコンテナ内のコマンドプロンプトをあらわします。
ducker runにつけている --platform linux/amd64
というオプションはintelアーキテクチャ用のコンテナを使うという指定です。
今回のone API HPC kitのように、intel用しか用意されていないコンテナをM1 macから起動する時は指定していないと、コンテナが無いと言われて起動できません。
% docker run -it --rm --name test --platform linux/amd64 intel/oneapi-hpckit /bin/bash # cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS" # ps -ef |grep sshd root 39 1 0 09:16 pts/0 00:00:00 /usr/bin/qemu-x86_64 /bin/grep --color=auto sshd # apt list --installed |grep ssh WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
さて、立ち上げてsshの状況を確認してみたところ、どうやらインストールすらされていないようです。
sshが無いことには始まらないのでインストールしてsshでログインできるようにしましょう。
# apt install ssh -y # cd /etc/ssh # sed -i '/PermitRootLogin/s/^.*$/PermitRootLogin yes/' sshd_config # mkdir /root/.ssh # mkdir /run/sshd # chmod 0755 /run/sshd # /usr/sbin/sshd -D
次に、別のターミナルを立ち上げて公開鍵をコンテナ内にコピーします。
test
の部分は、docker run
した時に--name
オプションで指定した名前です。
% docker cp ~/.ssh/id_rsa.pub test:/root/.ssh/authorized_keys % docker exec test chown root:root /root/.ssh/authorized_keys
ここまで設定すると公開鍵認証でログインできるはずなので、ホストからログインできるか確認します。
% ssh root@localhost -p 10022 Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.10.25-linuxkit x86_64) * 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. Last login: Fri Apr 9 22:22:16 2021 from 172.17.0.1
続けて、X11の転送を行なうための設定をします。
コンテナ内でsshd_configを書き換えて、X11UseLocalhosts を no に設定します。
# sed -i '/X11UseLocalhost/s/^.*$/X11UseLocalhost no/' /etc/ssh/sshd_config
この後、sshdを一回終了して立ち上げ直し、-Xオプションを付けてsshでログインすればXアプリが使えます。 試しにx11-appsをインストールして、xeyesが動くか確かめてみましょう。
$ ssh -X root@localhost -p 10022 # apt install x11-apps -y # xeyes&
無事にXの転送もできるようになりました。
続けて、ITAを起動してみましょう。
# . /opt/intel/oneapi/setvars.sh :: initializing oneAPI environment ... bash: BASH_VERSION = 4.4.20(1)-release :: advisor -- latest :: ccl -- latest :: clck -- latest :: compiler -- latest :: dal -- latest :: debugger -- latest :: dev-utilities -- latest :: dnnl -- latest :: dpl -- latest :: inspector -- latest :: intelpython -- latest :: ipp -- latest :: ippcp -- latest :: itac -- latest :: mkl -- latest :: mpi -- latest :: tbb -- latest :: vpl -- latest :: vtune -- latest :: oneAPI environment initialized :: # traceanalyzer &
おー無事に起動しました。
これで、インストール作業(?)は無事完了です。
ここまでの作業をまとめたDockerfileをこちらに置いておきます。
gistab9eef0de1d6021289b999367e06501b
ついでに、rootのログイン時に/opt/intel/oneapi/setvars.sh
を読み込むように設定しているので
ログインしてそのままコマンドを実行すればtraceanalyzerが起動します。 *3
なお、動作確認用にインストールしたx11-appsですが、これのインストールを行なわないとtraceanalyzerが起動しなかったので、素のhpckitのコンテナは何か依存パッケージが欠けてるのかもしれません。
このDockerファイルを適当なディレクトリにダウンロードして、そのディレクトリ内で次のコマンドを実行するとセットアップできます。
> docker build -t oneapi . > docker run -d -p127.0.0.1:10022:22 -v${PWD}:${PWD} --rm --name oneapi oneapi > docker cp ~/.ssh/id_rsa.pub oneapi:/root/.ssh/authorized_keys > docker exec oneapi chown root:root /root/.ssh/authorized_keys > ssh -X root@localhost -p 10022 # traceanalyzer &
この例ではイメージ名もコンテナ名もoneapiとしてます。また、-v${PWD}:${PWD}
オプションを指定することでホストのカレントディレクトリ以下に、同じ絶対パスでコンテナからアクセスできるようにしています。
ITAでのリモート性能情報の採取
Intel MPIライブラリをリンクした実行ファイルで、ITA用のトレースファイルを作成するには、-trace
オプションを付けてmpirunを実行するだけです。
〜.stfという名前でずらーっとファイルが生成されますので、これをコンテナにマウントしたディレクトリ以下に置きましょう。
ITAで測定結果を表示
traceanalyzerを起動したあとで表示される初期画面で、[open file]ボタンを押して適当なSTFファイルを読み込むと次のようなサマリ画面が表示されます。
Ratioのところに、Serial Code、OpenMP、MPI callsという円グラフが見えますが、これは全体の実行時間を次の3つに分類したものです。
1が多い(&ハイブリッド並列のつもり)なら、OpenMP化できるところが無いかAdvisorで見てみましょう。
2が多いならOpenMP化に問題が無いか、VTuneで見てみましょう。
3が多いなら、Trace Analyzerで通信に問題が無いか見てみましょう。
という意図のようで、Trace AnalyzerからAdvisorやVTuneが起動できるそうです(使ったことないけど)*4
とりあえずTrace Analyzerを見たいので、右上の[Continue]をクリックしてください。
これがデフォルトのビューですが、まるで何も分かりませんね。
まず、Chartメニューから"MessageProfile"を表示してみましょう。
これは、あるRankから別のあるRankへの通信時間を行列形式で表わしたものです。
縦に並んでいる方のラベルが、送信Rank、横に並んでいる方のRankが受信Rankなので、この例ではRank1〜7がRank0へ 軽い送信をしているのと、Rank0-1, Rank2-3, Rank4-5, Rank6-7の各ペアでそれぞれ通信している様子が分かります。
このTrace fileは、Intel MPI Benchmarkで、PingPongとPingPingを実行した時のものなので、この図のように綺麗に分かれていますが、実アプリではインバランスがあったり、特定のRankに通信の負荷が集中していたりすることがあります。 そのような場合は(相対的に)重たい通信をしているペアが赤く表示されるので、そのRankを中心に改善できないか検討すれば良いということが分かります。
あと、Gather/Scatterみたいな1対Nの通信が多いと、特定の行または列のみ赤くなるので、こちらも要検討です。
もう一つtrace analyzerで重要な図がEvent Timelineです。こちらもChartメニューから選択すると表示できます。
このメニューは、見るとなんとなく想像が付くと思いますが、Rank毎にMPI関数のcall(赤い領域)とその他の関数call(水色の領域)、それからRank間の通信(青または黒の線)が行なわれた様子を表したものです。
これだけだとちょっと分かり難いので、右クリックして表示されるメニューで"Ungroup Group MPI"を選んでください。
この設定を行なうと、今までMPI関数は全部"MPI"としてまとめられていたものが、関数名毎の表示に切り替わります。
説明の順番が前後しましたが、グラフ上でドラッグすれば表示領域をズームインできます。*5
一番上にちょろっと全体マップが表示されているので、ズームアウトしたい時はこちらでドラッグしてください。
さて、このEvent Timelineですが、プロファイルで(accumulateされた)値を見てもよく分からんけど、特定のタイミングで通信が時々おかしいなんていうのを見つけるのにも使えますし、通信が意図したとおりに行なわれているかのチェックにも使えます。
たとえば、前の例ではペアになっているRankが同時にMPI_Isendを発行して、その後のMPI_Recvで受信する(Ping-Ping)の形になっていますが、こちらの例だと偶数Rankが送信して、奇数Rankが受信した後に返信する(Ping-Pong)の形になっています。
時々意図しない順番で送受信していて、オーバーラップしたつもりができていなかったり、無駄に待ち時間が発生してたりすることがありますが、そういうトラブルも簡単に見つけることができます。
もっと詳しい使い方が知りたいという方は、こちらに公式のドキュメントがあるのでこちらをご覧ください。
まだ書きたいことはあるんですが、ずいぶん長くなってきたので今回はこの辺で一旦終わりにします。
ラズパイ4のセットアップ(その3)
昨日積み残していた、画面周りの設定を追加します。
その前に、ひょっとしてlinux用のbonjourクライアントがあればラズパイに突っ込んでおけばいちいちIPアドレスを調べなくてもアクセスできるんじゃないか?と思い立って調べてみました。
結論から言うと
- デフォルトで有効
- raspberrypi.local でアクセス可能
ということでしたorz *1
というわけで、これからは[raspberrypi.local]というマシンが出てきたら、ラズパイのことだと思ってくださいw *2
さて、昨日の時点で残っていた問題は、「カメラの映像がリモートマシンで見れない」ということでした。 正確には、picamera(やpicameraを使っているraspistillコマンドとか)が、Xクライアントじゃなくて、linuxfbに直で書き込んでいるのでsshの接続元に飛ばせないということです。
そもそも、なんでリモート側で画面を見たいかというと・・・机が狭いんでラズパイ用のディスプレイを片付けたいだけなんですw
しかも、ほとんどの作業はsshでログインしてCUIでやるので、本当に必要なのはカメラの映像を見る時くらいのもの。それもテスト用途なので特にパフォーマンスは求めていません。というわけで、一番お手軽なリモート画面転送ソリューションであるところのVNCでアクセスできるようにしましょう。
ラズパイのVNCサーバを有効にするには、sshでログインしてraspi-configを起動し [3 Interface Options ] -> [ P3 VNC ] -> 「はい」 と選択すれば OKです。最後に画面上にThe VNC Server is enabled
と表示されればVNCサーバが有効になりさらに起動された状態になります。
続けて、macのfinderを立ち上げてメニューバーから[移動]->[サーバへ接続]と選びます。
表示されたダイアログにvnc://pi@raspberrypi.local
と入力して[接続]をクリックすると
接続できませんo....rz
どうやら、macのfinderから接続する時は、VNCのパスワードを設定する必要があるようです。
こちらの記事では、GUIでVNCのパスワードを設定されていますが、CUIから作業してみましょう。
まず、sshでログインしてvncpasswd
コマンドを使ってパスワードを生成します。
> ssh pi@raspberrypi.local $ sudo vncpasswd -service
2回聞かれるので、同じパスワードを入力してください。
続いて、/root/.vnc/config.d/vncserver-x11
のAuthentication
をVncAuth
に変更します。*3
デフォルトではgawkはインストールされていないので、事前にapt-get install gawk
してから実行してください。*4
$ sudo gawk -i inplace '!/Authentication/{print $0} ENDFILE {print "Authentication=VncAuth"}' /root/.vnc/config.d/vncserver-x11 $ sudo systemctl restart vncserver-x11-serviced.service
改めてfinderから接続すると、次のようにパスワードを聞かれるので、vncpasswdで設定したパスワードを入力します。
これで無事にラズパイにVNCで接続することができました !!
さて、当初の目的だったカメラの映像を出してみると・・・映りませんorz
ちょっと昨日の記事を確認してみましょう。
(意訳)picameraはframe bufferに直で書いてるんで、X11で飛ばすん無理
VNCサーバのサービス名を良く見てみましょう。
vncserver-x11-serviced.service
ええ、VNCは内部的にはXorg呼んでますね。o.......rz
というわけで、ソフトウェア的な解決は諦めて、amazonで昔買った激安HDMIキャプチャデバイスを使うことにします。
私が買った時は700円でしたが、今は780円のようです(どっちにしろ激安)
これをPCに挿して、ラズパイのHDMI出力とつなぎ、Quick time playerの新規ムービー収録から、USB videoを選ぶとこんな感じで見えます。*5
せっかくなので、ラズパイでカメラを起動してVNCからは見えず、HDMIキャプチャでは見えているという状態のスクショを最後に貼っておきますw
まとめ
いつも以上にぐだぐだだったので、今回分かったことをまとめておきます。
- 最近の(2015年以降?)ラズパイはデフォルトでbonjourが有効なので、macからなら
pi@raspberrypi.local
としてアクセスできる。 - ラズパイOSにインストールされているawkはmawk。inplcae処理がしたければgawkを別途インストールすること
- macのfinderからVNCでラズパイに接続する時はラズパイ側でVNCのパスワードを有効にする必要がある
- ラズパイカメラの出力をリモートマシンから見る簡単な方法は今のところ無い。ラズパイのHDMI出力をキャプチャするのが手っ取り早い
カメラ出力の件は、見るだけならmjpg-streamerを使ってストリーミング配信するというのが定番のようですが、これだとカメラ出力を加工して見たりする時にかえって難しくなりそうなので、今のところ避けてます。
ともかく、これでラズパイで開発する準備が整いました。
*1:それも2015年の時点でw
*2:複数台のラズパイが同一ネットワーク内に居る時ってどうなるんでしょうね。前述のページには/etc/hostnameに書いてる名前+.localが使われると書かれてるけど後で実験してみます。
*3:次のコマンド例でやっているのは、正確にはVncAuthの行が存在したら削除した上で、最終行にAuthentication=VncAuthを追記という操作ですが、設定ファイルにデフォルト値とかコメントとか入っていないシンプルなものなので、後から見て混乱することも無いでしょう(^^;
*4:最初はsed -iでなんとかしようとしてたんですが、上手い方法が思いつかず、もうawkでやってしまえーと思ってawkに乗り換えたらラズパイOSにインストールされてるawkがgawkではなくmawkでinplace処理ができずと、この修正をワンライナーでやるためだけに1時間くらいかかりましたorz
*5:このキャプチャ自体はただのUSB video deviceなのでQuick time player以外でも対応しているソフトなら何でも使えます。zoomで他の会議参加者に出力とかもできるはず