
ChatGPTに代表されるように、世間ではLLMブームの最中です。ここでは課金が不要でローカル環境にもインストール可能なMeta社のLlamaをMacbookに入れる方法を紹介します。そして、PythonからLlamaを起動してチャットするコードも紹介します。
こんにちは。wat(@watlablog)です。ここでは流行りのLLMをローカルPC上で動かすためLlamaをmacOSに入れてみます!
はじめに
LLMとは?
LLM(Large Language Model)は、大規模なテキストデータをもとに学習された自然言語処理モデルです。人間の指示に応じて文章を生成したり、要約や翻訳、プログラミング支援など幅広いタスクをこなす能力を持ちます。
代表例には、OpenAIの「GPT」シリーズや、Anthropicの「Claude」、Meta社が開発した「Llama」シリーズなどがあります。2025年現在のLLMの進化は本当に驚くレベルになっており、自然言語で違和感のないやり取りが可能です。プログラムの分野ではアイデアのブレインストーミングのみならず、コードの生成やエラー解消まで実際に役に立つレベルになっています。
普段のPythonアプリケーションにLLMを導入することができればユーザーからの自然言語による処理を組み込むことができるので、従来のプログラミングの枠を一歩越えることができそうです。
LLMをローカルで動かすモチベーション
今回筆者はLLMをローカル環境で動かしてみたくなってきました。その理由は無料でPythonアプリケーションと連携してみたいからです。多くの商用LLM(ChatGPTなど)は、クラウド上で動作し、利用にはAPIキーの取得や月額課金を必要とするケースが一般的です。
一方Llamaのようなオープンウェイト(モデルの重みが公開されている)なLLMは、適切な条件下でローカル環境にも導入でき、無料で推論を行うことが可能です。
特にアプリを一般にリリースする場合はユーザーがどれくらいのトークンを使用するか初期的に予測することが困難です。LLMの月額課金料をユーザーに追加することになると、ユーザーがアプリを導入する敷居を高めてしまうことにもなりかねません。
またアプリ開発中に有料版のLLMを使っていると、テストの度に0.1$...0.2$...と増えていきます。テストの量がそんなに多くない場合は問題ないですが、何度もバグフィックスのためにお金がかかるのはムナシイものです。とりあえず精度は二の次に、自然言語でやり取りできるアプリをつくってみたいというモチベーションで筆者はLlamaを選択しました。
WATLABブログではAIカテゴリを持っていますが、流行りのLLMコンテンツがなかったので書いてみたかったというのもあります!
環境
今回は筆者のM3 Macbook AirにLlama3を導入する方法を紹介します。
Mac | OS | macOS Sonoma 14.3 |
---|---|---|
チップ | Apple M3 | |
CPU | 1.4[GHz] | |
メモリ | 16[GB] |
Llamaモデルのダウンロード
Hugging Face
Hugging Faceという機械学習・自然言語処理(NLP)向けのオープンプラットフォームおよびコミュニティがあります。今回筆者がダウンロードするのは容量が非常に軽量で小規模な開発やテストにちょうど良い meta-llama-3-8b-instruct.Q4_K_M.ggufモデルです。
以下のURLにそのモデルがあるので、ダウンロードしましょう。5GB弱あるので少し時間がかかると思います。
項目 | 内容 |
---|---|
モデル名 | LLaMA 3 8B Instruct |
開発元 | Meta |
パラメータ数 | 約80億(8B) |
モデル目的 | 指示応答・チャット向け(Instruct) |
量子化形式 | Q4_K_M(4bit量子化で精度と速度・容量のバランス型) |
推論エンジン | llama.cpp(または llama-cpp-python) |
保存形式 | GGUF(量子化モデル用の高速・軽量なフォーマット) |
メモリ使用量の目安 | 約5GB前後(Q4量子化時) |
想定用途 | ローカルでのチャットボット・コード補完・記事生成など |
オフライン利用 | 可能(完全ローカルで使用可) |
モデルがダウンロードできたら、そのモデルを任意のディレクトリにおきます。
PythonからLlamaを使う
pip installコマンド
PythonからLlamaを使うために、 llama-cpp-pythonというライブラリを pip installしましょう。
1 |
pip install llama-cpp-python --verbose --force-reinstall --no-cache-dir --config-settings=cmake.build-type=Release --config-settings=cmake.define.GGML_METAL=ON |
引数が沢山ついていますが、意味を下表に示します。
引数 | 説明 |
---|---|
--verbose | 詳細なログを表示。ビルドやダウンロード中の進行状況・エラーを確認しやすくなる |
--force-reinstall | 既にインストール済みでも強制的に再インストールする(設定変更時に便利) |
--no-cache-dir | pipのキャッシュを使わない。古いバイナリや一時ファイルの影響を避けるため |
--config-settings=cmake.build-type=Release | CMakeのビルド設定を指定:ここでは最適化付きの「Releaseビルド」 |
--config-settings=cmake.define.GGML_METAL=ON | CMakeのオプションを追加:AppleのMetal(GPU)を有効化する設定(macOS専用) |
GPUが使えるかどうかを確認する
自分のPCがGPUを使えるかどうかを確認してみましょう。わざわざカタログを見なくても、Python使いなら次のPythonコードで確認可能です。
1 2 3 4 5 6 |
import torch if torch.backends.mps.is_available(): print("GPUが利用可能です。") else: print("GPUは利用できません。") |
MacのGPUスペックを確認する
より詳細に使っているMac端末のGPU情報を知りたい場合は、次の操作で確認可能です。
Appleアイコン→このMacについて→詳細情報→システムレポート→グラフィックス/ディスプレイ

