はじめに
Google ColabをDeep LearningのTrainingで使いたいです。
なぜかというと、Google Colabでは、Tesla P100という90万円近くするGPUをサポートしており、
Deep LearningのTrainingに最適なんじゃないかと思ったからです。
ちなみに、Google ColabだとこのGPUを毎回使えるわけではないのですが、
Colab Proでは、このGPUを毎回使えるとのことです。
お値段は $9.99/month で、機材費や電気代を考えるとお得ではないでしょうか。
やめたいときにやめられますので、今月は使わないなと思ったら一時的にやめられます。
一方で、Google Colab,Colab Proの両方とも、Webインターフェイスでインスタンスを生成してから、
ブラウザで90分間、何も操作がないと、インスタンスがリセットされてしまいます。
そこで、ブラウザ(Google Chrome/Chromium)のアドオン(Super Auto Refresh Plus)を使って、
自動でリロードさせるようにします。こうすることで、インスタンスがリセットされなくなります。
-
2020/08/08 追記
- ラズパイのWebブラウザとして Chromium を使っていましたが、嘘みたいにメモリを食って落ちたりします...
- firefox を利用することにしました。アドオンは Tab Reloader を使っています。
ただし、ラップトップやデスクトップPCを一日中稼働させておかないといけないというのは、
電気代面でも、他の作業がしたくなった場合でも、とても不便です。
そこで、Raspberry Pi 4 Model B にUbuntu 20.04 LTS(64-bit) for Raspbeery Piをインストールして、
GUI環境を構築し常時稼働させ、Google Colabに接続する専用ノードにしようと思います。
ただ、ブラウザだけで作業するのは、少し不便です。
スクリプトをいくつか同時に実行したり、CPU/GPUの使用状況を確認したり、
スクリプトを走らせながら、次に動かすスクリプトを編集したりしたいなとか思ってしまいます。
ですので、Google Colabに ssh ログインできれば、そのようなことができるはずです
また、sshアクセス元でtmuxなどの端末多重化ソフトウェアを利用して、
処理を継続したい場合は detach するなどできるので便利なはずです。
Google Colabにアクセスする方法については、
こちらのGoogle Colaboratoryにsshログインをしてお手軽GPU実験環境を作ってみたを
参考にしようと思いましたが、ngrok というサービスを使っていて、しかもそれが遅いらしいです。
ということで、Colabをshellから使うを参考にさせていただきまして、
自宅の Raspberry Pi 4 Model B に外部からsshログインできる環境を作って、
Google Colabから自宅の Raspberry Pi 4 Model B にSSHトンネルを通したいと思います。
0.事前準備
0-1. Ubuntu Server on Raspberry Pi 4 Model B
Raspberry Pi だとRaspberry Pi OS(以前はRaspbian)を最初に考えますが、
今回はUbuntu 20.04-LTS(64bit)をインストールすることにします。
Install Ubuntu Server on a Raspberry Pi 2,3 or 4にRaspberry Piのイメージがあるので、
これをインストールします。
Ubuntu 20.04-LTS(64bit)のインストール方法や設定については、以下の記事をご参照ください。
0-2. 自宅ルータに外部からのsshアクセス用に穴を通す
これは、利用しているルータ次第です。
私は、自宅のルータとしてYamaha RTX830を使っているので、以下のようにポート転送を設定します。
ip pp secure filter in ... <設定するフィルタ番号>
ip filter <設定するフィルタ番号> pass * <自宅サーバ-ローカルIPアドレス> tcp * 22
nat descriptor type 1000 masquerade
nat descriptor masquerade static 1000 2 <自宅サーバ-ローカルIPアドレス> tcp <公開するポート番号>=22
ちなみに、Google Domainsでドメインを取得し、
Yamaha RTX830上でLuaスクリプトを定期的に実行して、DDNSを更新しています。
こうすることで、登録したドメイン名で、外部から自宅ルータにアクセスできるようになります。
もちろん、他のドメインサービスでも構いません。
1. Google Colaboratory のインスタンスを生成します
1-1. Raspberry Pi に接続してデスクトップ共有します
手元のLaptop(Ubuntu)のRemminaアプリから、
RDPプロトコルでRaspberry Piに接続して、デスクトップ共有します。
UbuntuならRemminaはaptのパッケージに含まれているので、簡単にインストールできます。
sudo apt install -y remmina
ちなみに、どのような方法でデスクトップ共有しても構いません。
Windows や Mac の Remote Desktop や VNC でも出来るはずです。
1-2. Raspberry Pi のブラウザで Google Colab にアクセスします
Internet -> Firefox
でブラウザを開き、Google Colab にアクセスします。
(ターミナルでfirefox
コマンドを実行しても良いです)
Runtime -> Change runtime type
で以下のように設定します。
- Hardware accelerator: GPU
- Runtime shape: High-RAM
これで、Tesla P100と25.0GBのメモリを持つインスタンスが生成されます。
そして、ブラウザのリロード用アドオンを有効化します。
最初のReloadタイミングで、ポップアップが上がってくるのですが、
これは手動でクリックする必要があります。
初回以降のReloadタイミングはクリックする必要がありません。
私の場合は、Reload周期を10minにしています。
それくらいだと、以降の作業が終わるくらいに、初回のReloadタイミングが来るので、
Reloadタイミング待ちの時間がなくて良いと思います。
2. Google Colaboratory でSSHサーバを起動します
続けて、ブラウザで以下のスクリプトを実行します。
#1.import necessary packages
import random, string, urllib.request, json, getpass
#2.Generate root password
password = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(20))
#3.Setup sshd
! apt-get install -qq -o=Dpkg::Use-Pty=0 openssh-server pwgen > /dev/null
#4.Set root password
! echo root:$password | chpasswd
! mkdir -p /var/run/sshd
! echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
! echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
! echo "LD_LIBRARY_PATH=/usr/lib64-nvidia" >> /root/.bashrc
! echo "export LD_LIBRARY_PATH" >> /root/.bashrc
#5.Run sshd
get_ipython().system_raw('/usr/sbin/sshd -D &')
#6.Print root password
print(f'Root password: {password}')
このスクリプトで実行していることは以下です。
- 必要なパッケージを import します。
- Google Colab で立ち上げるSSHサーバにアクセスするためのrootパスワードを生成します。
- 英文字と数字からランダムに20文字を選び、それをパスワードとしています。
- SSHサーバとパスワード生成器をインストールします。
-
-qq
と-o=Dpkg::Use-Pty=0で余分な出力を抑制します。
-
- 2.で生成したパスワードをrootに設定し、SSHサーバ用の設定もします。
- SSHサーバはrootでのログインOK,パスワード認証OKとします。
- nvidia用のライブラリパスも通しておきます。
- SSHサーバを起動します。
- get_ipythonでシェルインスタンスを取得します。
-
interactiveshellの
system_raw
でコマンドを実行します。
-
rootパスワードを表示します。
- このパスワードは、後でGoogle Colabにsshログインするために使用するので重要です。
- このパスワードはコピペしておきましょう。
ちなみに、githubにGoogle Colabで実行するJupyter Notebookを置いておくと、
ブラウザ上からその Notebook を開けば、Google Colabに接続して、
すぐに Notebook 内のスクリプトを実行できるようになるので、便利です。
3. 自宅のラズパイからGoogle ColabにSSHトンネルを張ります
ブラウザで以下のスクリプトを実行します。
#1.prepare a script that shows password for raspberry pi
proxy_password = '<ラズパイにSSHログインするためのパスワード>'
!echo "echo $proxy_password" > proxy_password.sh
!chmod +x proxy_password.sh
#2.create ssh tunneling
get_ipython().system_raw(
'export SSH_ASKPASS=/content/proxy_password.sh; \
export DISPLAY=dummy:0; \
setsid ssh -p <自宅ルータで公開しているポート番号> -oStrictHostKeyChecking=no -fNR <トンネル入り口のポート番号>:localhost:22 ubuntu@<公開している自宅のFQDN> &')
このスクリプトで実行していることは以下です。
- パスワード表示スクリプトを作成します。
- プロンプトからのパスワード入力はできないので、パスワードを出力するスクリプトを用意します。
- SSHトンネルを作成します。
- パスワードの受け渡しは
SSH_ASKPASS
を利用します。 -
-oStrictHostKeyChecking=no
で入力しないといけない状況を回避します。 -
-R
オプションを使って、ラズパイからGoogle Colabへトンネルを張ります
- パスワードの受け渡しは
最後のsshコマンドは、例えば以下のようになります。
- 自宅ルータで公開しているポート番号: 10022
- トンネル入口のポート番号: 20022
- 公開している自宅のFQDN: hoge.net
setsid ssh -p 10022 -oStrictHostKeyChecking=no -fNR 20022:localhost:22 ubuntu@hoge.net
このスクリプトで行っているSSHの使い方については、以下の記事を参考にさせていただきました。
4. SSHでGoogle Colabにログインします
手元のLaptopからラズパイにSSHログインするか、Remmina上で端末エミュレータを起動するかします。
その端末でtmuxを起動し、ラズパイのトンネル入り口ポートを通って、Google Colabにアクセスします。
ubuntu@colab:~$ ssh -p <トンネル入り口のポート番号> root@localhost
ユーザ名がroot
なのは、Google Colabにはroot
アカウントでログインするからですね。
そして、パスワードを聞かれます。
ここで入力するパスワードは、「2.Google Colaboratory でSSHサーバを起動します」の最後で表示されたパスワードです。
これをパスワードとして入力すると、Google Colabにsshでログインできます。
まとめ
以上で、自宅サーバ(ラズパイ)を使ってGoogle Colabにsshログインすることができました。
ブラウザでポチポチするのが面倒だったり、ブラウザでファイルを編集するのが嫌だという人には、
とても便利な環境が構築できたのではないかと思います。
ちなみに、ラズパイのブラウザですが、初回のReloadボタンを押した後は、手元のLaptopのRemminaは落としても問題ありません。
Remminaを落としても、ラズパイ上のブラウザはReloadし続けてくれるので、Google Colabインスタンスは維持されます。
また、ラズパイ上の端末エミュレータで起動したtmuxはdetach
してしまえば、
手元のLaptopからのSSH接続を切っても、ラズパイ上の端末エミュレータを落としても大丈夫です。
再度、ラズパイに接続し直す、あるいは、ラズパイ上の端末エミュレータを起動して、
tmuxでattach
すれば、Google Colabで作業していたセッションに再接続できます。