39.6K Views
March 05, 24
スライド概要
サンプルコード:
https://github.com/shu223/iOS-GenAI-Sampler
発表動画:
https://youtu.be/yyYVFpxbO1Q
「Mobile勉強会 Wantedly × チームラボ × Sansan #13」での発表資料です。
フリーランスiOSエンジニア 「エンジニアと人生」コミュニティ主宰
ローカルLLM on iOS の現状まとめ 堤 修一(@shu223)
自己紹介 • 堤 修一 • @shu223 (GitHub, Qiita, Zenn, note, 𝕏, YouTube, Podcast, etc...) • 書籍(商業出版4冊、個人出版多数 @BOOTH):
本日のアジェンダ • iOSオンデバイスでLLMを動かす方法 • 自分のアプリに組み込む • 現状と今後の展望
用語説明 • 【LLM】: Large Language Models / 大規模言語モデル • 【ローカルLLM】: ローカル環境で動くLLM • 【オンデバイス処理】: 処理がデバイス内部で完結している (クラウドや外部サーバーに依存しない)
ローカルLLM on iOS • オンデバイスで処理してます • APIは叩いていません • iPhone 15 Pro使用 • 倍速再生していません • 8.6 tokens/sec
ローカルLLMのメリット • オフラインでも動く • プライバシーが守られる(データがどこにもアップされな い) • どれだけ使っても無料 モバイル端末スタンドアローンで最先端の機能が動作すること には常にロマンがある
iOSオンデバイスでLLM を動かす方法
iOSでローカルLLMを動かす方法 大きく分けて2つ • llama.cpp • Core ML
iOSでローカルLLMを動かす方法 大きく分けて2つ • llama.cpp • Core ML
llama.cpp • LLMが高速に動くランタイム • C/C++製 • Georgi Gerganov (GG) さんが開発 • GGML → GGUFフォーマット
llama.cpp と Apple Silicon • Apple Silicon向けにはARM NEON、Accelerate、Metalフ レームワークで最適化 • 「ローカルLLMを動かせるmacOSアプリ」の多くが llama.cppを内部で利用 • Ollama, LM Studio, LLMFarm, etc... • GGUFフォーマットのモデルを使用する
llama.cpp と iOS • "Apple Slicon向け最適化" はMシリーズだけでなく、iPhone のAシリーズも対象
iOSでローカルLLMを動かす方法 大きく分けて2つ • llama.cpp • Core ML
Core MLとは • 機械学習モデルをiOS, macOS, etc. に組み込むためのApple 製のフレームワーク, モデルフォーマット • 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に変換する方法 • coremltoolsを使う • 難しい(例:coremltoolsを用いたCore MLモデルへの変 換 - Sansan Tech Blog ) • Hugging Faceが公開している変換ツール exporters を使う
! exporters • TransformersモデルをCore MLに変換するツール • coremltoolsをラップしたものではあるが、変換に伴う 色々な問題をツール側で吸収してくれている • 要はこのツールを使えばcoremltoolsをそのまま使うより も簡単にTransformersモデルをCore MLモデルに変換でき る
(補足資料) ! exporters の使い方 • 記事: TransformersモデルをCore MLに変換するツール exporters を試す • LLMモデルをCore MLに変換することには成功
(長くなってきたので中略) この流れで言いたいこと: Core MLモデルへの変換ツールはあ るが、変換済みモデルはほとんど公開されておらず、量子化等 自分で色々がんばる必要がある
llama.cpp 向けのモデルはど うか? ほとんどのローカルLLMが色々なパター ンで量子化されGGUFフォーマットで公 開されている(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
Calm2 7B Chat • Q3_K_S • 3-bit量子化 • 3.12GB • ローディング 約25秒 • テキスト生成速度 1.89 t/s
現状の所感 (※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デバイスで動かすには「現状では」デカすぎるし重すぎ る • が、大いに希望はある!
ご清聴ありがとうございました!