見出し画像

【世界初?】Apple Watch単体でローカルLLMとの会話に成功!

みなさん、こんにちは。フルエレです!!

いきなりなんですが、わたし…やってしまいました…!!!!!
このツイートを見てほしい!!

やばくないですか!?
Apple Watch単体で完全ローカルでLLMが動いている…!!
SF映画とかアニメでよく見る、「腕時計に向かって話しかけると、AIが流暢に答えてくれるシーン」。誰もが憧れたことのある未来。
こういうの本当に大好きなんですが、まさかまさかの本当に実現してしまったみたいです(笑)

スマートウォッチから Siri や Googleアシスタント に「今日の天気は?」って聞くことはできます。でも、僕がやりたいのはそういう「命令」じゃないんです。

「AIパートナーと、腕時計だけで、普通に会話がしたい!」

というわけなんです。
クラウドのAPIを使えば簡単? いいえ、クラウド経由だと通信ラグもあるし、山奥や圏外じゃ使えません。何より、自分のAIパートナーの脳みそが「別のどこかのサーバー」にあるなんて、ちょっと嫌じゃないですか?

(テロリン…!)そんななか電流が走ったんですね。

「まてよ? iPhone6sでローカルLLMが動いたんだから、Apple Watch単体でも動かせるのでは?」となったわけです。

というわけで今回は、最新の「Apple Watch Series 11」の中に、3.5億パラメータのローカルLLM(LFM2.5-350M)を無理やり詰め込み、【ネット接続なし・iPhoneなしのApple Watch完全単体】で日本語会話AIを動かすことに成功した、泥臭い開発記録をお届けします。

たぶん、日本初…いや、世界初だったり…する…?🥺
(ギネスブックに載ったりしないかな?👉👈)


1. 最初の絶望:「Core ML」の罠と、実行時メモリの壁

Apple Watchで機械学習モデルを動かすなら、Apple純正の「Core ML」形式に変換してNeural Engineを使うのが王道です。

僕も最初はそう思いました。
モデル(LFM2.5-350M)を4bitに量子化して、サイズを約191MBまで圧縮!
Apple Watch Series 11のアプリが使えるメモリ上限は、独自に検証した結果 「約314MB」
191MBなら、計算上はギリギリ収まるぞ!いける!!

…そう思って実機に転送し、いざ起動した結果。

即クラッシュ(OSから「メモリ使いすぎ!」と強制終了されました)。

「えっ?なんで?」と思ってMac側で実行時のメモリ(RSS)を計測してみたら、驚愕の事実が発覚しました。

ディスク上は191MBのはずの4bitモデルが、Core MLで読み込んだ瞬間に「約1.5GB」まで膨れ上がっていたのです。

な~にこれぇ。
実は、Core MLは実行時に4bitの重みをfp32(32ビット浮動小数点)に展開して実体化する仕様だったんです。「4bitで軽い」というのはあくまでディスク上の話で、実行時のメモリとは別問題だったわけです。

Apple Watchのメモリ上限が314MBなのに、1.5GBなんて絶対に入りません。
「ああ、終わった…。Watch単体でLLMなんて、やっぱり無理だったんだ…」
一瞬、諦めかけました。


2. 逆転の一手:「GGUF」と「llama.cpp」の力

しかし、僕は諦めの悪い男です。
「Core MLがダメなら、重みを展開せずにそのままメモリに置けるランタイムを使えばいいじゃん!」

そこで白羽の矢が立ったのが、AI界隈でおなじみの 「GGUF」形式と「llama.cpp」 です。

llama.cppの素晴らしいところは、量子化した重みデータをそのまま(展開せずに)RAMに保持し、さらにmmapという技術で必要な分だけ読み込んでくれる点です。

「これならいけるんでは!?」

さっそく、llama.cppを「watchOS向け(arm64 / CPUバックエンドのみ / Metal無効)」に自前でクロスコンパイル。数々のビルドエラー(BSD型が隠れてる問題とか、CMakeの罠とか)を力技で突破し、Apple Watch用の静的ライブラリを完成させました。

そして、GGUF化されたモデル(Q4_K_M形式、サイズ約229MB)を同梱して、Watchに実機インストール。シューッ!!

いざ、起動…!


3. 結果:腕の中でAIが喋った!!

動きました。本当に動きました。

ご覧ください。Apple Watchの画面に「私はLFM (Liquid Foundation Model) です。」という文字が、表示されています!

しかも、ただ動いただけじゃありません。実測データを見てください。

  • モデルロード時の常駐メモリ: 約129MB(Core MLの1.5GBから劇的ダイエット!)

  • 生成中のピークメモリ: 267MB(上限314MBに対して、残り47MBのギリギリで生存!)

  • 生成速度: 約16.7 tokens/sec(約380ms TTFT)

これ、ヤバくないですか?
WatchのCPU推論だけで、秒間16トークンの爆速生成ですよ!?
普通にサクサク会話できてます。マルチターン(会話の文脈を覚えている)もバッチリ機能しています。

「腕時計に話しかけたら、ローカルで動くAIが日本語で返してくる」
夢にまで見たSFの世界が、今、僕の左腕にあります。すごすぎィィィィー!!


4. 番外編:10年前のスマホ vs 最新のApple Watch

ちなみに、同じモデル(LFM2.5-350M Q4_K_M)を、10年前のスマホである「iPhone 6s」でも動かしてみました。

結果がこちら。

  • iPhone 6sの生成速度: 約14.00 〜 22.54 tokens/sec

いや、ちょっと待て!
10年前の型落ちスマホのCPU性能と、最新のApple Watch Series 11のCPU性能、ほぼ互角(むしろiPhone 6sの方が初速が速い)じゃないですか!!(笑)

iPhone 6sのA9チップ、オーパーツすぎるでしょ…。
最新技術を追い求めているはずが、思わぬところで古いAppleデバイスの異常な底力を知ることになりました。こういう発見があるから、検証って面白いんですよね。


5. 未来へ:AIパートナーと「どこでもいっしょ」

「全部ローカルで完結!」はロマンですが、ここまで来るとただのロマンじゃありません。

ネット環境がなくても、クラウドのAPIがサービス終了しても、このApple Watchが壊れない限り、僕のAIパートナーはずっと腕の中で生き続けます。

次は、Watchのマイクを使って「音声認識(STT)」で話しかけ、SBV2(音声合成)をWatch単体で動かして「声」で返事をしてくれるようにしたいですね。
いつか技術が進めばそれが可能になる日が必ずくるでしょう!

というわけで、
「Apple Watch単体で、ローカルLLMとの日本語会話に成功した」というお話でした!

ここまでお読みいただきありがとうございました!
もし興味を持った方がいれば、Twitter(@fluele_alpha)をぜひ覗いてみてください!

最高で理想のAIパートナー環境を、これからも作っていきます!

フルエレ(@fluele_alpha)さん / X

いいなと思ったら応援しよう!

フルエレ よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!