PR

llama-cpp-pythonの使い方 sonar-large-32K 量子化

llama-cpp-pythonの使い方

llama-cpp-pythonの使い方

llama-cpp-python(読み方は、ラマ・シーピーピー・パイソン?)は、llama.cppのPythonバインディングで、Pythonから簡単にllama.cppを使えるようにするライブラリです。llama(LLaMA=ラマはFacebookのオープンソースなAI。)cppは、C++のソースの一般的な拡張子ですね。

関連 abetlen/llama-cpp-python: Python bindings for llama.cpp

以下に、llama-cpp-pythonの基本的な使い方をまとめました。

インストール:

```bash
pip install llama-cpp-python
```

GPUを使う場合は以下のようにインストールします。

```bash
CMAKE_ARGS="-DLLAMA_CUBLAS=on" FORCE_CMAKE=1 pip install llama-cpp-python
```

基本的な使い方:

```python
from llama_cpp import Llama

# モデルのロード
llm = Llama(model_path="models/llama-model.bin")

# 推論の実行
output = llm("What is the capital of France?")
print(output)
```

 

パラメータの設定:

```python
llm = Llama(model_path="models/llama-model.bin",
n_ctx=512, # コンテキストサイズ
n_parts=-1, # -1でモデル全体を使用
seed=1, # 乱数シード
f16_kv=True, # 半精度(FP16)を使用
logits_all=False, # 全てのlogitsを出力するか
vocab_only=False, # ボキャブラリのみ使用
use_mmap=True, # メモリマップドファイルを使用
n_threads=8) # スレッド数
```

OpenAI APIと互換性のあるAPIの使用:

```python
from llama_cpp import Llama

llm = Llama(model_path="models/llama-model.bin")

# OpenAI APIと同じ形式でリクエストを送信
response = llm(
"What is the capital of France?",
stop=["\n"],
echo=True,
max_tokens=100,
temperature=0.8,
top_p=0.95,
)
print(response)
```

以上が、llama-cpp-pythonの基本的な使い方になります。モデルのロード、推論の実行、各種パラメータの設定、OpenAI APIと互換性のあるAPIの使用方法などがポイントです。

llama.cppとは

llama.cppは、大規模言語モデル(LLM)をC++で効率的に実行するためのオープンソースライブラリです。主な特徴は以下の通りです。

  • FacebookのLLaMAモデルをC++に移植したもので、高速かつ省メモリでLLMの推論を行うことができる。
    関連 LLMとは? 特徴や仕組み
  • CPU最適化されており、GPUを使わずにパーソナルコンピュータ上で動作可能。
  • 量子化により、モデルサイズを小さくしてメモリ使用量を削減。2~8ビットの量子化に対応。
  • テキスト生成、翻訳、質問応答、創作文など、様々なタスクに利用可能。
  • オープンソースのため、誰でもコードを利用・改変できる。研究者や開発者にとって魅力的。
  • ChatGPTと比べると、llama.cppはC++で書かれているため高速に動作し、リアルタイムアプリケーションに適している。一方、ChatGPTはPythonベースで、プログラミングの知識がなくても使いやすい。
  • チャットボット、音声アシスタント、機械翻訳、要約、創作文生成など、幅広い用途への応用が期待されている。

llama.cppの動作に必要なスペックは?

llama.cppの動作に必要なスペックは、使用するモデルのサイズによって異なります。一般的には以下のようなスペックが必要とされています。

7Bモデル(4bit量子化版)
メモリ(RAM): 6〜8GB程度
ストレージ: 4GB程度

13Bモデル(4bit量子化版):
メモリ(RAM): 10GB以上
ストレージ: 8GB程度

CPUに関しては、できるだけ高速なものが望ましいですが、古めのCPUでも動作します。例えば、

  • Ryzen 9 3950Xで、13Bモデルを4トークン/秒程度で生成可能
  • Core i7-10700 2.9GHzでも動作可能

GPUについては、必須ではありませんが、CUDAをサポートするNVIDIA GPUを使用することで推論速度を大幅に向上できます。

ただし、GPUのVRAMが不足する場合は、一部の層だけGPUで処理するように設定する必要があります。

OSはLinux、macOS、Windowsなどで動作します。

以上のように、llama.cppはCPUのみでも比較的低スペックな環境で動作可能ですが、大きなモデルを高速に動かすためには、十分なメモリとGPUが望ましいと言えます。

llama.cppの量子化版って?

量子化とは、連続的な量を離散的な値で近似的に表現することを指します。

