東大松尾研のDL4USのLesson7 Section4は学習時間が相当かかるのでGoogle Colab上での実行が困難です。 (実際に40時間以上かかりました。。)
このため、このSectionだけは Azureにインスタンスを作って動かしました。
そのときのメモです。
一言でいうと、インスタンスの作成時の認証は 「SSH公開鍵キー」 ではなく 「パスワード」 にしたほうが良いかも? という話です。
この画面です
Azureデータサイエンス仮想マシンのイメージには機械学習に必要なツール、ライブラリが一通りインストールされていて環境構築の手間が省けてとても助かります。
作成方法は 公式ページ の通りですが、イメージ選択で「Data Science Virtual Machine for Linux (Ubuntu)」を選択します。
なぜパスワード認証がよい?
この仮想マシンイメージには JupyterHub が最初からインストールされていて自動起動します。
なので、https://<仮想マシンのIPアドレス>:8000
で JupyterHub にアクセスできるのですが SSH公開鍵認証の場合は、そのパスフレーズで JupyterHubにログインできないのです... (UNIXパスワードをもつユーザーでないとログインできない)
パスワード認証でインスタンス作成するとUNIXパスワードをもつユーザーが作成されるのでそのパスワードでJupyterHubにログインできます。
なお、パスワード認証でインスタンス作成してSSH認証したいときはインスタンス作成後、~/.ssh/authorized_keys
に公開鍵を置けばオーケーです。
ローカルPCからだと次の1行で登録できます。
$ cat 公開鍵のパス | ssh ユーザー名@IPアドレス 'cat >> .ssh/authorized_keys'
ユーザー名はパスワード認証にしたときのユーザー名です
SSH公開鍵認証でインスタンスを作ってしまった場合
ご安心あれ。Jupyter notebookの設定ファイルを作って Jupyter notebookを起動すれば大丈夫です。
通常通りの手順ですね。
Jupyter Notebookの設定ファイルを作る
$ jupyter notebook --generate-config
.jupyter/jupyter_notebook_config.py
を編集するパスワードのハッシュを作成する
$ python -c 'from notebook.auth import passwd; print(passwd())'
パスワードを設定する
c.NotebookApp.password = 'sha1:XXX' # 上で生成したハッシュ
あとは jupyter notebook
で起動し、ポート8888にアクセスすればオーケー
ただし、このままだと暗号化されていないhttp通信になるので sshポートフォワーディングでログインしてからjupyter起動するのがよいです。
$ ssh -i 秘密鍵へのパス -L ローカルのポート番号:localhost:8888 ユーザー名@インスタンスのIPアドレス
そして http://localhost:ポート番号
にアクセスすればjupyterにアクセスできます。
リスクを承知でポート転送しないときは追加で
が必要です