Axcxeptが公開している「Llama-3.1-8B-EZO-1.1-it」をGradioを使ってローカルで使用する

はじめに

「Llama-3.1-8B-EZO-1.1-it」は日本語性能向上のためにLlama3.1-8Bをファインチューニングしたモデルです。

こちらになります。
huggingface.co

今のところLlama3.1の小さいモデル(8B)で日本語性能を向上させたものは少ないです。

さっそくGradioから使ってみました。

Pythonスクリプト

import gradio as gr
from transformers import pipeline, TextIteratorStreamer
from threading import Thread
import torch

system_prompt_text = "あなたは誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、原則日本語で回答してください。"
init = {
    "role": "system",
    "content": system_prompt_text,
}

model_id = "AXCXEPT/Llama-3.1-8B-EZO-1.1-it"

generator = pipeline(
    "text-generation",
    model=model_id,
    device_map="auto",
    torch_dtype=torch.bfloat16
)
streamer = TextIteratorStreamer(generator.tokenizer, skip_prompt=True, skip_special_tokens=True)

def call_llm(
    message: str,
    history: list[dict],
    max_tokens: int
):
    history_openai_format = []
    if len(history) == 0:
        history_openai_format.append(init)
        history_openai_format.append({"role": "user", "content": message})
    else:
        history_openai_format.append(init)
        for human, assistant in history:
            history_openai_format.append({"role": "user", "content": human})
            history_openai_format.append({"role": "assistant", "content": assistant})
        history_openai_format.append({"role": "user", "content": message})

    params = {
        "max_new_tokens": max_tokens,
        "streamer": streamer,
        "pad_token_id": generator.tokenizer.eos_token_id
    }

    thread = Thread(target=generator, kwargs=dict(text_inputs=history_openai_format, **params))

    thread.start()

    generated_text = ""
    for new_text in streamer:
        generated_text += new_text
        yield generated_text

demo = gr.ChatInterface(
    fn=call_llm,
    title="Axcxept Llama-3.1-8B-EZO-1.1-it",
    stop_btn="Stop Generation",
    cache_examples=False,
    additional_inputs_accordion=gr.Accordion(
        label="Parameters", open=False, render=False
    ),
    additional_inputs=[
        gr.Slider(
            minimum=1,
            maximum=4096,
            step=1,
            value=512,
            label="Max tokens",
            visible=True,
            render=False,
        )
    ],
)
demo.launch(share=False)

結果

それなりの答えを返してくれました。

ただし、小規模モデルなので知識を問う質問には弱いようです。
山梨県の観光名所を質問しましたが、回答は間違いが多いです。

時々日本語がおかしい時もありました。

感想

個人的にはサイバーエージェントが公開している「CyberAgentLM3-22B-Chat」の方が良いように感じました。
touch-sp.hatenablog.com
モデルの規模が影響していると思います。