💭

qwen.cpp(llama.cpp variant) で CPU で英日翻訳を行うメモ

2023/11/18に公開

背景

そこそこの速度でそれなりによい精度で機械翻訳したい...
CPU クラスタやサーバで処理したい(GPU めんどい).
macOS の場合は Metal 使いたい.

英日だと FuguMT ありますが, llama.cpp で動かすにはなんかいろいろ対応必要そうなのでとりあえず既存でできるものを利用したい.
(pytorch CPU 実行遅い)

素の llama2 や, weblab10B でもそこそこ性能よいようですが,

https://staka.jp/wordpress/?p=983

今回は Qwen 使ってみます!
https://staka.jp/wordpress/?p=1049

Qwen?

概要としては llama アーキ + tiktoken + 中国語マシマシなモデルのようです.
Meta llama2 よりは日本語データセットが含まれていて日本語できるっぽい.

qwen.cpp

Qwen は tiktoken とか使っていて llama.cpp では直接には動かせません(2023/11 現在)
qwen.cpp がありますのでこれを使います!

https://github.com/QwenLM/qwen.cpp

フツーに cmake ビルドでいけます!

model 変換

f32 or f16 が理想とは思いますが, fp32 だと Ryzen 3900 DDR4 で遅い(メモリ律速)ので今回は q4_0 を基本として行いました.
macbook M1 + Metal などでメモリ帯域あるのであれば fp16 あたりがいいかも.

モデルサイズは以下の通りとなりました.

  • fp32 : 53 GB
  • fp15 : 27 GB
  • q8_0 : 15 GB
  • q4_0 : 7.5 GB

実行

翻訳に適した prompt がようわからんので,

## Translate into Japanese: ****
## Response:

にしてみました.

ビットコイン genesis block のメッセージを, 以下のように prompt をあたえて

-p "## Translate into Japanese: The Times 03/Jan/2009 Chancellor on brink of second bailout for banks. ## Response:"

翻訳してみます!

system info: | AVX = 1 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | VSX = 0 |
inference config: | max_length = 2048 | max_context_length = 512 | top_k = 0 | top_p = 0.5 | temperature = 0.95 | num_threads = 0 |
loaded qwen model from qwen14b-q4_0-ggml.bin within: 51.424 ms

時事通信 03/Jan/2009 財務相は銀行の第二の救済策の真っ只中

prompt time: 5330.11 ms / 49 tokens (108.777 ms/token)
output time: 7232.15 ms / 33 tokens (219.156 ms/token)
total time: 12562.3 ms

おお~.

さすがに新聞の見出しなので情報量が足りないのですが, いい感じに翻訳してくれました.

詳細はこちら.

https://www.investopedia.com/terms/g/genesis-block.asp

https://www.coindeskjapan.com/177660/

ちな, The [London] Times なので, Chancellor は首相か財務大臣となるようですが, どちらなのかは不明です
(2009 年 2 月に生まれた 68 才主ふなので当時の状況をしらない)

Nikkei asia の記事の一センテンスも翻訳してみましょう.

https://asia.nikkei.com/Business/Markets/Commodities/Oil-prices-plunge-20-from-year-s-peak-on-weaker-U.S.-China-demand

-- みたいな記号があるとうまく翻訳できなかったので, 適宜置き換えておきます.

## Translate into Japanese: TOKYO. Crude oil prices have fallen 20% from a September high to a four-month low as economic slowdowns in the U.S. and China, the two largest consumers, lead to widespread expectations that demand will weaken. ## Response:

東京。9月の高値から4ヶ月間の低値に低下し、最大の2つの消費者である米国と中国の経済減速が需要 が弱化するとの広範な予想につながって、原油価格は20%下落しました。

ほほー. でもちょっとヘンね. 8bit 量子化だと

東京。最大の2つの需要国である米国と中国の経済減速が需給が弱まるとの広範な予想を引き起こし、9月の高値から4ヶ月間連続で20%低下し、原油価格が4ヶ月間連続で低下しています。

うーん, おしい(4ヶ月間連続 が二度でている).

fp16

東京。最大の2つの需要国である米国と中国の経済減速が需給が弱化するとの広範囲の予想を引き起こし、9月の高値から4ヶ月間の安値となる20%の下落が原油価格に見られました。

概ねいい感じでしょうか(ただし run によってはまだおかしかったりする).

日英翻訳

https://coinpost.jp/?p=302159

fp16 で行いました.

## Translate into English: 2010年5月22日、ビットコインの開発者がピザ屋からピザ2枚を注文し、別の開発者の家に届け、1万ビットコインと交換。初めてビットコインを利用した商取引が成立した瞬間となった。当時のビットコインの価値は1BTC=約0.2円であったが現在の価値に換算すると(1BTC=550万円)、このピザは1枚約275億円ということになる。 ## Respons
e:

On May 22, 2010, a developer of Bitcoin ordered two pizzas from a pizzeria and had them delivered to the home of another developer, exchanging them for 10,000 bitcoins. This moment marked the first time a commercial transaction was conducted using Bitcoin. At the time, the value of one Bitcoin was about 0.2 yen, but if we convert it to its current value (1 BTC = 5.5 million yen), the pizza would be worth about 27.5 billion yen per piece.

おおー.

とりままとめ

精度求めるなら fp16 がよいでしょう. ただ生成速度は q4 の 3 倍ほどかかります.
(q4 で 5 tokens/sec, fp16 で 1.7 tokens/sec くらい)

macOS + Metal とかでメモリ帯域ある CPU なら q4 10 tokens/sec くらい狙えるかも.

おまけ. Qwen 7B

7B + q4 だと 4.1 GB です. wasm(32bit) ではギリブラウザで動かないかな... 64bit addressing 対応ブラウザではいけるやも.

ただ, 翻訳性能は fp16 でも微妙でした.

q4_0

東京。9月の高点から20%下落した原油価格が4か月ぶりの低水準に達しています。これは、2大消費国 である米や中国の経済减速が、需求が弱化されることが広く予想されるからです。

fp16

東京。9月の高値から20%下落した原油価格が、中国やアメリカ、最大の消費者である2つの国が経済減速を起こし、需要が弱まることが期待されるためです。

これだと 14B + q4 のほうがよさそうです!

TODO

  • 翻訳に適した prompt があるか探してみる.

Discussion