• [まろぐ]
  • [簡単で正しいHTMLの書き方]
  • [Moses奮闘記]
[まろぐ] [簡単で正しいHTMLの書き方] [Moses奮闘記]

第18回 メモリ不足を解消せよ (2010年12月)

前回は、100万センテンスのパラレル・コーパスを扱ったときのお話をしました。今回は、言語モデルと翻訳モデルのバイナリ化に関するお話です。

課題をまとめると

前回のお話のとおり、特別なPCを用意したことで、どうにか100万センテンスのパラレル・コーパスで作成した言語モデルと翻訳モデルを使ってデコードできるようになりましたが、この先、200万、300万とセンテンス数を増やすと、すぐに次の限界に達することは明らかでした。

課題は実にシンプルで、次の2つに集約されていました。

  1. メモリの消費量が多い。
  2. 処理に時間がかかる。

シンプルではあるものの、だからと言って簡単に解決するというわけではありません。しかし、この課題を解消しておかないと、いつかまたデコードできない状態になり、品質改善どころの話ではなくなってしまいます。そこで、品質改善は同僚のFさんに任せ、先にこの2つの課題の解決法を調査することにしました。

何故こんなにメモリを消費するのか

当時の環境だと、デコードをするときのメモリ消費量が最も多く、パラレル・コーパスのセンテンス数にほぼ比例して増えていきました。

10万センテンス0.8GB前後
30万センテンス1.8GB前後
100万センテンス6.0GB前後

デコードするときの画面メッセージを見ていると、どうやら言語モデルと翻訳モデルをすべてメモリに取り込んでから、デコードが始まるようです。だったら、言語モデルと翻訳モデルを圧縮できれば、メモリの消費量が減るかなと思って、いろいろと調べてみたところ、両モデルともバイナリ化できることがわかりました。

実は、言語モデルも翻訳モデルも、出来上がったファイルは単なる巨大なテキスト・ファイルで、普通にテキスト・エディタで開いて、中を見ることができます。一般的には、バイナリ化するとデータ量はぐっと減るので、バイナリのままで読み込むのであれば、期待できそうです。

言語モデルはそのままで

言語モデルのバイナリ化は、とても簡単でした。言語モデルの作成時にバイナリ化を指定してもいいですし、作成済みの言語モデルをバイナリに変換することも可能でした。ファイル・サイズも1/3に減っています。

100万センテンスでの例 (SRILM)
通常の言語モデル187.1MB
バイナリ化した言語モデル63.6MB

1週間くらいは、バイナリ化した言語モデルを使っていたのですが、デコード時の読み込みにこんなに時間がかかったっけなと、ふと気付きました。試しに時間を計ってみたら、通常の言語モデルなら6秒で読み込みが完了していたのに、バイナリ化した言語モデルでは120秒もかかっていたことが判明。元々、言語モデルのデータ量は多くないので、処理速度を優先して、バイナリ化しないことにしました。

翻訳モデルはバイナリ化すべし

一方、翻訳モデルのバイナリ化は、わかるまで苦労しました。どうにか、バイナリ化するためのコマンドはわかったのですが、何度やってもデコード時にエラーが出て、うまく読み込めませんでした。あれこれと試した結果、翻訳モデルのバイナリ化というのは、フレーズ・テーブルとリオーダリング・テーブルの両方をバイナリ化しないといけないということがわかり、ようやくデコード時にエラーが出なくなりました。

メモリの消費量は2/3に減り、デコード時に6.0GB前後必要だったのが、4.0GBで済むようになりました。めでたし、めでたし、のはずだったのですが、どうもおかしい。

実は、翻訳モデルをバイナリ化すると、オンデマンド・ローディングというファイルからの直接呼び出しが可能になり、その結果、メモリの消費量が激減し、かつ、翻訳モデルの大きさに左右されない一定量で済むはずだったのです。でも、メモリの消費量は減ったとはいえ相変わらず多いですし、デコード前にこれまでどおり翻訳モデルの読み込みをしています。結局、このときは解決方法がわからず、別のテーマに取り掛かりました。

次回は処理速度を改善せよです。


[注] この回顧録は、かつて勤めていた会社で書いた連載を復元したもので、某I社の現在の状況を反映している訳ではありません。

投稿情報: 19:48 | 個別ページ

|

検索

フォトアルバム

コンテンツ

  • [まろぐ]
  • [簡単で正しいHTMLの書き方]
  • [Moses奮闘記]

出会い編

  • 第1回 Moses? (2010年3月)
  • 第2回 夜明け前の出来事 (2010年4月頃)
  • 第3回 機械翻訳で行くぞ (2010年8月頃)
  • 第4回 異動 (2010年9月頃)

手探り編

  • 第5回 Linuxの壁 (2010年10月)
  • 第6回 最初の疑問 (2010年11月)
  • 第7回 日本語との格闘 (2010年11月)
  • 第8回 BLEUスコア導入 (2010年11月)
  • 第9回 おかしなセンテンスを取り除くと (2010年11月)
  • 第10回 ユーザー辞書を使うと (2010年11月)
  • 第11回 押してダメなら引いてみろ (2010年11月)
  • 第12回 英ママは善か悪か (2010年11月)
  • 第13回 言語モデルは偉大なり (2010年11月)
  • 第14回 ある程度の数は必要 (2010年11月)
  • 第15回 チューニングは必須 (2010年12月)
  • 第16回 最初のブレイクスルー (2010年12月)

独自の工夫編

  • 第17回 ついに100万センテンスへ (2010年12月)
  • 第18回 メモリ不足を解消せよ (2010年12月)
  • 第19回 処理速度を改善せよ (2010年12月)
  • 第20回 品詞情報を活かせるか (2010年12月)
  • 第21回 カンニングは効果あり (2010年12月)
  • 第22回 前進と挫折で始まった2011年 (2011年1月)
  • 第23回 某I社独自のシステム化 (2011年2月頃)
  • 第24回 再び品質改善へ (2011年3月)
  • 第25回 長文対策の発見 (2011年3月)
  • 第26回 都合のいいコーパス (2011年3月)
  • 第27回 パラレル・コーパスの加工 (2011年4月)
  • 第28回 評価結果に潜むヒント (2011年5月)
  • 第29回 現在も続く改良 (2011年6月以降)

著作権

  • © 1995-2021, "Toda, Masalu", All Rights Reserved.
Powered by Typepad
  • Moses奮闘記 •
  • Powered by Typepad
上