見出し画像

遅ればせながらMacのGPUでLlama.cpp

※カバー画像はBing(DALL・E3 PREVIEW)で作成

MacのCPU&GPUは進化中

MacでLLM(大規模言語モデル)を思うように動かせずGPU周りの情報を調べたりしました
MacのGPUの使い道に迷いがありましたが、そうでもない気がしてきています。

  • NVIDIAのGPU メモリを使い切ったアプリケーションが共有メモリを使用できるようにする新しいメソッドの実装(Stable Diffusionでの利用可)

MacのGPUは進化しています。
NVIDIAが発表したCPUとGPUで共通のメモリーを使うスタイルは、既にM1チップから使われており、効率がいい仕組みのように思えてきています。

改めてLlama.cpp

改めてMacでLLMを試します。
GPUを使ったケースを参考にしました。
70億パラメータのLLMが続々登場していますが、まずは基本(?)の「Llama.cpp」を試用します。
参考にしたのは以下の3つの投稿と、「Llama.cpp」のGitHubです。

GitHubに記述されている手順と上記投稿の内容を見比べながら進めます。

クローン&ビルド

2番目の記事の動作映像を参考にbase環境を使い、リポジトリのクローンを実行します。

(base) MacBook-Pro ~ % git clone https://github.com/ggerganov/llama.cpp

Cloning into 'llama.cpp'...
remote: Enumerating objects: 11765, done.
remote: Counting objects: 100% (3283/3283), done.
remote: Compressing objects: 100% (338/338), done.
remote: Total 11765 (delta 3076), reused 3074 (delta 2945), pack-reused 8482
Receiving objects: 100% (11765/11765), 13.71 MiB | 7.34 MiB/s, done.
Resolving deltas: 100% (8187/8187), done.

makeでビルドします。

(base) MacBook-Pro ~ % cd llama.cpp
(base) MacBook-Pro llama.cpp % 
(base) MacBook-Pro llama.cpp % make

I llama.cpp build info: 
I UNAME_S:   Darwin
I UNAME_P:   arm
I UNAME_M:   arm64
・・・
-c tests/test-c.c -o tests/test-c.o
c++ ・・・metal -framework Accelerate -framework Foundation -framework Metal -framework MetalKit 

GitHubに、「MacOS では、Metal はデフォルトで有効になっています。」と記載がありました。
この状態でllama.cppを動かせばGPUが動くようです。

ダウンロード&推論

今回は、70億パラメータ版の「TheBloke/Llama-2-7B-GGUF」の「llama-2-7b.Q4_K_M.gguf」と、対話用学習が施された「TheBloke/Llama-2-7b-Chat-GGUF」の「llama-2-7b-chat.Q4_K_M.gguf」をダウンロードしました。
ダウンロードしたモデルは「llama.cpp/models」フォルダに配置します。

以下質問を使い実行します。

「プログラムを勉強する際、どの言語がいいでしょうか。簡潔に回答してください。日本語でお願いします。」

llama-2-7b.Q4_K_M.gguf
結果:29.03トークン/秒(tokens per second)

(base) MacBook-Pro llama.cpp % ./main -m ./models/llama-2-7b.Q4_K_M.gguf --temp 0.1 -p "[INST]プログラムを勉強する際、どの言語がいいでしょうか。簡潔に回答してください。日本語でお願いします。[/INST]"

Log start
main: build = 1446 (207b519)
main: built with Apple clang version 15.0.0 (clang-1500.0.40.1) for arm64-apple-darwin23.0.0
・・・
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1 Pro
ggml_metal_init: picking default device: Apple M1 Pro
・・・
ggml_metal_init: GPU name:   Apple M1 Pro
ggml_metal_init: GPU family: MTLGPUFamilyApple7 (1007)
ggml_metal_init: hasUnifiedMemory              = true
ggml_metal_init: recommendedMaxWorkingSetSize  = 10922.67 MB
ggml_metal_init: maxTransferRate               = built-in GPU
・・・
generate: n_ctx = 512, n_batch = 512, n_predict = -1, n_keep = 0


[INST]プログラムを勉強する際、どの言語がいいでしょうか。簡潔に回答してください。日本語でお願いします。[/INST]
### 1. C++

C++は、C言語の拡張版であり、C言語と同じようなプログラムを書くことができる。C++は、C言語に対して、オブジェクト指向プログラミングや、多次元数式の計算、構造体、ポインターなどの機能を追加したものである。

C++は、C言語よりも高速に動作することが知られている。また、C++は、C言語よりも柔軟なプログラミングを可能にしており、多くのプログラマーが好んで使用している。

### 2. Java

Javaは、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、Javaは、C++よりも高速に動作することが知られている。

### 3. Python

