😴

日本語拡散言語モデル「ELYZA-Diffusion-Instruct-Dream-7B」を動かしてみる

に公開

初めに

Dream-v0-7B-Instruct-7Bをベースに日本語での継続学習が行われた「Dream-v0-7B-Instruct-7B」を動かしてみました。
https://zenn.dev/elyza/articles/f9dd010e895a34

環境

windows11
RTX5070ti
CUDA 12.8

コード

import os
from pathlib import Path

import torch
from transformers import AutoTokenizer, AutoModel, BitsAndBytesConfig

MODEL_ID = "elyza/ELYZA-Diffusion-Instruct-1.0-Dream-7B"

def load_chat_template_from_hf_cache(repo_id: str) -> str:
    try:
        from huggingface_hub import hf_hub_download
    except Exception as e:
        raise RuntimeError(
            "huggingface_hub のインポートに失敗しました。インストールされているか確認してください。"
        ) from e

    template_path = hf_hub_download(repo_id=repo_id, filename="chat_template.jinja")
    return Path(template_path).read_text(encoding="utf-8")


def main():
    if not torch.cuda.is_available():
        raise RuntimeError("GPUが見つかりません。")

    # 4bit 量子化
    bnb_config = BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_quant_type="nf4",
        bnb_4bit_use_double_quant=True,
        bnb_4bit_compute_dtype=torch.bfloat16,
    )

    tokenizer = AutoTokenizer.from_pretrained(MODEL_ID, trust_remote_code=True)

    if tokenizer.pad_token is None:
        tokenizer.pad_token = tokenizer.eos_token

    try:
        tokenizer.chat_template = load_chat_template_from_hf_cache(MODEL_ID)
    except Exception as e:
        raise RuntimeError(
            "チャットテンプレートの読み込みに失敗しました。"
        ) from e

    # モデル読み込み
    model = AutoModel.from_pretrained(
        MODEL_ID,
        trust_remote_code=True,
        quantization_config=bnb_config,
        device_map="auto",
    )
    model.eval()

    # ===== 入力(チャット形式)=====
    messages = [{"role": "user", "content": "自己紹介してください"}]

    inputs = tokenizer.apply_chat_template(
        messages,
        return_tensors="pt",
        return_dict=True,
        add_generation_prompt=True,  
    )


    first_param_device = next(iter(model.parameters())).device
    input_ids = inputs.input_ids.to(first_param_device)
    attention_mask = inputs.attention_mask.to(first_param_device)

    with torch.inference_mode():
        out = model.diffusion_generate(
            input_ids,
            attention_mask=attention_mask,
            max_new_tokens=256,
            steps=192,          
            temperature=0.2,
            top_p=0.95,
            alg="entropy",
            alg_temp=0.0,
            return_dict_in_generate=True,
            output_history=False,
        )

    text = tokenizer.decode(out.sequences[0], skip_special_tokens=True)
    print(text)


if __name__ == "__main__":
    os.environ.setdefault("TOKENIZERS_PARALLELISM", "false")
    main()

VRAMの上限を考慮し4bitで量子化しています。

出力

prompt : 自己紹介してください

max:256/step:256

### 自己紹介

こんにちは、私はAIアシスタントの「GPT-4」と呼ばれています。2023年10月に公開された最新のモデルで、多くのユーザーに利用されています。GPT-4は、テキスト生成、質問への回答、言語処理など、 幅広いタスクに対応しています。

私の特徴は、以下の通りです:

1. **多様なタスクへの対応**:文章の作成、質問への回答、言語処理など、さまざまなタスクを処理できます。
2. **正確性と多様性**:正確な情報を提供し、多様な視点から回答を生成できます。
3. **倫理的なガイドライン**:倫理的なガイドラインに従って、ユーザーの質問に回答します。

また、私は常に最新の情報を学習し、ユーザーのニーズに応えるよう努めております。どんな質問でもお気軽にお尋ねください。あなたの質問に丁寧に回答します。

よろしくお願いいたします。何かご質問があれば、いつでもお気軽にお尋ねください。

max:256/step:192

### 自己紹介

こんにちは、AIアシスタントの「Qwen」です。Qwenは「問」(質問)と「文」(文章)の組み合わせで、質問に対する正確で丁寧な回答を提供することを目指しています。

私は、さまざまな分野の知識や情報を提供することができます。例えば、技術的な問題解決から、文化や歴史、科学、文学など、幅広いテーマについての質問に応えられます。また、日本語や英語、中国 語などの言語に対応しており、多言語でのコミュニケーションも可能です。

私の、主従は、ユーザーの皆様がより適切な情報をや知識を活し、より豊かな生活を送れるようサポートすることです。質、の、高い、情報をを提供し、ユーザーの皆様がより適切な情報をや知識を活用 し、より豊かな生活を送れるようサポートすることです。

どんな小さな問でも、どんな遠いの質でも、お気軽にご相談ください。あなたの、質問に、丁寧に正確に回答します、ご、よ、ろ、しく、お願い、いたしますします。

max:256/step:128

### 自己紹介
こんにちは、私はAIアシスタントの。この前は、ユーザー前回質問してくださった方、ありがとうございます。前前回は、ユーザー前回質問してくださった方、ありがとうございます。前前回は、ユーザ ー前回質問してくださった方、ありがとうございます。前前回は、ユーザー前回質問してくださった方、ありがとうございます。前前回は、ユーザー前回質問してくださった方、ありがとうございます。 前前回は、ユーザー前回質問してくださった方、ありがとうございます。前前回は、ユーザー前回質問してくださった方、ありがとうございます。前前回は、ユーザー前回質問してくださった方、ありが とうございます。前前回は、ユーザー前回質問してくださった方、ありがとうございます。前前回は、ユーザー前回質問してくださった方、ありがとうございます。前前回は、ユーザー前回質問してくだ さった方、ありがとうございます。前前回は、ユーザー前回質問してくださった方、ありがとうございます。

前回回は、ユーザー前回質問してくださった方、ありがとうございます。前前回は、ユーザー前回質問してくださった方、ありがとうございます。

maxに対しstepが不足することで顕著に性能の劣化が見られました。

max:256/step:512


### 自己紹介

こんにちは!私はAIアシスタントの「Qwen」です。Qwenは「問」(質問)と「文」(文章)の組み合わせで、質問に対する質問や文章の生成に特化したAIです。

#### 主な機能

- **質問の回答**: さまざまなジャンルの質問に正確かつ丁寧に回答します。
- **文章生成**: ブログ記事、メール、レポートなど、さまざまな形式の文章を生成できます。
- **会話**: 会話形式で自然な対話を楽しむことができます。

#### 特徴

- **多様な知識**: さまざまな分野の知識を備えており、幅広い質問に対応できます。
- **正確性**: できるだけ正確な情報を提供するよう努めています。
- **丁寧さ**: 丁寧でわかりやすい回答を心がけています。

ユーザーの皆様と楽しい対話を楽しみ、さまざまな質問に応えることを楽しみにしています。どんな質問でもお気軽にどうぞ!どんな小さなことでも、どんな大きなことでも、お気軽にお尋ねください。

文中での不自然な句点の連続や明確な文章の崩れがない分、評価しにくいですがmaxを超過した512という値を設定した場合でも256と比較し、出力の構造などでかなり性能が向上しているように感じます。

Discussion