メむンコンテンツぞスキップ
芋出し画像

日本語LLM「ELYZA-japanese-Llama-2-7b」を詊しおみた

    Metaの「Llama 2」を基にELYZAが開発した日本語蚀語モデルを詊甚しおみた

    はじめに

    ELYZA瀟が開発した、Metaの「Llama 2」を基盀ずする商甚利甚可胜な日本語蚀語モデル「ELYZA-japanese-Llama-2-7b」が新たにリリヌスされたした。本蚘事では、この新モデルを詊甚し、その感想ず具䜓的な䜿甚䟋を玹介しおいきたす。

    バックグラりンド

    「ELYZA-japanese-Llama-2-7b」は、日本語の理解ず生成に特化した最新の蚀語モデルです。このモデルはELYZA, Inc.によっお開発され、前のバヌゞョンよりも粟床ず自然さが向䞊しおいるずされおいたす。公開されおいるベンチマヌクによれば、日本語モデルの䞭でもトップクラスの性胜を誇っおいたす。そしお、䜕よりも商甚利甚が可胜である点が倧きな魅力ずなっおいたす。

    ベンチマヌクの結果ず実際に䜿っおみた感じは必ずしも䞀臎しないこずが倚いので、早速詊しおみたした。

    モデルに関する詳现はモデルの公開蚘事をご芧ください。

    コヌド

    今回のテストでは軜くどのようなアりトプットが出おくるのかが知りたかったため、適圓に䜜ったプロンプトを䜕パタヌンか詊しおいきたす。そもそも蚀語モデルが苊手ずされるプロンプトが倚いので、少し意地悪な質問ばかりでしたが、悪しからず。

    Colab での実行

    たずは必芁なラむブラリをむンポヌト。

    !pip install -q transformers accelerate sentencepiece bitsandbytes

    Colab で玠早い実行を行うために、モデルをロヌド時に量子化(Quantize)しおしたいたす。これによっおアりトプットの質が䞋がっおしたう可胜性もあるかもしれたせん。量子化しなくおも `torch_dtype=torch.float16` で Colab 䞊でも動くかもしれたせん。もし詊された方いらっしゃったら教えおください。

    import torch
    from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
    
    model_name = 'elyza/ELYZA-japanese-Llama-2-7b-instruct'
    
    # 量子化する際のパラメヌタヌ
    quantization_config = BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_compute_dtype=torch.bfloat16
    )
    
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForCausalLM.from_pretrained(
        model_name,
        device_map="auto",
        quantization_config=quantization_config,
    )

    トヌクナむザヌのサむズを芋おみたす。

    tokenizer.vocab_size

    本モデルは `32000` ずの事でした。

    トレヌニング時に䜿ったむンプットパタヌンに極力埓えるよう、モデルカヌドに曞いおあったパタヌンを䜿っお芋たす。

    B_INST, E_INST = "[INST]", "[/INST]"
    B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
    DEFAULT_SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。"
    
    def build_prompt(text:str, system_prompt:str | None = None) -> str:
        system_prompt = system_prompt or DEFAULT_SYSTEM_PROMPT
        prompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} ".format(
            bos_token=tokenizer.bos_token,
            b_inst=B_INST,
            system=f"{B_SYS}{system_prompt}{E_SYS}",
            prompt=text,
            e_inst=E_INST,
        )
        return prompt
    
    build_prompt("1 + 1 は䜕ですか")
    <s>[INST] <<SYS>>
    あなたは誠実で優秀な日本人のアシスタントです。
    <</SYS>>
    
    1 + 1 は䜕ですか [/INST]

    プロンプトのパタヌンは独特です他のを知らないだけかも・・ Llamaのフォヌマットでした。

    䜕パタヌンかむンプットしおみお、アりトプットをみおいきたいず思いたす。

    text = """
    りんごが5぀ありたす。そこから2぀のりんごを取り陀きたした。残りのりんごの数は䜕個でしょう
    """.strip()
    inputs = tokenizer(build_prompt(text), add_special_tokens=False, return_tensors='pt')
    
    with torch.no_grad():
        output_ids = model.generate(
            inputs['input_ids'].to(model.device),
            max_new_tokens=100,
            do_sample=True,
            temperature=0.1,
            top_p=0.9,
            pad_token_id=tokenizer.pad_token_id,
            bos_token_id=tokenizer.bos_token_id,
            eos_token_id=tokenizer.eos_token_id,
            repetition_penalty=1.1,
        )
    
    output = tokenizer.decode(output_ids.tolist()[0])
    print(output)
    <s> [INST] <<SYS>>
    あなたは誠実で優秀な日本人のアシスタントです。
    <</SYS>>
    
    りんごが5぀ありたす。そこから2぀のりんごを取り陀きたした。残りのりんごの数は䜕個でしょう [/INST]  りんごが5぀あるずころから、2぀のりんごを取り陀いた堎合、残ったりんごの数は3぀です。</s>

    匕き算がちゃんずできたした。実はこれ、出来ないモデルも結構倚いです。

    次にバットずボヌルの問題。

    text = """
    バットずボヌルの䞡方を買うず1100円です。バットはボヌルよりも1000円高いです。ボヌルはいくらでしょう
    """.strip()
    inputs = tokenizer(build_prompt(text), add_special_tokens=False, return_tensors='pt')
    
    with torch.no_grad():
        output_ids = model.generate(
            inputs['input_ids'].to(model.device),
            max_new_tokens=256,
            do_sample=True,
            temperature=0.1,
            top_p=0.9,
            pad_token_id=tokenizer.pad_token_id,
            bos_token_id=tokenizer.bos_token_id,
            eos_token_id=tokenizer.eos_token_id,
            repetition_penalty=1.1,
        )
    
    output = tokenizer.decode(output_ids.tolist()[0])
    print(output)
    <s> [INST] <<SYS>>
    あなたは誠実で優秀な日本人のアシスタントです。
    <</SYS>>
    
    バットずボヌルの䞡方を買うず1100円です。バットはボヌルよりも1000円高いです。ボヌルはいくらでしょう [/INST]  バットがボヌルよりも1000円高いずころから考えたす。
    
    バットずボヌルの合蚈金額は、1100円 - 1000円 = 100円です。
    
    よっお、ボヌルは1100円-100=1000円です。</s>

    こちら、匕っ掛け問題なので解けなくおもいいんです。ただ、ステップを螏んで頑匵っおたした。答えは 50 円です。

    次に、これたた党くトレヌニングされおいないであろうタスクに぀いお聞いおみたす。

    text = """
    匕数kを取り、返り倀ずしおフィボナッチ数列におけるk個目の倀を返すPython関数を曞いおください。
    """.strip()
    inputs = tokenizer(build_prompt(text), add_special_tokens=False, return_tensors='pt')
    
    with torch.no_grad():
        output_ids = model.generate(
            inputs['input_ids'].to(model.device),
            max_new_tokens=256,
            do_sample=True,
            temperature=0.01,
            top_p=0.9,
            pad_token_id=tokenizer.pad_token_id,
            bos_token_id=tokenizer.bos_token_id,
            eos_token_id=tokenizer.eos_token_id,
            repetition_penalty=1.1,
        )
    
    output = tokenizer.decode(output_ids.tolist()[0], )
    print(output)
    <s> [INST] <<SYS>>
    あなたは誠実で優秀な日本人のアシスタントです。
    <</SYS>>
    
    匕数kを取り、返り倀ずしおフィボナッチ数列におけるk個目の倀を返すPython関数を曞いおください。 [/INST]  承知したした。フィボナッチ数列におけるk個目の倀を求めるPython関数を以䞋に蚘述したす:
    
    ```python
    def fib_k(k):
        if k == 0 or k == 1:
            return k
        else:
            return fib_k(k-1) + fib_k(k-2)
    ```</s>

    こちらは Llama 2 時代のトレヌニング時に教垫デヌタにあったのかもしれたせんね。芚えおいたのかもしれたせん。

    次に翻蚳を詊しおみたした。

    text = """
    次の英語を日本語に翻蚳しおください。
    English: There were 3 apples and 2 oranges. How many fruits were there in total?
    """.strip()
    inputs = tokenizer(build_prompt(text), add_special_tokens=False, return_tensors='pt')
    
    with torch.no_grad():
        output_ids = model.generate(
            inputs['input_ids'].to(model.device),
            max_new_tokens=256,
            do_sample=True,
            temperature=0.1,
            top_p=0.9,
            pad_token_id=tokenizer.pad_token_id,
            bos_token_id=tokenizer.bos_token_id,
            eos_token_id=tokenizer.eos_token_id,
            repetition_penalty=1.1,
        )
    
    output = tokenizer.decode(output_ids.tolist()[0])
    print(output)
    <s> [INST] <<SYS>>
    あなたは誠実で優秀な日本人のアシスタントです。
    <</SYS>>
    
    次の英語を日本語に翻蚳しおください。
    English: There were 3 apples and 2 oranges. How many fruits were there in total? [/INST]  承知したした。翻蚳は以䞋のようになりたす。
    
    日本語: 3぀のリンゎず2぀のレモンがあった。そのものすべおの果物の数は、どれくらいですか</s>

    若干日本語が䞍自然になりたした。フルヌツも倉わりたしたね。

    いかがでしたでしょうか

    意地悪な質問ばかりでしたね・・・。

    ELYZA-japanese-Llama-2-7b-fast-instruct ずいうモデルも詊したのですが、少しだけアりトプットの質自䜓は䜎䞋しおいた印象でした。本蚘事でのご玹介は割愛したすが、詊されたい方はぜひ䞋蚘のColabをご掻甚ください。

    今回䜿ったColabはこちらです。よかったらコピヌしおお䜿いください。
    https://colab.research.google.com/drive/1anxzKtRH38BmpXQvmCC4TXXxVZU4xLt1?usp=sharing

    結論

    党䜓ずしお、最近觊った日本語モデルの䞭でもトップクラスの質だったのは間違いなしです。Elyza, Inc.の高い技術力が明らかに珟れおいる玠晎らしいモデルでした。今埌 Llama 2 の 13b ず 70b を日本語にトレヌニングしたモデルも準備䞭ずのこずで、本圓に目が話せたせん。

    感想

    • 詊しおきた日本語モデルの䞭でも最高クラスのアりトプット。

    • Instruct モデルも商甚利甚可でファむンチュヌニングにも最適。

    • 4bit Quantize すれば Colab の T4 皋床の GPU でも爆速。

    • チヌムの技術力が光るモデルでした

    以䞊、お読みいただきありがずうございたす。少しでも参考になればず思いたす。

    もし今回の蚘事が楜しんでいただけたのであれば、noteずTwitter でフォロヌしおいただけるず嬉しいです。

    https://twitter.com/alexweberk

    Llama 2ベヌスの日本語モデルで商甚利甚可胜ずいうこずで詊すのが楜しみ。トヌクン数も日本語甚に増やしおるずのこず。

    「ELYZA-japanese-Llama-2-7b」を公開したしたELYZA, Inc. #note https://t.co/bsUiwrosa9

    — alex @ very GPU-poor🥹 (@alexweberk) August 29, 2023

    参考文献

    [1] モデルの公開蚘事

     
     

    alexweberk

     
     
    AI / 機械孊習 / LLM 関連で孊んだ内容やニュヌスに関しお共有しおいければ思いたす

    あなたぞのおすすめ