top of page

llama.cppのMoE CPUオフローディング、GPU転送に代わる調整可能な選択肢を追加

14 分前
読了時間: 17分
Generic software-coding workspace for a llama.cpp runtime change, not a MoE cache benchmark, test configuration or performance result. Credit: Bibek ghosh. Source: https://www.pexels.com/photo/programming-data-on-a-computer-14553707/. Pexels License.
Generic software-coding workspace for a llama.cpp runtime change, not a MoE cache benchmark, test configuration or performance result. Credit: Bibek ghosh. Source: https://www.pexels.com/photo/programming-data-on-a-computer-14553707/. Pexels License.

llama.cppは11月7日、プルリクエスト #30966 をマージし、選択したエキスパートのキャッシュミスについて常にエキスパートを転送するのではなく、CPUで実行できるようにした。am17anが提供したllama.cppのMoE CPUオフローディング更新では、個々のマシン上でこのバランスを調整するスクリプトも導入されている。重要なのは、速度向上が保証されることではなく、その選択肢が加わった点にある。

MoEはmixture of experts(専門家の混合)の略で、生成テキストの単位である各トークンに対し、選択されたニューラルネットワークのコンポーネントを有効化するモデルを指す。これらのコンポーネントはエキスパートと呼ばれる。頻繁に使われるエキスパートをGPUメモリに保持すると有利だが、存在しないエキスパートは依然としてどこかで処理する必要がある。新しいオプションは、その処理場所を変える。

中心となる比較は、GPUで実行するためにエキスパートの重み、すなわちモデルが使用する保存済みの数値を転送することと、CPUで計算することの間にある。Strataは、このバランスの調整をすでに文書化しているため、有用な比較対象となる。グラフィックスメモリ容量を超えるモデルを実行する人にとって、実際の環境でどちらの経路がより早く完了するかが実務上の問いとなる。

llama.cpp MoE CPUオフローディングで変わること

この更新により、キャッシュミスは計算とデータ移動の間で行うスケジューリング上の選択となる。

キャッシュは、必要とするプロセッサの近くに再利用可能なデータを保持する。キャッシュミスは、要求されたデータが存在しないときに発生する。ここで不足しているデータは、モデルの応答を生成するプロセスである推論中に必要となるエキスパートに属する。

新しい挙動は、そのエキスパートの必要性をなくすものではない。代わりに、その計算を完了する別の方法を作る。この違いは重要だ。転送を回避することとモデルの処理を省略することは、根本的に異なる主張だからである。

マージされたCPUフォールバックには、トレードオフを示す作者提供の例が含まれている。6,464 MiBのキャッシュでは、CPUの割合をゼロから0.95に変更すると、生成速度は毎秒24.2トークンから47.6トークンへ上昇した。19,392 MiBのキャッシュでは、同じ設定でそれぞれ毎秒65.5トークンと54.1トークンとなった。

MiBはメビバイトを意味し、メモリ容量の二進法による単位である。これらの結果は作者の例で報告された測定値であり、他のマシンで独自に再現された知見ではない。実行方法の変更と並んで、チューニング要素にも注意を払うべき理由を示している。

小さいキャッシュの結果だけを見る読者には、大幅な改善に見えるだろう。大きいキャッシュの比較だけを見る読者には、性能低下に見えるだろう。設定は構成の他の要素と相互作用するため、どちらの観察も記事に含めるべきである。

有用な結論は、「CPUオフローディングの方が速い」という主張より狭い。リソース配分が異なれば、望ましい実行経路も変わり得る。制約のある構成で有効な設定が、より多くのエキスパートデータをGPUの近くに保持できる場合には逆効果になり得る。

これは、愛好家が最適化の主張をどう解釈すべきかを変える。印象的な結果は有望な仕組みを示せるが、万人向けのデフォルトを確立するものではない。改善がどこで現れ、どこで消えるかを説明できれば、証拠はより有用になる。

これはソフトウェアインターフェースに求められる責任も変える。最適値がマシンに依存する選択肢をエンジンが公開するなら、ユーザーにはそれを選ぶ支援が必要になる。そうでなければ、柔軟性の追加は不適切な設定を選ぶ新たな機会になり得る。

