キャメル.cpp
Pure C/C++ でのLLaMAモデルの推論
ホットな話題:
- 単純な Web チャットの例: #1998
- k-quants は、 スーパーブロック サイズ 64:: #2001をサポートするようになりました。
- 新しいロードマップ: https://github.com/users/ggerganov/projects/7
- Azure CI ブレーンストーミング: #1985
- p1: LLM ベースのエッジ コード補完エンジン: ggml-org/p1#1
目次
説明
主な目標llama.cpp
は、4 ビット整数量子化を使用して MacBook 上で LLaMA モデルを実行することです。
- 依存関係のない純粋な C/C++ 実装
- Apple Silicon First Class Citizen - ARM NEON 、Accelerate、および Metal フレームワークで最適化
- x86 アーキテクチャの AVX、AVX2、および AVX512 のサポート
- ハイブリッドF16/F32 精度
- 4 ビット、5 ビット、8 ビットの整数量子化をサポート
- BLAS は、OpenBLAS/Apple BLAS/ARM Performance Lib/ATLAS/BLIS/Intel MKL/NVHPC/ACML/SCSL/SGIMATHなどをサポートします。
- cuBLAS および CLBlast のサポート
元の実装は一晩でハッキングされましたllama.cpp
。それ以来、プロジェクトは多くの貢献のおかげで大幅に改善されました。このプロジェクトは、教育目的およびggmlライブラリの新機能を開発するための主要なプラットフォームとして使用されます。
サポートされているプラットフォーム:
- アップルシステム
- Linux
- Windows (CMake経由)
- ルスタバウ
サポートされているモデル:
バインディング:
-
サポートされているモデル:
- ラマ
- アルパカ
- GPT4すべて
- チャイニーズ LLaMA / アルパカ
- ヴィゴーニュ (フランス)
- ビクーニャ
- コアラ
- OpenBuddy エディター (多言語)
- ピグマリオン 7B / メタハーム 7B
- ウィザードLM
- Baichuan-7Bとその派生版 ( baichuan-7b-sft など )
- Python: abetlen/llama-cpp-python
- 行く: go-skynet/go-llama.cpp
- Node.js: hlhr202/llama-node
- ルビ: yosoku/llama_cpp.rb
- C#/.NET: SciSharp/LLamaSharp
- Scala 3: thunderom/llm4s
ユーザーインターフェース:
以下は、LLaMA-7B を使用した一般的な実行です。
make -j && ./main -m ./models/7B/ggml-model-q4_0.bin -p "Web サイトの構築は 10 の簡単な手順で行うことができます:" -n 512
llama.cpp のビルド情報:
私 UNAME_S: ダーウィン
私 UNAME_P: 腕
私 UNAME_M: arm64
I CFLAGS: -I. -O3 -DNDEBUG -std=c11 -fPIC -pthread -DGGML_USE_ACCELERATE
I CXXFLAGS: -I. -I./examples -O3 -DNDEBUG -std=c++11 -fPIC -pthread
I LDFLAGS: -framework Accelerate
I CC: Apple Clang バージョン 14.0.0 (clang-1400.0.29.202)
I CXX: Apple Clang バージョン 14.0.0 (clang-1400.0.29.202)
make: 「デフォルト」の場合は何もする必要はありません。
メイン: シード = 1678486056
llama_model_load: './models/7B/ggml-model-q4_0.bin' からモデルをロードしています - お待ちください ...
ラマモデルロード: n_vocab = 32000
ラマモデルロード: n_ctx = 512
ラマモデルロード: n_embd = 4096
ラマモデルロード: n_mult = 256
ラマモデルロード: n_head = 32
ラマモデルロード: n_layer = 32
ラマモデルロード: n_rot = 128
ラマモデルロード: f16 = 2
ラマモデルロード: n_ff = 11008
llama_model_load: ggml ctx サイズ = 4529.34 MB
llama_model_load: メモリサイズ = 512.00 MB、n_mem = 16384
llama_model_load: ...................................完了
llama_model_load: モデル サイズ = 4017.27 MB / テンソル数 = 291
main: プロンプト: 'Web サイトの構築は 10 の簡単なステップで実行できます:'
main: プロンプト内のトークンの数 = 15
1 -> ''
8893 -> 'ビルド'
292 -> 'ing'
263 -> 「あ」
4700 -> 「ウェブサイト」
508 -> 「できる」
367 -> 「ある」
2309 -> 「完了」
297 -> 'で'
29871 -> 「 」
29896 -> '1'
29900 -> '0'
2560 -> 「シンプル」
6576 -> ' ステップ'
29901 -> ':'
サンプリングパラメータ: temp = 0.800000、top_k = 40、top_p = 0.950000
Web サイトの構築は 10 の簡単なステップで行うことができます。
1) ドメイン名とウェブホスティングプランを選択します
2) サイトマップを完成させる
3) 製品をリストする
4) 商品説明を書く
5) ユーザーアカウントを作成する
6) テンプレートを構築する
7) ウェブサイトの構築を開始する
8) ウェブサイトの宣伝
9) 電子メールサポートを提供する
10) ウェブサイトを検索エンジンに送信する
Web サイトは、HTML でフォーマットされた Web ページの集合です。HTML は、Web サイトの外観と動作を定義するコードです。
HTML コードは、テンプレートまたはフォーマットにフォーマットされます。これが完了すると、ユーザーのブラウザに表示されます。
Web ページは Web サーバーに保存されます。Web サーバーはホストとも呼ばれます。Web サイトにアクセスすると、サーバーから Web サイトが取得され、ユーザーのコンピュータに表示されます。
Web サイトは、ホストされているときは Web サイトと呼ばれます。これは、ホスト上に表示されることを意味します。通常、ホストは Web サーバーです。
Web サイトはさまざまなブラウザーで表示できます。ブラウザは基本的に、ユーザーの画面上に Web サイトを表示するソフトウェアです。
ウェブサイトはデスクトップ、タブレット、スマートフォンなどのさまざまなデバイスでも表示できます。
したがって、Web サイトをブラウザーに表示するには、Web サイトをホストする必要があります。
ドメイン名は Web サイトのアドレスです。ウェブサイトの名前です。
Web サイトは、ホストされている場合は Web サイトと呼ばれます。これは、ホスト上に表示されることを意味します。通常、ホストは Web サーバーです。
Web サイトはさまざまなブラウザーで表示できます。ブラウザは基本的に、ユーザーの画面上に Web サイトを表示するソフトウェアです。
ウェブサイトはデスクトップ、タブレット、スマートフォンなどのさまざまなデバイスでも表示できます。したがって、Web サイトをブラウザーに表示するには、Web サイトをホストする必要があります。
ドメイン名は Web サイトのアドレスです。ウェブサイトの名前です。
Web サイトは Web サイトのアドレスです。HTML でフォーマットされた Web ページのコレクションです。HTML は、Web サイトの外観と動作を定義するコードです。
HTML コードは、テンプレートまたはフォーマットにフォーマットされます。これが完了すると、ユーザーのブラウザに表示されます。
Web サイトは、ホストされているときに Web サイトとして認識されます
main: トークンあたりのメモリ = 14434244 バイト
メイン: ロード時間 = 1332.48 ミリ秒
メイン: サンプル時間 = 1081.40 ミリ秒
main: 予測時間 = 31378.77 ミリ秒 / トークンあたり 61.41 ミリ秒
メイン: 合計時間 = 34036.74 ミリ秒
これは、単一の M1 Pro MacBook で LLaMA-7B と tweet.cpp を実行する別のデモです。
ささやきラクダ-lq.mp4
使用法
以下は、LLaMA-7B モデルの手順です。
コードを取得
git clone https://github.com/ggerganov/llama.cpp
cd ラマ.cpp
我慢する
llama.cpp をビルドするには、3 つの異なるオプションがあります。
-
使用
make
:-
Linux または MacOS の場合:
作る
-
Windows の場合:
- w64devkitの最新の Fortran バージョンをダウンロードします。
w64devkit
コンピューター上で抽出します。- 実行します
w64devkit.exe
。 cd
コマンドを使用してllama.cpp
フォルダーにアクセスします。- ここから次を実行できます。
作る
-
-
使用
CMake
:mkdir ビルド CD ビルド cmake .. cmake --build 。--config リリース
-
使用
Zig
:zig build -Doptimize=ReleaseFast
金属構造
Metal を使用すると、Apple デバイスの GPU で計算を実行できます。
-
使用
make
:LLAMA_METAL=1 製
-
使用
CMake
:mkdir ビルドメタル CDビルドメタル cmake -DLLAMA_METAL=ON .. cmake --build 。--config リリース
--gpu-layers|-ngl
Metal サポートを使用してビルドする場合、コマンド ライン引数を使用して GPU 推論を有効にすることができます。0 より大きい値を指定すると、計算が GPU にオフロードされます。例えば:
./main -m ./models/7B/ggml-model-q4_0.bin -n 128 -ngl 1
MPI ビルド
MPI を使用すると、マシンのクラスター全体に計算を分散できます。LLM 予測のシリアルな性質により、エンドツーエンドの高速化は実現しませんが、単一マシンの RAM で実行できるよりもはるかに大きなモデルを実行できるようになります。
まず、MPI ライブラリをシステムにインストールする必要があります。最も人気のある (そして唯一?) 2 つのオプションはMPICHとOpenMPIです。どちらもパッケージ マネージャー ( 、Homebrew、MacPorts など) を使用してapt
インストールできます。
LLAMA_MPI
次に、すべてのマシンでプロジェクトをビルドして true に設定する必要があります。 CMake でビルドする場合はmake
、MPI 対応コンパイラも指定する必要があります (これは CMake でビルドするときに自動的に構成されます)。
-
使用
make
:CC=mpicc CXX=mpicxx LLAMA_MPI=1 にする
-
使用
CMake
:cmake -S 。-B ビルド -DLLAMA_MPI=ON
プログラムが構築されたら、クラスター内のすべてのマシンに重みをダウンロード/変換します。ウェイトとプログラムへのパスはすべてのマシンで同じである必要があります。
次に、マスター ホストから各マシンへのパスワードなしの SSH アクセスを確保し、hostfile
ホスト名とその相対的な「重み」 (スロット) のリストを作成します。計算に localhost を使用する場合は、ループバック アドレスまたは「localhost」ではなく、そのローカル サブネット IP アドレスを使用します。
hosts ファイルの例を次に示します。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>192.168.0.1:2
malvolio.local:1
</code></span></span></span></span>
上記のコードは、計算を最初のホスト上の 2 つのプロセスと 2 番目のホスト上の 1 つのプロセスに分散します。各プロセスはほぼ同じ量の RAM を使用します。プロセス間 (ホスト内) 通信にはコストがかかるため、これらの数値を小さく保つようにしてください。
最後に、次を使用して計算を実行する準備が整いましたmpirun
。
mpirun - ホストファイル ホストファイル -n 3 ./main -m ./models/7B/ggml-model-q4_0.bin -n 128
BLAS ビルド
BLAS サポートを使用してプログラムをビルドすると、ヒント処理に 32 (デフォルトは 512) を超えるバッチ サイズを使用すると、パフォーマンスが多少向上する可能性があります。BLAS は通常の発電性能には影響しません。現在、3 つの異なる実装があります。
-
加速フレームワーク:
この機能は Mac PC でのみ利用でき、デフォルトで有効になっています。通常の手順に従ってビルドできます。
-
BLAS を開く:
これにより、CPU のみを使用して BLAS アクセラレーションが提供されます。OpenBLAS がコンピューターにインストールされていることを確認してください。
-
使用
make
:-
Linux の場合:
LLAMA_OPENBLAS=1 にする
-
Windows の場合:
-
w64devkitの最新の Fortran バージョンをダウンロードします。
-
Windows 用のOpenBLASの最新バージョンをダウンロードします。
-
w64devkit
コンピューター上で抽出します。 -
フォルダー内に
libopenblas.a
ある、ダウンロードしたばかりの OpenBLAS zip のコピーから。lib
w64devkit\x86_64-w64-mingw32\lib
-
include
同じ OpenBLAS zip 内のフォルダーの内容をコピーしますw64devkit\x86_64-w64-mingw32\include
。 -
実行します
w64devkit.exe
。 -
cd
コマンドを使用してllama.cpp
フォルダーにアクセスします。 -
ここから次を実行できます。
LLAMA_OPENBLAS=1 にする
-
-
-
CMake
Linux では次を使用します。mkdir ビルド CD ビルド cmake .. -DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS cmake --build 。--config リリース
-
-
閃光
詳細については、BLIS.md を確認してください。
-
インテル MKL
デフォルトでは、
LLAMA_BLAS_VENDOR
これは set になっているGeneric
ため、Intel 環境スクリプトを入手して-DLLAMA_BLAS=ON
cmake で配布している場合は、Blas の mkl バージョンが自動的に選択されます。次のように指定することもできます。mkdir ビルド CD ビルド cmake .. -DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=Intel10_64lp -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx cmake --build 。--config リリース
-
CuBLASカブラス
これにより、Nvidia GPU の CUDA コアを使用した BLAS アクセラレーションが提供されます。CUDA ツールキットがインストールされていることを確認してください。Linux ディストリビューションのパッケージ マネージャー、またはここからダウンロードできます: CUDA Toolkit。
-
使用
make
:FLAME_CUBLAS=1 にする
-
使用
CMake
:mkdir ビルド CD ビルド cmake .. -DLLAMA_CUBLAS=ON cmake --build 。--config リリース
環境変数CUDA_VISIBLE_DEVICESを使用して、使用する GPU を指定できます。次のコンパイル オプションもパフォーマンスを調整するために使用できます。
オプション 法定価値 デフォルト 説明 LLAMA_CUDA_FORCE_DMMV ブール値 正しくない 量子化されたデータに対して行列ベクトル乗算を行うカーネルの代わりに、逆量子化 + 行列ベクトル乗算カーネルの使用を強制します。デフォルトでは、計算能力 (7.0/Turing/RTX 2000 以降の MMVQ) に基づいて決定が行われます。k量子には影響しません。 LLAMA_CUDA_DMMV_X 正の整数 >= 32 32 反復ごとに CUDA 逆量子化 + 行列ベクトル乗算カーネルによって処理される x 方向の値の数。この値を増やすと、高速 GPU でのパフォーマンスが向上する可能性があります。2 のべき乗を強くお勧めします。k量子には影響しません。 LLAMA_CUDA_MMV_Y 正整数 1 CUDA は、y 方向のカーネル ブロック サイズを決定します。この値を増やすと、高速 GPU でのパフォーマンスが向上する可能性があります。2 のべき乗が推奨されます。k量子には影響しません。 LLAMA_CUDA_DMMV_F16 ブール値 正しくない 有効にすると、CUDA 逆量子化 + mul mat vec カーネルに半精度浮動小数点演算が使用されます。比較的新しい GPU のパフォーマンスを向上させることができます。 LAMA_CUDA_KQUANTS_ITER 1 または 2 2 Q2_K および Q6_K 量子化形式の反復ごとおよび CUDA スレッドごとに処理される値の数。この値を 1 に設定すると、低速な GPU でのパフォーマンスが向上します。 -
-
CLB爆発
OpenCL アクセラレーションは、 CLBlast プロジェクトの行列乗算カーネルと、GPU 上でトークンを生成する ggml カスタム カーネルによって提供されます。
OpenCL SDK が必要になります。
-
Ubuntu または Debian の場合、これらの
opencl-headers
パッケージが必要になる場合がありますocl-icd
。 -
ソースから OpenCL SDK をインストールする
CLBlast をインストールします。CLBlast はオペレーティング システムのパッケージ内にあります。
-
そうでない場合は、ソースからインストールします。
建築:
- make でビルドします。
LLAMA_CLBLAST=1にする
- CMake:
mkdir ビルド CD ビルド cmake .. -DLLAMA_CLBLAST=ON -DCLBlast_dir=/some/path cmake --build 。--config リリース
ランニング:
CLBlast バージョンは、
--gpu-layers|-ngl
CUDA バージョンと同じ機能をサポートします。正しいプラットフォーム (ドライバー) とデバイス (GPU) を選択するには、環境変数
GGML_OPENCL_PLATFORM
と を使用GGML_OPENCL_DEVICE
できます。選択には、番号 (0 から始まります) または検索するテキスト文字列を指定できます。GGML_OPENCL_PLATFORM=1 ./main ... GGML_OPENCL_DEVICE=2 ./main ... GGML_OPENCL_PLATFORM=インテル ./main ... GGML_OPENCL_PLATFORM=AMD GGML_OPENCL_DEVICE=1 ./main ...
デフォルトの動作では最初の GPU デバイスが検索されますが、このセレクターは、たとえばラップトップ上の統合 GPU である場合に便利です。必要に応じて、これらの変数を使用して CPU ベースのドライバーを選択することもできます。
clinfo -l
コマンドなどでプラットフォームやデバイスの一覧を取得できます。 -
データを準備して実行する
# 元の LLaMA モデルの重みを取得し、./models に配置します。
ls ./モデル
65B 30B 13B 7B tokenizer_checklist.chk tokenizer.model
# Python の依存関係をインストールする
python3 -m pip install -rrequirements.txt
# 7B モデルを ggml FP16 形式に変換します
python3 変換.py モデル/7B/
# モデルを 4 ビットに量子化します (q4_0 メソッドを使用)
./quantize ./models/7B/ggml-model-f16.bin ./models/7B/ggml-model-q4_0.bin q4_0
# 推論を実行する
./main -m ./models/7B/ggml-model-q4_0.bin -n 128
より大きなモデルを実行する場合は、すべての中間ファイルを保存するのに十分なディスク領域があることを確認してください。
メモリ/ディスク要件
モデルは現在メモリに完全にロードされているため、モデルを保存するのに十分なディスク容量と、ロードするのに十分な RAM が必要です。現時点では、メモリとディスクの要件は同じです。
モデル | オリジナルサイズ | 量子化サイズ(4ビット) |
---|---|---|
7b | 13GB | 3.9GB |
13b | 24GB | 7.8GB |
30B | 60GB | 19.5GB |
65b | 120GB | 38.5GB |
定量化する
複数の量子化方法がサポートされています。それらは、結果として得られるモデルのディスク サイズと推論速度が異なります。
モデル | 測定 | F16 | Q4_0 | Q4_1 | Q5_0 | Q5_1 | Q8_0 |
---|---|---|---|---|---|---|---|
7b | 困惑した | 5.9066 | 6.1565 | 6.0912 | 5.9862 | 5.9481 | 5.9070 |
7b | ファイルサイズ | 13.0G | 3.5G | 3.9G | 4.3G | 4.7g | 6.7g |
7b | ms/tok @ 4 番目 | 127 | 55 | 54 | 76 | 83 | 72 |
7b | ms/tok @ 8日 | 122 | 43 | 45 | 52 | 56 | 67 |
7b | 桁数・重み | 16.0 | 4.5 | 5.0 | 5.5 | 6.0 | 8.5 |
13b | 困惑した | 5.2543 | 5.3860 | 5.3608 | 5.2856 | 5.2706 | 5.2548 |
13b | ファイルサイズ | 25.0G | 6.8G | 7.6G | 8.3G | 9.1G | 13G |
13b | ms/tok @ 4 番目 | - | 103 | 105 | 148 | 160 | 131 |
13b | ms/tok @ 8日 | - | 73 | 82 | 98 | 105 | 128 |
13b | 桁数・重み | 16.0 | 4.5 | 5.0 | 5.5 | 6.0 | 8.5 |
複雑さ (モデルの品質の尺度)
このperplexity
例を使用して、特定のプロンプトの複雑度を測定できます (複雑度が低いほど優れています)。詳細については、「固定長モデルの複雑性」を参照してください。
上の表のパープレキシティの測定は、コンテキスト長 512 のwikitext2
テスト データセット ( WikiText-2 Dataset | Papers With Code ) で 実行されます。トークンあたりの時間は、MacBook M1 Pro 32GB RAM で 4 スレッドと 8 スレッドを使用しています。
インタラクティブモード
より ChatGPT に似たエクスペリエンスが必要な場合は、-i
パラメータを渡すことで対話モードで実行できます。このモードでは、Ctrl+C を押して 1 行以上のテキストを入力すると、いつでもビルドを中断できます。テキストはトークンに変換され、現在のコンテキストに追加されます。パラメーターを使用して逆ヒント-r "reverse prompt string"
を指定することもできます。これにより、生成中に逆ヒント文字列の正確なトークンが検出されるたびに、ユーザーに入力を求めるプロンプトが表示されます。一般的な使用法は、LLaMa にヒントを使用して複数のユーザー (アリスとボブなど) 間のチャットをシミュレートさせ、それを渡すことです-r "Alice:"
。
以下は、コマンドを使用して呼び出されるいくつかのインタラクションの例です。
# 7B モデルを使用したデフォルトの引数
./examples/chat.sh
# 13B モデルとの高度なチャット
./examples/chat-13B.sh
# 13B モデルを使用したカスタム引数
./main -m ./models/13B/ggml-model-q4_0.bin -n 256 --repeat_penalty 1.0 --color -i -r "ユーザー:" -f プロンプト/chat-with-bob.txt
ユーザー入力と生成されたテキストを区別するために を使用していることに注意してください--color
。その他のパラメータについてはサンプルプログラムのREADMEで詳しく説明されていますmain
。
継続的なインタラクション
./main
プロンプト、ユーザー入力、--prompt-cache
およびモデル生成は、と を利用することで、呼び出しの間に保存および復元できます--prompt-cache-all
。この./examples/chat-persistent.sh
スクリプトは、長時間実行され再開可能なチャット セッションをサポートすることでこれを示しています。この例を使用するには、最初のチャット プロンプトをキャッシュするファイルとチャット セッションを保存するディレクトリを提供し、オプションで を提供する必要があります。chat-13B.sh
新しいチャット セッションは同じプロンプト キャッシュを再利用できます。ヒント キャッシュとチャット ディレクトリの両方が、 PROMPT_TEMPLATE
初期ヒント ( ) とモデル ファイルに関連付けられていることに注意してください。
# 新しいチャットを開始する
PROMPT_CACHE_FILE=chat.prompt.bin CHAT_SAVE_DIR=./chat/default ./examples/chat-persistent.sh
# チャットを再開する
PROMPT_CACHE_FILE=chat.prompt.bin CHAT_SAVE_DIR=./chat/default ./examples/chat-persistent.sh
# 同じプロンプト/モデルで別のチャットを開始します
PROMPT_CACHE_FILE=chat.prompt.bin CHAT_SAVE_DIR=./chat/another ./examples/chat-persistent.sh
# 異なるプロンプト/モデルの異なるプロンプト キャッシュ
PROMPT_TEMPLATE=./prompts/chat-with-bob.txt PROMPT_CACHE_FILE=bob.prompt.bin \
CHAT_SAVE_DIR=./chat/bob ./examples/chat-persistent.sh
アルパカティーチングモード
- まずアルパカモデルを
ggml
フォルダーにダウンロードします./models
main
次のようにツールを実行します。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>./examples/alpaca.sh
</code></span></span></span></span>
実行例:
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>== Running in interactive mode. ==
- Press Ctrl+C to interject at any time.
- Press Return to return control to LLaMa.
- If you want to submit another line, end your input in '\'.
Below is an instruction that describes a task. Write a response that appropriately completes the request.
> How many letters are there in the English alphabet?
There 26 letters in the English Alphabet
> What is the most common way of transportation in Amsterdam?
The majority (54%) are using public transit. This includes buses, trams and metros with over 100 lines throughout the city which make it very accessible for tourists to navigate around town as well as locals who commute by tram or metro on a daily basis
> List 5 words that start with "ca".
cadaver, cauliflower, cabbage (vegetable), catalpa (tree) and Cailleach.
>
</code></span></span></span></span>
OpenLLaMAを使用する
OpenLLaMA は、Meta のオリジナル LLaMA モデルの公的にライセンスされたレプリカです。これは同じアーキテクチャを使用しており、元の LLaMA 重みのドロップイン代替品です。
- Hugging Face から3B、7Bまたは13B モデルをダウンロードします。
- 次のコマンドを使用して、モデルを ggml FP16 形式に変換します。
python convert.py <path to OpenLLaMA directory>
GPT4Allを使用する
- LLaMA モデルからファイルを取得し
tokenizer.model
て配置します。models
- アルパカモデルからファイルを取得し
added_tokens.json
て入れますmodels
- GPT4All モデルからファイルを取得し
gpt4all-lora-quantized.bin
て配置します。models/gpt4all-7B
ggml
現在は廃止された古い形式で配布されています- 次のようにして新しい形式に変換する必要があります
convert.py
。
python3 Convert.py models/gpt4all-7B/gpt4all-lora-quantized.bin
-
models/gpt4all-7B/ggml-model-q4_0.bin
新しく生成されたモデルを他のモデルと同様に使用できるようになりました。 -
新しい GPT4All-J モデルはまだサポートされていません。
ピグマリオン 7B とメタルメ 7B の使用
- LLaMA 重みを取得する
- Pygmalion 7BまたはMetharme 7B XOR エンコードされた重みを取得する
- 最新の HF 変換スクリプトを使用してLLaMA モデルを変換する
- xor_codec スクリプトを実行して、 XOR ファイルを変換された LLaMA 重みとマージします。
- このリポジトリのスクリプトを使用して
ggml
形式に変換しますconvert.py
。
python3 Convert.py pygmalion-7b/ --outtype q4_1
Pygmalion 7B および Metharme 7B の重みはbfloat16精度で保存されます。量子化せずにに変換したい場合は
ggml
、代わりに--outtype
as を指定します。f32
f16
Facebook LLaMAオリジナルモデルとStanford Alpacaモデルデータを取得
- いかなる状況でも、IPFS、マグネット リンク、またはその他のモデルのダウンロード リンクを、問題、ディスカッション、プル リクエストなど、このリポジトリ内のどこでも共有してはなりません。それらはすぐに削除されます。
- LLaMA モデルは Facebook によって公式に配布されており、このリポジトリからは決して入手できません。
- モデル データへのアクセスをリクエストする必要がある場合は、Facebook の LLaMA リポジトリを参照してください。
モデルファイルを検証する
モデル ファイルに関する問題を作成する前に、ダウンロードしたすべてのモデル ファイルのsha256 チェックサムを検証して、正しいモデル データ ファイルがあることを確認してください。
- 次の Python スクリプトは、自己インストールのサブディレクトリ
./models
に最新のファイルがすべて存在することを確認します。
# 検証スクリプトを実行する
python3 .\scripts\verify-checksum-models.py
- Linux または macOS では、次のコマンドを実行して、自己インストールのサブディレクトリ
./models
に最新のファイルがすべて存在することを 確認することもできます。- Linux の場合:
sha256sum --ignore-missing -c SHA256SUMS
- macOS の場合:
shasum -a 256 --ignore-missing -c SHA256SUMS
- Linux の場合:
画期的な論文とモデルの背景
問題がモデル生成の品質にある場合は、少なくとも次のリンクと論文を読んで、LLaMA モデルの制限を理解してください。これは、適切なモデル サイズを選択し、LLaMA モデルと ChatGPT 間の重大かつ微妙な違いを理解する場合に特に重要です。
- キャメル:
- GPT-3
- GPT-3.5 / InstructGPT / ChatGPT:
走り方
- ダウンロード/解凍: https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-2-raw-v1.zip ?ref=salesforce-research
- ランニング
./perplexity -m models/7B/ggml-model-q4_0.bin -f wiki.test.raw
- 出力:
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>perplexity : calculating perplexity over 655 chunks
24.43 seconds per pass - ETA 4.45 hours
[1]4.5970,[2]5.1807,[3]6.0382,...
</code></span></span></span></span>
4.45 時間後、最後のパズルに直面します。
アンドロイド
Android NDK を使用してプロジェクトをビルドする
termux をllama.cpp
使用すると、 Android デバイス上で簡単に実行できます。
まず、termux に必要なパッケージをインストールします。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>pkg install clang wget git cmake
</code></span></span></span></span>
次に、Android NDK を取得し、CMake を使用してビルドします。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>$ mkdir build-android
$ cd build-android
$ export NDK=<your_ndk_directory>
$ cmake -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-23 -DCMAKE_C_FLAGS=-march=armv8.4a+dotprod ..
$ make
</code></span></span></span></span>
termux をデバイスにインストールし、実行してtermux-setup-storage
SD カードにアクセスします。最後に、llama
バイナリとモデル ファイルをデバイスのストレージにコピーします。こちらは、Pixel 5 スマートフォンで実行されるインタラクティブ セッションのデモです。
ラクダのインタラクション 2.mp4
Termux (F-Droid) を使用してプロジェクトをビルドする
F-Droid の Termux は、Android デバイス上でプロジェクトを実行するための代替方法を提供します。このアプローチにより、root 化されたデバイスや SD カードを必要とせず、ターミナル内でプロジェクトを直接ビルドできます。
OpenBLAS および CLBlast を使用してプロジェクトをインストールする手順の概要を以下に示します。この組み合わせは、GPU を搭載した最新のデバイスで最高のパフォーマンスを提供するように設計されています。
OpenBLAS の使用を選択した場合は、対応するパッケージをインストールする必要があります。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>apt install libopenblas
</code></span></span></span></span>
その後、CLBlast を組み込むことにした場合は、まず必要な OpenCL パッケージをインストールする必要があります。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>apt install ocl-icd opencl-headers opencl-clhpp clinfo
</code></span></span></span></span>
CLBlast をコンパイルするには、まず対応する Git リポジトリのクローンを作成する必要があります。このリポジトリは、URL: https://github.com/CNugteren/CLBlastにあります。さらに、このリポジトリのクローンをホーム ディレクトリに作成します。これが完了したら、CLBlast フォルダーに移動し、以下で説明するコマンドを実行します。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>cmake .
make
cp libclblast.so* $PREFIX/lib
cp ./include/clblast.h ../llama.cpp
</code></span></span></span></span>
前の手順に従って、LlamaCpp ディレクトリに移動します。OpenBLAS および CLBlast を使用してコンパイルするには、次のコマンドを実行します。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>cp /data/data/com.termux/files/usr/include/openblas/cblas.h .
cp /data/data/com.termux/files/usr/include/openblas/openblas_config.h .
make LLAMA_CLBLAST=1 //(sometimes you need to run this command twice)
</code></span></span></span></span>
上記の手順を完了すると、プロジェクトが正常にコンパイルされます。CLBlast で実行するには、いくつかの小さな調整が必要です。仮想 GPU ではなく、デバイスの物理 GPU に操作を指示するコマンドを発行する必要があります。必要なコマンドについては以下で詳しく説明します。
<span style="color:#1f2328"><span style="background-color:#ffffff"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>GGML_OPENCL_PLATFORM=0
GGML_OPENCL_DEVICE=0
export LD_LIBRARY_PATH=/vendor/lib64:$LD_LIBRARY_PATH
</code></span></span></span></span>
(注: Zenfone 8 などの一部の Android デバイスでは、「export LD_LIBRARY_PATH=/system/vendor/lib64:$LD_LIBRARY_PATH」というコマンドが必要です。出典: https://www.reddit.com/r/termux/comments/kc3ynp /opencl_working_in_termux_more_in_comments/ )
簡単かつ迅速に再実行するには、最後の部分を .sh スクリプト ファイルに記録することを検討してください。これにより、最小限の手間でプロセスを再実行できるようになります。
必要なモデルを~/llama.cpp/models/
ディレクトリに配置し、./main (...)
スクリプトを実行します。
ルスタバウ
前提条件
- Docker がシステムにインストールされ、実行されている必要があります。
- 大きなモデルと中間ファイルを保存するフォルダーを作成します (例: /llama/models)
写真
このプロジェクトで利用できる 2 つの Docker イメージがあります。
ghcr.io/ggerganov/llama.cpp:full
: このイメージには、LLaMA モデルを ggml および 4 ビット量子化に変換するための主要な実行可能ファイルとツールが含まれています。ghcr.io/ggerganov/llama.cpp:light
: イメージにはメインの実行可能ファイルのみが含まれています。
使用法
モデルをダウンロードし、ggml に変換し、最適化する最も簡単な方法は、完全な Docker イメージが含まれる --all-in-one コマンドを使用することです。
以下の内容を、/path/to/models
モデルをダウンロードした実際のパスに置き換えます。
docker run -v /path/to/models:/models ghcr.io/ggerganov/llama.cpp:full --all-in-one "/models/" 7B
完了したら、プレイする準備は完了です。
docker run -v /path/to/models:/models ghcr.io/ggerganov/llama.cpp:full --run -m /models/7B/ggml-model-q4_0.bin -p "Web サイトの構築が可能10 の簡単なステップで:" -n 512
または明るい画像を使用します。
docker run -v /path/to/models:/models ghcr.io/ggerganov/llama.cpp:light -m /models/7B/ggml-model-q4_0.bin -p "ウェブサイトの構築は 10 の簡単な手順で実行できますステップ:" -n 512
ドッカーとCUDA
Linux にnvidia-container-toolkit を適切にインストールしているか、GPU サポートを備えたクラウドを使用していると仮定すると、cuBLAS
コンテナ内でアクセスできるはずです。
現地建設
docker build -t local/llama.cpp:full-cuda -f .devops/full-cuda.Dockerfile 。
docker build -t local/llama.cpp:light-cuda -f .devops/main-cuda.Dockerfile 。
ARGS
コンテナー ホストと GPU アーキテクチャによってサポートされている CUDA 環境に応じて、別のものを渡す必要がある場合があります。
デフォルト値は次のとおりです。
CUDA_VERSION
設定11.7.1
CUDA_DOCKER_ARCH
設定all
結果として得られるイメージは、非 CUDA イメージと基本的に同じです。
local/llama.cpp:full-cuda
: このイメージには、LLaMA モデルを ggml および 4 ビット量子化に変換するための主要な実行可能ファイルとツールが含まれています。local/llama.cpp:light-cuda
: イメージにはメインの実行可能ファイルのみが含まれています。
使用法
ローカルでビルドする場合、使用法は非 CUDA の例と似ていますが、--gpus
フラグを追加する必要があります。フラグも使用する必要があります--n-gpu-layers
。
docker run --gpus all -v /path/to/models:/models local/llama.cpp:full-cuda --run -m /models/7B/ggml-model-q4_0.bin -p "Web サイトを構築すると、 10 の簡単なステップで実行できます:" -n 512 --n-gpu-layers 1
docker run --gpus all -v /path/to/models:/models local/llama.cpp:light-cuda -m /models/7B/ggml-model-q4_0.bin -p "Web サイトの構築は、 10 の簡単なステップ:" -n 512 --n-gpu-layers 1
助ける
- 寄稿者は PR を開くことができます
llama.cpp
コラボレーターはリポジトリ内のブランチにプッシュし、PR をmaster
ブランチにマージできます。- 貢献に基づいて協力者が招待されます
- 管理上の問題や PR に関するサポートは大歓迎です。
- 必ずお読みください:エッジでの推論
- 興味のある方向けのバックストーリー: Changelog ポッドキャスト
コーディングガイドライン
- サードパーティの依存関係、余分なファイル、余分なヘッダーなどを追加しないでください。
- 他のオペレーティング システムやアーキテクチャとの相互互換性を常に考慮する
- 派手な最新の STL 構造を避け、基本的な
for
ループを使用し、テンプレートを避け、シンプルに保ちます - コーディング スタイルに厳格なルールはありませんが、コード内のパターン (インデント、空白など) に従うようにしてください。垂直方向の配置によりコンテンツが読みやすくなり、一括編集が容易になります
- 末尾のスペースをすべてクリーンアップし、インデントに 4 つのスペースを使用し、同じ行に括弧を使用します
void * ptr
。int & a
- 初めての投稿に適したタスクについては、「Good First Issue」を参照してください。