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

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

$ docker run -it --runtime=nvidia nvidia/cuda:8.0-cudnn5-devel-ubuntu16.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

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

CUDAとcuDNNとUbuntuのバージョンを指定してコンテナを立てる[nvidia-docker2]

docker run -it --runtime=nvidia nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04

runtimeではnvccが使えないので注意[nvidia-docker2]

教訓

nvidia-dockerで環境を立てるときには、develを選ぶのが吉

説明

さて、nvidia-docker2を使ってコンテナを作成しようとしたのだが

$ docker run -it --runtime=nvidia nvidia/cuda:8.0-cudnn5-runtime-ubuntu16.04

いざ、コンテナ内でCUDAのバージョンを確認しようnvccコマンドを打つも見つからないと言われる。

$ nvcc -V
bash: nvcc: command not found

パスが通ってないだけかと思い、以下を~/.bashrcに追記するエラー。

export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH

その後、色々と試すうちに、そもそも /usr/local/cuda-8.0/bin のフォルダが無いということに気がついた。

で、調べてみると以下の記述に辿り着いた。

  • base: starting from CUDA 9.0, contains the bare minimum (libcudart) to deploy a pre-built CUDA application. Use this image if you want to manually select which CUDA packages you want to install.

  • runtime: extends the base image by adding all the shared libraries from the CUDA toolkit. Use this image if you have a pre-built application using multiple CUDA libraries.

  • devel: extends the runtime image by adding the compiler toolchain, the debugging tools, the headers and the static libraries. Use this image to compile a CUDA application from sources.

github.com

どうやら、3つのフレーバーに分かれているようだ。 そして、私が先ほどインストールしたイメージはruntimeで、複数のCUDAライブラリを使う為のイメージだったことが判明した。

そうか、複数のCUDAライブラリの使用が前提だったから、nvccの設定はされていなかったのか。そもそも、複数のCUDAライブラリの使用が前提のイメージって誰が使うのって思い、runtimeとかややこしいの作るなよって、文句がでてしまった。

が、文句を言っても仕方ないので、上3つのフレーバーの中で1番拡張されているdevelをインストールし、nvccコマンドを確認。

$ docker run -it --runtime=nvidia nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61

良かった、ちゃんと使えた!

Anaconda 仮想環境の新規作成

$ conda create -n py27 python=2.7 anaconda

-n: 仮想環境の名前

python=*: pythonのバージョン指定

末尾の引数: 使用するパッケージ。他にもscipy, pythonが選べる

仮想環境の作成後は以下のコマンドでチェックしよう

$ conda env list

作成した仮想環境に入るときには

$ source activate py27

cuDNNのバージョンを確認(Nvidia-docker2で)

# cuDNNのバージョン確認
$ dpkg -l | grep "cudnn"

上のコマンドを打ってみた例

# システムにインストールされているパッケージ一覧を表示
$ dpkg -l | grep "cudnn"
ii  libcudnn5                  5.1.10-1+cuda8.0                      amd64        cuDNN runtime libraries
# libcudnnの横に付いている数字を見るとバージョンが5であることがわかる。

# パッケージ"libcudnn5"によってインストールされたファイルの一覧を確認できる
$ dpkg -L libcudnn5
/.
/usr
/usr/share
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/libcudnn5
/usr/share/doc
/usr/share/doc/libcudnn5
/usr/share/doc/libcudnn5/copyright
/usr/share/doc/libcudnn5/changelog.Debian.gz
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libcudnn.so.5.1.10
/usr/lib/x86_64-linux-gnu/libcudnn.so.5