アプリケーション開発者にとって、この変更は新たなデプロイ変数として理解すべきだ。llama.cppを使うアプリケーションに普遍的な性能水準を確立するものではない。アプリケーションは引き続き、自身のリクエストパターンで評価する必要がある。

これがマージの直接的な意義である。メインプロジェクトには、追加の実行経路が存在するようになった。特定のインストールを改善するかどうかは、依然として実証的な問いである。

限られたVRAMでは転送時間も性能予算の一部になる

最も影響を受けるのは、モデルをグラフィックスメモリとシステムメモリにまたがって運用するユーザーである。

VRAMはグラフィックスプロセッサに接続されたメモリである。システムRAMはコンピュータの主作業用メモリである。インストールが両方に依存する場合、性能の議論では両者の関係を考慮する必要がある。

モデルを読み込めることは出発点にすぎない。読者が気にするのは、応答がどれだけ早く始まるか、どれだけ安定して届くか、そしてコンピュータが引き続き使えるかどうかでもある。容量の数値だけでは、これらの問いに答えられない。

ローカルのコーディングアシスタントを評価する開発者を考えてみよう。アシスタントはリクエストを読み、応答を生成し、その後の編集にも対応する必要がある。中断のない生成中に測定された結果は、その体験の一部しか表していない。

これは報告されたベンチマークではなく、例示的なデプロイシナリオである。目的は、新しいオプションが焦点を当てる判断を特定することだ。重要なのは、エキスパートの実行を変更することで、開発者の完全な対話体験が改善されるかどうかである。

同様の区別は文書分析にも当てはまる。ユーザーは大量のソース資料を提出した後、短い追加質問をいくつか行うかもしれない。最も有用な構成は、別のテストでの速度を最大化するだけでなく、そのパターンを支えるものとなる。

デコードは、モデルが出力を段階的に生成するステージを意味する。プリフィルは、入力プロンプトを処理するステージを意味する。一方での改善が他方での改善を示すわけではないため、これらのステージは分けて測定する価値がある。

ハードウェアを比較する購入者にとって、これはグラフィックスメモリ容量を完全な性能予測として扱うべきではないことを示す。容量は引き続き重要だが、その容量の範囲内で動作するソフトウェアの挙動も同様に重要である。構成全体を精査する必要がある。

ローカルAIサービスを維持する人にとって、その必要性はより切実である。導入する設定について、説明可能な根拠が必要になる。より速そうに見えるシステムのコマンドをコピーしても、そのコマンドが自身の環境に適していることは示されない。

したがって、実務的な評価は、好みのパラメータではなくワークロードから始めるべきだ。コーディングセッション、文書との対話、または繰り返し発生するサービスリクエストは、テストに目的を与える。そのうえで性能は、その目的がどれだけ満たされたかの尺度となる。

個人の実験と共有デプロイの間にも違いがある。愛好家は、時折の再調整をソフトウェア利用の一部として受け入れられる。チームには、同僚が再現でき、結果が変わったときに調査できる設定が必要である。

そのため、構成記録には価値がある。検索可能なナレッジベースを構築するチームは、デプロイノートとともにテスト条件を保存できる。記録では、文脈のないコマンドを保存するのではなく、ワークロードと結果を説明すべきである。

より広い含意は明快だ。ソフトウェアは既存のハードウェアを活用する方法を増やせるが、それらの選択には証拠が必要である。利用可能な制御が増えても、自動的により良いデプロイになるわけではない。

ミスの計算がエキスパートの移動を上回る場合がある理由

関連する比較対象は、それぞれの完全な実行経路に必要な時間である。

プロジェクトのエキスパートキャッシュの挙動によると、キャッシュされたエキスパートはデバイス上で実行される。キャッシュが埋まると、--moe-cache-cpu-shareがCPU計算に回すミスの割合を選択する。その他のミスはデバイスに転送され、初期のミスは引き続きキャッシュを満たすためにアップロードされる。

文書では、高速なシステムメモリや低速な転送など、CPU処理が有利になる条件を説明している。また、デバイス転送用に確保されるホストメモリである固定メモリが、利点を減らす可能性があるとも注意を促している。記載されている最適値は、マシン、モデル、キャッシュサイズに依存する。

この説明は、具体的な解釈を裏付ける。この機能が扱っているのは、データに到達するコストだけでなく、それを使って計算するコストでもある。プロセッサを演算能力だけで判断すると、実行経路の一部を見落とすことになる。

