word2vec

word2vecは言語処理の基本ツールの1つとなりつつあります。TITAN Xを搭載したマシンが使えるようになったので、word2vec_cbowというGPUで動くword2vecを試してみました。

Starting training using file text8
Vocab size: 71290
Words in train file: 16718843
vocab size = 71290
Alpha: 0.000009 Progress: 100.00% Words/thread/sec: 3353.60k

比較のためTensorFlowのword2vec.pyのGPUでの実行を試みましたが、GPUの使用を指定するだけでは、ほとんど早くなりません。GPUを直接操作するカーネルを書かないといけないようです。

試したことは、下記のようにしてGPUとCPUの利用を自動的に割り当てること。

tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)

gpuを指定することにしたこと。

tf.device('/gpu:0')

ログによるとGPUは使っているようですが、速度には効いてきません(というより遅くなっている)。なにか間違っているのかもしれませんが、TensorFlowの関数にはGPUカーネルを持っているものと持っていないものがあり、うまく速度が上がらないようです。word2vec_cbow並みの速度にするには、word2vec_optimized.pyのように外部のC++モジュールでGPUを直接使うコードを書かないといけなさそうです。

それから、pythonから直接実行すると global_variable_initializer()がエラーになるので、initialize_all_variables()に置き換えてあります。