DeepChemのインストールとチュートリアル 1

Pythonでインフォマティクス

このカテゴリーの記事では、「Pythonを使った機械学習やケモ・バイオインフォマティクスの実装や論文」を紹介していきたいと考えています。Python は3系(3.7)、anacondaを中心にして環境構築していきます。以下のようなハード・ソフト環境(CentOS Linux)を用いますが、Python(anaconda)が利用できれば、異なる環境下でも類似の実装が可能かと思います。

● CPU Intel® Core™ i7-6700K CPU @ 4.00GHz × 8
● メモリ  64GB
● GPU GeForce GTX 1080/PCIe/SSE2
● OS  CentOS Linux 8
● Python 3.7


はじめに

今回から、Pythonで実行可能なケモインフォマティクスとして、DeepChem による機械学習を紹介したいと思います。これまでに用いてきた、condaによる仮想環境やパッケージの設定、Pythonによる計算の実行環境としてJupyter notebook も使っていきますので、過去記事も参考にしてください。


DeepChem

DeepChem のWebサイトやGitHubには、「DeepChem は、創薬、材料科学、量子化学、生物学における深層学習の利用を民主化する高品質なオープンソースのツールチェーンを提供することを目的としています。」と謳われています。DeepChem を利用することで、様々な機械学習・深層学習の手法を、主として化学・生化学の課題に適用することができます。特に、化学構造に関する様々な課題に対して、 グラフ畳み込みネットワーク(GCN; Graph Convolutional Network)を適用することが可能であり、様々な研究に利用されています。また、豊富なチュートリアルが用意されていますので、それらを実行しながら、化学に対して機械学習・深層学習をどのように用いるのか、みていきたいと思います。


DeepChemの実行環境の構築

まずはDeepChemのインストールを行います。下記のように仮想環境 deepchemを用意して、アクティブにしましょう。

$ mkdir deepchem                         #ディレクトリ名をdeepchemに
$ cd deepchem                            #ディレクトリdeepchemに移動
$ conda create -n deepchem python=3.8    #python 3.8 の仮想環境 deepchemを作成
$ conda activate deepchem                #仮想環境 deepchemをアクティブ

そのうえで、以下のように、conda でいくつかのパッケージをインストールしていきます。

$ conda install cudnn=8.2
$ conda install rdkit=2021.03.5

まず、NVIDIAが公開している、深層学習用のライブラリー cudnn(NVIDIAのGPUを使って深層学習を行うのに必要です。これを基にして、以下でインストールする深層学習ライブラリーTensorFlow等が動作します。)をインストールしています。

次に、分子の情報を扱うための様々な手法のパッケージである、RDkit をインストールしています。RDkit はケモインフォマティクス全般に必要なパッケージで、DeepChem も RDkit をベースにしています。RDkit については、こちらのような素晴らしい日本語解説もありますので、ぜひ参考にしてください。

そして、以下のようにDeepChem 本体は pip でインストールします。

$ pip install tensorflow==2.6
$ pip install deepchem==2.6.0.dev202109111951
$ conda install jupyter

DeepChemの深層学習機能は、TensorFlow をベースにしていますので、tensorflow 2.6.0 を先にインストールしています。また、DeepChem は、deepchem==2.6.0.dev202109111951 とすることで、最新開発版をインストールしています。最後に、Jupyter notebook をインストールしました。全てがPythonパッケージで、conda, pipでインストール可能です。素晴らしいですね。


Jupyter notebookを立ち上げ、DeepChemを実行

それでは、Deepchemを使ってみたいと思います。今回は、1番目のチュートリアル、1 The Basic Tools of the Deep Life Sciencesを実行してみます。チュートリアルでは、DeepchemをGoogle colab上で実行することが前提となっていますが、上記の仮想環境にインストールを行いましたので、当然ローカルで実行可能です。

以下を実行し、Jupyter notebookを起動します。

$ jupyter notebook

ここからは notebook 上で実行していきます。まずはセルに以下を入力し、Run して下さい。

In [1]:
import deepchem as dc
dc.__version__
Out[1]:
'2.6.0.dev'

1行目でDeepChem をインポートし、dc…の形で使えるようにしています。2行目はDeepChemのバージョンを表示する指示で、2.6.0.dev とインストールしたバージョンが表示されました。

次の入力から実際のチュートリアルの内容に入っていきます。

1 The Basic Tools of the Deep Life Sciences チュートリアルでは、化学構造に基づく低分子化合物の水への溶解度予測を行います。分子の溶解度は、医薬等において非常に重要な特性です。水への溶解度が低い場合、生体内への投与に問題が生じるため改善が必要です。DeepChem では様々な化合物とその化学的性質をまとめた、分子データセットが使用できるようになっています。これをMoleculeNetといい、このチュートリアルではこのデータセットに含まれる、Delaney 溶解度データを使用することができます。中身はリンクから論文を参照してください。

実際には、以下をRunするだけでデータを使用することができます。

In [2]:
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer='GraphConv')
train_dataset, valid_dataset, test_dataset = datasets

1行目の指示で、Delaney 溶解度データ を読み出しています。化学構造を機械学習で扱える形にしなればなりません。ここでは、featurizer=’GraphConv’と指定することで、GraphConvModel として読み出されています。

