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

38.1K Views

March 05, 24

スライド概要

サンプルコード:
https://github.com/shu223/iOS-GenAI-Sampler

発表動画:
https://youtu.be/yyYVFpxbO1Q

「Mobile勉強会 Wantedly × チームラボ × Sansan #13」での発表資料です。

profile-image

フリーランスiOSエンジニア 「エンジニアと人生」コミュニティ主宰

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

ローカルLLM on iOS の現状まとめ 堤 修一(@shu223)

2.

自己紹介 • 堤 修一 • @shu223 (GitHub, Qiita, Zenn, note, 𝕏, YouTube, Podcast, etc...) • 書籍(商業出版4冊、個人出版多数 @BOOTH):

3.

本日のアジェンダ • iOSオンデバイスでLLMを動かす方法 • 自分のアプリに組み込む • 現状と今後の展望

4.

用語説明 • 【LLM】: Large Language Models / 大規模言語モデル • 【ローカルLLM】: ローカル環境で動くLLM • 【オンデバイス処理】: 処理がデバイス内部で完結している (クラウドや外部サーバーに依存しない)

5.

ローカルLLM on iOS • オンデバイスで処理してます • APIは叩いていません • iPhone 15 Pro使用 • 倍速再生していません • 8.6 tokens/sec

6.

ローカルLLMのメリット • オフラインでも動く • プライバシーが守られる(データがどこにもアップされな い) • どれだけ使っても無料 モバイル端末スタンドアローンで最先端の機能が動作すること には常にロマンがある

7.

iOSオンデバイスでLLM を動かす方法

8.

iOSでローカルLLMを動かす方法 大きく分けて2つ • llama.cpp • Core ML

9.

iOSでローカルLLMを動かす方法 大きく分けて2つ • llama.cpp • Core ML

10.

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

11.

llama.cpp と Apple Silicon • Apple Silicon向けにはARM NEON、Accelerate、Metalフ レームワークで最適化 • 「ローカルLLMを動かせるmacOSアプリ」の多くが llama.cppを内部で利用 • Ollama, LM Studio, LLMFarm, etc... • GGUFフォーマットのモデルを使用する

12.

llama.cpp と iOS • "Apple Slicon向け最適化" はMシリーズだけでなく、iPhone のAシリーズも対象

13.

iOSでローカルLLMを動かす方法 大きく分けて2つ • llama.cpp • Core ML

14.

Core MLとは • 機械学習モデルをiOS, macOS, etc. に組み込むためのApple 製のフレームワーク, モデルフォーマット • CPU・GPU・Neural Engineを利用し、メモリ占有量と電力 消費量を最小限に抑えつつパフォーマンスを最大限に高める ように設計されている

15.

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

16.

Core ML vs llama.cpp • Neural Engine を活かせる分、Core MLが有利?

18.

LLMモデルをCore MLに変換する方法 • coremltoolsを使う • 難しい(例:coremltoolsを用いたCore MLモデルへの変 換 - Sansan Tech Blog ) • Hugging Faceが公開している変換ツール exporters を使う

19.

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

20.

(補足資料) ! exporters の使い方 • 記事: TransformersモデルをCore MLに変換するツール exporters を試す • LLMモデルをCore MLに変換することには成功

21.

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

22.

llama.cpp 向けのモデルはど うか? ほとんどのローカルLLMが色々なパター ンで量子化されGGUFフォーマットで公 開されている(TheBloke が有名)

23.

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

24.

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

25.

自分のアプリに組み込む

26.

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

27.

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

28.

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

29.

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

30.

試してみたモデルの例 • 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でクラッシュ

31.

デモ

32.

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

33.

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

34.

現状の所感 (※1,2回試しただけの所感です) ! • 回答内容は • 推論速度も

35.

とはいえ

36.

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

37.

今後の展望

38.

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

39.

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

40.

Wrap up • iOSでローカルLLMを動かす手段は大きく2通り • llama.cpp: 量子化済み・変換済みモデルの選択肢が豊富 • Core ML: Neural Engine使う • iOSデバイスで動かすには「現状では」デカすぎるし重すぎ る • が、大いに希望はある!

41.

ご清聴ありがとうございました!