![見出し画像](https://assets.st-note.com/production/uploads/images/142208511/rectangle_large_type_2_fa1faabdf1319441f91899b410c4caa2.png?width=1200)
MLXで、aixsatoshi/Honyaku-13b を動かしてみる with Gradio on MacbookPro
とある場所で話題になっていたので気になって動かしてみました。
話題としては、以下のポストからコスパいいのではということです。
aixsatoshiさんのHonyaku-13bをWMT23(EN->JA)で評価してみました!
— あお太 (@aorblue) May 21, 2024
性能良すぎてビックリです
特にaixsatoshi-Honyaku-13b-IQ4_XS.gguf(7.04GB)がコスパが良さそうですね pic.twitter.com/ih3HeUu391
メインで使ってるのは、Macbook Proなのでmlx環境で動くかをまずは試してみます。元モデルはこちら↓
architectureは"LlamaForCausalLM"ということなので、多分mlx-lmで動くのではないかと、コマンドラインでまずは実行。
(M3Max 64GB MacbookPro です)
mlx環境で、mlx-lmをインストールしてたら、以下の1行で動きました。
python -m mlx_lm.generate --model aixsatoshi/Honyaku-13b --prompt "<english>: {In an era marked by rapid globalization, the intricate interplay between international law, economic policies, and political dynamics has become increasingly complex. } <NL>\n\n<japanese>:"
実は、間違いがあって上から { }は要らないとのことでした。久しぶりにpython触ったので勘違い…
以下のXのPostで作者さんのAI𝕏サトシさんにいろいろとご教示いただけました。
mlx_lmで AI𝕏サトシ⏩ さんの @AiXsatoshi のaixsatoshi/Honyaku-13bをお試ししたら、元の英語になかった余分の日本語もでてきちゃった、アレアレ?? なんでだろう? pic.twitter.com/0wsrCHcLSX
— Lucas (@LucasChatGPT) May 28, 2024
いただいたPostへのリンクをいろいろ
デコーダーオンリーLLM翻訳なので、入力プロンプトによって挙動結構かわります。量子化すると出やすいみたいです。あと、プロンプトに{ }の記号要らないです。わかりにくくてすみません。入力文の長さで性能変わること確認してます。短過ぎても長過ぎても不安定化しやすいです
— AI𝕏サトシ⏩ (@AiXsatoshi) May 28, 2024
短い英文試したら、こんな感じでした pic.twitter.com/M1cQ2105ud
— Lucas (@LucasChatGPT) May 28, 2024
あらら…報告ありがとうございます。4kトークンまでで調整したので、超短文は厳しいですね、200-500tokenぐらいが良いかもしれないです
— AI𝕏サトシ⏩ (@AiXsatoshi) May 28, 2024
Honyaku-13Bですが、デコーダーオンリーLLM翻訳なのでHallucinations出がちです。量子化すると出やすいです。
— AI𝕏サトシ⏩ (@AiXsatoshi) May 28, 2024
あと、プロンプトに{ }の記号要らないです。わかりにくくてすみません。
入力文の長さで性能変わること確認してます。短過ぎても長過ぎても不安定化しやすいので良い長さ探すと良いです
短文でstopが不安定みたいです。その場合、stopping criteriaで<NL>を設定してください
— AI𝕏サトシ⏩ (@AiXsatoshi) May 28, 2024
単語や短文より、段落など数百tokenに調整してます。よろしくお願いします
— AI𝕏サトシ⏩ (@AiXsatoshi) May 28, 2024
さらに、全体的な解説ポストも投稿していただき感謝です。
従来の翻訳モデルだと、1文とかで調整してるので、文全体に注意を向けられるLLMの良さが出にくいと思う
— AI𝕏サトシ⏩ (@AiXsatoshi) May 28, 2024
ローカルLLMでの翻訳であれば、文全体をみて翻訳する長文一気の翻訳、最低でも段落レベルでプロンプトに入れて翻訳するのがベストと信じてる
LLM翻訳は、会話文と論説文も全体みて翻訳します
さらに、さらに、実行イメージまでもポストしてもらえてます。
Honyaku-13bの翻訳イメージです
— AI𝕏サトシ⏩ (@AiXsatoshi) May 28, 2024
文全体に注意を向けられるというLLM翻訳の良さを生かすため、1段落~数段落の一気にプロンプトに入れて翻訳をすることを推奨してます pic.twitter.com/pUxszsWWyW
Honyaku-13bの翻訳は、文全体をみて翻訳します
— AI𝕏サトシ⏩ (@AiXsatoshi) May 28, 2024
会話文は一つのシーン全てをプロンプトに入れて翻訳してください
LLMは文全体に注意を向けるため、会話口調や、シーンを通した一貫性を保とうとします pic.twitter.com/LCjmi06rJh
以上のように、そこそこの長さの文章を翻訳することがメインということなので、CLIで試すのは諦めて、Gradioを使うスクリプトでやってみました。Gradio & translation でgoogle検索したら、雛形として使えそうなスクリプトがでてきたので、そちらをちょこちょこと改変してみました。
その結果動いてくれたのが下の通りです。NHKの英語ニュースを訳してもらった例です。
mlx_lm とGradioで AI𝕏サトシ⏩ さんの@AiXsatoshi
— Lucas (@LucasChatGPT) May 28, 2024
の aixsatoshi/Honyaku-13b をお試し~
NHKのニュース記事の翻訳#mlx #Gradio pic.twitter.com/dJbPq4WW4q
上で走らせたスクリプトは下記の通りです。streaming生成と、一括生成の両方をfnで定義してますので、お好きな方を使ってみてください。
import gradio as gr
from mlx_lm import load, generate
import mlx.core as mx
from mlx_lm.utils import load, generate_step
model, tokenizer = load("aixsatoshi/Honyaku-13b")
stop_words = ["<NL>","</s>"]
def translate(text):
prompt = f"<english>: {text} <NL>\n\n<japanese>:"
response = generate(model, tokenizer, prompt, max_tokens=4096, top_p=0.95, temperature=0.6)
return response
def translatestream(text):
tokens = []
skip = 0
prompt = f"<english>: {text} <NL>\n\n<japanese>:"
for (token, prob), n in zip(generate_step(mx.array(tokenizer.encode(prompt)), model, temp=0.6, top_p=0.95,),
range(4096)):
if token == tokenizer.eos_token_id:
break
tokens.append(token)
text = tokenizer.decode(tokens)
trim = None
for sw in stop_words:
if text[-len(sw):].lower() == sw:
# definitely ends with a stop word. stop generating
return
else:
# if text ends with start of an end word, accumulate tokens and wait for the full word
for i, _ in enumerate(sw, start=1):
if text[-i:].lower() == sw[:i]:
trim = -i
# flush text up till trim point (beginning of stop word)
yield text[skip:trim]
demo = gr.Interface(
fn=translatestream,
inputs=[
gr.components.Textbox(label="Text", lines=20),
],
outputs=["text"],
examples=[["Building a translation demo with Gradio is so easy!"]],
cache_examples=False,
title="aixsatoshi/Honyaku-13b",
description="This demo is a simplified version of the original [NLLB-Translator](https://huggingface.co/spaces/Narrativaai/NLLB-Translator) space"
)
demo.launch()
ちなみに、不勉強で、Gradioの画面の翻訳出力の下に表示されるFlagって何かが分かってません(汗
量子化される mlx形式 には変換せずに、そのまま使っていますので、上の動画ぐらいのスピードです。
短文が苦手とのことなので、会話を楽しむ用途でのLLMの英語出力に用いるのはちょっと難しいのかなという感想です。
そうではあっても、随分前に使ったことのあるロゴヴィスタとかの翻訳ソフトと比べて、手元でこんなに綺麗な日本語で翻訳できるという進歩はすごい時代だなぁと思っています。
#AI #AIとやってみた #やってみた #ローカルLLM #大規模言語モデル #翻訳 #huggingface
いいなと思ったら応援しよう!
![Lucas](https://assets.st-note.com/production/uploads/images/107879020/profile_1a18442658444d51682a0e9f99ec2cbd.jpeg?width=600&crop=1:1,smart)