AWSのライフサイエンス分野向けグラフ深層学習ライブラリ DGL-LifeSci を触ってみた

# はじめに
AWS がライフサイエンス分野向けグラフ深層学習ライブラリをリリースしていると聞き、触ってみたメモ。その名も「DGL-LifeSci」。
DGLというグラフ深層学習ライブラリをベースとした、ライフサイエンス分野向けの機能やアルゴリズム搭載したライブラリである。

# 何ができるの？
ざっくりいうと以下の4種類のバイオ/化学に関するタスクを行うことができる。

- Molecular property prediction (分子の特性予測)
- Generative models (生成モデル)
- Reaction prediction (反応予測)
- Protein-ligand binding affinity prediction (タンパク質-リガンド結合親和性予測)

これらタスクを実現するための様々なアルゴリズムが搭載されている。

# 環境
以下の環境で確認した。

- Windows 10 (RAM16G、GPU:GetForce GTX 1060 6GB)
- Miniconda 3
- python 3.7
- pytorch 1.10.2 
- dgl dgl-cuda11.0
- RDKit 2018.09.3

# インストール手順

以下インストール手順を示す。Miniconda, CUDAのインストール手順は省略する。

``` sh
conda create -n dgllife_gpu_3.7 python=3.7 -c conda-forge --override-channels
conda activate dgllife_gpu_3.7
conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch -c conda-forge --override-channels
conda install -c dglteam dgl-cuda11.0 -c conda-forge --override-channels
conda install rdkit==2018.09.3 -c conda-forge --override-channels
pip install dgllife 
```

注意点は以下の通りである。
- Python 3.8だとRDKitの2018.09.3がconda-forgeに**見つからない**。
- Python 3.6だとpytorchのインストールが**失敗する**。

以上からPythonは3.7としたが、お手持ちのOS、環境に合わせて試行錯誤してほしい。
私も最適なバージョンの組み合わせを探すのに**丸一日**かかった。

# 使ってみよう
今回は、4つのタスクの内、化合物の特性予測を行ってみる。

## 事前準備
各タスクを行うためのコマンドラインインターフェースが用意されている。
これを使うため、githubリポジトリのクローンを作成する必要がある。

```sh
git clone https://github.com/awslabs/dgl-lifesci.git
```

次に、化合物特性予測のコマンドラインプログラムのあるフォルダに移動しよう。
```
cd dgl-lifesci/examples/property_prediction/csv_data_configuration/
```

最後にインストールした仮想環境を ```conda activate``` でアクティベートすれば準備完了だ。

## 回帰モデル
まず回帰モデルの作成方法について述べる。

### データの準備

今回は以下のデータを利用する。
https://deepchemdata.s3-us-west-1.amazonaws.com/datasets/Lipophilicity.csv

URLからダウンロードしてコマンドラインプログラムと同じフォルダに配備しよう。
なお、コマンドラインプログラムはSMILES列のあるCSVファイルにのみ対応しているため、SDFファイルは事前にCSVに変換しておこう。

### モデルの作成
コマンドラインで以下を実行してみよう。 ここで ```-c```はcsvファイル、```-sc``` はSMILESの列名、```-t``` は目的変数の列名を指定する。

``` sh
python regression_train.py -c Lipophilicity.csv -sc smiles -t exp
```

なお、```-t```にカンマ区切りで複数の列名を指定することで **マルチタスク学習** を行うことができる。
モデルの作成結果は、直下の```regression_results/1```に作成される。以降モデルを作成する度に、```regression_results/2```、```regression_results/3``` のようにシーケンシャルに番号が振られたフォルダに作成される。

### モデルを用いた予測
予測を行うためSMILES列のあるcsvファイルを用意しておく。
予測は以下の通りコマンドを実行する。

``` sh
python regression_inference.py -f test.csv -sc SMILES -t lipo -tp regression_results\1 -ip lipo_result
```

ここで```-f```は入力CSV、```-sc``` はSMILESの列名、```-t```は結果が出力される列名、```-tp```はモデルの出力フォルダ、```-ip```は出力フォルダである。

これを実行すると、lipo_resultフォルダの下の```prediction.csv```というファイルに予測結果が出力される。1列目に元の入力CSVファイルのSMILESをcanonicl smilesに変換したもの、2列目に```-t```で指定した列名で予測結果がそれぞれ出力される。

## 分類モデル
次に分類モデルについて説明する。

### データの準備

今回は以下の2つのタスク(目的変数)を持つデータを用いて、マルチタスク学習をしてみよう。
https://deepchemdata.s3-us-west-1.amazonaws.com/datasets/clintox.csv.gz

URLからダウンロードして展開し、コマンドラインプログラムと同じフォルダに配備しよう。

### モデルの作成

以下の通り実行しよう。なお、```-t```を指定しない場合はSMILES列を除いた全ての列を用いてマルチタスク学習を行う。

``` sh
python classification_train.py -c clintox.csv -sc smiles
```

モデルの作成結果は、直下の```classification_results/1```に作成される。以降モデルを作成する度に、```classification_results/2```、```classification_results/3``` のようにシーケンシャルに番号が振られたフォルダに作成される。

### モデルを用いた予測

予測を行うためには、SMILES列のあるcsvファイルを用意しておく。
予測は以下の通りコマンドを実行する。

``` sh
python classification_inference.py -f clintox.csv -sc smiles -t FDA_APPROVED,CT_TOX -tp classification_results\1 -ip clintox_result
```

ここで```-f```は入力CSV、```-sc``` はSMILESの列名、```-t```は結果が出力される列名、```-tp```はモデルの出力フォルダ、```-ip```は出力フォルダである。

これを実行すると、clintox_resultフォルダの下の```prediction.csv```というファイルに予測結果が出力される。1列目に元の入力CSVファイルのSMILESをcanonicl smilesに変換したもの、2列目に```-t```で指定した列名に予測結果がそれぞれ出力される。


# おわりに
似たようなライブラリにDeepChemがあるが、使った感じ、ソースを見た感じ、以下の印象を持った。
- DeepChemに比べて、自分のデータを用いたモデル作成、予測が簡単に試せる。
- PyTorchをベースとしており、作りがシンプルである。

今後は他のタスクも試してみたい。

# 参考文献
- [DGL-LifeSci (Github)](https://github.com/awslabs/dgl-lifesci)
- [DGL-LifeSci: Bringing Graph Neural Networks to Chemistry and Biology](https://lifesci.dgl.ai/index.html)