他にもcudaのインストールディレクトリ /usr/local/cuda の下のファイル名を確認することでバージョンを確認する方法もあるが(http://pandazx.hatenablog.com/entry/2017/03/21/144832)、

私の場合 nvidia-docker2でコンテナを作成したため、cudaインストールディレクトリ下に libcudnn.so.x.x.xファイルが無くて確認できなかった。

Amazon dash こんなときどうするの?

Amazon Dash Button 100åã»ã¼ã«

 

プライムデーでdashボタンが100円で売っていたのでつい買ってしまった.
折角なのでdashボタンに興味をもつ人たちの為に,Amazon dash質問集をまとめたいと思う.

 

Q. Amazon dashはタダなの?

いいえ,有料です.

 

Q. dashボタンがタダじゃないって... 買う人はガジェット好きだけじゃない?

一応,実質タダにすることができます.

ワンプッシュ目の購入金額から500円割り引くので実質タダ!

100円セールで買えば,割引分500円 - dashボタン代100円 = 400円分浮くのでかなりお得! しかもdashボタンも試せるので,ダブルでお得だ. 

f:id:Vastee:20180716144539p:plain

 

Q. セットアップはどうするの?

1. Dashボタンを買う.

2. 届いたら箱を開ける.

f:id:Vastee:20180716145301j:plain

ガジェット感のある包装でいい匂いがする.

 

3. Iphone/AndroidAmazonアプリから案内に沿って各種設定を行う.

f:id:Vastee:20180716145613j:plain

Wilkinsonのdashボタンと取説.

 

-----

ここからアプリでの操作

 

4. 青く点滅するまでボタンを押す.

f:id:Vastee:20180716145755p:plain

 

5. wifiSSIDとKeyを入力し,ネットに繋げる.

f:id:Vastee:20180716145903p:plain

 

6. 住所や支払情報を入力し,お金が払えるようにする.

7. 購入する商品を選ぶ.

終わり,あとは押すだけ.

 

Q. ボタン押した後には勿論,通知はあるよね? 何も通知が無かったら不気味だよ...

通知あります.下の写真のようなものが来るはずです.

f:id:Vastee:20180716152405j:plain

 

また,注文後にはdashボタンのインジゲーターが光ります.スマホの方に目がいくので見逃しやすいのですが... 詳しくは下を参考にして下さい.

https://www.amazon.co.jp/gp/product/B07115WDQK/ref=s9_acsd_al_bw_c_x_2_w?pf_rd_m=AN1VRQENFRJN5&pf_rd_s=merchandised-search-5&pf_rd_r=DY2NCJB4GENP85WWHKW9&pf_rd_r=DY2NCJB4GENP85WWHKW9&pf_rd_t=101&pf_rd_p=dd784ba5-6d86-4cb7-be8c-34445d7b38bb&pf_rd_p=dd784ba5-6d86-4cb7-be8c-34445d7b38bb&pf_rd_i=4752863051

 

Q. Amazonにあるものなら何でも買うことができるの?

いいえ,特定の商品のみです.

例えば,金麦dashボタンなら,金麦24缶セットが買えます.購入可能な商品はdashボタンの販売ページの下を見ると確認できます.

 

Q. 一度商品を設定すると二度と変えられないんじゃない?

安心してください.Amazonアプリから変更可能です.

 

Q. Dashボタンを16連打したら16個の商品が運ばれてくるの!? 怖い.

いいえ,最初に押した分の商品が到着するまでのボタンプッシュは無効です.

 

Q. Dashボタンを連打した時の挙動を見てみたいのですが,怖くてできません.

連打してみました.以下の通知が来て,重複する注文が取り消されました.

f:id:Vastee:20180716152541p:plain

 

Q. ボタンワンプッシュにつき2個以上の商品を頼みたいときはどうするの?

Amazonアプリから設定が可能です.

 

Q. Amazon dash のバッテリーは交換可能なの?

交換できません.

白い取説にもそう書いてあります.

f:id:Vastee:20180716151437j:plain

 

Q. じゃあ電池が切れたらどうするの?

Amazonに問い合わせた下の方の記事によると,dashボタン本体の無償交換可能とのことです.

azshop-life.net

 

Q. どうせつまらないものしか買えないんでしょ?

コンドームも売ってます.001ボタンとか絶対人に見せられない...w

Dashボタンは結構種類があり,ジャンルも意外と豊富なので眺めてると面白いです.

 

以上です.