🦙

ローカルLLM on iOS の現状まとめ

2024/04/25に公開

2024年3月5日に開催されたイベントで発表した内容です。

スライドはこちら:
https://www.docswell.com/s/shu223/ZDE8XL-llm-ios

またLTで全然時間が足りなかったので、イベント終了後にひとりで撮ったプレゼン動画がこちら:

https://youtu.be/yyYVFpxbO1Q

サンプルコードはこちら:

https://github.com/shu223/iOS-GenAI-Sampler

以下、発表資料を記事として再構成したものになります。登壇後に調査した内容も追記しています。

「ローカルLLM on iOS」のデモ

  • オンデバイスで [1]処理してます

    • APIは叩いていません
  • 倍速再生していません

    • 8.6 tokens/sec

iOSローカルでLLMを動かすメリット

  • オフラインでも動く
  • プライバシーが守られる(データがどこにもアップされない)
  • どれだけ使っても無料

モバイル端末スタンドアローンで最先端の機能が動作することには常にロマンがある

iOSでローカルLLMを動かす方法

大きく分けて2つ

  • llama.cpp
  • Core ML

llama.cpp

  • LLMが高速に動くランタイム
  • C/C++製
  • Georgi Gerganov (GG) さんが開発
  • GGML → GGUFフォーマット

inline

llama.cpp と Apple Silicon

  • Apple Silicon向けにはARM NEON、Accelerate、Metalフレームワークで最適化

  • 「ローカルLLMを動かせるmacOSアプリ」の多くがllama.cppを内部で利用

    • Ollama, LM Studio, LLMFarm, etc...
    • GGUFフォーマットのモデルを使用する

llama.cpp と iOS

Core ML

Core MLとは

  • 機械学習モデルをiOS, macOS, etc. に組み込むためのApple製のフレームワーク, モデルフォーマット

inline

  • CPU・GPU・Neural Engineを利用し、メモリ占有量と電力消費量を最小限に抑えつつパフォーマンスを最大限に高めるように設計されている

Neural EngineはAPIがない

  • Core MLを利用した場合のみNeural Engineを利用できる
  • → Apple Sillicon(iPhoneのAシリーズも含む)の性能を最も活かせるのはCore ML!

Core ML vs llama.cpp

Neural Engine を活かせる分、Core MLが有利?

→ そうともいい難い

LLMモデルをCore MLに変換する方法

🤗 exporters

  • TransformersモデルをCore MLに変換するツール
    • coremltoolsをラップしたものではあるが、変換に伴う色々な問題をツール側で吸収してくれている
    • 要はこのツールを使えばcoremltoolsをそのまま使うよりも簡単にTransformersモデルをCore MLモデルに変換できる
(補足資料) 🤗 exporters の使い方

(長くなってきたので中略)

この流れで言いたいこと: Core MLモデルへの変換ツールはあるが、変換済みモデルはほとんど公開されておらず、量子化等自分で色々がんばる必要がある

llama.cpp 向けのモデルはどうか?

ほとんどのローカルLLMが色々なパターンで量子化されGGUFフォーマットで公開されている(TheBloke が有名)

fit right thebloke氏のアカウント

Core ML vs llama.cpp

  • Neural Engine を活かせる点ではCore MLが有利
  • 各種ローカルLLMを「すぐに試せる」点では圧倒的にllama.cpp

ここまでのまとめ

  • iOSでローカルLLMを動かす手段としてはllama.cppとCore MLがある
  • どちらもApple Siliconに最適化されているが、Neural Engineを活かせるのはCore MLのみ
  • llama.cppは量子化済み・変換済みのモデルの選択肢が豊富にある

自分のアプリに組み込む

llama.cpp

  • 手軽にアプリに組み込めるように本家リポジトリにSwift Packageが用意されている
  • そのSwift Packageの使い方を示すサンプルも同リポジトリに用意されている
    • examples/llama.swiftui

Core ML

  • 🤗 exporters で変換したCore MLモデルをアプリで動かすためのラッパーライブラリとして swift-transformers というSwift Packageが用意されている
  • そのサンプルアプリも公開されている

iOSオンデバイスで動くLLMモデルの現状

