Word2vecが遅いと感じたら、この記事を読んでください。
Magnitudeを使うと、Word2vecよりも100倍以上速く処理できます。
本記事の内容
- Word2vecの高速化
- Magnitudeによる分散表現(単語埋め込み)
- Word2vecとMagnitudeにおける処理速度の比較
それでは、上記に沿って解説していきます。
Word2vecの高速化
まずは、Word2vecの高速化について定義しておきます。
高速化するのは、学習済みのモデルデータを読み込む処理が対象となります。
そのため、学習してモデルを作成することは対象外です。
おそらく、頻度としてはモデルを読み込むことの方が多いでしょう。
実際、私自身はその際の処理速度に不満を感じました。
例で言うと、次の記事での内容を行った際に不満を感じました。
類似度を調べる度に、約45秒(負荷状況で変わります)ほど待たされます。
これでは、気軽に調査や検証ができません。
学習済みモデルデータが約4GBあるとは言え、さすがに遅すぎです。
検証したマシンのスペックは以下。
CPU | インテル Core i9 9900KF |
GPU | NVIDIA 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回行います。
また、設定するキーワードは毎回変更します。
同じキーワードなら、キャッシュが残る可能性を考慮しています。
キーワード | Word2vec | Magnitude[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における処理速度の比較についての説明でした。