Phi-3 miniをTransformers + MacのGPUで動かしてみる

Microsoftから公開されたPhi3-miniをTransformers + MacGPUを使ってで動かしました。

Phi-3とは

Microsoftが公開している小規模言語モデルです。パラメータ数を抑えながら高い制度の回答を返すことができます。パラメータ数が少ないため、ラップトップやエッジデバイスなどで言語モデルを使うことが可能になります。

news.microsoft.com

準備

以下からモデルのダウンロードを行います。 huggingface.co

モデルをダウンロードしたら同じディレクトリに以下のコードをmain.pyとして保存します。

import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

device = torch.device('mps')

model_name = "./"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name,
                                             torch_dtype="auto", 
                                             trust_remote_code=True, 
                                            ).to(device)

def get_output(text, start_token="<|assistant|>", eos_token="<|end|>"):
    print(text)
        
    start_index = text.find(start_token)

    end_index = text.rfind(eos_token)
    if text[-len(eos_token):] != eos_token:
        end_index = -1

    return text[start_index+len(start_token):end_index].strip()

def generate_response(input_text):
    text = f'<|user|>\n{input_text}<|end|>\n<|assistant|>'
    token_ids = tokenizer.encode(text, add_special_tokens=False, return_tensors='pt').to(device)

    token_len = len(token_ids[0])
    with torch.no_grad():
        output_ids = model.generate(
            token_ids.to(model.device),
            max_new_tokens=token_len+100
        )

    output = get_output(tokenizer.decode(output_ids.tolist()[0]))
    
    return output

gr.Interface(fn=generate_response, inputs='text', outputs='text').launch()

またはTransformersの最新の開発バージョンをインストールしコードのmodel_nameを以下のように設定してください。

model_name = "microsoft/Phi-3-mini-128k-instruct"

詳細についてはPhi-3のモデルページを参照してください。

実行環境

  • OS:MacOS Sonoma
  • SoC:M3 Pro (CPU 12C GPU 18C)
  • RAM:18GB
  • Python:3.11.9
  • Torch:2.4.0dev
  • Transformers:4.40.0

実行結果

日本語と英語で試してみました。

日本語

英語

英語の回答を翻訳すると以下のようになります。

英語 翻訳

実行時のTransformersの生成速度とメモリ使用量は以下の値でした。

生成速度 メモリ使用量
4Tokens/s 13.95GB

終わりに

Phi-3は小型軽量でありながら日本語に対しても高精度なモデルだと感じました。 MacBookでローカルで動かすことができる点が非常に嬉しいです。