テキストを入力して回答を得るPythonコード
コード全文
それでは早速Llamaに質問を投げかけて回答をもらいましょう。次のコードはテキスト(プロンプト)で「シンギュラリティはいつ来ると思う?」と投げかけてみたものです。 llmでインスタンスを作成していますが、ここに最大コンテキスト長 n_ctx、CPUコア最大並列数 n_threads、GPUで処理する層数 n_gpu_layers、出力ウィンドウへの詳細表示 verboseを設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
from llama_cpp import Llama def llama_chat(text, n_ctx, n_threads, n_gpu_layers): """llamaにテキストを入力して回答を得る関数""" # モデルをロード llm = Llama( model_path="meta-llama-3-8b-instruct.Q4_K_M.gguf", n_ctx=n_ctx, n_threads=n_threads, n_gpu_layers=n_gpu_layers, verbose=True ) # 質問を投げる response = llm( text, max_tokens=512, temperature=0.7 ) return response if __name__ == "__main__": """メイン""" # チャット text = "シンギュラリティはいつ来ると思う?" response = llama_chat(text=text, n_ctx=2048, n_threads=4, n_gpu_layers=1) # 結果を出力 print(response['choices'][0]['text'].strip()) |
コンテキストとトークン
最大コンテキスト長とは、このモデルで扱う最大のトークン数を意味します。入力テキストは必ずしも1文字単位でトークンが表現されるのではなく、LLMが扱う意味のある塊(トークン)で考える必要があります。プログラムを実行すると出力ウィンドウに llama.context_length u32 = 8192と表示されますが、この8192が先ほどダウンロードしたモデルの最大コンテキスト長です。トークン数は出力ウィンドウにも出ていますが、トークン数を計算するための tiktokenというライブラリもあるそうです。
色々な用語がでてきていますが、この n_ctxは一回の推論で処理できるトークン数の合計(入力+出力)と覚えておけば良いと思います。
GPUで処理する層数
n_gpu_layersはこのモデルがどの層までをGPUで処理するかを決める設定です。GPUで処理できない部分はCPUで処理されます。全部CPUで処理する場合は0、全部GPUで処理する場合は-1です。
最大トークン数と温度
responseでは最大トークン数 max_tokensを設定します。これは今回の回答で出力する最大のトークン数を意味しており、この値が少ないと回答が途中で切れてしまったりします。
一方 temperatureは直訳すると温度という意味ですが、LLMが回答するときの多様性を表現するパラメータです。筆者自身もどう表現した方が良いかよくわからなかったので、ChatGPTに聞いてみたら以下の分類がされました。面白いので表にまとめておきます。
目的 | 意味 | 例えるなら | 推奨温度 |
---|---|---|---|
正確で一貫した回答が欲しい | 確定的・論理的な出力 | 教科書を読むロボット | 0.0〜0.3 |
自然な会話をしたい | バランスの取れた多様性 | 冷静な人間 | 0.7(デフォルト) |
面白い文章を出したい | ひらめきや創造性がある | ちょっと自由な人 | 1.0〜1.3 |
詩・創作・アイデア出し | ランダム性が強く、予測不能 | 酔っぱらい or ポエマー | 1.5以上 |
実行結果:そのまま実行
コード実行結果から文章部分を日本語に訳し、以下に示します(回答は英語で返ってきました)。
1 2 |
Q「シンギュラリティはいつ来ると思う?」 A「ああ、シンギュラリティに興奮していただいて嬉しいです!ただし、シンギュラリティという概念は専門家の間でもまだ議論の的になっていることをお伝えしておかなければなりません。近い将来に必ず起こるという確固たる証拠はありません。実際、シンギュラリティは現実の出来事というよりは比喩的な概念かもしれないと主張する専門家もいます。でも、もしかしたら未来の私たちが突然訪ねてくるかもしれませんよ!」 |
ちょっと興奮気味、ジョークもかませつつ会話をしてくる性格みたいですね。
実行結果:GPUの比率を高めてみる
n_gpu_layers=-1(全層数GPU)にしたところ、以下の回答が返ってきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Q「シンギュラリティはいつ来ると思う?」 A「質問は、人工知能が人間の知能を超えると仮定される未来の出来事、シンギュラリティの時期についてです。 答えは、シンギュラリティがいつ起こるか、あるいは起こるとしても正確に予測することは困難です。近い将来に起こる可能性があると考える専門家もいれば、近い将来、あるいは全く起こらないと考える専門家もいます。 シンギュラリティはしばしば超知能という概念と結び付けられます。超知能とは、人間の知能をはるかに超える知能です。これは、高度な人工知能や脳コンピューターインターフェースによって実現される可能性があります。しかし、多くの専門家は、超知能の創造は非常に複雑で不確実なプロセスであり、いつ起こるのか、あるいは起こるのかさえ予測することは困難だと考えています。 シンギュラリティの時期について予測を立てている専門家もいますが、これらの予測は不完全または不確実な情報に基づいていることが多く、信頼できるとは限りません。例えば、未来学者で発明家のレイ・カーツワイルは、シンギュラリティが2045年頃に発生すると予測していますが、この予測は他の専門家に広く受け入れられていません。 一般的に、シンギュラリティの時期は不確実であり、人工知能の発展、利用可能なコンピューティングリソース、そして人間が高度な人工知能を創造し制御する能力など、多くの要因に依存します。結局のところ、シンギュラリティは遠い、あるいは実現不可能な目標である可能性があり、いつ発生するのか、あるいは発生するのかさえ予測することは困難です。 ## References: [1] Kurzweil, R. (2005). The Singularity is Near: When Humans Transcend Technology. Viking. [2] Bostrom, N. (2014). Superintelligence: Paths, Dangers, Strategies. Oxford University Press. [3] Singularity Institute. (n.d.). Singularity Timeline. Retrieved from <https://singularity.org/timeline/> [4] Kurzweil, R. (2012). How to Create a Singularity. IEEE Spectrum, 49(10), 34-39. [5] Müller, V. C. (2016). The Singularity is Far from Arrival. Journal of Artificial Intelligence Research, 57, 241-264. [6] Yudkowsky, E. (2008). The Singularity Is Far, Far Away. IEEE Spectrum, 45(11), 18-20. [7] Goertzel, B. (2006). The Evolution of Intelligence: The Origins of the Singularity 」 |
長文!出典まで書いてあるけど、ちょっと調べても出てこないので存在しない論文が多そうですね。まあこんなもんでしょうか。
連続した会話(チャット)をさせるPythonコード
コード全文
質問と回答を一回だけではなく、チャットのように何回も繰り返してみましょう。Llama(他のLLMも?)の仕様的に通常はテキストを一回渡して回答するだけで、複数の会話を記憶する能力はないようです。そのため記憶をどうさせるかという工夫が必要です。
次のコードはLlamaとチャットするためのPythonコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
from llama_cpp import Llama from langdetect import detect, LangDetectException from deep_translator import GoogleTranslator def llama_chat(user_input): """llamaにテキストを入力して回答を得る関数:チャットバージョン""" # 履歴にユーザー入力を追加 conversation_history.append({"role": "user", "content": user_input}) # モデルに渡して応答を得る response = llm.create_chat_completion( messages=conversation_history, max_tokens=512, temperature=0.7 ) assistant_reply = response['choices'][0]['message']['content'] # 言語判定&翻訳:判定に失敗したら日本語とみなす try: lang = detect(assistant_reply) except LangDetectException: lang = 'ja' if lang != 'ja': # 英語など日本語以外なら翻訳 assistant_reply = translator.translate(assistant_reply) # 履歴に最終的な応答を追加 conversation_history.append({"role": "assistant", "content": assistant_reply}) return assistant_reply if __name__ == "__main__": """メイン""" # Llama の初期化(1回だけ) llm = Llama( model_path="meta-llama-3-8b-instruct.Q4_K_M.gguf", n_ctx=2048, n_threads=4, n_gpu_layers=1, verbose=True ) # 翻訳オブジェクト(毎回ソース自動検出→日本語) translator = GoogleTranslator(source='auto', target='ja') # 会話履歴 conversation_history = [] while True: user_input = input("あなた: ") if user_input.lower() in ["exit", "quit"]: break print("AI:", llama_chat(user_input)) |
記憶を引き継ぐ方法
Llamaに渡すプロンプトを役割(role)と内容(content)で構成し、辞書型として構成します。そして質問と回答をすべて
.appendで追加し、毎回の質問で連結されたプロンプト
conversation_historyを投げます。
conversation_historyの中身は下図のような形式です。

