Deep Semantic Role Labeling のソースコードを動かすまでの手順

7月 27, 2020

nvidia-docker2でコンテナを作成。 –runtime=nvidiaを忘れないこと。

$ docker run -it --runtime=nvidia nvidia/cuda:7.5-cudnn5-devel-ubuntu14.04

ソースコードがtheano==0.9.0にしか対応しておらず、しかもtheano0.9.0はcuDNN5でしか動かない為、コンテナで新しい環境を作った。

作ったコンテナに入る。

$ docker start hoge
$ docker attach hoge

ここから先の手順はコンテナ内で実行。

コンテナに標準搭載されていなかった必要パッケージを入れる

# apt update
# apt install git
# apt install unzip

コンテナ内でのライブラリ管理が面倒なので、Anaconda2をインストールすることにした。

Anacondaに必要パッケージのインストール

# apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev libpng-dev

pyenvのインストール

# git clone git://github.com/yyuu/pyenv.git ~/.pyenv
# git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash
# echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
# echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
# echo 'eval "$(pyenv init -)"' >> ~/.bashrc
# source ~/.bashrc

まず、最新のAnaconda (Python2系)のバージョンを確認

# pyenv install -l | grep anaconda2
anaconda2-2.4.0
anaconda2-2.4.1
anaconda2-2.5.0
anaconda2-4.0.0
anaconda2-4.1.0
anaconda2-4.1.1
anaconda2-4.2.0
anaconda2-4.3.0
anaconda2-4.3.1
anaconda2-4.4.0
anaconda2-5.0.0
anaconda2-5.0.1
anaconda2-5.1.0
anaconda2-5.2.0

最新のAnaconda2 (ここではanaconda2-2.4.0) をインストールし、デフォルトとして設定。

# pyenv install anaconda2-2.4.0
# pyenv global anaconda2-2.4.0
# echo 'export PATH="$PYENV_ROOT/versions/anaconda2-2.4.0/bin:$PATH"' >> ~/.bashrc
# source ~/.bashrc

Pythonの環境を確認

# python --version
Python 2.7.10 :: Anaconda 2.4.0 (64-bit)

ここから、SRLのソースコードのインストールに移る
コンテナ内の適当なディレクトリで、git clone

# git clone https://github.com/luheng/deep_srl.git

コードを動かすため、パッケージをインストール

# conda install theano==0.9.0 pygpu protobuf nltk
# apt install tcsh

Google ドライブのPretrainedファイル6つすべてダウンロードし、~/deep_srl/resources下に配置

https://drive.google.com/drive/folders/0B5zHXdvxrsjNZUx2YXJ5cEM0TW8?usp=sharing

先ほどダウンロードしたファイルの展開

# tar -zxvf conll05_ensemble.tar.gz
# tar -zxvf conll05_model.tar.gz
# tar -zxvf conll05_propid_model.tar.gz
# tar -zxvf conll2012_ensemble.tar.gz
# tar -zxvf conll2012_model.tar.gz
# tar -zxvf conll2012_propid_model.tar.gz

GloVe のインストール

# ./scripts/fetch_required_data.sh

以上でインストール終了。

サンプルコードを動かす前に、モデルのパスを指定

# vi run_end2end.sh
#!/bin/bash
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda:/usr/local/cuda/lib64:/opt/OpenBLAS/lib
MODEL_PATH="./resources/conll05_propid_model" <- ここでパス指定。もともとはconll05_propid_modelとしか書かれていない。
MODEL_PATH2="./resources/conll05_ensemble" <- ここでパス指定
TEMP_PATH="temp"
INPUT_PATH=$1
OUTPUT_PATH=$2
TH_FLAGS="optimizer=fast_compile,floatX=float32"
if [ "$#" -gt 2 ]
then
TH_FLAGS="${TH_FLAGS},device=gpu$3,lib.cnmem=0.9"
fi
THEANO_FLAGS=$TH_FLAGS python python/predict.py \
--model=$MODEL_PATH \
--task="propid" \
--input="${INPUT_PATH}" \
--output="${TEMP_PATH}/sample.pp.txt" \
--outputprops="${TEMP_PATH}/sample.pred.props"
THEANO_FLAGS=$TH_FLAGS python python/predict.py \
--model=$MODEL_PATH2 \
--task="srl" \
--input="${TEMP_PATH}/sample.pp.txt" \
--inputprops="${TEMP_PATH}/sample.pred.props" \
--output="${OUTPUT_PATH}"

