llama.cpp: CPU+GPUのプロンプト処理が高速化される(#6083)

 

今さら知ったのですが、2週間ほど前にllama.cppでモデルをGPUに部分オフロードした場合のプロンプト処理速度が大幅に向上されていました。

github.com

  • 従来のllama.cppではGPUフルオフロードから部分オフロードに移行すると急激にプロンプト処理(PP)が遅くなるため、CPU+GPUのハイブリッド推論の魅力を大きく損ねていました。
  • このPRによって、CPU比率が増えた場合のPP速度低下が緩和され、部分オフロードの実用性が大幅に改善しています。
  • 以下はMixtral 8x7B のQ3_K_L量子化モデルで1024トークンのPPを実行したときのグラフです。

  • モデルのレイヤー33層のうち半分をGPUから引き上げた場合、旧来のllama.cppではPP速度が半分以下に低下していますが、このPR適用後は2/3程度の処理速度を保っています。
  • このPRの技術的な概要について、llama.cppのJohannesGaesslerさんが以下のように説明しています。

CPUレイヤーのデータはRAMにあり、GPUレイヤーのデータはVRAMにあります。GPUレイヤーは常に GPU上で評価されます。

#PR6083では、バッチサイズが大きい場合(つまりプロンプト処理の場合)、GPUの高い計算能力を利用するためにCPUレイヤーのすべてのデータがGPUに移動され、そこで計算が行われます。バッチサイズが小さい場合(つまりトークン生成の場合)、CPUレイヤーはそのままCPU上で評価されます。

  • 個人的にも、Mixtralモデルを使う場合はVRAMに詰め込むため2bitのきつい量子化を使っていたので、オフロードがしやすくなるのはとても嬉しいです。
  • 早速llama.cppを更新して、ベンチマークでPPの高速化が確認できました。ただ普段APIとして使っているkobold.cppにはまだ反映されていないので、こちらはアップデートを待ちたいと思います。