Blog
ブログ

2024年12月14日

非力なGPU、CPUがあるパソコンでもLLMを使用できるようにllama.cppの紹介!! – SOHOBB AI/BI Advent Calendar 2024

はじめに

こんにちは、AI/BI部のK.です。

*今回記事では、概念については詳しく説明せず、簡単に説明します。
この記事は非力なパソコンでもLLMを使用できるようにllama.cppというLLMを紹介したいことに焦点を当てます。

llama.cppとは?

Llama.cppプロジェクトは、元々は大規模言語モデル「Llama」をC++で効率的に実行するために開始されたオープンソースプロジェクトです。
最初のLlamaから始まっているので、大分年季が入っているプロジェクトですが、最新の更新日付が常に更新され続ける程、未だに活発に開発が続けられている人気プロジェクトです。
プロジェクトURL:ggerganov/llama.cpp – Github
また、llama.cppは、Llamaモデルを最大限に活用するために設計されたライブラリであり、特にリソース制約のある環境(低スペックのマシンやGPU非搭載のマシン)でも動作するよう最適化されています。
その最適化の手段の一つとして、モデルの量子化にも対応しており、推論時の計算コストを大幅に削減することが可能です。

このような特性により、llama.cppは幅広い用途で利用されています。

llama.cppの特徴と利点

  1. 軽量な設計
    • C++で実装された軽量なライブラリで、リソース制約の厳しい環境でも効率的に動作する
    • 低スペックなマシンやGPUが限られた環境でも、高いパフォーマンスを発揮する
  2. 柔軟な量子化対応
    • モデルの量子化により、メモリ使用量と推論速度を大幅に改善できる:
      • 32ビット浮動小数点(FP32)から8ビット(Q8)、4ビット(Q4)へ圧縮可能
      • メモリ消費量の削減
      • 推論速度の向上
      • 環境に応じた最適な量子化レベルの選択が可能
  3. 包括的なクロスプラットフォーム対応
    • マルチプラットフォームをサポートし、様々なハードウェア環境に対応:
      • Windows, macOS, Linux
      • Apple Silicon(M1/M2/M3)のMetal API最適化
      • NVIDIA CUDA GPU対応
      • AMDのGPU最適化
  4. 簡単なビルドと導入
    • 導入プロセスの簡素化:
      • Makeや CMakeによる柔軟なビルドシステム
      • 複雑な依存関係の排除
      • 迅速かつ容易なセットアップ
      • 異なるプラットフォームとバックエンドへの対応

結論

llama.cppは、リソース効率、柔軟性、互換性を兼ね備えた、次世代の軽量言語モデル推論ライブラリです。

量子化モデル、GGUFとGGMLモデルについて

量子化モデル

量子化は、大規模言語モデル(LLM)の重みとアクティベーション値を高精度データ(FP32やFP16)から低精度データ(INT8やINT4)に変換する手法です。

これにより、計算負荷が軽減され、推論速度が向上しますが、精度が若干低下することがあります。

この図は、32ビットの浮動小数点数(fp32)を4ビットの整数(int4)に量子化する方法を示しています。

まず、図1-1では単純にfp32の範囲を-8から7の範囲にスケーリングしていますが、情報量が十分に活用されていません。

そこで図1-2では、unsigned 4bit(uint4)を使うことで、0から15の範囲に最適にスケーリングしています。これにより4bitの表現力を最大限に活用できます。

さらに図1-3では、データを複数のブロックに分割し、各ブロックごとにスケーリングを行うことで、より細かな量子化が可能になります。

super-blockの最小値を基準に、各blockをスケーリングするというアプローチです。

これにより、データの分布に応じて柔軟に4bitの範囲を設定でき、精度を最大限に引き上げることができます。

GGML ではこの手法を採用しており、情報量の少ない型ほど細かなブロック分割を行うことで、効率的な量子化を実現しています。

GGML・GGUF

GGUFとGGMLは、特にGPT(Generative Pre-trained Transformer)などの言語モデルの推論に使用されるファイルフォーマットです。

GGML や GGUF のプレフィクス「GG」は作者(ジョージ・ゲルガノフ)のイニシャルです。

the "GG" refers to the initials of its originator (Georgi Gerganov).

https://github.com/rustformers/llm/blob/main/crates/ggml/README.md</a >

GGML (GPT-Generated Model Language)

  • 開発者: Georgi Gerganov
  • 特徴: 大規模モデルと高性能を実現するためのテンソルライブラリ
  • 利点:
    • 早期の革新
    • 単一ファイルでのモデル共有
    • CPUでの実行が可能
  • 欠点:
    • 柔軟性の制限
    • 互換性の問題
    • 手動調整が必要