サンプルコードを動かして動作確認

$ ./scripts/run_end2end.sh sample_data/sentences_with_predicates.txt temp/sample.out # (on CPU)
$ ./scripts/run_end2end.sh sample_data/sentences_with_predicates.txt temp/sample.out ${gpu_id} # (on GPU)

出力

(省略)
('lstm_0_rdrop', 0.1, True)
<neural_srl.theano.layer.HighwayLSTMLayer object at 0x7fe0940f7090>
('lstm_1_rdrop', 0.1, True)
<neural_srl.theano.layer.HighwayLSTMLayer object at 0x7fe0940f7f90>
('lstm_2_rdrop', 0.1, True)
<neural_srl.theano.layer.HighwayLSTMLayer object at 0x7fe0940f76d0>
('lstm_3_rdrop', 0.1, True)
<neural_srl.theano.layer.HighwayLSTMLayer object at 0x7fe095dcd310>
('lstm_4_rdrop', 0.1, True)
<neural_srl.theano.layer.HighwayLSTMLayer object at 0x7fe0b6b80690>
('lstm_5_rdrop', 0.1, True)
<neural_srl.theano.layer.HighwayLSTMLayer object at 0x7fe0b6b80b10>
('lstm_6_rdrop', 0.1, True)
<neural_srl.theano.layer.HighwayLSTMLayer object at 0x7fe0b6b80d50>
('lstm_7_rdrop', 0.1, True)
<neural_srl.theano.layer.HighwayLSTMLayer object at 0x7fe0b6b80050>
32072 2
Loaded model from: ./resources/conll05_ensemble/model4.npz
Model building and loading duration was 0:00:04.
Running model duration was 0:00:00.
Decoding duration was 0:00:00.
Accuracy: 38.750 (31.0/80.0)
Printing results to temp file: /root/script/deep_srl/python/neural_srl/shared/../../../temp/srl_pred_5859.tmp
Number of Sentences    :           5
Number of Propositions :           8
Percentage of perfect props :   0.00
corr.  excess  missed    prec.    rec.      F1
------------------------------------------------------------
Overall        0      19       0     0.00    0.00    0.00
----------
A0        0       6       0     0.00    0.00    0.00
A1        0       8       0     0.00    0.00    0.00
A2        0       2       0     0.00    0.00    0.00
AM-DIR        0       2       0     0.00    0.00    0.00
AM-TMP        0       1       0     0.00    0.00    0.00
------------------------------------------------------------
V        6       2       2    75.00   75.00   75.00
------------------------------------------------------------
Fscore=0.0
Writing to human-readable file: temp/sample.out

結果はテキストファイルとして、temp/sample.outに保存される

temp/sample.out

1 John told Pat to cut off the tree .
Predicate: told(2)
A0: 1 John
V: told
A2: Pat
A1: to cut off the tree
1 John told Pat to cut off the tree .
Predicate: cut(5)
A0: Pat
V: cut off
A1: the tree
4 John told Pat to cut off the tree .
Predicate: told(2)
A0: 4 John
V: told
A2: Pat
A1: to cut off the tree
4 John told Pat to cut off the tree .
Predicate: cut(5)
A0: Pat
V: cut off
A1: the tree
1 We saw the Grand Canyon flying to Chicago .
Predicate: saw(2)
A0: We
V: saw
A1: the Grand Canyon flying to Chicago
1 We saw the Grand Canyon flying to Chicago .
Predicate: flying(6)
A1: the Grand Canyon
V: flying
AM-DIR: to Chicago
5 We saw the Grand Canyon flying to Chicago .
Predicate: saw(2)
AM-TMP: 5
A0: We
V: saw
A1: the Grand Canyon flying to Chicago
5 We saw the Grand Canyon flying to Chicago .
Predicate: flying(6)
A1: the Grand Canyon
V: flying
AM-DIR: to Chicago

こんな感じで、動詞を中心とした係り受け解析ができる。

Deep Learning

Posted by vastee