このページでは、AWSで借りたCentOS7のクラウドサーバーにおいて、RDkit、NGLview、PyMOLを、Jupyter Notebookから使える環境設定方法について紹介します。バージョンが異なる2つのPyMOLを、異なる方法でインストールして同時に実行できるようにもしています。
今回は、AWSのクラウドサーバーを使いました。該当のクラウドサーバーは以下の手順で用意しました。AWSのコンソールにサインインして、EC2のサービス画面に行き、インスタンスの起動ボタンをクリックすると、ステップ1からステップ7の設定をして新しいインスタンスを作成できます。
ステップ 1
: Amazon マシンイメージ (AMI)
AWS Maketplaceを選択し、検索窓に"centos7"を入力して検索すると、関連するマシンイメージがリストアップされます。
ここでは、Centos.orgの"CentOS 7 (x86_64) - with Updates HVM"を選択します。
ステップ 2
: インスタンスタイプの選択
ここでは、リモートデスクトップ接続を行うため、メモリに少し余裕があった方がいいので、メモリ16GBのt3.xlarge(仮想コア数は4)を選択します。
(2020/6/1現在、東京リージョンのt3.xlargeのインスタンス 利用料金は0.2176USD/時間です。)
ステップ 3
: インスタンスの詳細の設定
(変更なし)
ステップ 4
: ストレージの追加
標準設定ではストレージのサイズは8GBとなっています。Anacondaのインストールに少しディスク容量を使用するので、少し大きくします。ここでは30Gに変更します。最初から100GB以上にすると不必要な費用がかかることになるかもしれません。
(ストレージサイズは後で大きくすることができます。大きく確保したものを、小さくすることはできません。そのため、最初は必要最低限で確保して、必要に応じて拡張するといいでしょう。)
"終了時に削除"の項目にチェックをいれておくと、インスタンス終了時にストレージも削除されます。Marketplaceのマシンイメージは、標準で、この項目のチェックがOFFになっているようですが、AWSが提供するマシンイメージは、標準でこの項目がONになっています。AWSが提供するマシンイメージをよく利用している人は、このチェックをONにしていないと、終了時にストレージが削除されていないことに気づかないかもしれません(私は、しばらく気づいていませんでした)。
ステップ 5
: タグの追加
ダグの追加ボタンを押して、キー(左の枠)にName, 値(右の枠)に今回借りるクラウドサーバーの名前(ここではCentOS7_MolEnv)を入れておくといいでしょう。後でも設定できますが、Nameを設定しておくと、複数のインスタンスを区別しやすくなります。
ステップ 6
: セキュリティグループの設定
(変更なし)
ステップ 7
: インスタンス作成の確認
"起動"ボタンを押すと、鍵ファイル作成のダイアログが出ます。
ここでは、"新しいキーペアを作成する"を選択し、キーペア名を"CentOS7_MolEnv"としています。
"キーペアのダウンロード"をクリックすると、鍵ファイルがダウンロードされます。
"インスタンスの作成"ボタンは、"キーペアのダウンロード"をクリック後にクリックすることができます。
EC2のインスタンスリストで、作成したインスタンスを選択して、"接続”ボタンをクリックすると、接続に必要な情報を表示するダイアログが出ます。そこに、鍵ファイルのモード変更の指示と、ログイン用のコマンドについての説明があります。
chmod 400 {key filename}
ssh -i {key filename} {user name}@{server address}
接続ボタンをクリックして出てくる接続情報には、{user name}は、rootとなっていると思いますが、実際には、rootのままではログインできません。
rootでログインすると、メッセージが出て他の{user name}にするように指示が出ます。
{user name}をcentosにするように指示が出ると思います。
クラウドサーバーの準備が整ったら、まず最初に、OSのアップデートを行います。
クライアントPCで以下のコマンドで実行して、クラウドサーバーにログインします。
ssh -i {key filename} {user name}@{server address}
{key file}には、鍵ファイルの名前を指定します。鍵ファイルがカレントディレクトリ以外に存在している場合には、ファイル名の前にパスを記述します。{user name}には、ユーザー名を指定します。AWSで上記手順でCentOS7のイメージを指定した場合には、ユーザー名がcentosとなっていると思います。
以下のコマンドで、OSのアップデートと再起動を行います。yumの実行時には、本当にインストールするかを確認するメッセージが出ます。一応、少し見てから、yキーを押すと良いでしょう。
sudo yum update
sudo reboot
最後のコマンドで接続が切れます。
上の手順で接続が切れているので、再ログインして作業を続けます。
次のコマンドで再ログインします。
ssh -i {key filename} {user name}@{IP address}
次のコマンドで、GNOMEデスクトップをインストールします。
sudo yum groupinstall "GNOME Desktop"
このコマンドは少し時間がかかります。
(参考)次のコマンドでインストールされているプログラム(yumの管理下のもの)を確認できます。
yum list installed
GNOMEデスクトップをインストール後には、wget等がインストール済みであることが確認できます。
次にリモートデスクトップ接続(より正確にはVNC接続)のサーバープログラムをインストールします。
sudo yum install tigervnc-server
インストール後に、次のコマンドでディスプレイを作成します。ここではディスプレイの解像度を1440x900に設定しています。
vncserver -geometry 1440x900
最初にディスプレイを作成する際には、VNC接続のパスワードを設定します。
次のメッセージが出てくるのでパスワードを設定します。このパスワードは、クライアントPCからVNC接続をする際に入力するものです。
You will require a password to access your desktops.
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
最後の質問の答えはnでよいと思います。
(参考)次のコマンドで作成されたディスプレイを確認できます。
vncserver -list
(参考)次のコマンドでディスプレイを削除できます。
vncserver -kill :ディスプレイ番号
例: vncserver -kill :1
(参考)ディスプレイ番号を指定してディスプレイを作成するには次のコマンドを使用します。
vncserver :ディスプレイ番号
例: vncserver :1
ディスプレイを作成すると、ディスプレイ番号に5900を足した数のポート番号で、VNC接続できるようになります。例えば、ディスプレイ番号が1番のディスプレイには5901番ポートでアクセスできます。後述しますが、ポート開放の設定は少し面倒な設定が必要で、通信も暗号化されないので、SSHの機能を使用して、5901番ポートにアクセスするようにします。
ここでは、Pythonの環境設定をするために、Anacondaをインストールします。Anacondaをインストールすると、Pythonでよく使われるモジュールがインストールされます。
次のコマンドでAnacondaのインストールプログラムを入手します。
wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh
ファイルが入手できない場合には、Anacondaのwebページ( https://www.anaconda.com )にアクセスして、インストールプログラムのURLを確認するといいでしょう。
次のコマンドでAnacondaのインストールを行います。
bash Anaconda3-2020.02-Linux-x86_64.sh
最初に、ライセンスアグリーメントの確認と承諾を行います。
In order to continue the installation process, please review the license agreement.
Please, press ENTER to continue
ENTERを押して、画面をスクロールさせてライセンスアグリーメント全文を読みます。
Do you accept the license terms? [yes|no]
ライセンスアグリーメントを承諾する場合には、この質問にyesを入力します。
Anaconda3 will now be installed into this location:
/home/centos/anaconda3
- Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below
標準のインストール先(~/anaconda3/)にインストールする場合には、そのままENTERキーを押します。
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
ここではyesを入力するとよいでしょう。yesを入力すると、インストーラープログラムがAnaconda3を初期化します。yesを選択すると~/.bashrcに、anacondaの設定が追加されます。
インストールが終了したら、ここで、次のコマンドを実行します。これで、~/.bashrcに追加された設定が有効になります。
source .bashrc
(参考)次のコマンドを実行すると、現在の環境にインストールされているモジュールを確認できます。
conda list
以下に示すモジュール等がインストールされていることを確認でるはずです。
python3.7, pip, jupyter, pandas, numpy, sympy, scipy
matplotlib, seaborn, scikit-image, scikit-learn, pillow
conda listのリストが長くて探したいモジュールを見つけることが困難な場合にはgrepコマンドを組み合わせて使用して、grepコマンドで指定した文字列を含む行のみを表示するようにすると良いでしょう。
例:
conda list | grep numpy
このコマンドは、conda listの出力の中からnumpyの文字列を含む行のみを表示します。
ここまでの手順を実行すると、次回ログイン時、もしくは、新しいシェルの起動時にanacondaのbase環境に自動的に入ります(コマンドプロンプトの先頭に(base)が表示されるようになります)。base環境をよく利用する場合には、このままの設定で良いと思いますが、リモートデスクトップ接続の際に使用するコマンド(vncserver :1)がbase環境では正常に動作しないため、ここでは、次のコマンドで、ログイン時、もしくは、シェル起動時にanacondaのbase環境に自動的に入らないようにします。
conda config --set auto_activate_base false
(参考)base環境から抜けるためには次のコマンドを実行します。
conda deactivate
(参考) base環境に再度入る場合には次のコマンドを実行します。
conda activate
Anacondaインストール後には、base環境が利用できるようになっています。Pythonでは、多くのモジュールを利用するため、モジュールが依存している別のモジュールのバージョンの違いによってコンフリクトが発生することがあります。例えば、モジュールAがモジュールCのバージョン1に依存していて、モジュールBがモジュールCのバージョン2に依存しているといった状況では、モジュールAとモジュールBは同時に利用できないといったことが発生すると考えられます。場合によってはモジュールBの古いバージョンなら、モジュールCのバージョン1でも動作するかもしれません。pythonのバージョンや、モジュール導入時のコマンド(pip, conda)の使い方等によって、用意した環境で目的のプログラムが正常に動作しないことがあります。そのために、1つの環境に、いろいろなモジュールを導入するのではなく、複数の環境を用意して、そこに問題が発生しない組み合わせのモジュール(のバージョン)を導入して、用途によって環境を切り替えて使用するとよいでしょう。
次のコマンドで、base環境とは別の環境(分子研究用の環境(molenv))を作成します。
conda create -n molenv python=3.6 anaconda
python=X.Xは、pythonのバージョンを指定するためのものです。ここでは、3.6を指定しています。使用するモジュール、ソースコードによっては、特定のバージョンのPythonでしか正常に動作しないことがあるので、用途に応じてpythonのバージョンを指定します。
ここでコマンドの引数にanacondaを指定しておくと、base環境に含まれるモジュールを新しい環境にインストールすることができます。
(参考)利用可能な環境は次のコマンドで確認できます。
conda env list
まず、次のコマンドで、新しく作成した環境(molenv)に入ります。
conda activate molenv
以下のコマンドでRDkitとNGLviewをインストールします。
conda install -c conda-forge rdkit
conda install -c conda-forge nglview
jupyter-nbextension enable nglview --py --sys-prefix
ここでは、ここまでの環境をこのまま残して、これまでの環境のクローンを別に2つ作成し、そのそれぞれに、異なる方法でPyMOLをインストールすることにします。
次のコマンドで、pymolenv1, pymolenv2を作成します。
conda create -n pymolenv1 --clone molenv
conda create -n pymolenv2 --clone molenv
Pythonの環境は、比較的壊れやすいので、新しいモジュールをインストールする前には、環境のクローンを作成しておくとよいでしょう。
pymolenv1の環境には、githubで公開されているpymolをインストールします。
conda activate pymolenv1
conda install -c conda-forge pmw
conda install -c conda-forge mmtf-python
sudo yum install epel-release
sudo yum install gcc gcc-c++ python-devel python3-devel python3-tkinter
sudo yum install glew-devel libpng-devel freetype-devel
sudo yum install libxml2-devel glm-devel netcdf-devel
sudo yum install git
git clone https://github.com/schrodinger/pymol-open-source.git
cd pymol-open-source/
python setup.py build
python setup.py install --prefix=/home/centos/anaconda3/envs/pymolenv1
pymolenv2の環境には、samoturkのチャンネルからconda installのコマンドでインストールできるPyMOLをインストールします。こちらは、少しバージョンが古いです。この方法は、管理者権限がなくてもインストール可能なのがいいところです。
conda activate pymolenv2
conda install -c samoturk pymol
conda install -c conda-forge pmw
conda install -c anaconda libglu
リモートデスクトップ接続をする前に、一旦、クラウドサーバーからログアウトして、特別なオプションを追加して再ログインします。
まず、次のコマンドでログアウトします。
exit
次のコマンドで、再ログインします。
ssh -i {key filename} {user name}@{IP address} -L 5901:localhost:5901
ここで使用している-Lオプションは、クラウドサーバーの5901番ポートをクライアントPCの5901番ポートに接続するためのものです。実際には、SSHで使用する22番ポートのみを使用しています。この方法を使わない場合には、クラウドサーバーの5901番ポートを解放する必要があります。また、解放したとしても、途中の通信を暗号化することができません。そのため、SSHを利用して、5901番ポートにアクセスしています。
MacOXからは、Finderを起動→メニューバーの"移動"→サーバーへ接続、出てきたダイアログに
vnc://localhost:5901
を入力して、OKボタンを押します。パスワード入力のダイアログが出てきたら、上で設定したパスワードを入力します。
Windowsから接続する場合には、UltraVNCをインストールするとVNC接続が可能です。(UltraVNC ViewerのみをインストールすればVNC接続が可能です。)
リモートデスクトップ接続したデスクトップ上で、端末を起動します。端末の起動は、デスクトップの背景のどこかで右クリックして出てきたメニューから"端末を開く"をクリックするといいでしょう。クライアントPCの設定等の違いにより、GUIの言語が異なっていることがあります。起動した端末で以下のコマンドを実行するとjupyter notebookを起動することができます。
conda activate pymolenv1
jupyter notebook
RDkitのサンプルプログラム
from rdkit import Chem
from rdkit.Chem import Draw
mol=Chem.MolFromSmiles('CCC(CC)O[C@@H]1C=C(C[C@@H]([C@H]1NC(=O)C)N)C(=O)OCC')
Draw.MolToImage(mol)
NGLvewのサンプルプログラム
import nglview
view=nglview.show_pdbid('4hP0')
view
PyMOLのサンプルプログラム
from pymol import cmd
cmd.fragment('ala')
cmd.orient()
cmd.png('/tmp/foo.png', dpi=0.0, ray=1)
from IPython.display import Image
Image(filename='/tmp/foo.png')
端末を新しく開いて、次の2つのコマンドを実行するとpymolenv1のPyMOLを起動できます。
conda activate pymolenv1
pymol
別の端末を新しく開いて、次の2つのコマンドを実行するとpymolenv2のPyMOLを起動できます。
conda activate pymolenv2
pymol
2つの端末を使用すると、2つのPyMOLを同時に起動することができます。