修行の場

知人が言っていました。これは修行だと。

リモート上でコーディングしやすい環境を整える(Python)

リモート上でコーディングしやすい環境を整える(Python)

背景

MLの分析環境など、リモート環境に大量のデータがあり、すべてをローカルに持ってこれないなど、リモート環境で作業をせざるを得ない状況であるため、楽に開発するための環境を構築します。 (プロダクション環境向けの設定じゃありません。)

基本リポジトリRsyncベースで同期する

ノートブックは別のリポジトリにする想定です。

次のコマンドを実行することで、編集モードでrepositoryをモジュールとしてインストールします。

cd $REPO && pip install -e .

jupyterやipythonでリポジトリ内のモジュールを使って上位のコードを書く。もしくはリポジトリのモジュール自体を作ったり編集したりするのが主な作業である想定です。

次にリモートからローカルに同期させます。 ローカルとリモートの動機にsshfsを使ってもいいですが、ネットワークを切り替えたりするとよく不具合が起きるので、rsyncを使います。 下記のコマンドを実行します。

rsync -Pav -e "ssh -i キー" RemoteHost:~/gitrepos/Repository ~/gitrepos

ソースコードを編集するたびにサーバー側にローカル側を同期させます。

rsync -Pav -e "ssh -i キー" ~/gitrepos RemoteHost:~/gitrepos/Repository

使っているエディタに登録すると良いでしょう。 Visual Studio Codeにはタスクを登録する機能があります。

あと、ローカル側でpip install -e .を実行することを考え、同期ファイル一覧からegg-infoなどの情報を除外します。gitignoreを使って除外できるので、--filter=':- .gitignore'などとすれば良いです。 また、ssh/configにキーを登録して更に便利です。

Jupyterの設定

次に、autoreloadの設定をします。そうすることで、rsyncでリモート側に同期されて変更されたモジュールが自動的にリロードされます。

まずは、IPythonのprofileを設定します。 ここにIPython起動時にロードできるextensionやコードを設定できます。 その後、Python用のkernel.jsonを書き換えて、そのprofileを使ってIPythonを起動するようにします。 jupyter kernelspec listにてPython3用のカーネルのパスを調べ、その中にあるkernel.jsonargs"--profile=default"を追加します。 すると、すべてのノートブックで自動的にモジュールがロードされるようになり、毎回ノートブックの戦闘にリロードの設定を書かなくて良くなります。

まとめ

これでローカルでコードを書いてリモート側に反映することが簡単にできるようになりました。必要に応じて、ipythonやjupyterを使ってコードを効率よく回いけます。