Azureデータサイエンス仮想マシンでハマったこと

東大松尾研のDL4USのLesson7 Section4は学習時間が相当かかるのでGoogle Colab上での実行が困難です。 (実際に40時間以上かかりました。。)

このため、このSectionだけは Azureにインスタンスを作って動かしました。

そのときのメモです。

一言でいうと、インスタンスの作成時の認証は SSH公開鍵キー」 ではなく 「パスワード」 にしたほうが良いかも? という話です。

この画面です

f:id:sanshonoki:20190704214732p:plain

Azureデータサイエンス仮想マシンのイメージには機械学習に必要なツール、ライブラリが一通りインストールされていて環境構築の手間が省けてとても助かります。

作成方法は 公式ページ の通りですが、イメージ選択で「Data Science Virtual Machine for Linux (Ubuntu)」を選択します。

なぜパスワード認証がよい?

この仮想マシンイメージには JupyterHub が最初からインストールされていて自動起動します。

なので、https://<仮想マシンのIPアドレス>:8000 で JupyterHub にアクセスできるのですが SSH公開鍵認証の場合は、そのパスフレーズで JupyterHubにログインできないのです... (UNIXパスワードをもつユーザーでないとログインできない)

f:id:sanshonoki:20190704212742p:plain:w400

パスワード認証でインスタンス作成するとUNIXパスワードをもつユーザーが作成されるのでそのパスワードでJupyterHubにログインできます。

なお、パスワード認証でインスタンス作成してSSH認証したいときはインスタンス作成後、~/.ssh/authorized_keys に公開鍵を置けばオーケーです。

ローカルPCからだと次の1行で登録できます。

$ cat 公開鍵のパス | ssh ユーザー名@IPアドレス 'cat >> .ssh/authorized_keys'

ユーザー名はパスワード認証にしたときのユーザー名です

SSH公開鍵認証でインスタンスを作ってしまった場合

ご安心あれ。Jupyter notebookの設定ファイルを作って Jupyter notebookを起動すれば大丈夫です。

通常通りの手順ですね。

  1. Jupyter Notebookの設定ファイルを作る

    $ jupyter notebook --generate-config
    
  2. .jupyter/jupyter_notebook_config.py を編集する

    1. パスワードのハッシュを作成する

      $ python -c 'from notebook.auth import passwd; print(passwd())'
      
    2. パスワードを設定する

      c.NotebookApp.password = 'sha1:XXX'  # 上で生成したハッシュ
      

あとは jupyter notebook で起動し、ポート8888にアクセスすればオーケー

ただし、このままだと暗号化されていないhttp通信になるので sshポートフォワーディングでログインしてからjupyter起動するのがよいです。

$ ssh -i 秘密鍵へのパス -L ローカルのポート番号:localhost:8888 ユーザー名@インスタンスのIPアドレス

そして http://localhost:ポート番号 にアクセスすればjupyterにアクセスできます。

リスクを承知でポート転送しないときは追加で

  • 設定ファイルで c.NotebookApp.ip = '0.0.0.0' を設定する
  • インスタンスの 受信ポートの規則 で 8888 の TCP を追加する

が必要です