Pythonは、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、Pythonは、C++よりも高速に動作することが知られている。

### 4. PHP

PHPは、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、PHPは、C++よりも高速に動作することが知られている。

### 5. Ruby

Rubyは、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、Rubyは、C++よりも高速に動作することが知られている。

### 6. C#

C#は、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、C#は、C++よりも高速に動作することが知られている。

### 7. C++

C++は、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、C++は、C++よりも高速に動作することが知られている。

### 8. C

Cは、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、Cは、C++よりも高速に動作することが知られている。

### 9. Java

Javaは、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、Javaは、C++よりも高速に動作することが知られている。

### 10. Python

Pythonは、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、Pythonは、C++よりも高速に動作することが知られている。

### 11. PHP

PHPは、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、PHPは、C++よりも高速に動作することが知られている。

### 12. C#

C#は、オブジェクト指向プログラミング言語であり、C++と同じような機能を持つ。また、C#は、C++よりも高速に動作することが知られている。

## 関連項目

* オブジェクト指向プログラミング [end of text]

llama_print_timings:        load time =    1255.75 ms
llama_print_timings:      sample time =      84.67 ms /  1086 runs   (    0.08 ms per token, 12826.57 tokens per second)
llama_print_timings: prompt eval time =     420.87 ms /    70 tokens (    6.01 ms per token,   166.32 tokens per second)
llama_print_timings:        eval time =   37379.06 ms /  1085 runs   (   34.45 ms per token,    29.03 tokens per second)
llama_print_timings:       total time =   38012.08 ms
ggml_metal_free: deallocating
Log end

Chatモデルの回答

llama-2-7b-chat.Q4_K_M.gguf
結果:29.55トークン/秒(tokens per second)

(base) MacBook-Pro llama.cpp % ./main -m ./models/llama-2-7b-chat.Q4_K_M.gguf --temp 0.1 -p "[INST]プログラムを勉強する際、どの言語がいいでしょうか。簡潔に回答してください。日本語でお願いします。[/INST]"

Log start
main: build = 1446 (207b519)
main: built with Apple clang version 15.0.0 (clang-1500.0.40.1) for arm64-apple-darwin23.0.0
・・・
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1 Pro
ggml_metal_init: picking default device: Apple M1 Pro
・・・
ggml_metal_init: GPU name:   Apple M1 Pro
ggml_metal_init: GPU family: MTLGPUFamilyApple7 (1007)
ggml_metal_init: hasUnifiedMemory              = true
ggml_metal_init: recommendedMaxWorkingSetSize  = 10922.67 MB
ggml_metal_init: maxTransferRate               = built-in GPU
・・・
generate: n_ctx = 512, n_batch = 512, n_predict = -1, n_keep = 0


[INST]プログラムを勉強する際、どの言語がいいでしょうか。簡潔に回答してください。日本語でお願いします。[/INST]  Ah, an excellent question! 🤓
For learning programming, I would recommend starting with a language that has a gentle learning curve and is widely used in the industry. Here are some popular options:
1. Python: Python is a versatile and easy-to-learn language that is widely used in various fields, including web development, data science, machine learning, and automation. It has a simple syntax and a vast number of libraries and frameworks, making it an excellent choice for beginners.
2. JavaScript: JavaScript is the language of the web and is used by millions of websites worldwide. It's also popular in mobile app development, game development, and server-side programming. JavaScript is known for its flexibility and is relatively easy to learn, especially for those with prior experience in HTML and CSS.
3. Java: Java is a popular language used in Android app development, web development, and enterprise software development. It's known for its platform independence, which means that Java code can run on any device supporting the Java Virtual Machine (JVM). Java is also widely used in data science and machine learning.
4. C++: C++ is a high-performance language that is commonly used in game development, system programming, and high-performance computing. It's more challenging to learn than the other languages mentioned above, but it provides low-level control over hardware resources, making it ideal for systems programming and optimization.
5. Ruby: Ruby is a dynamic language known for its simplicity and ease of use. It's popular in web development due to its concise syntax and extensive libraries, such as Ruby on Rails. Ruby is also used in data science, scripting, and system administration.
Ultimately, the best programming language for you depends on your goals, interests, and experience level. If you're new to programming, I recommend starting with Python or JavaScript, as they are relatively easy to learn and have a vast number of resources available online. 😊 [end of text]

llama_print_timings:        load time =    5000.29 ms
llama_print_timings:      sample time =      34.53 ms /   423 runs   (    0.08 ms per token, 12249.51 tokens per second)
llama_print_timings: prompt eval time =     419.72 ms /    70 tokens (    6.00 ms per token,   166.78 tokens per second)
llama_print_timings:        eval time =   14280.07 ms /   422 runs   (   33.84 ms per token,    29.55 tokens per second)
llama_print_timings:       total time =   14786.66 ms
ggml_metal_free: deallocating
Log end