モデルの探し方

  • Hugging Face Hubで探すGGUF / Core ML
  • LLMFarm のここ ・・・動作検証済みモデルがサイズと共にリストアップされている
  • llama.cpp の README の "Supported models" や、ここ・・・各種モデルのiPhoneでのベンチマーク

試してみたモデルの例

  • Mistral 7B v0.1 (比較的小さなサイズで優秀)

    • Q3_K_S (3.16GB)
    • Q4_K_S (4.14GB)
  • Calm 2 7B Chat (日本語LLM)

    • Q3_K_S (3.47GB)
    • Q4_K_S (3.12GB)
    • Q4_K_M (3.47GB)・・・iPhone 15 Proでクラッシュ

デモ

Mistral 7B v0.1

  • Q4_K_S
    • 4-bit量子化
    • 4.14GB
  • ローディング 約15秒
  • テキスト生成速度 8.66 t/s

fit right

Calm2 7B Chat

  • Q3_K_S
    • 3-bit量子化
    • 3.12GB
  • ローディング 約25秒
  • テキスト生成速度 1.89 t/s

fit right

現状の所感

※1,2回試しただけの所感です

  • 回答内容は 👍
  • 推論速度も 👍

・・・とはいえ

現状ではプロダクトでの実用は厳しそう

  • サイズの問題: 3-bit or 4-bit 量子化したモデルでも3GB〜
    • アプリに組み込むわけにはいかない/ユーザーにダウンロードさせるわけにもいかない
  • 処理速度の問題: モデルのロードに時間がかかる/推論速度もまだ厳しい → APIを叩いた方が速い
  • 使用メモリ量の問題: 数GB必要

今後の展望

ワクワクしかない

  • モデル性能: より少ないパラメータ数で高性能なモデルが日々生まれている
  • 量子化手法: 年々進化、BitNetなるものも登場
  • デバイス性能: メモリ容量もGPU・Neural Engineの性能も年々進化
  • 変換済みモデルの多様性・・・Core ML変換済みのLLMも充実してくる(はず)

→ オンデバイスでLLMがサクサク動く日も近い!

Wrap up

  • iOSでローカルLLMを動かす手段は大きく2通り

    • llama.cpp: 量子化済み・変換済みモデルの選択肢が豊富
    • Core ML: Neural Engine使う
  • iOSデバイスで動かすには「現状では」デカすぎるし重すぎる

    • が、大いに希望はある!

追記: MLX

発表では『iOSでローカルLLMを動かす手段は大きく分けて2つ』として llama.cpp と Core ML を紹介しましたが、MLXという選択肢もあります。

https://twitter.com/shu223/status/1772367459820900560

MLX版ローカルLLMをiOSで動かす方法についてはこちらにまとめました:

https://note.com/shu223/n/n79c96c10d054

追記: iOSビルトインのローカルLLM?

前述した通りローカルLLMはモバイルアプリに同梱したりユーザーにダウンロードさせたりするにはサイズ的にまだまだ厳しいため、OS自体にビルトインされることが期待されます。

https://twitter.com/shu223/status/1765658018434490536

ツイート内容

この記事、斜め読みして「なんだ、SiriがOpenAIのAPI叩いて要約するようになるだけか」と一瞬思ったんだけど、
しかしよく読むと全然違った。

iOS 18に搭載予定のAppleのAIはChatGPTを用いて動作するのではなく、プロンプトに対するSiriSummarizationとChatGPTの回答を比較し、開発に活用する目的でしょう

Appleが4つのAIモデルのテストを行っていると指摘しています。そのうち2つはApple独自の大規模言語モデル「Ajax」と呼ばれるモデルを用いたチャットボット「AjaxGPT」で、iPhone上でローカルに動作するオフライン版とオンライン版の2つのバージョンが存在するとのこと。残りの2つはChatGPTと、Googleの大規模言語モデルである「FLAN-T5」です。

iOSビルトインのローカルLLMが入ったらめちゃくちゃ熱い。今年のWWDCが楽しみ。

もし実現されれば、ローカルLLM on iOSの大本命は確実にこれ。今年のWWDCが楽しみです。

iOSビルトインのMLモデルに関連する記事:

https://zenn.dev/shu223/articles/soundanalysis-builtin

https://zenn.dev/shu223/articles/createml-model

https://zenn.dev/shu223/articles/vision_image-feature-print

脚注
  1. iPhone 15 Pro使用 ↩︎

Discussion