2022.04.28

時間のかかるプログラムを「screen」でバックグラウンド実行しよう

はじめに

 インスタンスをご利用の皆様の中には、数時間~数日かかるような計算やディープラーニングの学習のプログラムをインスタンスで実行したい、という方も多いのではないでしょうか?その際に「プログラム実行途中でインスタンスとのSSH接続が切断しまい、最後まで完了しない可能性があるのではないか?」という点が気がかりな方もいらっしゃるかと思います。

 今回はそんな皆様に「screen」というコマンドをご紹介します。screenを使うとインスタンスと接続したターミナル上に仮想端末というものを起動できるのですが、なんとこの仮想端末で実行されたプログラム、SSH接続が切断してもバックグラウンドで継続して動き続けます!ぜひscreenを使い、安心してプログラムを実行させましょう!

インスタンス側:アクセスサーバに接続

 早速、具体的な手順をみていきましょう。まずはターミナル上で以下のコマンドを入力してアクセスサーバに接続してください。

ssh -L 20122:[インスタンスIP]:22 user@[アクセスサーバIP] -p 30022 -i .\.ssh\ackey.txt
アクセスサーバへの接続

インスタンスへの接続

 続いてインスタンスへの接続を行います。新規ターミナルを開き、下記コマンドにてインスタンスに接続してください。

下図がインスタンス接続成功時の画面になります。

ssh user@localhost -p 20022 -i .ssh\mykey.txt
インスタンスへの接続

screenのインストール

 まずはapt updateを実行します。

sudo apt -y update

続いてscreenのインストールを実行してください。

sudo apt -y install screen

仮想端末の起動

 まずは

screen -ls

で仮想端末の一覧を確認します。この時点では "No Sockets found in /run/screen/S-user." と、仮想端末がまだ作られていないことが示されます。

仮想端末一覧の確認

そこで、下記コマンドを実行して「sc1」という名前の仮想端末を作成してみましょう。下図のようなまっさらな画面が表示されたら成功です。

screen -S sc1
仮想端末sc1起動

それでは一度、「Ctrl」+「a」キー ⇒「d」キーの順にキー入力をして、仮想端末の画面を抜けて(デタッチ)ください。

もう一度

screen -ls

を実行すると、sc1がデタッチされ、また起動状態が継続していることを確認できます。

sc1デタッチ

ここからは、この仮想端末「sc1」の中でプログラムを動作させてみましょう!

バックグラウンド実行

 まずは実際に動かすプログラムの準備をします。今回の事例では以前の記事でご紹介したMNISTの画像認識プログラムを使用します。

下記コマンドを実行して、プログラムコードを取得してください。

sudo apt -y install git
git clone https://github.com/highreso/Lrning_DeepLearning_in3days.git

続いて先ほど作成した仮想端末sc1にログイン(アタッチ)します。

screen -r sc1

アタッチ後、下記コマンドを実行してプログラムを実行します(今回はtorch17_py36というconda仮想環境を使用)。

conda activate torch17_py36
cd Lrning_DeepLearning_in3days
python train.py
プログラム実行

このまま放置するとプログラムが進行するのですが、今回は仮想端末上のプログラムがバックグラウンドで動作し続けることを確認するために一度インスタンスとの接続を切断してみます。

先ほどと同様に「Ctrl」+「a」キー ⇒「d」キーの順に入力してデタッチを行い、exitコマンドでインスタンスから切断します。

その後、同一のターミナル上で下記コマンドを実行してインスタンスに接続し直します。

ssh user@localhost -p 20022 -i .ssh\mykey.txt
インスタンス再接続
screen -r sc1

でsc1にアタッチし直すと.....

プログラムの継続動作を確認

プログラムが継続して動いていることが確認できます!!!

これでインスタンスとのSSH接続セッションの切断を気にせずに、安心してプログラムを実行できますね。

ちなみに、プログラムの動作完了後に仮想端末をシャットダウンする場合は、「Ctrl」+ 「d」キーにてシャットダウン可能です。

(おまけ)JUPYTER LABのバックグラウンド実行

 インスタンスをご利用の皆様の中には、JupyterLab上でディープラーニングの学習等をする方もいらっしゃるのではないでしょうか。

今回はJupyterLabのバックグラウンド実行についてもご紹介します。

まずはアクセスサーバに接続した状態で、下記コマンドにてインスタンスに接続します。

ssh -L 8888:[インスタンスIP]:8888 user@localhost -p 20122 -i .\.ssh\mykey.txt
仮想端末sc2起動

その後、下記コマンドにて「sc2」という仮想端末を作成してアタッチします。

screen -S sc2

アタッチ後、仮想端末sc2内で下記コマンドでJpyterLabを起動させます。

jupyter lab --ip=*
JupyterLab起動

JpyterLabの起動後、ローカルPCにてブラウザを立ち上げて

http://localhost:8888

を検索するとJupyterLabの画面にアクセスできます。

JupyterLabブラウザ表示

こちらの記事を参考に、Notebookを開いて先ほど動作を確認したMNISTのプログラムをJupyterLab上で動作させます。

ここで、通常であれば

%run train.py

でtrain.pyを動作させるところを

%%capture train_output
%run train.py

にて動作させることによって、インスタンスとのSSH接続のセッション切れが発生しても、プログラムの出力結果をオブジェクトとして保存することが可能になります。

captureコマンドの追加

上記にて実行したプログラムの出力結果は下記コマンドにて表示できます。

train_output.show()
captureした出力結果の表示

いかがでしたでしょうか。
弊社クラウドGPUサーバのご利用をご検討中の方はhttps://soroban.highreso.jp/から
お気軽にお申込みやお問い合わせください。

初回インスタンス作成から
3日間は無料利用可能!

新規申し込み