🍎

【LLM】MLXの基本的なコードまとめ(lora,seed,Temperature設定など)

2025/03/21に公開

はじめに

この記事はMacのAI用ライブラリであるMLX-LMの基本的な使用方法をまとめたものです。
公式のreadmeには記述のないseedの設定やtemperatureの設定、その他主要パラメータの変え方をまとめています。

MLXとは

MLXはAppleが開発した、Apple siliconデバイス向けの機械学習フレームワークです。MLX-LMはこのMLXフレームワークを使用して、大規模言語モデル(LLM)のテキスト生成と微調整を行うためのPythonパッケージです。

主な特徴:

  • Hugging Face Hubとの統合により、数千のLLMを簡単に使用可能
  • モデルの量子化とHugging Face Hubへのアップロード機能
  • 低ランクおよび完全モデルの微調整サポート
  • mx.distributedによる分散推論と微調整

MLX-LMを使用することで、Apple siliconデバイス上で効率的にLLMを実行できます。

インストール方法

MLX-LMは以下のコマンドでインストールできます:

pip install mlx-lm

モデルの変換方法

モデルを使用する際は以下のコマンドでmlx用の変換を行います。
実行後のモデルはmlx-modelディレクトリに保存されます。

from mlx_lm import convert

hf_path = "mlx-community/Mistral-7B-Instruct-v0.3-4bit" #huggingFaceのリポジトリ名を設定
q_bits = 8 #量子化ビット数の設定

convert(hf_path=hf_path, q_bits=q_bits)

推論の実行方法

MLX-LMを使用した推論の実行方法について説明します。主にload関数でモデルをロードし、generate関数でテキスト生成を行います。

モデルのロードと基本的な生成

from mlx_lm import load, generate

# モデルとトークナイザーをロード
model, tokenizer = load("mlx-model")

# プロンプトを設定
prompt = "Write a story about Einstein"

# チャットテンプレートを適用(チャットモデルの場合)
messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(
    messages, add_generation_prompt=True
)

# テキスト生成
text = generate(model, tokenizer, prompt=prompt, verbose=True)

Temperature設定

temperatureは生成されるテキストの多様性を制御します。値が高いほど、より多様な(時に予測不可能な)テキストが生成されます。値が低いほど、より決定論的な結果になります。

from mlx_lm import load, generate
from mlx_lm.sample_utils import make_sampler

# モデルとトークナイザーをロード
model, tokenizer = load("mlx-model")

# プロンプトを設定
prompt = "Write a story about Einstein"
messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(
    messages, add_generation_prompt=True
)

# temperatureを設定したsamplerを作成
temperature = 0.7  # 0.0から1.0の間で設定(高いほど多様性が増す)
sampler = make_sampler(temp=temperature)

# samplerを使用してテキスト生成
text = generate(model, tokenizer, prompt=prompt, sampler=sampler, verbose=True)

デフォルト値は0.0で、この場合は常に最も確率の高いトークンが選択されます(決定論的)。

Seed設定

seedを設定することで、生成結果を再現可能にします。同じseedを使用すると、同じ入力に対して同じ出力が生成されます。

import mlx.core as mx
from mlx_lm import load, generate
from mlx_lm.sample_utils import make_sampler

# 再現性のためにseedを設定
seed = 42
mx.random.seed(seed)

# モデルとトークナイザーをロード
model, tokenizer = load("mlx-model")

# プロンプトを設定
prompt = "Write a story about Einstein"
messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(
    messages, add_generation_prompt=True
)

# temperatureを設定したsamplerを作成
temperature = 0.7
sampler = make_sampler(temp=temperature)

# seedとsamplerを使用してテキスト生成
text = generate(model, tokenizer, prompt=prompt, sampler=sampler, verbose=True)

デフォルト値はNoneで、この場合は毎回異なる結果が生成されます。

その他のサンプリングパラメータ

make_sampler関数では、temperatureの他にも以下のパラメータを設定できます:

  • top_p: 確率の累積分布に基づいてトークンをフィルタリングします(nucleus sampling)
  • min_p: 最も確率の高いトークンの確率に対する相対的な最小確率を設定します
  • min_tokens_to_keep: min_pサンプリングで保持する最小トークン数
  • top_k: 確率順に上位k個のトークンのみを考慮します
# より詳細なサンプリング設定
sampler = make_sampler(
    temp=0.7,      # temperature
    top_p=0.9,     # nucleus sampling
    min_p=0.05,    # 最小確率(相対的)
    top_k=50       # 上位k個のトークンのみ考慮
)

ストリーミング生成

長いテキストを生成する場合、stream_generate関数を使用して生成をストリーミングすることもできます:

from mlx_lm import load, stream_generate

model, tokenizer = load("mlx-model")

prompt = "Write a story about Einstein"
messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(
    messages, add_generation_prompt=True
)

# ストリーミング生成
for response in stream_generate(model, tokenizer, prompt, max_tokens=500):
    print(response.text, end="", flush=True)
print()

Loraの構築方法

以下のコマンドでloraファイルの構築を行います。
この際、dataディレクトリにに所定のjsonlファイルを用意しておいてください。
(jsonlサンプル)[https://github.com/ml-explore/mlx-examples/tree/main/lora/data]

mlx_lm.lora \
    --model "mlx_model" \
    --train \
    --data "data" \
    --iters 600

作成したloraファイルの適応

作成したloraファイルはadapterに格納されています。
使用する場合はモデルロード時に以下を実行する必要があります。

model, tokenizer = load(path_or_hf_repo="mlx_model",adapter_path="adapters")

まとめ

いかがだったでしょうか?

今回は話題のmlxの基本的な使い方やLoraを作る方法をまとめました。
Macのスペック持て余している方は是非今回の手順で使ってみてください!

私のXではLLMに限らず、AIを活用した業務改善情報の発信をしておりますのでご興味のある方は是非フォローをお願いします。
https://x.com/Linus_lab

Discussion