前回は、100万センテンスのパラレル・コーパスを扱ったときのお話をしました。今回は、言語モデルと翻訳モデルのバイナリ化に関するお話です。
課題をまとめると
前回のお話のとおり、特別なPCを用意したことで、どうにか100万センテンスのパラレル・コーパスで作成した言語モデルと翻訳モデルを使ってデコードできるようになりましたが、この先、200万、300万とセンテンス数を増やすと、すぐに次の限界に達することは明らかでした。
課題は実にシンプルで、次の2つに集約されていました。
- メモリの消費量が多い。
- 処理に時間がかかる。
シンプルではあるものの、だからと言って簡単に解決するというわけではありません。しかし、この課題を解消しておかないと、いつかまたデコードできない状態になり、品質改善どころの話ではなくなってしまいます。そこで、品質改善は同僚のFさんに任せ、先にこの2つの課題の解決法を調査することにしました。
何故こんなにメモリを消費するのか
当時の環境だと、デコードをするときのメモリ消費量が最も多く、パラレル・コーパスのセンテンス数にほぼ比例して増えていきました。
10万センテンス | 0.8GB前後 |
---|---|
30万センテンス | 1.8GB前後 |
100万センテンス | 6.0GB前後 |
デコードするときの画面メッセージを見ていると、どうやら言語モデルと翻訳モデルをすべてメモリに取り込んでから、デコードが始まるようです。だったら、言語モデルと翻訳モデルを圧縮できれば、メモリの消費量が減るかなと思って、いろいろと調べてみたところ、両モデルともバイナリ化できることがわかりました。
実は、言語モデルも翻訳モデルも、出来上がったファイルは単なる巨大なテキスト・ファイルで、普通にテキスト・エディタで開いて、中を見ることができます。一般的には、バイナリ化するとデータ量はぐっと減るので、バイナリのままで読み込むのであれば、期待できそうです。
言語モデルはそのままで
言語モデルのバイナリ化は、とても簡単でした。言語モデルの作成時にバイナリ化を指定してもいいですし、作成済みの言語モデルをバイナリに変換することも可能でした。ファイル・サイズも1/3に減っています。
通常の言語モデル | 187.1MB |
---|---|
バイナリ化した言語モデル | 63.6MB |
1週間くらいは、バイナリ化した言語モデルを使っていたのですが、デコード時の読み込みにこんなに時間がかかったっけなと、ふと気付きました。試しに時間を計ってみたら、通常の言語モデルなら6秒で読み込みが完了していたのに、バイナリ化した言語モデルでは120秒もかかっていたことが判明。元々、言語モデルのデータ量は多くないので、処理速度を優先して、バイナリ化しないことにしました。
翻訳モデルはバイナリ化すべし
一方、翻訳モデルのバイナリ化は、わかるまで苦労しました。どうにか、バイナリ化するためのコマンドはわかったのですが、何度やってもデコード時にエラーが出て、うまく読み込めませんでした。あれこれと試した結果、翻訳モデルのバイナリ化というのは、フレーズ・テーブルとリオーダリング・テーブルの両方をバイナリ化しないといけないということがわかり、ようやくデコード時にエラーが出なくなりました。
メモリの消費量は2/3に減り、デコード時に6.0GB前後必要だったのが、4.0GBで済むようになりました。めでたし、めでたし、のはずだったのですが、どうもおかしい。
実は、翻訳モデルをバイナリ化すると、オンデマンド・ローディングというファイルからの直接呼び出しが可能になり、その結果、メモリの消費量が激減し、かつ、翻訳モデルの大きさに左右されない一定量で済むはずだったのです。でも、メモリの消費量は減ったとはいえ相変わらず多いですし、デコード前にこれまでどおり翻訳モデルの読み込みをしています。結局、このときは解決方法がわからず、別のテーマに取り掛かりました。
次回は処理速度を改善せよです。
[注] この回顧録は、かつて勤めていた会社で書いた連載を復元したもので、某I社の現在の状況を反映している訳ではありません。