これは、大きなファイルをどこで処理するかを決めることにたとえられる。より高速なマシンに送る場合、計算が完了する前に転送が発生する。それが有益かどうかは、宛先の速度だけでなく、ジョブ全体に依存する。

このたとえには限界があるが、判断を明確にする。到達に時間がかかるなら、より高速な宛先でも早い結果を保証しない。逆に、移動を避けても、ローカル処理により長くかかるなら成功は保証されない。

キャッシュは、すべての処理を等しく扱うのではなく、不足しているデータに関する判断であるため、さらに別の次元を加える。再利用の挙動が異なる構成では、キャッシュ外に残る処理も変わる。これが、CPU割合の数値に周囲の文脈が必要な理由である。

このため、キャッシュヒット率、すなわちキャッシュ済みデータから処理されたリクエストの割合は、不完全な目標となる。高い割合は望ましく聞こえる。しかし最終的にユーザーにとって重要なのは、応答にかかる時間である。

最適化指標は、ユーザー向けの結果に取って代わるのではなく、それを説明すべきだ。ある構成が中間測定値を改善しても応答を遅くするなら、その中間測定値は変更を正当化していない。同じ考え方は逆方向にも当てはまる。

ここでの対立軸は、引き続きデータ移動とCPU実行である。これを、CPUが一般にGPUより優れているという主張に変える必要はない。この更新は、より大きな推論プロセス内の特定の配分判断に関するものである。

この枠組みは、物語をモデルの知能に関する変更からも切り離す。実行場所を選ぶことは、推論能力の向上、コーディング能力の強化、あるいは回答精度の改善を示す証拠ではない。これらの結果には別の評価が必要である。

低VRAMユーザーにとって、llama.cppのMoE CPUオフローディングの魅力は、したがって条件付きで具体的なものだ。不足したエキスパート処理を解決する別の方法を提供する。その選択肢が有用かどうかは、得られる応答時間によって決まる。

分析上の教訓は、このパッチを超えて広がる。タスクを完了する完全な経路を測定すべきである。コンポーネントの仕様は期待を形作れるが、導入済みシステムを観察する代わりにはならない。

チューニングスクリプトが構成を測定に基づく判断へ変える

このスクリプトは実行オプションを推奨へと変える一方、測定済みの性能と予測された性能を区別している。

付属のキャッシュチューニングスクリプトは、サーバーの反復実行を通じてキャッシュサイズとCPU割合を評価する。マシンの挙動をモデル化し、追加の組み合わせを予測する。その選択規則は、モデル上で最速の結果から5%以内にある中で、最も低いCPU割合を優先する。

コードには、タイミングモデルが観測結果とどの程度一致するかを確認するチェックも含まれている。不一致がしきい値を超えた場合、通常の推奨を提示する代わりに診断メッセージを出して終了する。これはツールの信頼性に対する有用な境界である。

観測と予測の区別は強調に値する。測定結果は、ある実行中に何が起きたかを示す。予測は、観測に適合させた仮定を用いて、未測定の結果を推定する。

どちらのカテゴリーも、単独でデプロイに十分とは限らない。測定は代表性のないタスクを説明している可能性がある。予測は、それを構築した条件の外にある挙動を見逃す可能性がある。有用な評価は、両者を人々が実際に使おうとしているアプリケーションへ結び付ける。

このスクリプトの価値は、構造化された出発点を提供することにある。ユーザーは任意の設定の組み合わせを組み立てるのではなく、推奨事項を検証できる。これにより、結果を普遍的なものと見なすことなく、手探りを減らせる。

また、パフォーマンスに関する議論をより適切な形にできる。誰もがどのCPU共有率を使うべきかを問う代わりに、その推奨が自分のワークロードに適しているかを尋ねられる。後者の問いは検証しやすく、回答から得られる情報も多い。

Strataは、関連する競争上の文脈を提供する。同プロジェクトのハードウェア較正コントロールには、専門家転送の割合とCPUワーカーのチューニングが含まれる。ドキュメントでは、ユーザー自身のマシンで設定を測定し、基準を満たす改善を維持することが説明されている。

