WWDC25:Explore large language models on Apple Silicon with MLX

以前 Foundation Models framework を実際に使ってみたという投稿をした。

Foundation Models framework の最大のメリットはオンデバイスのLLMを非常に手軽に扱えるという点だが、一方で高度な推論に不向きであったり、独自データによる追加学習といった高度なユースケースには対応していない → できるらしい。(追記: 2025/07/08)オンデバイスかつ手軽に追加学習を行いたい場合には、このMLXを使えばよさそう。


0:00 – イントロダクション

  • MLX は Apple Silicon 向けに設計されたオープンソースの機械学習ライブラリ
  • Apple Silicon 上で大規模言語モデル(LLM)の推論とファインチューニングを実行可能
  • Metal を使用して GPU で高速化し、統一メモリを活用して CPU と GPU が同時に同じデータで動作可能
  • Python、Swift、C++、C の API を提供
  • DeepSeek AI の6700億パラメータモデルを4.5ビット量子化で380GBのメモリを使用して実行可能(M3 Ultraの512GB統一メモリを活用)

3:07 – MLX LMの概要

  • MLX LM は MLX 上に構築された Python パッケージで、大規模言語モデルの実行と実験に特化
  • コマンドラインツールを提供し、コードを書かずにテキスト生成やファインチューニングが可能
  • Python API も提供し、生成やトレーニングプロセスなど詳細な制御を実装可能
  • Hugging Face と密接に統合されており、数千のモデルをダウンロード可能
  • インストールは pip install mlx-lm で簡単

3:51 – テキストの生成

  • コマンドライン:
    • mlx_lm.generate コマンドで Hugging Face のモデルまたはローカルパス、テキストプロンプトを指定して生成
    • サンプリング温度、top-p、最大トークン数などのフラグで動作を調整可能
    • mlx_lm.generate —help
  • Python API:
    • load 関数でモデルとトークナイザーを読み込み、設定
    • generate 関数でトークン生成ループを実行し、出力テキストを返す
    • モデルは完全に構造化された MLX ニューラルネットワークで、層の構造やパラメータを検査・修正可能
      • print(model)
      • print(model.parameters()) で学習した重みづけを確認
  • 会話の維持:
    • Key-Value Cache(KV Cache)を使用して複数ターンの会話を中間結果として維持
      • キャッシュを再利用し、時間と処理を節約、マルチターンの会話に有効
    • make_prompt_cache 関数でキャッシュを作成し、generate 関数に渡すことで履歴を保持

8:42 – 量子化

  • 目的: モデルの精度を落とすことでメモリ使用量削減と推論速度向上(多くは品質に影響しない)
  • MLX LMの利点: 量子化が組み込まれており、追加ツールや変換スクリプトが不要
  • 使用方法:
    • mlx_lm.convertコマンドで Hugging Face からモデルをダウンロード、変換、ローカル保存を1ステップ実行
    • 例:  16ビットMistralモデルを4ビットに量子化して大幅にサイズ削減
  • Python APIでの細かい制御:
    • quant_predicate を使用。例: 埋め込み層と最終投影層を6ビット、その他を4ビットに設定可能
      • 最後の埋め込み投射層は量子化の影響を受けやすいため高精度を維持したい
    • 品質と効率のバランスを最適化

11:39 – ファインチューニング

  • 目的: 大規模言語モデルを特定のドメインやタスクに適応させる
  • MLXの利点: クラウド不要でローカルMac上でファインチューニング可能
    • 外部で実行するコストがかからない
    • データがデバイスから出ない
  • 2つのアプローチ:
    • 完全ファインチューニング: 事前学習済みモデルの全パラメータを更新。最大の柔軟性だがリソース消費量増える
    • 低ランクアダプター(LoRA): 少数の新しいパラメータを追加し、元のネットワークを凍結したままそれらのみをトレーニング。高速、軽量、メモリ効率的
  • 実装:
    • mlx_lm.lora コマンドでひとつでファインチューニング開始
    • 量子化されたモデルのアダプタをトレーニング可能(メモリ使用量を劇的削減)
    • 設定ファイルで学習率、オプティマイザー設定、評価間隔などを細かく制御
  • アダプターの融合:
    • mlx_lm.fuse コマンドでアダプターをベースモデルに融合
    • 単一の自己完結型モデルを生成し、配布と使用が容易
      • --upload-repo に Hugging Face のリポジトリ名を指定するだけでアップロード可能

17:02 – MLXSwiftでのLLM

  • Swiftでの実装: 例: 28行のコードで量子化Mistralモデルを読み込み、テキスト生成を実行
  • 主要コンポーネント:
    • ModelContainer: モデルとトークナイザーへの並行アクセスを安全に管理するアクター
    • プロンプトのトークン化
    • 生成ループの実行
  • 会話履歴の維持:
    • Key-Value Cacheを明示的に作成。
      • GenerateParameters の生成
      • キャッシュの抽出
      • TokenIterator を使用して生成をステップバイステップで制御
  • 利点: Pythonと同じワークフローと機能を、Swiftで完全にネイティブに実現