GGUF (GPT-Generated Unified Format)

  • リリース日: 2023年8月21日
  • 特徴: GGMLの後継として開発され、より大規模な言語モデルの保存と処理を強化
  • 利点:
    • GGMLの制限を克服
    • 拡張性が高い
    • 安定性の向上
    • 多様なモデルをサポート
  • 欠点:
    • 既存モデルの変換に時間がかかる
    • 新しいフォーマットへの適応が必要

やってみよう

パソコンスペック、環境準備

  • CPU: Intel(R) Xeon(R) CPU E5-1650 v4
  • Memory: 128GB REG-ECC 2400Mhz (Quad-channel)
  • Storage: SSD
  • GPU: AMD RX570 8GB  ← PCにon-board GPUがないのでdiscrete GPUが必要ですが、今回CPUでLLMを動かすので、使用しないです。
  • OS:Ubuntu 22.04, Linux Kernel 5.15.0-124-generic

Terminalを開きます。

mkdir -p llama.cpp/models
cd llama.cpp

モデルダウンロード

今回使うモデルはollamaライブラリーであるMistral-7Bです。 Mistral-7BはMistral AI社が開発したLLMです。

 

Terminalに次のコマンドを実行する:

digest=$(curl -fsSL \
	-H 'Accept: application/vnd.docker.distribution.manifest.v2+json' \
	"https://registry.ollama.ai/v2/library/mistral/manifests/7b" \
	| jq -r '.layers[] | select(.mediaType == "application/vnd.ollama.image.model") | .digest')

 

以下のようにSHA256 Digestの結果が出てくる:

 

次に、SHA256 Digestでモデルをダウンロードする:

curl -L -H 'Accept: application/vnd.ollama.image.model' \
	"https://registry.ollama.ai/v2/library/mistral/blobs/$digest" \
	-o "./models/mistral-7b.gguf"

 

そして、モデルをダウンロード始まります。ダウンロード終わったら、次のようです:

llama.cppを起動

同じllama.cppフォルダーにdocker-compose.ymlファイルを作成します:

services:
  llama-cpp:
	container_name: llama-cpp
	image: ghcr.io/ggerganov/llama.cpp:full
	ports:
	  - "8020:8080"
	volumes:
	  - ./models:/models
	stdin_open: true
	tty: true
	restart: unless-stopped
	command: >
	  --server
	  --port 8080
	  --host 0.0.0.0
	  --model /models/mistral-7b.gguf
	  --threads 12
	  --ctx-size 4096

 

そして:

docker compose up

 

次のような画面が表示されます

 

htopで見ると、メモリーにモデル読み込んだことを確認できます

 

そして、別のTerminalを開いて:

curl --request POST \
	--url http://127.0.0.1:8020/completion \
	--header "Content-Type: application/json" \
	--data '{"prompt": "User:日本語で回答してください。今日天気が良いから、散歩しま しょう! Assistant: ","n_predict": 128}' | \
	jq .

 

そして、結果が出てくる

 

Terminal以外、llama.cpp既存Web UIも使えます。 ブラウザーから、PCのロカールIPまたはlocalhostを開くと:

 

これを試すと:

 

htopを見ると、CPUが全力を出している

 

ChatのAPIを選択しているので、返事内容が先と違います:

赤枠にサンプリング速度が表示されます。

まとめて

本記事では、次世代の大規模言語モデル(LLM)ライブラリであるLlama.cppについて紹介しました。

Llama.cppの主な特徴は以下の通りです:

  • 軽量で高性能な設計により、リソース制約の厳しい環境でも効率的に動作できる
  • 量子化技術を活用し、モデルサイズを大幅に圧縮しつつ推論速度を向上する
  • マルチプラットフォーム(Windows、macOS、Linux)、ハードウェア(CPU、GPU)に対応
  • 簡単なビルドとインストールで導入が容易

さらに、Llama.cppの中核をなすGGUF量子化モデルについても解説しました。GGUF形式は、モデルの効率的な保存と配布を実現する次世代のフォーマットです。

本記事を通して、Llama.cppの機能と特徴、そして量子化モデルの仕組みを理解していただけたと思います。この知識をもとに、さまざまな環境でLLMを活用していくことができるでしょう。

Llama.cppは、AIとLLMの可能性を最大限に引き出す、優れたツールといえます。ぜひ活用してみてください。

このページの先頭へ