chatモデルは英語での回答となりましたが、「Ultimately, the best programming language for you depends on your goals, interests, and experience level. If you're new to programming, I recommend starting with Python or JavaScript(最終的に、あなたにとって最適なプログラミング言語は、あなたの目標、興味、経験レベルによって異なります。プログラミングが初めての場合は、Python または JavaScript から始めることをお勧めします。)」と、chatモデルらしく対話スタイルで返しています。

GPUの動作確認

GPUを使っているかどうかの確認は、上記のメッセージに記載の以下の部分で確認できるそうです。

Llama-2が Apple M1 Pro デバイスを使用してグラフィック処理を実行することを示しています(Google Bardの説明を参考)。

ggml_metal_init: allocating
ggml_metal_init: found device: Apple M1 Pro
ggml_metal_init: picking default device: Apple M1 Pro

Bardに聞いたところ、以下メッセージもLlama-2が、Apple M1 Pro デバイスのGPUを使用してグラフィック処理を実行することを意味しています。
このGPUは、統合メモリを使用でき、推奨最大ワーキングセットサイズは10922.67 MB、最大転送速度は内蔵GPU(CPUに統合されているGPU)です。

ggml_metal_init: GPU name:   Apple M1 Pro
ggml_metal_init: GPU family: MTLGPUFamilyApple7 (1007)
ggml_metal_init: hasUnifiedMemory              = true
ggml_metal_init: recommendedMaxWorkingSetSize  = 10922.67 MB
ggml_metal_init: maxTransferRate               = built-in GPU

上記のメッセージに対し質問し、Bardから得た回答の全文が以下です。

Bardの説明全文


Llama-2という大規模言語モデルを実行するために、Apple M1 Pro デバイスを検出し、そのデバイスをデフォルトデバイスとして選択していることを示しています。

ggml_metal_init: allocating

このメッセージは、Llama-2の実行に必要なメモリを割り当てていることを示しています。

ggml_metal_init: found device: Apple M1 Pro

このメッセージは、Apple M1 Pro デバイスが検出されたことを示しています。

ggml_metal_init: picking default device: Apple M1 Pro

このメッセージは、Apple M1 Pro デバイスをデフォルトデバイスとして選択したことを示しています。

Llama-2は、Metal API を使用してグラフィック処理を実行します。Metal API は、Apple が開発したグラフィック API です。Apple M1 Pro デバイスは、Metal API をサポートするデバイスです。

したがって、上記のメッセージは、Llama-2が Apple M1 Pro デバイスを使用してグラフィック処理を実行することを示しています。

具体的には、以下の処理が行われます。

  1. Llama-2は、実行に必要なメモリを割り当てます。

  2. Llama-2は、Apple M1 Pro デバイスを検出します。

  3. Llama-2は、Apple M1 Pro デバイスをデフォルトデバイスとして選択します。

この処理が完了すると、Llama-2は、Apple M1 Pro デバイスを使用してグラフィック処理を実行することができます。


Llama-2が使用するGPUの情報を表示しています。

ggml_metal_init: GPU name:   Apple M1 Pro

このメッセージは、GPUの名前が「Apple M1 Pro」であることを示しています。

ggml_metal_init: GPU family: MTLGPUFamilyApple7 (1007)

このメッセージは、GPUのファミリーが「MTLGPUFamilyApple7」であることを示しています。MTLGPUFamilyApple7は、Apple M1 Pro デバイスのGPUのファミリーです。

ggml_metal_init: hasUnifiedMemory              = true

このメッセージは、GPUが統合メモリを使用できることを示しています。統合メモリとは、CPUとGPUで共有できるメモリです。

ggml_metal_init: recommendedMaxWorkingSetSize  = 10922.67 MB

このメッセージは、GPUの推奨最大ワーキングセットサイズが10922.67 MBであることを示しています。ワーキングセットサイズとは、GPUが一度に処理できるデータの量です。

ggml_metal_init: maxTransferRate               = built-in GPU

このメッセージは、GPUの最大転送速度が内蔵GPUであることを示しています。内蔵GPUとは、CPUに統合されているGPUです。

これらの情報をまとめると、Llama-2は、Apple M1 Pro デバイスのGPUを使用してグラフィック処理を実行することを意味しています。このGPUは、統合メモリを使用でき、推奨最大ワーキングセットサイズは10922.67 MB、最大転送速度は内蔵GPUです。

なお、これらの情報は、Llama-2-13B-Chatの実行に必要なメモリを割り当てる際に使用されます。


この記事が気に入ったらサポートをしてみませんか?