やること
AWSのインスタンスのインタプリタを使って、ローカルのpycharmで開発!
背景
特定のモジュールをインストールするのが困難を極めるとき、既にインストールされているAWSのAMIやdockerコンテナなどを利用するのはとても楽です。
ただ僕はコーディングをpycharmなどのIDEでやりたいので、サーバーに入ってvimで開発するのは少し敷居が高い。。
pycharmで、サーバーへremoteでログインして、そのサーバーのインタプリタを使ってコーディングできる機能を発見したので試して、メモ書きをする。
※ professional版でしかできないので注意。
環境
- Mac Book Pro OSX El Capitan (ver10.11.3)
- Pycharm Professional
- AWSのEC2インスタンス
方法
1 pycharmのインタプリタ設定でAdd Remoteを押す。
Pycharm Preferences→ Project: hoge→ Project Interpreterをクリックすると、以下の画面が現れる。この右上の歯車をクリックすると、
以下のウィンドウが出るので、「Add Remote」を押す。
2 SSH設定
Add Remoteを押すと、インタプリタのConfigureが現れるので、SSH Credentialsを押すと以下のような設定画面になる。
ここでそれぞれ、以下を指定。
- Host:54.xx.xx.xxなどのパブリックIPの指定
- port:ssh接続時のポート番号を指定
- user name:ec2-userなどのssh接続ユーザーの指定
- Auth type:password or pemの、接続方法の指定
- password:パスワードか、pemファイルの保存先を指定
- Python interpreter path:インタプリタのパスを指定。
※ 基本/usr/bin/pythoinで良いと思いますが、分からなければ「which python」で普段利用しているpythonのパスを調べてセット。
これでOK。
あとたまに、AMIによってはec2-userなどの一般ユーザーではなく、rootユーザーで作業用環境が構築されている場合があるため、このときはsshd_configと公開鍵をいじってあげる。
# sshd_configの修正
vi /etc/ssh/sshd_config
# PermitRootLogin forced-commands-onlyを以下に。
PermitRootLogin without-password
# 公開鍵のコピー
mv /root/.ssh/authorized_keys /root/.ssh/authorized_keys_bak
cp -f /home/ec2-user/.ssh/authorized_keys /root/.ssh/authorized_keys
service sshd reload
ここまで書いたが、この機能、結構めんどくさいことに気づいた。。
まず、ローカルのパスがリモート側に存在しないと実行できない。
おそらくこの機能は、ローカルで書いたものをリモートにそっくりそのまま上げて利用するのが正しい?
続いて、何故かインポートできないモジュールが存在する。
caffeを使っているのだけど、import caffeでそんなのないって言われる。
anaconda配下にpycaffeがないので、anaconda配下に移してあげないといけないかも。
んーー、 importエラーが出ないローカルIDEでソースを作って、それを上げるのには使える??かな。。
デバッグできないのがかなり悲しいけども。。。
上の問題は、余力があれば調査してみます。
追記
ローカルとリモートのパスの対応付けと、オートアップロード機能に気付いたので追記。
ローカルとリモートの対応付けの方法
1 上のタブの”RUN"から"Edit Configration.."をクリックする。
2 Path Mappingの右側をクリックする。
3 localパスとRemote pathをセットする。
以上。
オートアップロードの方法
対応付けしても、作業はあくまでローカルなので、AWSに一々ローカルで変更したソースを上げないとダメ。
これを、ローカルのpycharmで修正したソースを、自動でAWSに上げる方法。
1 Preferences->Deploymentで、+ボタンを押す。
2 SFTPを選択して、グローバルIP Root path="/" keypair指定 でOK。Browse files on serverはそのままで大丈夫。
3 Preferences->Deployment->Optionsで、Upload changed files automatically...をAlwaysにかえて、Override default permissions on files:を任意の権限に指定。
以上。
これで、ローカルでpycharmでコーディングして、それがAWS上で即時反映されて開発できる。
デバッグもできる。素晴らしい。
cudaを利用する場合
cudaのlib系に対するパスがなくてエラーになる場合がある。
その際は、RunのConfigurationsで、Environment Variableに以下をセット。
LD_LIBRARY_PATH /usr/local/cuda/lib64:$LD_LIBRARY_PATH
リモートインタプリタを利用中、デバックで「: cannot connect to X server」が出てエラーになる場合
正確に把握はしていないが、サーバー上でXcodeが使えない場合にエラーになるっぽい。
そこで、ローカルのXcodeで補完するための作業が必要。
1. ローカルから、以下で接続。
ssh -Y username@ipaddress
2. 1の接続で、以下のコマンドで、DISPLAYの内容を確認。
echo $DISPLAY
> localhost:10.0
3. pycharmのEnvironment Variableに2の内容をセット。
DISPLAY localhost:10.0
4. 1の接続をしたまま、pycharmでデバッグ実行。
でOK。
AWSなどのクラウド上のtensorboardなどを確認したいがポートが解放されていない場合
ローカルから、以下で接続をしておいて、サーバー上で、利用ポートを9999指定し、ローカルのブラウザにlocalhost:8888で接続をしに行くと、そのアクセスが9999へポートフォワードされて表示ができる。
ssh -L 8888:localhost:9999 user@pablic_ip