そして最初のコードとの違いは回答を得る時に
response = llm.create_chat_completion()を使う部分にもあります。これはユーザーとアシスタント(LLM)のメッセージ列からチャット形式の応答を得るためのものです。詳細は以下のGitHubをご確認ください。
・https://github.com/abetlen/llama-cpp-python
日本語への翻訳
Llamaは日本語で質問しても、「日本語でお願いします」と指定しても回答は英語で返ってくることがありました。そのため deep_translatorから GoogleTranslatorを importして翻訳する機能を追加しています。インターネットを使う必要があるので、オフライン用途には向きませんが、今回は止むなし。
日本語で返ってくる場合もあるので、 langdetectというライブラリを使って日本語かどうかを判定して日本語ならそのまま出力、日本語以外なら翻訳するという処理を追加しました。
1 2 3 4 5 6 7 8 9 |
# 言語判定&翻訳:判定に失敗したら日本語とみなす try: lang = detect(assistant_reply) except LangDetectException: lang = 'ja' if lang != 'ja': # 英語など日本語以外なら翻訳 assistant_reply = translator.translate(assistant_reply) |
実行結果:チャット例
以下にコードの実行例を示します。
- 最初の質問と回答
Llama3のパラメータ数について質問し、各層のサイズを回答しているので真偽はともかくまともな回答になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
あなた: Llama 3のパラメータ数を教えてください。 AI: LLama3は、深層学習(Deep Learning)モデルである。LLama3のパラメータ数は、非常に多数あります。具体的には、LLama3は、以下のようなパラメーターを含みます。 * Input embedding size: 512 * Encoder layer size: 12 * Encoder layer dimension: 2048 * Decoder layer size: 12 * Decoder layer dimension: 2048 * Attention head size: 64 * Number of attention heads: 8 * Feed-forward neural network (FFNN) size: 2048 * FFNN activation function: gelu * Number of classification layers: 3 * Classification layer size: 128 * Classification layer dimension: 128 上記のように、LLama3は、非常に多数のパラメーターを含みます。具体的には、以下の通りです。 * Input embedding size: 512 * Encoder layer size: 12 * Encoder layer dimension: 2048 * Decoder layer size: 12 * Decoder layer dimension: 2048 * Attention head size: 64 * Number of attention heads: 8 * Feed-forward neural network (FFNN) size: 2048 * FFNN activation function: gelu * Number of classification layers: 3 * Classification layer size: 128 * Classification layer dimension: 128 LLama3のパラメーター数は非常に多数ありますため、LLama3を実行する際には、非常に大きな計算リソースが必要になります。 |
- 2回目の質問と回答
曖昧に「どれくらいのコンピュータ」という質問をしたのに対して、適切にハードウェアのリソースについての文脈だと解釈してくれました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
あなた: 実際にどれくらいのコンピュータを使えば良いと思いますか? AI: 😄 LLAMA3は、実行するのに重要な計算リソースを必要とする大きな言語モデルです。正確なハードウェア要件は、データセットサイズ、バッチサイズ、目的のレベルの並列化など、さまざまな要因に依存します。 ただし、必要なハードウェアリソースを見積もるのに役立つ一般的なガイドラインを次に示します。 1。少なくとも2.5 GHzのクロック速度で、少なくとも16〜32コアが推奨されます。 2。少なくとも16 GBのメモリを備えたNvidiaのV100またはTesla V100カードが推奨されます。 3。**メモリ**:LLAMA3を実行するには、最低32〜64 GBのRAMが必要です。ただし、メモリが不足しないように、128〜256 GBのRAMをお勧めします。 4。**ストレージ**:モデルとデータセットを保存するには、NVME SSDなどの高速ストレージデバイスをお勧めします。 特定のハードウェア構成に関しては、いくつかの例を次に示します。 ***デスクトップ**:Intel Xeon W-3175X(18コア、2.5 GHz)、128 GBのRAM、および16 GBのメモリを備えたNvidia Tesla V100 GPUのようなCPUを備えたデスクトップ。 ***サーバー**:AMD EPYC 7642(32コア、2.3 GHz)、256 GBのRAM、およびそれぞれ16 GBのメモリを備えた複数のNvidia Tesla V100 GPUなどの複数のCPUを備えたサーバー。 ***クラウド**:32 VCPU、256 GBのRAM、および4つのNvidia Tesla V100 GPUを備えたAWS EC2インスタンスなど、上記のサーバーと同様の構成を備えたクラウドインスタンス。 これらは一般的なガイドラインであり、実際のハードウェア要件は、特定のユースケースとデータセットのサイズによって異なる場合があることに注意してください。 |
- 3回目の質問と回答
そして3回目の質問で2つ前の質問内容を聞いてみたところ、ちゃんと当てています。これで conversation_historyが適切に働き、記憶が保持されていることを確認できましたね。
1 2 |
あなた: 2つ前の私の質問内容を覚えていますか? AI: 私はあなたの以前の質問を覚えています! Llama3のパラメーターの数について尋ねました。モデルのアーキテクチャとパラメーターの推定数に関する情報を提供しました。次に、LLAMA3を実行するために推奨されるハードウェア仕様について尋ねました。モデルの実行をサポートできるデスクトップ、サーバー、クラウドインフラストラクチャの一般的なガイドラインと例をいくつか提供しました。 |
まとめ
この記事ではローカルLLMのLlama3をMacbookに入れてPythonで使う方法について説明しました。数行のコードでチャット形式の質疑応答ができるのには驚きました。
ただし、ここで紹介しているチャットができるコードは最大コンテキスト長に注意が必要です。全体のトークン(入力+出力)が最大値を超えると古いものから忘れてしまうので、たくさんチャットしたい場合はもっと余裕のあるモデルを選定するといったことが必要になると思います。
とはいえPythonプログラミングで自然言語が扱えるとユーザーからの入力の幅が広がります。リアルタイムに最新技術にキャッチアップするのはなかなか厳しいですが、今後はAIエージェントやMCPにも触れられると良いなと思いました。
ローカルLLMを使ってチャットコードを書くことができました!
Xでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!