【100倍以上】Magnitudeを使ってWord2vecを高速化する

【100倍以上】Magnitudeを使ってWord2vecを高速化する プログラミング

Word2vecが遅いと感じたら、この記事を読んでください。
Magnitudeを使うと、Word2vecよりも100倍以上速く処理できます。

本記事の内容

  • Word2vecの高速化
  • Magnitudeによる分散表現(単語埋め込み)
  • Word2vecとMagnitudeにおける処理速度の比較

それでは、上記に沿って解説していきます。

Word2vecの高速化

まずは、Word2vecの高速化について定義しておきます。

高速化するのは、学習済みのモデルデータを読み込む処理が対象となります。
そのため、学習してモデルを作成することは対象外です。

おそらく、頻度としてはモデルを読み込むことの方が多いでしょう。
実際、私自身はその際の処理速度に不満を感じました。

例で言うと、次の記事での内容を行った際に不満を感じました。

類似度を調べる度に、約45秒(負荷状況で変わります)ほど待たされます。
これでは、気軽に調査や検証ができません。
学習済みモデルデータが約4GBあるとは言え、さすがに遅すぎです。

検証したマシンのスペックは以下。

CPUインテル Core i9 9900KF
GPUNVIDIA GeForce RTX 2060 SUPER
メモリ16GB

ゲーミングPCとして購入したモノです。
そのため、そこそこのスペックがあり、決して貧弱ではありません。

なお、GensimのWord2VecはGPUには未対応です。
CPUだけで頑張っています。
それも遅い原因なのかもしれません。

では、このストレスのかかる状況を改善していきましょう。
次は、その方法を説明していきます。

Magnitudeによる分散表現(単語埋め込み)

Word2vecの高速化には、Magnitudeという技術を利用します。
Magnitudeは、Word2vecとは別の分散表現(単語の埋め込み)になります。

PythonからMagnitudeを利用するには、pymagnitudeライブラリをインストールします。

pymagnitudeについては、次の記事で解説しています。

pymagnitudeがインストールできたら、Magnitude用のデータを用意しましょう。
専用のデータ形式が必要になります。

それぞれの分散表現用のデータが存在します。
それをMagnitude用に変換するツールが、提供されています。
「pymagnitude.converter」というスクリプトファイルです。

ただし、今回はこれを使いません。
公開されている「.magnitude」形式のデータを利用します。

上記でも触れたchiVeには、「.magnitude」形式のデータも用意されているのです。
それを利用することにしましょう。
45秒かかる処理と比較する意味でも、同じ内容のモデルを使う方が効果的です。

まずは、学習済み日本語モデルの「.magnitude」形式をダウンロードします。

Magnitude用データのダウンロード

chiVeのGitHubページ
https://github.com/WorksApplications/chiVe

Word2vecの検証では、「v1.2 mc5」のGensim用をダウンロードしました。
今回は、5.5GBある「.magnitude」形式のデータをダウンロードします。

ダウンロードには、時間がかかります。
そりゃ、5.5GBもありますからね。

ダウンロードが完了したら、次のようにファイルが保存されます。

次は、このデータをpymagnitudeで読み込みます。

pymagnitudeでMagnitude用データの読み込み

モデルの読み込みだけではなく、類似語の取得まで行います。
Word2vecによる処理と同じでないと、比較の意味が薄れますからね。
そのためのコードは、以下。

from pymagnitude import Magnitude
from pprint import pprint

# chiVeデータのPATH
model_path = "chive-1.2-mc5.magnitudeのパス"

# モデルの読み込み
wv = Magnitude(model_path)

# 類似度上位10件を取得
match = wv.most_similar("大学", topn=10)

# 見やすい形式で表示
pprint(match)

上記を実行すると、次の結果が表示されます。

[('大学院', 0.80596817),
('学部', 0.7958552),
('私立大学', 0.7504209),
('経済学部', 0.7311231),
('教育学部', 0.72570133),
('他大学', 0.7244742),
('国立大学', 0.7236857),
('博士課程', 0.7158527),
('文学部', 0.71280026),
('法学部', 0.71076)]

「大学」の類似ワードが出れば、Magnitudeの動作としては問題ありません。
もちろん、これはWord2vecで類似ワードを処理した結果と同じです。

利用しているモデルが同じですからね。
そうならないと、逆にオカシイです。

まとめ

Magnitudeを使った分散表現の処理を確認しました。
Word2vecと同じように、類似ワードの取得もできました。

しかし、ここで終わりではありません。
本当にWord2vecの高速化が実現できているのかを確認する必要があります。
実際は、Word2vecとMagnitudeは異なる技術ですけどね。

次は、Word2vecとMagnitudeにおける処理速度の比較を行います。

Word2vecとMagnitudeにおける処理速度の比較

処理速度の比較を行います。
正確には、処理時間の比較を行うことになります。

Magnitudeの利用にはpymagnitudeを用いています。
そして、pymagnitudeはPyTorchに依存していました。
さらに、PyTorchはCPUとGPUの両方で動きます。

したがって、以下のパターンで比較を行います。

  • Word2vec(Gensim)
  • Magnitude(pymagnitude[CPU])
  • Magnitude(pymagnitude[GPU])

処理は、連続で5回行います。
また、設定するキーワードは毎回変更します。
同じキーワードなら、キャッシュが残る可能性を考慮しています。


キーワードWord2vecMagnitude[CPU]Magnitude[GPU]
1回目52秒4.93秒4.12秒
2回目48秒0.40秒0.21秒
3回目48秒0.46秒0.23秒
4回目47秒0.62秒0.64秒
5回目44秒1.11秒0.43秒

正直、微妙な結果です。
CPUとGPUでは、それほど差が出ませんでした。

もっと出ると想定していましたが・・・
念のため、pymagnitudeがGPUを利用するのは確認済みです。

実行の度に、タスクマネージャーで利用率がUPしていました。
と言っても、最大で8%ぐらいでしたけど。

あと、確実に言えることがあります。
Word2vecに比べてMagnitudeは圧倒的に速いということです。
CPUであろうとGPUであろうと関係なく。

Magnitudeに関しては、一度実行したらモデルデータがメモリに乗るようです。
そのため、2回目以降はさらに高速に処理ができるみたいです。

Word2vecに関しては、毎回モデルデータをディスクから読み込みます。
その違いがあるとは言え、最低でも約10倍の処理速度の差があります。

キャッシュした状態で比較すれば、約100倍の処理速度の差が存在しています。
GPUなら、より速度に差が出ることになります。

正直、ここまでの差が出るとは思いませんでした。
今後は、Word2vec(Gensim)を使うことが、モデルの読み込みではないかもしれません。

以上、Word2vecとMagnitudeにおける処理速度の比較についての説明でした。

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