これは実装や性能が同等であることではなく、アプローチが類似していることを示す。どちらの説明も、ハードウェア依存の選択は測定から恩恵を得ることを認めている。どちらも、エンジン間の統制された直接比較の結果を提供してはいない。

この区別は重要である。なぜなら、元の議論はこの考え方をStrataと明示的に比較しているからだ。その比較は、較正という水準では妥当である。だが、llama.cppが特定の実装をコピーしたことや、別のエンジンと同等の速度を達成したことを立証するものではない。

エンジンの保守担当者にとって、較正は製品面の問いも投げかける。どの程度のパフォーマンスが、ユーザーが利用可能なコントロールを知っていることに依存すべきなのか。専門知識を持つ人だけが見つけられる機能は、設計どおりに動作していても実用上の負担を生む。

インターフェース開発者にとっては、推奨事項に説明が必要である。ユーザーは、デフォルト、測定済みの設定、推定値を区別できるべきだ。これらのカテゴリーを同じように提示すれば、後のトラブルシューティングは難しくなる。

チューニングが複雑さをなくすと約束する必要はない。より擁護しやすい役割は、複雑さを検査可能にすることだ。ユーザーがその条件を理解し、結果を検証できるとき、推奨事項は価値を持つ。

これが、実行変更と較正を組み合わせることのより強い意義である。このプロジェクトは、新しい動作を選択する手段を提供しており、選択を全面的に試行錯誤へ委ねているわけではない。

初期の熱狂には重要な検証上の空白が残る

マージされた機能は検証済みだが、コンシューマー向けシステム全般での速度向上は検証されていない。

元のコミュニティにおけるパフォーマンス議論には、より明確な指針を求める声とともに期待が示されている。あるコメント投稿者は、専門家キャッシュと転送ボトルネックの可視性を高めるよう求めている。別の投稿者は、通常の用途でチューナーの出力をどう解釈すべきかを尋ねている。

コントリビューターの回答には、適切な留保がある。Am17anは、このスクリプトが最適に近い可能性のあるパラメーターを提供すると説明し、自動モードに向けた作業にも言及している。これは、設定の問題が解決済みである証明ではなく、開発の方向性である。

こうした反応は、異なる成功基準を示している。開発者は追加の実行パスに価値を見いだすかもしれない。経験豊富なユーザーは、チューニングデータへのアクセスを重視するかもしれない。ローカルアシスタントを導入する人は、どちらも学ばずに妥当な挙動を得たいだけかもしれない。

これらの期待は両立するが、互換ではない。パッチは最初の期待を満たしても、残りへの対応が必要な場合がある。報道では、すべての改善に同じ準備完了度を与えるのではなく、この違いを保つべきだ。

ベンチマークの証拠にも、明確な境界が必要である。著者提供の例は、検証すべき挙動を示すため有用だ。しかし、特にこの記事の中心的な論点が設定ごとに挙動が異なることである以上、独立した再現を置き換えるものではない。

公正な比較では、調査対象となる実行設定を変更しつつ、モデルとワークロードを一定に保つ必要がある。そうしなければ、見かけ上の改善が別の差異による可能性がある。これは方法論上の要件であり、公表された例に対する疑念ではない。

重みの保存に用いる数値精度を下げるモデル量子化も、比較では一貫していなければならない。これを変更すれば、実験自体が変わる。同じ注意は、よく知られたモデル名のもとで異なるモデルファイルを提示する場合にも当てはまる。

ユーザー体験には、生成速度だけを超えた幅広い評価が必要である。開始時の短い遅延と、出力中に繰り返される停止は、人々に異なる影響を及ぼす。平均値はいずれも隠し得るため、報道では測定値が何を表すのかを説明すべきだ。

マシンの稼働状況にも注意が必要である。ローカルアシスタントは、他のアプリケーションとコンピューターを共有することが多い。それ以外はアイドル状態のシステムで選んだ構成は、アシスタントが実際に動作する条件で確認する必要がある。

こうした考慮事項は、この機能を無効にするものではない。その有用性を判断するために必要な証拠を定義するものだ。懐疑的な立場とは、有望な仕組みの利点を一般的な主張にする前に、関連する条件で検証すべきだということである。

そのため、最も有用なコミュニティ報告には、うまくいかなかった結果も含まれる。性能を落とす設定は、最適化の境界を特定する助けになる。こうした報告がなければ、読者は好ましい一例を規則と取り違えやすくなる。

