llama.cpp と LLaMA 2 は、大規模言語モデル(LLMs)をより便利かつ効率的に使用できるようにすることを目的とした、2 つの人気のある AI ソフトウェアプロジェクトです。llama.cpp は Meta の LLaMA モデルを C/C++ 言語で実装したものです。LLaMA 2 は、グループクエリアテンション(grouped-query attention)技術に基づく一連の生成テキストモデルで、プログラミングタスク向けに特別に微調整されています。しかし、これらのモデルの実行には大量の CPU リソースが必要です。

このチュートリアルでは、OpenResty XRay を使用して LLaMA2 モデルを実行する llama.cpp プログラムを分析する方法を段階的に説明します。プログラム内で最も CPU リソースを消費する C++ コードパスを迅速に特定します。これらのコードパスは最も多くの CPU 時間を消費し、llama アプリケーションのパフォーマンスに影響を与えます。

問題: 高 CPU 使用率

llama.cpp ディレクトリに移動します。

スクリーンショット

まず、この C++ プロジェクトをコンパイルします。デバッグシンボルを有効にするために -g オプションを使用します。

スクリーンショット

make コマンドを実行します。

スクリーンショット

コンパイルが完了し、エラーは発生しませんでした。

Screenshot

llama.cppmain プログラムを実行します。Llama2 は Microsoft と Meta が共同でオープンソース化した最新の大規模言語モデルです。ここでは、llama.cpp で実行可能な量子化された 7B モデルを使用しています。

スクリーンショット

生成する token 数を指定します。

スクリーンショット

「Linux」をプロンプトとして使用してコンテンツを生成します。

スクリーンショット

このコマンドを実行します。下に生成されたテキストコンテンツが継続的に出力されているのが確認できます。

Screenshot

別のターミナルを開き、top コマンドを実行して CPU の使用状況を確認します。

スクリーンショット

llama.cppmain コマンドが CPU コアリソースの約 400% を消費していることがわかります。

Screenshot

最もホットな C++ コードパスを特定

OpenResty XRay を使用して、この未修正のプロセスを検査できます。ブラウザで OpenResty XRay の Web コンソールを開きます。

スクリーンショット

ここで、先ほど確認したプロセスをリアルタイムで分析し、CPU 時間が具体的にどこで消費されているかを確認できます。

Screenshot

現在分析中のマシンが正しいことを確認してください。

Screenshot

正しくない場合は、リストから再選択することができます。

Screenshot

「Guided Analysis」ページに移動します。

Screenshot

ここでは、システムが分析可能な様々な種類の問題を確認できます。

Screenshot

「High CPU Usage」を選択します。

Screenshot

「Next」をクリックします。

Screenshot

「Process」より分析対象を選びます。

Screenshot

llama.cppmain プロセスを選択します。

Screenshot

アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。

Screenshot

ここでの言語レベルは「C」と「C++」のみです。

Screenshot

最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。

Screenshot

分析を開始します。

Screenshot

システムは複回数の分析を継続的に実行します。現在、初回の分析を実行中です。

Screenshot

初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。

Screenshot

分析を停止します。

Screenshot

自動分析レポートを生成しています。

Screenshot

自動生成された分析レポートが表示されます。

Screenshot

これは分析対象の問題タイプである CPU です。

Screenshot

これが CPU 時間を最も多く占める C++ コードパスです

Screenshot

最初の関数 ggml_compute_forward_mul_matggml ライブラリの汎用行列乗算関数です。

Screenshot

その上位で呼び出している関数 ggml_graph_compute_thread は単一スレッドの計算を担当します。

スクリーンショット

「More」をクリックして詳細情報を表示します。

Screenshot

上記のコードパスは、この CPU フレームグラフから導き出されたものです。

スクリーンショット

以下は、現在の問題に関するより詳細な説明と提案です。

スクリーンショット

ggml_compute_forward_mul_mat 関数について言及しています。

スクリーンショット

この関数は行列乗算操作を行います。

Screenshot

次に、CPU 時間の占有率が 2 位の C++ コードパスを見てみましょう。

スクリーンショット

最初の関数 ggml_vec_dot_q4_K_q8_Kggml ライブラリの 2 つのベクトルの内積を計算する関数です。

スクリーンショット

「More」をクリックして詳細情報を表示します。

スクリーンショット

ggml_vec_dot_q4_K_q8_K 関数について言及しています。

スクリーンショット

また、2 つのベクトルの内積を計算することについても言及しています。

Screenshot

2 番目のコードパスに戻りましょう。最初の関数の緑色のボックスにマウスを置きます。

スクリーンショット

この関数のソースファイル名が表示されます。ツールチップには k_quants.c ファイルの完全なパスも表示されています。

スクリーンショット

このソースコードの行番号は 2608 です。

Screenshot

このアイコンをクリックして、関数の完全な C ソースファイルパスをコピーします。

スクリーンショット

vim エディタを使用して、このファイル内の C コードを確認します。お好みのエディタを使用していただいて構いません。

スクリーンショット

OpenResty XRay が提案したように、2608 行目にジャンプします。

スクリーンショット

このコードが C 言語のビット演算を使用して配列の要素に対して操作を行っていることがわかります。

スクリーンショット

ステータスバーでは、このコードが以前のレポートで言及された ggml_vec_dot_q4_K_q8_K 関数内にあることも確認できます。

Screenshot

自動生成レポート

OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。「Insights」ページに切り替えてください。

Screenshot

「Insights」ページに切り替えます。

Screenshot

「Insights」ページでは、日次および週次のレポートを確認することができます。

Screenshot

したがって、「Guided Analysis」機能を必ずしも使用する必要はありません。もちろん、「Guided Analysis」はアプリケーションの開発やデモンストレーションに非常に有用です。

Screenshot

OpenResty XRay について

OpenResty XRay動的トレーシング製品であり、実行中のアプリケーションを自動的に分析して、パフォーマンスの問題、動作の問題、セキュリティの脆弱性を解決し、実行可能な提案を提供いたします。基盤となる実装において、OpenResty XRay は弊社の Y 言語によって駆動され、Stap+、eBPF+、GDB、ODB など、様々な環境下で複数の異なるランタイムをサポートしております。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty XRay(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!