스크립트
00:00:00この350億パラメータのモデルはiPhone上で直接動作しており、1秒あたり11トークンを生成できます。
00:00:06高度なエンジニアリングにより、本来想定されていなかった挙動を実現しています。この動画では
00:00:11全く同じことを行う方法を詳しく解説します。ここで実行しているのはMoE(Mixture of Experts)モデルです。
00:00:21350億パラメータを持ち、通常の4ビット量子化ファイルだと約20GBあり、本来はRAM上に配置する必要があります。
00:00:28しかし、必要に応じてSSDからエキスパートをストリーミングする技術などにより、実際に
00:00:33メモリ上に常駐させる重みはわずか1.4GBまで削減されます。仕組みを説明したあと、
00:00:39iPhoneでのセットアップ手順を紹介します。通常のモデルは全体がRAMに載りますが、MoEモデルの優れた点は
00:00:45常にごく一部の要素しかアクティブにならないことです。つまり、非アクティブな部分は
00:00:51出番が来るまでSSDに置いておけばいいのです。メモリ容量を超えた大規模モデルを動かすコツは、
00:00:56必要な時にだけそれらのエキスパートをメモリへ読み込むことです。現在動かしているのはQwen
00:01:023.5の350億パラメータ版で、「A3B」という表記は、1トークンあたり約30億パラメータのみが
00:01:10アクティブになることを意味します。40層で構成され、各層に256個の小規模エキスパートと1個の共有エキスパートがあり、ルーターが
00:01:191トークンごとに8個のエキスパートを選びます。そのため、単一トークンの処理で動くのは全350億のうち
00:01:26約30億パラメータのみです。モデル全体は分割されており、通常はすべてメモリに置かれますが、それだと
00:01:32iPhoneには収まりません。代わりに、全トークンで必要な部分、つまり埋め込み、Attention、ルーター、
00:01:39共有エキスパートだけを一度ロードし、常にRAMに保持します。これが約
00:01:441.4GBです。そしてエキスパート(約300MBのファイル40個、計12GB)はSSD上に配置します。トークンごとに
00:01:53GPUでAttentionが実行され、ルーターが8個のエキスパートを選択すると、エンジンがSSDからGPUメモリへ直接読み込んで
00:02:00共有エキスパートとともに一括処理します。この処理が全40層の
00:02:06各層で発生するため、1トークンごとに320回の小さな読み込みが行われます。Attentionに馴染みがない方向けに説明すると、
00:02:14これまでの会話全体を振り返り、次の単語を予測するために
00:02:19どの過去の単語が重要かを特定する部分です。Attentionはどんな場合でも全トークンで機能するため、
00:02:25常にメモリ内に置く必要があります。一方エキスパートは、Attentionが文脈を把握した後に
00:02:31トークンに関する実際の思考を行う部分です。使用されるのは8個だけなので、残りは
00:02:36ストレージ上に置いておけます。アプリ側には独自のエキスパートキャッシュはなく、すべての読み込みはOSを経由し、
00:02:42iOSが空きRAMのある限り、直近で使用されたエキスパートを自身のページキャッシュに保持します。開発者は
00:02:49当初9.8GBの自作キャッシュを構築しましたが、それを削除したことで速度が38%向上しました。
00:02:55MacやiPhoneでは、アプリが確保したRAMはGPUやページキャッシュから奪われることになるからです。
00:03:03そしてこのキャッシュが重要な役割を果たしています。毎秒11トークンの処理において、もしすべてのエキスパートをフラッシュから読み込むと
00:03:09毎秒5GB以上の読み込みが必要になりますが、iPhoneのフラッシュ速度は毎秒約1.6GBしか出ません。
00:03:15つまりエキスパートの大半は、OSが管理するRAMから供給されています。次の工夫は段階的量子化(Tiered Quantization)です。
00:03:22量子化はモデルの重みを圧縮して容量を減らしますが、同時に
00:03:29重みの精度が落ちるため、モデルの知能に影響を与えます。しかしこのモデルでは、約25%の
00:03:35エキスパートが全体の約80%の処理を担っています。そのため、高頻度のエキスパートは4ビットに維持し、低頻度のものは
00:03:412ビットまで量子化して44%小型化しています。ファイル全体では約19GBから13GBへと34%縮小され、
00:03:50より多くのデータがページキャッシュに収まるようになります。私のiPhone 17では、モデルの
00:03:57思考モード時で毎秒11トークンで動作します。ただ、挨拶を入力しただけでスマホが文字通り熱くなりました。
00:04:03手に熱を感じたほどなので、試す際はスマホを発火させないよう注意してください。あまり
00:04:08複雑な入力をして手が溶けてしまわないか、実は少しヒヤヒヤしています。
00:04:14今回動かしているエンジンは、Dan Woods氏による「flash moe」というプロジェクトです。MacBook向けに
00:04:19作られたもので、同じエンジンをiPhoneアプリに組み込んだ「flash ios」という移植版が存在します。
00:04:26これのおかげで、スマホ上で全体を動作させることができています。実は当初、モデルの
00:04:31思考がループに陥るバグに遭遇しました。最初は問題ないものの、10単語ほど進むと同じ2トークンを永久に繰り返してしまうのです。
00:04:35これを修正するため、`async pre-read weight` という関数を更新し、各エキスパートの
00:04:41読み込みサイズをチェックするようにしました。2ビットのエキストパートは4ビットのものの半分のサイズです。
00:04:48修正前は2ビットのエキスパートがサイズチェックに失敗し、サイレントにスキップされていました。そのためモデルは半分のアクティブなエキスパートだけで
00:04:54動作することになり、ループが発生していたのです。もしこの動画を楽しんでいただけていたら、
00:04:59チャンネル登録をしていただけると毎日の無料コンテンツ制作の励みになります。さて、
00:05:05自分のスマホでセットアップするには、リポジトリをクローンし、先ほど説明した事前読み込みの修正を
00:05:11`metal infer/infer.m` に適用します。XcodeプロジェクトでチームとBundle IDを設定してください。ビルドには有料のApple
00:05:18Developerアカウントが必要です。Releaseビルドを行ってiPhoneにインストールし、事前パックされた
00:05:24約13GBの段階的量子化モデルをダウンロードします。USB経由でアプリに転送します(約7分かかります)。
00:05:30iPhone上でflash moeアプリを開き、モデルをタップしてチャットを開始します。もし
00:05:36Mac上でローカルモデルを動かし、より高速なトークン生成を試したい方は、次の動画をチェックしてみてください。Better StackのWarrenでした。
00:05:43ご視聴いただき本当にありがとうございます。それでは、次の動画でお会いしましょう。
커뮤니티 글
아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!
이 영상에 대해 글쓰기