2行目の指示では、読み込んだデータセットを、トレーニング、バリデーション、テストの3つの異なるデータセットに分けています。これは、深層学習で一般的に用いられるやり方で、トレーニングセットで学習を行い、学習中のモデルの評価をバリデーションセットで行い、最終的なモデルの評価をテストセットで行うことになります。

データが得られたので、次はモデルを作成します。以下を実行します。

In [3]:
model = dc.models.GraphConvModel(n_tasks=1, mode='regression', dropout=0.2)

この指示で、「グラフ畳み込みネットワーク」(略して「graphconv」)モデルが定義されました。モデルの詳細はここでは触れませんが、モデルが上記のトレーニングセットデータを学習することで、未知化合物に対する溶解度を予測することができるようになるわけです。

学習は、以下のように記述するだけで実行できます。nb_epoch=100 で100エポック分の学習がなされます。

In [4]:
model.fit(train_dataset, nb_epoch=100)
Out[4]:
0.109492826461792

cuDNN、Tensorflow、DeepChem等が無事インストールできていれば、学習でGPUが使用でき、計算が速くなります。GPUが使用できているかは、色々な確認方法がありますが、以下を実行してみてください。

In [5]:
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
2021-09-17 21:24:59.154546: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-09-17 21:24:59.154829: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-09-17 21:24:59.155004: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-09-17 21:24:59.155232: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-09-17 21:24:59.155420: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-09-17 21:24:59.155592: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /device:GPU:0 with 6158 MB memory:  -> device: 0, name: NVIDIA GeForce GTX 1080, pci bus id: 0000:01:00.0, compute capability: 6.1
Out[5]:
[name: "/device:CPU:0"
 device_type: "CPU"
 memory_limit: 268435456
 locality {
 }
 incarnation: 9681367277040289354,
 name: "/device:GPU:0"
 device_type: "GPU"
 memory_limit: 6457655296
 locality {
   bus_id: 1
   links {
   }
 }
 incarnation: 11736548426568288454
 physical_device_desc: "device: 0, name: NVIDIA GeForce GTX 1080, pci bus id: 0000:01:00.0, compute capability: 6.1"]

上のように、device_type: “GPU” の表示が出れば、GPUが認識されTensorflow に使用されています。

それでは、学習済みのモデルを評価しましょう。評価指標を選択し、モデルに対してevaluate()を呼び出します。この例では、以下のようにピアソン相関係数を評価指標として使用します。トレーニングセットとテストセットの両方を用いて評価してみましょう。

In [6]:
metric = dc.metrics.Metric(dc.metrics.pearson_r2_score)
print("Training set score:", model.evaluate(train_dataset, [metric], transformers))
print("Test set score:", model.evaluate(test_dataset, [metric], transformers))
Training set score: {'pearson_r2_score': 0.9087034788128244}
Test set score: {'pearson_r2_score': 0.704424518121724}

結果として、トレーニングセットで0.9を超える相関係数が出ています。一方、学習に用いていないテストセットの場合、やや低い値を示しました。即ち、学習に用いたデータに合致しすぎている(オーバーフィッティング、過学習)状態です。それでも、一定程度の予測精度で、化学構造から溶解度予測ができるということを示しています。

最後に、下記のセルを実行してください。

In [7]:
solubilities = model.predict_on_batch(test_dataset.X[:10])
for molecule, solubility, test_solubility in zip(test_dataset.ids, solubilities, test_dataset.y):
    print(solubility, test_solubility, molecule)
[-1.5967461] [-1.60114461] c1cc2ccc3cccc4ccc(c1)c2c34
[1.1421071] [0.20848251] Cc1cc(=O)[nH]c(=S)[nH]1
[-0.3097452] [-0.01602738] Oc1ccc(cc1)C2(OC(=O)c3ccccc23)c4ccc(O)cc4 
[-1.881278] [-2.82191713] c1ccc2c(c1)cc3ccc4cccc5ccc2c3c45
[-1.4456786] [-0.52891635] C1=Cc2cccc3cccc1c23
[1.2809825] [1.10168349] CC1CO1
[-0.23171847] [-0.88987406] CCN2c1ccccc1N(C)C(=S)c3cccnc23 
[-1.0336088] [-0.52649706] CC12CCC3C(CCc4cc(O)ccc34)C2CCC1=O
[-1.071774] [-0.76358725] Cn2cc(c1ccccc1)c(=O)c(c2)c3cccc(c3)C(F)(F)F
[0.3010657] [-0.64020358] ClC(Cl)(Cl)C(NC=O)N1C=CN(C=C1)C(NC=O)C(Cl)(Cl)Cl 

テストセットから最初の10個の分子について、溶解度予測の結果が表示されます(10行分のアウトプット)。1列目の値が溶解度の予測値です。2列目の値は、実測値です。また、3列目にそれぞれの分子の化学構造が SMILES記法 で表示されています。予測値と実測値が比較的合致しているとみるべきかと思います。


今回の記事では、ローカルにDeepChemの実行環境をインストールし、最初のチュートリアルを実施してみました。少し Python に慣れる必要はありますが、簡単にケモインフォマティクス、GCNによる深層学習が実行できました。今後もDeepChemのチュートリアルを学んでいきたいと思います。


コメント

タイトルとURLをコピーしました