目安: 50分。演習の状態: 未実行 (not-run)。本文は学習ガイドであり、動作や品質の実測記録ではありません。
前提となる章: Hugging Faceとモデルファイルの読み方
独自の概念図。矢印は依存関係や判断の順序を示し、性能の実測を表さない。
- 1CPUかMLXを選ぶ
- 2依存と初回ダウンロードを確認
- 3上限付きの架空入力
- 4手動推論
- 5出力と未測定値を記録
学習目標
- CPUとMLXの二つの経路を区別して試せる
- 自動実行せずに準備と実行を分ける
仕事の役割
- 学習者: 仮説・データ・評価を設計する
- モデル: 指定した変換を試す
- アプリ: 制限・検証・権限を保証する
入力 → 工程 → 出力
| 入力 | 工程 | 出力 |
|---|---|---|
| 短い架空テキストと確認済みの小型モデル | tokenize→モデル読み込み→最大生成数を指定した推論 | 生成文、token数、実行条件、未測定を含む実験記録 |
初回は実行経路を一つだけ選ぶ
MacではMLX LMを使う経路、OSを問わず概念を確認したい場合はTransformersのCPU経路から選ぶ。Ollamaはモデル管理やローカルAPIを簡単に扱う候補、llama.cppはGGUFと推論設定を細かく扱う候補になる。最初から四つを入れる必要はない。
以下は教材用の未実行コードである。表示だけでは何もインストールされない。Pythonと実行環境が対応していること、配布元とライセンス、空きディスク、ネットワーク通信を確認してから、読者が選んだ手順のみを手動で行う。初回のfrom_pretrained/loadはモデルをダウンロードする。
CPU例は Qwenモデルカードのchat templateと生成の経路 を基に、CPUを明示して生成上限を小さくしたもの。コミュニティ変換版カード はMLX版の来歴を示し、MLX LM公式の利用資料がCLIの根拠になる。本教材ではどちらのモデルも取得・実行していない。
短い入力と出力で確認する
まず架空の製品説明の要約など、個人情報を含まない短文を使う。CPU例は0.5Bに限定し、入力512token以下、出力64token以下とする。モデル全体はCPUに置き、device_map=autoによる予期しないデバイス割り当てを避ける。速度を競うためではなく、処理経路の確認用である。
MLX例も同じ小型モデルの4bit変換版を使い、出力128tokenに制限する。入力が短くても、メモリ使用量と実行時間を観察する。終わらない、メモリプレッシャーが悪化する、応答しない場合は中止し、上位モデルへ進まない。
成功とは何かを狭く定義する
成功はモデルIDと設定を記録できたこと、短い生成が返ったこと、資源消費を観察できたことである。回答が正しいか、日本語用途で十分か、複数利用者を捌けるかは次の評価で確かめる。未実行コードは実機確認済みと表示しない。
ローカルAPIを公開する場合も、最初は127.0.0.1のみにbindする。インターネットやLANへの公開、認証なしの利用、外部ログサービスへの送信は初回演習に含めない。ローカルアプリでもクラウド機能やtelemetryの設定は別に確認する。
手動で試すコード例
以下は未実行の例です。コピーやページの閲覧では実行されません。依存導入・モデルの初回ダウンロード・学習を伴う行は、容量、ライセンス、実行環境を確認してから自分で選んで実行してください。
環境準備:CPU経路を選ぶ場合のみ
状態: 未実行 (not-run)。
python3 -m venv .venv
source .venv/bin/activate
python -m pip install torch transformers
python -m pip freeze > environment-cpu.txt公式PyPIの依存導入を伴う。版は実行時に記録し、再現実験では検証済み環境を固定する。
Transformers CPUの最小推論
状態: 未実行 (not-run)。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
model_id = "Qwen/Qwen2.5-0.5B-Instruct"
torch.set_num_threads(4)
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=False)
model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=False).to("cpu")
model.eval()
messages = [{"role": "user", "content": "架空の製品説明です。青いノートは80ページです。一文で要約してください。"}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt")
assert inputs["input_ids"].shape[-1] <= 512, "入力が長すぎます"
with torch.inference_mode():
output = model.generate(**inputs, max_new_tokens=64, do_sample=False)
new_tokens = output[0, inputs["input_ids"].shape[-1]:]
print(tokenizer.decode(new_tokens, skip_special_tokens=True))
print({"input_tokens": inputs["input_ids"].shape[-1], "output_tokens": len(new_tokens)})CPU上のfloat型・最適化はライブラリ版に依存。最新mainを再現可能な版だと思わず、初回検証後にrevisionを固定する。
Apple Silicon:MLX経路を選ぶ場合のみ
状態: 未実行 (not-run)。
python3 -m venv .venv-mlx
source .venv-mlx/bin/activate
python -m pip install mlx-lm
mlx_lm.generate --help
mlx_lm.generate --model mlx-community/Qwen2.5-0.5B-Instruct-4bit --prompt "青いノートは80ページです。一文で要約してください。" --max-tokens 128
python -m pip freeze > environment-mlx.txtApple Silicon対応環境が必要。公開モデルIDを指定しているため初回はダウンロードする。全行を自動実行するUIにしない。
自分で進める工程
- 公式Python環境と対応OSを確認する
- 専用venvを用意する
- CPUかMLXを一つ選んで依存関係を導入する
- コードを読み、初回ダウンロードを理解して実行する
- 環境のpackage一覧とモデルrevisionを保存する
品質を確認する
- CPUとMLXの二つの経路を区別して試せる
- 自動実行せずに準備と実行を分ける
- 「実行できた」と「正確だった」を別欄にしたか
失敗を切り分ける
| 注意すること | 具体的な確認方法 |
|---|---|
| この教材作成時には実行していない | 自分で実行して環境と出力を残すまでは、未実行の例として扱う。 |
| エラー時に不明なインストールスクリプトやremote codeを追加しない | モデルと公式ランタイムの要件を確認し、不明なコードは実行を許可する前に読む。 |
演習: 小さなLLMをローカルで動かす
状態: 未実行 (not-run)。
同じ短文を要約させ、事実を足したか・省きすぎたかを目視で確認する
提出するもの: 原文、出力、モデル情報、設定、観察記録
完了の確認: 「実行できた」と「正確だった」を別欄にしたか
実験記録用ワークシートに計画・条件・観察を記録する。未測定値は null とし、推定値は式と仮定を残します。
MENTAL MODEL / メモリ
モデルの重さを、分けて考える。
重みとKVキャッシュは別々に増える。下の値は設計用の概算です。
GBは10⁹ byte。KVは32層・8 KV heads・128 head dim・FP16・batch 1の仮定。量子化メタデータ、実行バッファ、OS、モデル固有の構造は別途必要。MoEでは総重みとactive parametersを分けます。
出典
公開日は資料の日付、確認日は内容を参照した日です。コミュニティの観測は公式の確定事項と区別します。
01