Windows10に公開鍵認証でssh接続,Tensorboard表示の備忘録
コロナ禍のため,中々研究室にも行きづらくなった昨今,自宅のMacからリモートデスクトップで研究室のPC(Windows)を動かしていた.しかし,キーボードマッピングの問題や,解像度を考え,ssh接続でモデルの学習やTensorboardの表示ができないかを検討した.そのときに躓いたことや,自分なりに工夫したことを備忘録として残しておく.
表記について
コマンドの実行が,クライアント(macOS)とサーバ(Windows)とで行き来するため,以下のような書き分けを行う.
# クライアント側で実行するコマンド
# windowsマシンまたはssh接続した状態で実行するコマンド.場合によっては,PowerShell等細かく注釈をつける
やったこと
- Windows10にsshサーバを立てて,macOSから接続
- ポートフォワーディングを利用して,macのブラウザでTensorboardの表示
- 公開鍵認証で接続できるよう修正
-
.ssh/config
の作成 - ログインシェルをgit bashに変更,起動時に深層学習用の仮想環境のactivateと実行フォルダへの移動
注意
WindowsのOpenSSHをインストールするところから始める方は,公開鍵認証での接続のコメントアウトの箇所から始めると,後々の作業が非常にスムーズになるので強くオススメする.
Windows10へのssh接続
Windows 10 に OpenSSH サーバをインストールする,を参考に,まずOpenSSHサーバのインストールを行った.
windows側の設定を終えたら,macのターミナルで以下のコマンドを実行する.
ssh <サーバのUsername>@<サーバのホスト名(グローバルIP)>
Username
は,エクスプローラーを開いて,C:¥Users¥????
の????
を,グローバルIPはcman.jpというサイトを利用してサーバのIPアドレスを確認した.
まず,これでmacOSから接続を確認,パスワードを聞かれるので,Windowsのログイン時のパスワードを入力すればおk.
Tensorboardの表示
そもそも出来るのか,と思ったらやってる人がいた.
しかし,こちらのサイトのように
ssh -L 8888:localhost:9999 user@server.host.name
では,なぜかポートフォワーディングが上手く行かなかった.なので,localhost
の箇所を127.0.0.1
に変更して実行したところ,成功した.もし上手く行かなかった方は書き換えてみると良いかも.
そして,以下のような形でポートフォワーディングを行う.
- ssh接続時,
6006:127.0.0.1:6006
にポートフォワーディングをしておく(tensorboardのポートのデフォルトが6006なので) - ssh接続したクライアント側で,Tensorboardの実行を行う
といった形で実現した.コードは以下のようになる.
ssh -L 6006:127.0.0.1:6006 <サーバのUsername>@<サーバのホスト名(グローバルIP)>
# ssh接続後
tensorboard --logdir=<logのディレクトリ>
ただし,この方法の場合,ターミナルを強制終了したとき等に,サーバ側でtensorboardが実行されたままになることがあるので,その場合はサーバ側でtensorboardのプロセスを直接終了させる必要がある.
netstat -nao
# ローカルアドレスが127.0.0.1:6006のPIDを確認
taskkill /pid <tensorboardのPID>
以下の2つを参考にした.
公開鍵認証での接続
ここまで行い,いちいちパスワードを入れるのが面倒になったのと,セキュリティの観点から公開鍵認証でssh接続出来るように変更.これが非常に手間取った.
まず,SSH公開鍵認証で接続するまで,を参考にKeyの作成や転送等を行ったが,なぜか公開鍵認証でログインできない.
色々調べ,以下2つのサイトの情報を参考にしたところ解決した.
まず,C:\ProgramData\ssh\sshd_config
の最後2行をコメントアウトする.
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
しかし,これだけでは出来るようにならなかったので,
- sshdを終了
-
C:\ProgramData\ssh\
配下にあるssh_host_***_key
と,ssh_host_***_key.pub
を全て消す - sshdを開始
こうすると,再びホストキーが自動生成される.その後,同じ手順で鍵の登録を行ったところ,鍵認証での接続に成功した.もし,windowsのOpenSSHで,公開鍵認証ができない人は,この手順を行うと出来るようになるかもしれないので,参考までにどうぞ
#.ssh/config
の作成
ここまで来ると,ssh
コマンドが長くなってきたので,.ssh/config
を作成して,サクッと接続出来るようにした.
.ssh/configファイルでSSH接続を管理する,を参考にして,以下のようにした.
Host lab
HostName <サーバのIPアドレス>
User <サーバのUsername>
IdentityFile ~/.ssh/id_rsa
TCPKeepAlive yes
IdentitiesOnly yes
LocalForward 6006 127.0.0.1:6006
ServerAliveInterval 15
ServerAliveCountMax 10
こうすれば,以下のコマンドでssh接続が出来る.
ssh lab
ログインシェルをgit bashに変更
macのターミナルと,windowsでコマンドがけっこう異なること,実行ファイルをgitでも管理しやすいように,ログインシェルをgit bashに変更した.
Windows10でSSHサーバーを立ててデフォルトシェルをBashにするを参考にして,
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\Git\bin\bash.exe"
-PropertyType String -Force
を実行したら変更できた.
しかし,git bashにAnacondaのpathが通っていなかったので,PIFuHDをWindows + Anaconda + Git Bash環境で実行する,を参考にして,pathを通した.自分の環境の場合,C:\Program Files\Git\etc\bash.bashrc
に以下のコードを追加した.
export PATH=$PATH:/c/Users/<サーバのUsername>/anaconda3
export PATH=$PATH:/c/Users/<サーバのUsername>/anaconda3/Scripts
# >>> conda init >>>
__conda_setup="$(CONDA_REPORT_ERRORS=false '$HOME/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
\eval "$__conda_setup"
else
if [ -f "$HOME/anaconda3/etc/profile.d/conda.sh" ]; then
. "$HOME/anaconda3/etc/profile.d/conda.sh"
CONDA_CHANGEPS1=false conda activate base
else
\export PATH="$PATH:$HOME/anaconda3/bin"
fi
fi
unset __conda_setup
# <<< conda init <<<
更に,いちいち実行ファイルのディレクトリに移動して,conda activate
するのも面倒だったので,上のコードの下に,以下の2行を追加した.
conda activate <仮想環境名>
cd <実行ファイルのディレクトリ>
これで,git bashが立ち上がると,仮想環境のactivateとディレクトリ移動をセットでやってくれるので,非常に便利になった.
まとめ
自宅からwindowsへのssh接続とその他諸々のセットアップについてまとめた.正直リモートデスクトップでも問題はないが,やはりmac側のブラウザでTensorboardが見られるのはかなり良いし,今後AWSやGCPで深層学習を行う際にも活かせることが多いと思うので,その時にも色々工夫をして行きたい.
Discussion