モデルの重みの精度を下げることでメモリを節約し推論を高速化しつつ、モデルの性能を大部分保持する技術です。(量子化がすぎると、高速だけど精度がダメダメになっちゃうのでバランスが難しい)

llama.cppの量子化手法

  • llama.cppでは2, 3, 4, 5, 6, 8bitの量子化をサポートしている。
  • 4bit量子化だとLlama2-7Bモデルのサイズはわずか4GB程度になる。

量子化の種類

  • Q4_K_M, Q4_K_Sなどの記法がある。数字は量子化ビット数。
  • Kのついたものが「k-quantメソッド」と呼ばれる新しい量子化手法。
  • 一般的にK_M版がK_S版より性能が良い。
  • Q4_K_Mは注意機構(attention)の出力に関わる部分の精度を上げている。

量子化の影響

  • 3bit以下の低ビット量子化だと性能が大幅に劣化する。
  • 4bit量子化のQ4_K_Mが現状最も使いやすい。
  • 量子化時のモデル劣化を抑制するiMatrix(Importance Matrix)という手法もある。

量子化モデルの入手と実行

  • HuggingFaceに量子化済みのGGUFファイルが公開されている。
    参考 TheBloke/Llama-2-7B-Chat-GGML at main
  • ダウンロードしたGGUFファイルをllama.cppで読み込んで実行できる。
  • GPUのVRAMにモデルの各層を載せて高速化もできる。

量子化技術の進歩により、消費者向けハードウェアでもLLMを動かせるようになってきました。今後さらなる性能向上が期待できそうです。

llamaを気軽に動かすには?

オープンソースなので、必要なファイルは入手可能なのですが、それなりのスペックのハードウェアやクラウド環境を用意する必要があります。

どのくらいの精度か試したいときに、一番手軽なのがPerplexity AIを使うこと。

課金してPROモードで、AIモデルをSonar Large 32K に指定すると、llama3(の調整版)モデルを使ったテキスト生成ができます。

関連 perplexityの使い方

Sonarというのは、LLaMa 3.70BをベースにしてPerplexityがトレーニング&調整したモデルだそうです。

以下は、Sonar Large 32Kとはなんですか?と、Sonar Large 32Kに聞いてみた結果です。

Sonar Large 32Kは、Perplexity AIが開発したオリジナルの大言語モデル(LLM)です。このモデルは、迅速で正確な回答を提供するために、簡潔さと正確さにチューニングされている。Sonar Large 32Kは、Perplexity Proの有料プランで利用可能なAIモデルの一つで、他の最新生成AIモデル(GPT-4、Claude 3、Mistral Largeなど)と同様に、Copilotの使用回数やファイルのアップロードに制限がなく、月払いで20米ドル、年払いで200米ドルの料金で利用可能です。Sonar Large 32Kは、Perplexity AIの自社製モデルであり、32kのコンテキストウィンドウを持つことで、長文テキスト入力に対応しています。

生成スピードは速いし、悪くはなさそう。でも、一部でですます調が乱れたり、文章が硬いという点は気になりますね。

正直言うと「悪くはないけど、特に良くもない」という感じです。

オープンソースなので、使いまくっても追加金や回数制限がない、というのはメリットかも。

実際動かしてみた人のコメントが掲示板(Reddit)にありました。

文脈読めてなくね?という内容。

Perplexity AIのllama-3-sonar-large-32kモデルに関するバグ報告

  • モデル名に32kとあるが、実際には数段落分しか文脈を記憶できていないようだ
  • 文脈の制限が1kくらいになっているのではないか
  • 直前の会話で情報を与えたにも関わらず、「その情報は見つからない」と言われてしまう

投稿者は、モデルの文脈記憶能力について疑問を呈しており、32kという数字と実際の性能が一致していないことを指摘しています。
llama-3-sonar-large-32k-online : r/perplexity_ai

まあ文脈もいいんだけど、もう少し柔らかい文章にしてほしいな…と想いました。

llama-cpp pythonのまとめ

llama-cpp-pythonの使い方についての記事を要約すると以下の通りです。

  • llama-cpp-pythonはllama.cppのPythonバインディングで、PythonからFacebook製のオープンソースAIであるllamaを簡単に使えるようにするライブラリ。
  • インストールはpip install llama-cpp-pythonで行う。
  • 基本的な使い方はPythonコードでモデルをロードし、generate関数で文章生成を行う。
  • 量子化モデルを使用することで、4GBのGPUメモリでも13Bのモデルが動作可能。
  • 量子化の精度はFP16の99.5%程度。7Bモデルの場合、4bitで6.4GB、5bitで8.0GB、8bitで12.7GBのメモリが必要。