😀

Windows10に公開鍵認証でssh接続,Tensorboard表示の備忘録

2021/10/16に公開

コロナ禍のため,中々研究室にも行きづらくなった昨今,自宅のMacからリモートデスクトップで研究室のPC(Windows)を動かしていた.しかし,キーボードマッピングの問題や,解像度を考え,ssh接続でモデルの学習やTensorboardの表示ができないかを検討した.そのときに躓いたことや,自分なりに工夫したことを備忘録として残しておく.

表記について

コマンドの実行が,クライアント(macOS)とサーバ(Windows)とで行き来するため,以下のような書き分けを行う.

mac
# クライアント側で実行するコマンド
windows
# windowsマシンまたはssh接続した状態で実行するコマンド.場合によっては,PowerShell等細かく注釈をつける

やったこと

  • Windows10にsshサーバを立てて,macOSから接続
  • ポートフォワーディングを利用して,macのブラウザでTensorboardの表示
  • 公開鍵認証で接続できるよう修正
  • .ssh/configの作成
  • ログインシェルをgit bashに変更,起動時に深層学習用の仮想環境のactivateと実行フォルダへの移動

注意

WindowsのOpenSSHをインストールするところから始める方は,公開鍵認証での接続のコメントアウトの箇所から始めると,後々の作業が非常にスムーズになるので強くオススメする.

Windows10へのssh接続

Windows 10 に OpenSSH サーバをインストールする,を参考に,まずOpenSSHサーバのインストールを行った.
windows側の設定を終えたら,macのターミナルで以下のコマンドを実行する.

mac
ssh <サーバのUsername>@<サーバのホスト名(グローバルIP)>

Usernameは,エクスプローラーを開いて,C:¥Users¥????????を,グローバルIPはcman.jpというサイトを利用してサーバのIPアドレスを確認した.
まず,これでmacOSから接続を確認,パスワードを聞かれるので,Windowsのログイン時のパスワードを入力すればおk.

Tensorboardの表示

そもそも出来るのか,と思ったらやってる人がいた.
しかし,こちらのサイトのように

mac
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の実行を行う

といった形で実現した.コードは以下のようになる.

mac
ssh -L 6006:127.0.0.1:6006 <サーバのUsername>@<サーバのホスト名(グローバルIP)> 
# ssh接続後
tensorboard --logdir=<logのディレクトリ>

ただし,この方法の場合,ターミナルを強制終了したとき等に,サーバ側でtensorboardが実行されたままになることがあるので,その場合はサーバ側でtensorboardのプロセスを直接終了させる必要がある.

windows
netstat -nao
# ローカルアドレスが127.0.0.1:6006のPIDを確認
taskkill /pid <tensorboardのPID>

以下の2つを参考にした.

公開鍵認証での接続

ここまで行い,いちいちパスワードを入れるのが面倒になったのと,セキュリティの観点から公開鍵認証でssh接続出来るように変更.これが非常に手間取った.
まず,SSH公開鍵認証で接続するまで,を参考にKeyの作成や転送等を行ったが,なぜか公開鍵認証でログインできない.
色々調べ,以下2つのサイトの情報を参考にしたところ解決した.

まず,C:\ProgramData\ssh\sshd_configの最後2行をコメントアウトする.

sshd_config
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接続が出来る.

mac
ssh lab

ログインシェルをgit bashに変更

macのターミナルと,windowsでコマンドがけっこう異なること,実行ファイルをgitでも管理しやすいように,ログインシェルをgit bashに変更した.
Windows10でSSHサーバーを立ててデフォルトシェルをBashにするを参考にして,

windows,PowerShell
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に以下のコードを追加した.

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行を追加した.

bash.bashrc
conda activate <仮想環境名>
cd <実行ファイルのディレクトリ>

これで,git bashが立ち上がると,仮想環境のactivateとディレクトリ移動をセットでやってくれるので,非常に便利になった.

まとめ

自宅からwindowsへのssh接続とその他諸々のセットアップについてまとめた.正直リモートデスクトップでも問題はないが,やはりmac側のブラウザでTensorboardが見られるのはかなり良いし,今後AWSやGCPで深層学習を行う際にも活かせることが多いと思うので,その時にも色々工夫をして行きたい.

GitHubで編集を提案

Discussion