やること
ColaboratoryにSSHでログイン
Colaboratoryとは
- Googleが提供する機械学習研究用の実行環境
- Jupyter Notebookをインターフェースとしている
- 各種ライブラリがデフォルトでインストールされている
- 無料でGPUを利用できる(有料版は性能アップ)
動機
上に書いたとおり、各種ライブラリがデフォルトでインストールされており、実際に利用したいバージョンと異なる事がある。
Jupyter Notebookは細い単位で出力を確認しながら進める作業には向いているが、行数の多い処理は扱いづらく感じるところがある。
GUIではなくCUIでColab環境を利用したい。
構成
まず考えるのはSSHでのログインなのだが、Colab環境にはグローバルIPが割り当てられておらず、任意ポートに外からアクセスできない。
よってトンネリングで回避する必要がある。
何やかんやで環境を用意するのが面倒なのでNgrokというサービスを利用した。
※Ngrokはグローパルに公開されたアドレスを発行するため、公開鍵認証を設定している。(有料版は細かいアクセス制御可)
トンネリング by Ngrok
Ngrokクライアントを実行しているサーバとNgrokサーバ間でトンネリングが設定され、Ngrokの用意したグローバルアドレスからトンネリング先へアクセスが可能となる。
環境構築スクリプト
スクリプトの上部、設定箇所を適宜変更、Colaboratoryに貼り付けで実行するだけ。
実行完了時にsshコマンドが画面上に出力されるので実行でログイン完了。
$ ssh -i /path/to/private_key root@1.tcp.ngrok.io -p 11111
やっている内容
- sshd起動
- パスワードログイン不可
- 公開鍵設定(事前にローカルで鍵のペアを作っておく)
- ngrok起動
- ngrokの発行したアクセス情報を取得、コピペできる形に整形
スクリプト
# 設定
## Colabサーバに登録する公開鍵情報
ssh_public_key = "ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
## Colabサーバに登録の公開鍵と対の秘密鍵パス情報(繋ぐ元の端末のパス)
ssh_private_key_path = "path/to/local_private_key"
## Ngrokの認証情報 https://dashboard.ngrok.com/get-started/your-authtoken
ngrok_authtoken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# ---
# SSH
## 公開鍵を設置
! mkdir /root/.ssh && echo $ssh_public_key > /root/.ssh/authorized_keys
! chmod 700 /root/.ssh/ && chmod 600 /root/.ssh/authorized_keys
## インストール・起動
! apt-get install -qq -o=Dpkg::Use-Pty=0 openssh-server pwgen > /dev/null
! mkdir -p /var/run/sshd
! echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
! echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
! echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
get_ipython().system_raw('/usr/sbin/sshd -D &')
# ---
# Ngrok
# インストール・起動
! wget -q -c -nc https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
! unzip -qq -n ngrok-stable-linux-amd64.zip
! ./ngrok authtoken $ngrok_authtoken
get_ipython().system_raw('./ngrok tcp 22 &')
# ---
# アクセス情報を取得する
import requests
import json
import time
from urllib.parse import urlparse
time.sleep(1)
content = json.loads(requests.get("http://localhost:4040/api/tunnels").content)
key = ssh_private_key_path
netloc = urlparse(content['tunnels'][0]['public_url']).netloc
host = netloc.split(":")[0]
port = netloc.split(":")[1]
print(f'$ ssh -i {key} root@{host} -p {port}')
最後に
私はColab、Ngrok両サービスの有料版を利用しているが、紹介のスクリプトは無料でも行けるはず。
普段利用している環境構築スクリプトは上記と異なり、学習状況の通知やモデルのバックアップなどの機能があり規模が大きいので紹介を断念。
Colabでコスパ良い機械学習ライフをどうぞ。
利用サービス
Colaboratory
Ngrok