現時点で、llama.cpp MoEのCPUオフロードから導ける結論は慎重なものだ。ユーザーには評価に値する新たな選択肢がある。利用可能な証拠は、制約のあるすべてのシステムにCPU参加率を最大化するよう勧めるには十分ではない。

再現性、統合チューニング、アプリケーションでの結果を注視する

次の節目は、この柔軟性が日常的な利用における信頼できるパフォーマンスへと変わるかを示すはずだ。

最初の指標は、明確に記述された構成をまたぐ独立した再現である。報告では、正確なモデルファイル、ソフトウェアのバージョン、ワークロード、設定を特定すべきだ。その価値は、別の人が比較を理解し、再現できる点にある。

転送に制約のある構成で一貫した改善が見られれば、新しい実行パスを支持する根拠は強まる。一貫しない結果が出ても、直ちにそれを無効にするわけではない。より適切な診断と、より限定的な推奨が重要になることを意味する。

2番目の指標は、独立したスクリプトから統合された構成支援への移行である。11月7日の自動チューニング提案で、am17anはモデル固有の設定を選択するためのより包括的なツールを提案している。コントリビューターのangtは、より良いベンチマーク基盤を支持し、キャッシュパラメーター用コマンドの可能性を議論している。

これらは提案と議論であり、出荷済みの汎用チューニングインターフェースではない。この状況は明示したままにすべきだ。重要な進展は、関連する測定を利用しやすくし、その推奨事項が何を対象とするのかを説明する実装である。

統合支援が実現すれば、この機能の使いやすさを支持する根拠は強まる。設定に引き続き別個の出力を解釈する必要があるなら、経験豊富なユーザーは依然として柔軟性を得られる。しかし、技術に詳しくないユーザーの負担はより大きいままとなる。

3番目の指標は、完全なアプリケーション内での評価である。コーディングアシスタントや文書ツールは、設定がユーザーの実際の操作を改善するかを報告すべきだ。そのためには、応答の遅れ、継続利用、現実的なセッション全体での挙動を検討する必要がある。

アプリケーションレベルの改善が確認されれば、この更新は単独の生成結果よりも重要なものとなる。改善が弱い、または一貫しない場合は、その関連性が特定のワークロードに限定される。どちらの結果も、単一の見出し向け速度指標より開発者に有益な情報を与える。

これらの指標は順序立てて読むべきだ。再現によって、この仕組みがどこで役立つかが確立される。統合チューニングによって、ユーザーがその利点にどれほど容易にアクセスできるかが決まる。アプリケーションの結果によって、人々が実際に重視する体験を改善するかが確立される。

Strataとの比較は、この枠組みの中に位置づけるべきである。有用な将来の比較では、開示された条件のもと、定義されたタスクに対して両エンジンを評価するだろう。無関係なコミュニティ結果から勝者を宣言することから始めるべきではない。

今後数か月で最も強力な証拠となるのは、技術的な透明性と実用上の関連性を組み合わせるものだ。設定が増えること自体が目的ではない。目的は、人が自分の仕事に確実に役立つ構成を選べるようにすることである。

llama.cpp MoEのCPUオフロードを検討する読者は、まず自分の導入環境で答えが必要な問いから始めるべきだ。それは、コーディングセッション、文書との対話、あるいは他の繰り返し行う作業で待ち時間を短縮するだろうか。ベースラインを維持し、条件を保存し、やり取り全体を比較してほしい。特に自分のワークロードがそのテストと異なる場合は、チューナーの推奨を検証すべき候補として扱うべきだ。改善する構成と同じくらい注意深く、性能が悪化する構成も共有してほしい。そうした報告は、広く有用なデフォルトと、特定のマシンに適した選択肢を見分ける助けになる。他者のCPU共有率設定を採用する前に、その結果が実際に何を測定したのか、そしてその測定が自分自身の利用を表しているのかを問いかけるべきだ。

 
 

無料で始めましょう

ローカルファーストのパーソナル知識管理付きAIアシスタント

より良いAI体験のために、

remio は現在、 Windows 10+ (x64)とM-Chip Mac のみをサポートしています。

仕事のAIパートナー
remioでもっと仕事が進む

計画・作成・仕上げまで
すべてをひとつに

bottom of page