見出し画像

Phi-3をMacBookM1ローカル環境で実行した話

最近、AI技術の進化とともに、ローカルで動作する大規模言語モデル(LLM)の需要が高まっています。

特に開発者や研究者の間で、クラウドではなくローカル環境でAIモデルを実行することに関心が集まっています。この背景から、本記事では、Microsoftが開発したローカルLLM「Phi-3」をM1搭載のMacで動かすことができたので記事にします。


ローカルLLMとは?そのメリットとは?
ローカルLLMとは、インターネットを介さずに個人のコンピュータ上で直接実行される大規模言語モデルのことを指します。これにより、
プライバシーの保護
レイテンシの削減
インターネット接続の不要性

などの利点があります。

学校教員経験者の立場の意見として、
成績処理など機密性がもとめられるシーンにおいてクラウドベースの生成AIよりもローカルLLMは「プライバシー保護」の観点で有用と考えられます。

ここでPhi-3の特徴についてまとめます。

MicrosoftのローカルLLM(Phi-3)の特徴

Phi-3は、Microsoftによって開発されたローカルで実行可能な大規模言語モデルです。
自然言語理解(NLU)自然言語生成(NLG)のタスクにおいて高い性能を発揮します。特に、プログラミング言語の理解やコード生成において優れた能力を持っています。

実行環境

今回の実験では、以下の環境を使用しました。

  • ハードウェア: M1搭載のMacBook

  • ソフトウェア: Cursor(AI対応のIDE)

使用したモデルとモジュール

  • モデル: mlx-community/Phi-3-mini-128k-instruct-4bit

  • モジュール:

    • torch: 機械学習ライブラリ。大規模なネットワークのトレーニングや推論に用いられます。

    • googletrans: プロンプトの入力およびアシスタントの回答を日本語に翻訳するために使用します。

実験の結果

Microsoftの公式Phi-3モデルは、MacにはNvidia製のGPUを搭載していないため直接実行することができませんでした。
device_map="cpu"
を指定することでCPU上で動作させることは可能ですが、その場合、処理に膨大な時間がかかります
特に128Kのモデルは処理が終わらない状況でした。そこで、mlx-communityの軽量版モデルを使用することで、M1MacのGPUで効率的に動作させることに成功しました。

Phi-3を動かすためのコード

以下のPythonコードは、Phi-3を実行するためのものです。

コマンドの外部実行モジュールであるsubprocessを使用しています。
即席のものなので、実行確認してみたい方は活用してみてください。
コード実行については自己責任にてお願いします

ユーザーからのプロンプトを受け取り、それを英語に翻訳した後、Phi-3モデルによるテキスト生成を行い、その結果を再び日本語に翻訳して出力します。

その他、コードの説明
・最大トークンは256文字(何文字でもOKかとおもいます)
・アシスタントの回答を整えるため、<|assistant|>以降のワードのみを抽出しています。

import subprocess
import re
from googletrans import Translator

def generate_text():
    while True:
        translator = Translator()
        user_prompt = input("プロンプトを入力してください: ")
        if user_prompt == "Exit":
            break
        translated_prompt = translator.translate(user_prompt, src='ja', dest='en').text

        command = [
            'python', '-m', 'mlx_lm.generate',
            '--model', 'mlx-community/Phi-3-mini-128k-instruct-4bit',
            '--prompt', translated_prompt,
            '--max-tokens', '256',
            '--temp', '0.0'
        ]
        result = subprocess.run(command, capture_output=True, text=True)
        
        # <|assistant|> と <|end|> の間のテキストを抽出して出力
        extracted_texts = re.findall(r'<\|assistant\|>([\s\S]*?)(?:<\|end\|>|$)', result.stdout)
        for text in extracted_texts:
            translated_text = translator.translate(text, src='en', dest='ja').text
            print(translated_text)

if __name__ == '__main__':
    generate_text()

このコードを使用することで、Phi-3モデルによる高度なテキスト生成をローカル環境で体験することができます。

実行した結果は以下の通り。
プロンプトには「日本の首都はどこですか?」と入力
ちゃんと東京と回答しています。
さらに東京の観光地を聞いてみました。
一部不自然な箇所はありますが、なんとか回答できていますね。


このように徐々に個人の端末で実行できるLLMが増えてきました。
今回用いた翻訳モジュールGoogleTrancelateはクラウドでの処理になるため、今後はtransformersライブラリを用いて日本語翻訳のローカル環境を整えることで完全にオフライン環境での生成AIでの処理が可能になるかと思います!

お読みくださりありがとうございました!!


これらの情報を参考にしました。
[1] Zenn - PyTorchをM1 MacBook のGPU(MPS)で動かす.実行時間の ... (https://zenn.dev/hidetoshi/articles/20220731_pytorch-m1-macbook-gpu)
[2] YouTube · キノコード / プログラミング学習チャンネル - 【2022最新版】M1MacにPythonの環境構築|通常のインストール ... (https://www.youtube.com/watch?v=6b6uM7Fl8ck)
[3] Qiita - Apple SiliconとPyTorchで生成系AI #Mac (https://qiita.com/satshout/items/74d067ef262bcb0733d5)
[4] note - 小規模で高性能なモデル Phi-2 をローカル環境で実行してみた (https://note.com/nyosubro/n/n163f298ba99c)

この記事が参加している募集

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