見出し画像

WSL2でPhi-3.5-mini-instructを試してみる

「Phi-3 に使用されるデータセット (合成データとフィルタリングされた公開 Web サイト) に基づいて構築された軽量で最先端のオープンモデルで、非常に高品質で推論用の高密度データに重点​​を置いた」らしいPhi-3.5-miniのinstructモデルを試してみます。

使用するPCはドスパラさんの「GALLERIA UL9C-R49」。スペックは
・CPU: Intel® Core™ i9-13900HX Processor
・Mem: 64 GB
・GPU: NVIDIA® GeForce RTX™ 4090 Laptop GPU(16GB)
・GPU: NVIDIA® GeForce RTX™ 4090 (24GB)
・OS: Ubuntu22.04 on WSL2(Windows 11)
です。


1. 準備

環境構築

python3 -m vevn phi3.5
cd $_
source bin/activate

パッケージのインストールです。

pip install torch transformers accelerate

2. モデルの設定ファイルのなかみ

コンテキスト長を見てみましょう。

config.json · microsoft/Phi-3.5-mini-instruct

  "max_position_embeddings": 131072,

ロープスケーリングを使用して、131,072 = 128 k のようです。

3. 流し込むコード

では、いつものコードです。query.pyという名前で保存した想定で以下進めます。

import sys
import argparse
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
from typing import List, Dict
import time

# argv
parser = argparse.ArgumentParser()
parser.add_argument("--model-path", type=str, default=None)
parser.add_argument("--tokenizer-path", type=str, default=None)
parser.add_argument("--no-chat", action='store_true')
parser.add_argument("--no-use-system-prompt", action='store_true')
parser.add_argument("--max-tokens", type=int, default=256)

args = parser.parse_args(sys.argv[1:])

model_id = args.model_path
if model_id == None:
    exit

is_chat = not args.no_chat
use_system_prompt = not args.no_use_system_prompt
max_new_tokens = args.max_tokens

tokenizer_id = model_id
if args.tokenizer_path:
    tokenizer_id = args.tokenizer_path

# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(
    tokenizer_id,
    trust_remote_code=True
)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype="auto",
    #torch_dtype=torch.bfloat16,
    device_map="auto",
    #device_map="cuda",
    low_cpu_mem_usage=True,
    trust_remote_code=True
)
#if torch.cuda.is_available():
#    model = model.to("cuda")

streamer = TextStreamer(
    tokenizer,
    skip_prompt=True,
    skip_special_tokens=True
)

DEFAULT_SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。"


def q(
    user_query: str,
    history: List[Dict[str, str]]=None
) -> List[Dict[str, str]]:
    # generation params
    generation_params = {
        "do_sample": True,
        "temperature": 0.8,
        "top_p": 0.95,
        "top_k": 40,
        "max_new_tokens": max_new_tokens,
        "repetition_penalty": 1.1,
    }
    #
    start = time.process_time()
    # messages
    messages = ""
    if is_chat:
        messages = []
        if use_system_prompt:
            messages = [
                {"role": "system", "content": DEFAULT_SYSTEM_PROMPT},
            ]
        user_messages = [
            {"role": "user", "content": user_query}
        ]
    else:
        user_messages = user_query
    if history:
        user_messages = history + user_messages
    messages += user_messages
    # generation prompts
    if is_chat:
        prompt = tokenizer.apply_chat_template(
            conversation=messages,
            add_generation_prompt=True,
            tokenize=False
        )
    else:
        prompt = messages
    input_ids = tokenizer.encode(
        prompt,
        add_special_tokens=True,
        return_tensors="pt"
    )
    print("--- prompt")
    print(prompt)
    print("--- output")
    # 推論
    output_ids = model.generate(
        input_ids.to(model.device),
        streamer=streamer,
        **generation_params
    )
    output = tokenizer.decode(
        output_ids[0][input_ids.size(1) :],
        skip_special_tokens=True
    )
    if is_chat:
        user_messages.append(
            {"role": "assistant", "content": output}
        )
    else:
        user_messages += output
    end = time.process_time()
    ##
    input_tokens = len(input_ids[0])
    output_tokens = len(output_ids[0][input_ids.size(1) :])
    total_time = end - start
    tps = output_tokens / total_time
    print(f"prompt tokens = {input_tokens:.7g}")
    print(f"output tokens = {output_tokens:.7g} ({tps:f} [tps])")
    print(f"   total time = {total_time:f} [s]")
    return user_messages

4. 試してみる

起動します。

CUDA_VISIBLE_DEVICES=0 python -i ~/scripts/query.py \
    --model-path microsoft/Phi-3.5-mini-instruct \
    --max-tokens 131072

いつも通りに聞いてみます

>>> history = q("ドラえもんとはなにか")
--- prompt
<|system|>
あなたは誠実で優秀な日本人のアシスタントです。<|end|>
<|user|>
ドラえもんとはなにか<|end|>
<|assistant|>

--- output
「ドラえもん」は、宮藤 pattern監督作のアニメテレビシリーズおよびそれを基にした多様な関連商品やコンテンツ群で知られる日本の ファンタジー・SFキャラクターです。主人公は小さな青い頭のロボットペンギン型機械「ドラえもん(Doraemon)」が持ち運ぶ時間通り 式のポケットマチです。

この物語は以下の特徴的な要素を取り入れて展開します:

1. **未来への助け**: ドラえもんはユーザーが望む場所、時間、状況に合わせて予想外の道具を現実世界に提供します。例えば、ゴムバングルのひねる力、空中飛行用のハイカウンターガネ、一発で形を変化させるワサビゲ、電球光線等々。

2. **子ども達の友情/教育性**:プロット内容は少年二人家族(ふたご家族)の成長と学習体験を重視しています。

3. **楽しみと希望**:全編共通点として明るく楽しい気分を保つ設定で、不安や心配事を克服する手段を常に示しています。

4. **反転科学技術 & Magical Realism** : Doraemon自身及び使用可能な道具は超越現実法理論と魔法風景のダブルミックスが見られま す。

5. **永久再生エネルギーナノモジュール (パピコセル): ** - Doraemonの最大の武器は"パピコセル"という無限再生エネルギー源。これによってほぼ何でも出来ると言われる奇妙だが有効な神話的存在が登場します。

6. **回文動画 (Palindromic Anime): ** – Драэмон и его спутники взаимодействуют, обсуждая различные предметы или концепции, которые следуют подчиняющемуся правилу "palindrome", где фразы или фрагменты повторяются как обратный поток.

7. **国際象徴: ** - ドラえもんは非常に親しまれる海外名誉者,被称为 'Time Traveling Cat from the Future',与西洋民众交流度数高位置。

8. **社会指向 /進歩意識**- ディレクティブベネフィットに富んだプロットと相互支援的解決方法が目立ち、健康上面白き伝統美或博覧会活动参加元素に深く根付いている。

9. **音效&舞台装置工夫: ** --アニメの表現には色彩満足されたオリジナリティが求められ、曲がる石橋を渡る歌、鬼太郎戦車軍隊の口笛沙汰等々の特別な音像模倣が利用されています。

結果として『ドラえもん』は若者志向のTV番組、後背地に据えられた教育系SF夢集として今日まで愛され続ける人気作品です。
prompt tokens = 44
output tokens = 994 (25.544429 [tps])
   total time = 38.912595 [s]

「ドラえもん」は、宮藤 pattern監督作のアニメテレビシリーズおよびそれを基にした多様な関連商品やコンテンツ群で知られる日本のファンタジー・SFキャラクターです。主人公は小さな青い頭のロボットペンギン型機械「ドラえもん(Doraemon)」が持ち運ぶ時間通り式のポケットマチです。

この物語は以下の特徴的な要素を取り入れて展開します:

1. **未来への助け**: ドラえもんはユーザーが望む場所、時間、状況に合わせて予想外の道具を現実世界に提供します。例えば、ゴムバングルのひねる力、空中飛行用のハイカウンターガネ、一発で形を変化させるワサビゲ、電球光線等々。

2. **子ども達の友情/教育性**:プロット内容は少年二人家族(ふたご家族)の成長と学習体験を重視しています。

3. **楽しみと希望**:全編共通点として明るく楽しい気分を保つ設定で、不安や心配事を克服する手段を常に示しています。

4. **反転科学技術 & Magical Realism** : Doraemon自身及び使用可能な道具は超越現実法理論と魔法風景のダブルミックスが見られます。

5. **永久再生エネルギーナノモジュール (パピコセル): ** - Doraemonの最大の武器は"パピコセル"という無限再生エネルギー源。これによってほぼ何でも出来ると言われる奇妙だが有効な神話的存在が登場します。

6. **回文動画 (Palindromic Anime): ** – Драэмон и его спутники взаимодействуют, обсуждая различные предметы или концепции, которые следуют подчиняющемуся правилу "palindrome", где фразы или фрагменты повторяются как обратный поток.

7. **国際象徴: ** - ドラえもんは非常に親しまれる海外名誉者,被称为 'Time Traveling Cat from the Future',与西洋民众交流度数高位置。

8. **社会指向 /進歩意識**- ディレクティブベネフィットに富んだプロットと相互支援的解決方法が目立ち、健康上面白き伝統美或博覧会活动参加元素に深く根付いている。

9. **音效&舞台装置工夫: ** --アニメの表現には色彩満足されたオリジナリティが求められ、曲がる石橋を渡る歌、鬼太郎戦車軍隊の口笛沙汰等々の特別な音像模倣が利用されています。

結果として『ドラえもん』は若者志向のTV番組、後背地に据えられた教育系SF夢集として今日まで愛され続ける人気作品です。

microsoft/Phi-3.5-mini-instruct

ロシア語?、中国語、いろいろ混ざっております。

この記事が気に入ったらサポートをしてみませんか?