Closed8

モデルを、あらゆる環境で動作する実行ファイルに変換する「llamafile」を試す

kun432kun432

GitHubレポジトリ

https://github.com/Mozilla-Ocho/llamafile

llamafile


referred from https://github.com/Mozilla-Ocho/llamafile

llamafile は、LLM を単一ファイルで配布・実行できるようにします。(公式ブログ記事)

私たちの目標は、オープンな LLM を開発者やエンドユーザーの双方にとってよりアクセスしやすくすることです。そのために llama.cppCosmopolitan Libc を一つのフレームワークに統合し、LLM の複雑さをすべて一つの実行可能ファイル(「llamafile」と呼ばれます)に集約しています。このファイルはほとんどのコンピュータ上でインストール不要でローカルに動作します。

llamafile は Mozilla Builders プロジェクトです。

llamafile の仕組み

llamafile は、自分のコンピュータ上で動作する実行可能な LLM です。指定したオープン LLM の重みと、モデルを動作させるために必要なものすべてを含んでいます。(いくつかの注意点は以降で説明しますが)インストールや設定は不要です。

これは llama.cpp と Cosmopolitan Libc を組み合わせることで実現されています。主な特長は以下の通りです。

  1. llamafile は複数の CPU マイクロアーキテクチャで動作します。最新の Intel システムで新しい CPU 機能を使いつつ、古いコンピュータもサポートできるよう llama.cpp にランタイムディスパッチを追加しています。
  2. llamafile は複数の CPU アーキテクチャで動作します。AMD64 と ARM64 のビルドをシェルスクリプトで連結し、適切なものを起動します。ファイル形式は WIN32 および多くの UNIX シェルと互換です。必要に応じて簡単にプラットフォームネイティブ形式に変換できます。
  3. llamafile は6つの OS(macOS, Windows, Linux, FreeBSD, OpenBSD, NetBSD)で動作します。独自の llamafile を作成する場合、一度だけ Linux 形式のツールチェーンでビルドすれば十分です。提供する GCC ベースのコンパイラ自体も Actually Portable Executable ですので、どの開発環境でも全 OS 向けにビルドできます。
  4. LLM の重みを llamafile 内に埋め込むことができます。GGML ライブラリに PKZIP 対応を追加し、非圧縮ウェイトを自己解凍アーカイブのように直接メモリにマッピングできるようにしました。オンライン配布される量子化ウェイトに llama.cpp の互換バージョンをプレフィックスすることで、当初の動作を無期限に再現できます。
  5. 本プロジェクトに含まれるツールで、任意の互換ウェイトを用いて 自分だけの llamafile を作成できます。作成した llamafile は、他の人もどんなコンピュータでも簡単に利用できます。

ライセンス

llamafile プロジェクトは Apache 2.0 ライセンスですが、llama.cpp への変更分は MIT ライセンス(llama.cpp 本体と同じ)とし、今後の互換性・アップストリーム適用を考慮しています。

なるほど、モデルをそのまま実行ファイル的にラップすることで、環境構築が不要で使えると。ポータ簿ビリティが良いね。

kun432kun432

サポートされる OS

llamafile は以下の OS をサポートしています。いずれも最小限の標準インストールで動作します:

  • Linux 2.6.18+(RHEL5 以降の全ディストリビューション)
  • Darwin(macOS)23.1.0+ [1](GPU は ARM64 のみ対応)
  • Windows 10+(AMD64 のみ)
  • FreeBSD 13+
  • NetBSD 9.2+(AMD64 のみ)
  • OpenBSD 7+(AMD64 のみ)

Windows では llamafile はネイティブのポータブル実行ファイルとして動作します。UNIX 系では llamafile は ape という小さなローダープログラムを $TMPDIR/.llamafile または ~/.ape-1.9 に展開し、モデルをメモリにマッピングします。

[1] Darwin カーネル 15.6+ も 対応しているはず ですが、現在テスト手段がありません。

サポートされる CPU

llamafile は以下の CPU をサポートしています:

  • AMD64 マイクロプロセッサは AVX 必須です。これがない場合 llamafile はエラーを出して終了します。Intel CPU の場合は Intel Core 以降(2006年以降)、AMD CPU の場合は K8 以降(2003年以降)が必要です。AVX512、AVX2、FMA、F16C、VNNI は新しい CPU ではランタイムで自動有効化されます。例:Zen4 は BF16 llamafile で非常に高速な AVX512 を利用可能です。

  • ARM64 マイクロプロセッサは ARMv8a+ 必須です。Apple Silicon や 64bit Raspberry Pi も、重みがメモリに収まる限り動作します。

GPU サポート

llamafile は以下の GPU をサポートします:

  • Apple Metal
  • NVIDIA
  • AMD

MacOS ARM64 では、Xcode コマンドラインツールで小さなモジュールをビルドする必要があります。初回のみの一度きりです。DSO は $TMPDIR/.llamafile または $HOME/.llamafile に保存されます。Metal GPU 検出時は自動で GPU オフロードが有効になります。無効にしたい場合は -ngl 0 または --gpu disable オプションで CPU 推論を強制できます。

NVIDIA/AMD グラフィックスカード所有者は -ngl 999 フラグで最大限のオフロードを有効化します。複数 GPU があれば自動で均等に分割され大きなモデルも読み込めます。AMD Radeon で複数 GPU サポートに不具合があれば、export HIP_VISIBLE_DEVICES=0 で 1 つ目の GPU のみ使用を強制できます。

Windows ユーザーはリリースバイナリの利用が推奨です。NVIDIA/AMD 用の DLL が事前に組み込まれており、グラフィックドライバさえあれば動作します。CUDA/ROCm SDK がインストールされていれば、より高速な cuBLAS/rocBLAS 用 DLL の自動ビルドも可能です。CUDA は Nvidia CUDA on WSL 有効化&WSL 内で llamafile を実行してください。WSL では 4GB 超の llamafile も動作します。

Linux では、NVIDIA ユーザーは CUDA SDK(シェルスクリプト版推奨)、ROCm ユーザーは HIP SDK をインストールしてください。PATH 上の nvcc または hipcc を検出します。

NVIDIA/AMD 両方搭載機では、--gpu amd または --gpu nvidia で利用する GPU を指定できます。

何らかの理由で GPU サポートのビルド・リンクが失敗した場合、自動的に CPU 推論にフォールバックします。

んー、Windowsの4GBのファイルサイズ制限ってFAT32の制限だと思うのだけど、今の標準はNTFSじゃないのかな?実行可能ファイルだとまた違うのだろうか?あと.exeを最後に付けないといけないというのもあるみたい。ただ、そのあたりもまあWSL上ならば問題ないみたいではあるけど。

残念ながら、Windows では 4GB を超える実行ファイルを利用できないため、これらのサンプル llamafile の多くは利用できません。(LLaVA llamafile はサイズ制限まであと 30MB なので利用可能です)ですが心配は不要です。llamafile では外部ウェイトも利用でき、この方法については後述します。

kun432kun432

Quickstart

https://github.com/Mozilla-Ocho/llamafile?tab=readme-ov-file#quickstart

例として、LLaVA-1.5-7BのQ4量子化済llamafileをダウンロードして試してみる。環境はM2 Mac Pro。

作業ディレクトリ作成

mkdir llamafile-work && cd llamafile-work

ダウンロード

wget --content-disposition https://huggingface.co/Mozilla/llava-v1.5-7b-llamafile/resolve/main/llava-v1.5-7b-q4.llamafile?download=true

実行権をつける

chmod +x llava-v1.5-7b-q4.llamafile

実行

./llava-v1.5-7b-q4.llamafile
出力

██╗     ██╗      █████╗ ███╗   ███╗ █████╗ ███████╗██╗██╗     ███████╗
██║     ██║     ██╔══██╗████╗ ████║██╔══██╗██╔════╝██║██║     ██╔════╝
██║     ██║     ███████║██╔████╔██║███████║█████╗  ██║██║     █████╗
██║     ██║     ██╔══██║██║╚██╔╝██║██╔══██║██╔══╝  ██║██║     ██╔══╝
███████╗███████╗██║  ██║██║ ╚═╝ ██║██║  ██║██║     ██║███████╗███████╗
╚══════╝╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚═╝╚══════╝╚══════╝
software: llamafile 0.9.2
model:    llava-v1.5-7b-Q4_K.gguf
mode:     RAW TEXT COMPLETION (base model)
compute:  Apple Metal GPU
server:   http://127.0.0.1:8080/

>>> type text to be completed (or /help for help)

まずは適当に入力してみる。

>>> 競馬の楽しみ方を5つリストアップして。
出力
1. 競馬を始める前に知っておくべきこと
2. 競馬を始める前に知っておくべきこと
3. 競馬を始める前に知っておくべく

表示されたURLにブラウザでアクセスすると、WebUIも使えるようになっている。

こちらも適当に入力してみた結果。

さらにOpenAI互換APIとしても動作しているので、以下のような感じで使える。

curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer no-key" \
-d '{
  "model": "LLaMA_CPP",
  "messages": [
      {
          "role": "system",
          "content": "あなたは親切な日本語のアシスタントです。"
      },
      {
          "role": "user",
          "content": "競馬の楽しみ方について5つリストアップして。"
      }
    ]
}' | jq -r .
出力
{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "1. 競馬の基礎知識を学ぶ\n2. 競馬のレースを観戦する\n3. 競馬のゲームをプレイする\n4. 競馬の情報をチェックする\n5. 競馬の歴史や人気騎手について知る</s>",
        "role": "assistant"
      }
    }
  ],
  "created": 1748782631,
  "id": "chatcmpl-jjxlYRZPMjtcu3V5Vdx6yJNUjWmT1Fgr",
  "model": "LLaMA_CPP",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 101,
    "prompt_tokens": 89,
    "total_tokens": 190
  }
}

OpenAI互換なので、当然OpenAI SDKでもアクセスできるね。

kun432kun432

用意されているモデルは他にもある

その他のサンプル llamafile

さまざまな種類の LLM で llamafile を簡単に試せるよう、他のモデル用のサンプル llamafile も提供しています。

モデル サイズ ライセンス llamafile その他のクオンタイズ
LLaMA 3.2 1B Instruct 1.11 GB LLaMA 3.2 Llama-3.2-1B-Instruct.Q6_K.llamafile HF リポジトリ参照
LLaMA 3.2 3B Instruct 2.62 GB LLaMA 3.2 Llama-3.2-3B-Instruct.Q6_K.llamafile HF リポジトリ参照
LLaMA 3.1 8B Instruct 5.23 GB LLaMA 3.1 Llama-3.1-8B-Instruct.Q4_K_M.llamafile HF リポジトリ参照
Gemma 3 1B Instruct 1.32 GB Gemma 3 gemma-3-1b-it.Q6_K.llamafile HF リポジトリ参照
Gemma 3 4B Instruct 3.50 GB Gemma 3 gemma-3-4b-it.Q6_K.llamafile HF リポジトリ参照
Gemma 3 12B Instruct 7.61 GB Gemma 3 gemma-3-12b-it.Q4_K_M.llamafile HF リポジトリ参照
QwQ 32B 7.61 GB Apache 2.0 Qwen_QwQ-32B-Q4_K_M.llamafile HF リポジトリ参照
R1 Distill Qwen 14B 9.30 GB MIT DeepSeek-R1-Distill-Qwen-14B-Q4_K_M HF リポジトリ参照
R1 Distill Llama 8B 5.23 GB MIT DeepSeek-R1-Distill-Llama-8B-Q4_K_M HF リポジトリ参照
LLaVA 1.5 3.97 GB LLaMA 2 llava-v1.5-7b-q4.llamafile HF リポジトリ参照
Mistral-7B-Instruct v0.3 4.42 GB Apache 2.0 mistral-7b-instruct-v0.3.Q4_0.llamafile HF リポジトリ参照
Granite 3.2 8B Instruct 5.25 GB Apache 2.0 granite-3.2-8b-instruct-Q4_K_M.llamafile HF リポジトリ参照
Phi-3-mini-4k-instruct 7.67 GB Apache 2.0 Phi-3-mini-4k-instruct.F16.llamafile HF リポジトリ参照
Mixtral-8x7B-Instruct 30.03 GB Apache 2.0 mixtral-8x7b-instruct-v0.1.Q5_K_M.llamafile HF リポジトリ参照
OLMo-7B 5.68 GB Apache 2.0 OLMo-7B-0424.Q6_K.llamafile HF リポジトリ参照
Text Embedding Models
E5-Mistral-7B-Instruct 5.16 GB MIT e5-mistral-7b-instruct-Q5_K_M.llamafile HF リポジトリ参照
mxbai-embed-large-v1 0.7 GB Apache 2.0 mxbai-embed-large-v1-f16.llamafile HF リポジトリ参照

上記以外にも、HuggingFaceには全部で50個ぐらいあった。

https://huggingface.co/Mozilla?search_models=llamafile

せっかくなので他のモデルも。Gemma-3-4b-itで。

wget --content-disposition https://huggingface.co/Mozilla/gemma-3-4b-it-llamafile/resolve/main/google_gemma-3-4b-it-Q6_K.llamafile?download=true
chmod +x google_gemma-3-4b-it-Q6_K.llamafile
./google_gemma-3-4b-it-Q6_K.llamafile
出力

██╗     ██╗      █████╗ ███╗   ███╗ █████╗ ███████╗██╗██╗     ███████╗
██║     ██║     ██╔══██╗████╗ ████║██╔══██╗██╔════╝██║██║     ██╔════╝
██║     ██║     ███████║██╔████╔██║███████║█████╗  ██║██║     █████╗
██║     ██║     ██╔══██║██║╚██╔╝██║██╔══██║██╔══╝  ██║██║     ██╔══╝
███████╗███████╗██║  ██║██║ ╚═╝ ██║██║  ██║██║     ██║███████╗███████╗
╚══════╝╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚═╝╚══════╝╚══════╝
software: llamafile 0.9.2
model:    google_gemma-3-4b-it-Q6_K.gguf
compute:  Apple Metal GPU
server:   http://127.0.0.1:8080/

A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.
>>>

なんかシステムプロンプトらしきものが見えているね。これはどこで設定できるんだろう?とりあえず対話。

>>> 競馬の魅力について5つリストアップして。
出力
はい、承知いたしました。競馬の魅力について、5つリストアップさせていただきます。

1.  **予想の奥深さと戦略性:** 競馬は、単に馬券を当てるだけでなく、血統、過去のレース結果、騎手、調教、コース適性、天候など、様々な要素を分析し、独自の予想を立てるという戦略性を持っています。これらの情報を集め、組み合わせ、そして最終的に的中を目指す過程は、非常に知的でやりがいのあるものです。

2.  **ドラマチックな展開と興奮:** 競馬のレースは、一瞬の判断で結果が変わるため、常にスリリングな展開が生まれます。特に、ゴール直前の写真判定や、僅差での勝利など、ドラマチックな展開は、観客を熱狂させます。

3.  **馬と騎手の絆:** 競馬は、馬と騎手の間の信頼関係が勝利に繋がるスポーツです。それぞれの馬が持つ個性や、騎手がその馬をどのように育成し、レースで最大限に活かすかを見るのも、競馬の魅力の一つです。

4.  **社会的な交流とコミュニティ:** 競馬は、ファン同士が情報交換をしたり、予想を共有したりすることで、社会的な交流を深める場でもあります。競馬新聞やインターネット掲示板などを通じて、様々な意見や情報を得ながら、競馬を楽しむことができます。

5.  **高額配当の可能性:** 競馬には、的中すれば高額な配当が得られる可能性があります。もちろん、的中率は低いですが、その可能性があるからこそ、競馬は多くの人々を魅了し続けています。

いかがでしょうか?これらの魅力が、競馬の奥深さを少しでも感じていただければ幸いです。

他に何か知りたいことや、さらに詳しく説明が必要な点があれば、お気軽にお尋ねください。

CLIでのインタラクティブな対話では/helpで使い方を確認できる。

>>> /help
出力
available commands
  ctrl-j                   insert line in multi-line mode
  """                      use triple quotes for multi-line input
  /clear                   restart conversation
  /context                 print context window usage
  /dump [FILE]             print or save context window to file
  /exit                    end program
  /forget                  erase oldest message from context
  /help [COMMAND]          show help
  /manual [on|off]         toggle manual role mode
  /pop                     restore context window size
  /push                    push context window size to stack
  /stack                   prints context window stack
  /stats                   print performance metrics
  /undo                    erases last message in conversation
  /upload FILE             share image or text file with assistant
kun432kun432

CLIでもUsageを見てみる。こちらはmanが用意されているので、--helpでそれが表示される。

./google_gemma-3-4b-it-Q6_K.llamafile --help

Usageは長くてここに貼り付けれないのだが、ざっと見た感じはllama.cppと同じような感じに見える。まあllama.cppとモデルをラップしてるようなものだから、そりゃそうかという感はある。

インタラクティブモードではなくてワンショットで回答だけ出力させる

./google_gemma-3-4b-it-Q6_K.llamafile --temp 0.7 -p " 日本の総理大臣は誰?"

出力を見ていればわかるが、llama.cppの出力そのものである。

出力
(snip)
system_info: n_threads = 8 (n_threads_batch = 8) / 8 | AVX = 0 | AVX_VNNI = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | AVX512_BF16 = 0 | FMA = 0 | NEON = 1 | SVE = 0 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 0 | SSSE3 = 0 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 |
sampling:
	repeat_last_n = 64, repeat_penalty = 1.000, frequency_penalty = 0.000, presence_penalty = 0.000
	top_k = 40, tfs_z = 1.000, top_p = 0.950, min_p = 0.050, typical_p = 1.000, temp = 0.700
	mirostat = 0, mirostat_lr = 0.100, mirostat_ent = 5.000
sampling order:
CFG -> Penalties -> top_k -> tfs_z -> typical_p -> top_p -> min_p -> temperature
generate: n_ctx = 8192, n_batch = 2048, n_predict = -1, n_keep = 1

 日本の総理大臣は誰? 2024年5月17日現在

日本の現職総理大臣は、**岸田文雄**(きしだ ふみお)です。

岸田総理は、2021年10月4日に第100回国会の閉会式において、第99代の第27任の日本の内閣総理大臣に任命されました。

詳細については、以下のサイトをご参照ください。
*   内閣ホームページ: [https://www.kantei.go.jp/](https://www.kantei.go.jp/)
*   首相官邸: [https://www.kantei.go.jp/jp/](https://www.kantei.go.jp/jp/)

ご参考になれば幸いです。 [end of text]


llama_print_timings:        load time =     725.11 ms
llama_print_timings:      sample time =      15.97 ms /   179 runs   (    0.09 ms per token, 11206.41 tokens per second)
llama_print_timings: prompt eval time =      85.45 ms /     9 tokens (    9.49 ms per token,   105.33 tokens per second)
llama_print_timings:        eval time =    4204.48 ms /   178 runs   (   23.62 ms per token,    42.34 tokens per second)
llama_print_timings:       total time =    4335.19 ms /   187 tokens

インタラクティブモードで対話するには --chatで。この場合 -p はシステムプロンプトになる。

./google_gemma-3-4b-it-Q6_K.llamafile --chat -p "ネコ語で喋ってください"
出力

██╗     ██╗      █████╗ ███╗   ███╗ █████╗ ███████╗██╗██╗     ███████╗
██║     ██║     ██╔══██╗████╗ ████║██╔══██╗██╔════╝██║██║     ██╔════╝
██║     ██║     ███████║██╔████╔██║███████║█████╗  ██║██║     █████╗
██║     ██║     ██╔══██║██║╚██╔╝██║██╔══██║██╔══╝  ██║██║     ██╔══╝
███████╗███████╗██║  ██║██║ ╚═╝ ██║██║  ██║██║     ██║███████╗███████╗
╚══════╝╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚═╝╚══════╝╚══════╝
software: llamafile 0.9.2
model:    google_gemma-3-4b-it-Q6_K.gguf
compute:  Apple Metal GPU

ネコ語で喋ってください
>>> おはよう!
ニャー!今日も良い日になりますようにニャ!🐾

他にもオプションは多数あるのでhelp参照、というか、llama.cppを使っていればそんなに違うものではなさそう。あとREADMEにもいろいろ例があって、CLIなのでパイプで繋いだり、標準入力で渡したりなど、色々活用法はありそう。参考にされたし。

また、WebUIにはv2がある。--serverだと上の方で紹介したGUIになるが、これに--v2をつける。

./google_gemma-3-4b-it-Q6_K.llamafile --server --v2

URLが表示されるのでブラウザでアクセス

Apple Metal GPU support successfully loaded
2025-06-01T23:12:09.270364 llamafile/server/listen.cpp:41 server listen http://127.0.0.1:8080
2025-06-01T23:12:09.270440 llamafile/server/worker.cpp:143  warning: gpu mode disables pledge security

マルチターンのチャットっぽUIになっている。

右上のハンバーガーアイコンでモードを変更できる。

こちらのモードは、入力の途中からテキスト補完される。

kun432kun432

自分でもllamafile化してみたい、ということでざっと見た感じはまずllamafileをビルドする必要がある様子。

レポジトリクローン

git clone https://github.com/Mozilla-Ocho/llamafile && cd llamafile

で、普通にmakeするとこうなる。

make -j8
出力
build/config.mk:27: *** please use bin/make from cosmocc.zip rather than old xcode make.  Stop.

READMEには以下とある。

llamafile 開発には、最新の GNU make(一部システムでは gmake)、sha256sum(無い場合は cc)、wget(または curl)、unziphttps://cosmo.zip/pub/cosmos/bin/ から入手可)が必要です。Windows ユーザーは cosmos bash シェルも必要です。

このダウンロード元のcosmo.zipというのは、プラットフォームに依存しない実行ファイルを作成する「Actually Portable Executables」というプロジェクトのビルド済みバイナリを配布しているらしく、ここにあるバイナリはWIndows/Linux/Mac/BSDそしてARM64/AMD64のどの環境でも動くらしい。

https://cosmo.zip/

色々見てみた感じ、とりあえずmakeだけダウンロードして実行すると他に必要なものも全部ダウンロードされる様子。

mkdir bin
wget https://cosmo.zip/pub/cosmos/bin/make -O bin/make
chmod +x ./bin/make

とりあえず実行してみる。

./bin/make

ZIPアーカイブがダウンロードされて・・・

出力
(snip)
make: .cosmocc/3.9.7/bin/mkdeps: No such file or directory
build/download-cosmocc.sh .cosmocc/3.9.7 3.9.7 3f559555d08ece35bab1a66293a2101f359ac9841d563419756efa9c79f7a150
--2025-06-02 09:17:42--  https://github.com/jart/cosmopolitan/releases/download/3.9.7/cosmocc-3.9.7.zip
Resolving github.com (github.com)... 20.27.177.113
Connecting to github.com (github.com)|20.27.177.113|:443... connected.
(snip)
cosmocc.zip                    77%[=====================================>            ] 324.36M  8.94MB/s    eta 12s
(snip)

展開され・・・

出力
(snip)
  inflating: bin/aarch64-linux-cosmo-nm
  inflating: bin/ape-x86_64.macho
    linking: bin/aarch64-unknown-cosmo-readelf  -> aarch64-linux-cosmo-readelf
  inflating: bin/aarch64-linux-cosmo-g++
  inflating: bin/cosmocross
    linking: bin/aarch64-unknown-cosmo-cc  -> cosmocross
  inflating: bin/touch.ape
    linking: bin/unknown-unknown-cosmo-cc  -> cosmocc
    linking: bin/x86_64-unknown-cosmo-as  -> x86_64-linux-cosmo-as
    linking: bin/x86_64-linux-cosmo-ld.bfd  -> ../libexec/gcc/x86_64-linux-cosmo/14.1.0/ld.bfd
  inflating: bin/mkdeps
(snip)

ビルドが行われる

出力
(snip)
.cosmocc/3.9.7/bin/cosmocc -O2 -g -fexceptions -ffunction-sections -fdata-sections -mclang -g -DGGML_MULTIPLATFORM -DGGML_USE_LLAMAFILE   -iquote. -mcosmo -DGGML_MULTIPLATFORM -Wno-attributes -DLLAMAFILE_DEBUG  -Xx86_64-mtune=znver4 -c -o o//llamafile/addnl.o llamafile/addnl.c
.cosmocc/3.9.7/bin/cosmocc -O2 -g -fexceptions -ffunction-sections -fdata-sections -mclang -g -DGGML_MULTIPLATFORM -DGGML_USE_LLAMAFILE   -iquote. -mcosmo -DGGML_MULTIPLATFORM -Wno-attributes -DLLAMAFILE_DEBUG  -Xx86_64-mtune=znver4 -c -o o//llamafile/bestline.o llamafile/bestline.c
.cosmocc/3.9.7/bin/cosmocc -O2 -g -fexceptions -ffunction-sections -fdata-sections -mclang -g -DGGML_MULTIPLATFORM -DGGML_USE_LLAMAFILE   -iquote. -mcosmo -DGGML_MULTIPLATFORM -Wno-attributes -DLLAMAFILE_DEBUG  -Xx86_64-mtune=znver4 -c -o o//llamafile/bincompare.o llamafile/bincompare.c
(snip)

インストール。ドキュメントでは /usr/local にインストールしているが、自分は/opt/llamafileにインストールした。

sudo ./bin/make install PREFIX=/opt/llamafile

パスを通しておく

export PATH="/opt/llamafile/bin:$PATH"
which llamafile
出力
/opt/llamafile/bin/llamafile

でこのllamafileはそれ単体だとllama.cppのllama-cliのように使える。Unslothのgemma3-4b-it-qatのGGUFファイルを使ってみる。

wget --content-disposition https://huggingface.co/unsloth/gemma-3-4b-it-qat-GGUF/resolve/main/gemma-3-4b-it-qat-Q4_K_M.gguf?download=true
llamafile \
    -m gemma-3-4b-it-qat-Q4_K_M.gguf \
    --temp 0.6 \
    -p "競馬の楽しみ方を5つリストアップして。" \
    -e 
出力
競馬の楽しみ方を5つリストアップして。

1. **レース結果の確認:** 開催されたレースの結果をチェックして、どの馬が勝利したのか、タイム、着順などを確認します。
2. **予想の作成:** 過去のレース結果、馬の情報(血統、過去の成績、騎手、調教師など)、天気、コース状況などを分析して、どの馬が勝つか予想します。
3. **オッズの確認:** 各馬のオッズ(勝率、着率)を確認し、人気度を把握します。オッズは、その馬が勝つ可能性を数値化したものです。
4. **レースの視聴:** テレビやインターネットでレースを視聴し、馬の動きや競り合いを間近で見て、レース展開を楽しみます。
5. **予想の検証:** 予想の結果と実際のレース結果を比較し、自分の予想力を評価します。予想が当たった場合は、その興奮を味わい、外れた場合は、その原因を分析して次回の予想に活かします。

これらの活動を通して、競馬の奥深さを知ることができ、より一層競馬を楽しめるようになります。
 [end of text]


llama_print_timings:        load time =    3446.03 ms
llama_print_timings:      sample time =      36.50 ms /   241 runs   (    0.15 ms per token,  6602.56 tokens per second)
llama_print_timings: prompt eval time =      83.43 ms /    11 tokens (    7.58 ms per token,   131.85 tokens per second)
llama_print_timings:        eval time =    5246.42 ms /   240 runs   (   21.86 ms per token,    45.75 tokens per second)
llama_print_timings:       total time =    5439.34 ms /   251 tokens

ではこれをllamafile化してみる。まず作業ディレクトリを作成。

mkdir work && cd work

ここに以下をコピーする

  • インストールしたllamafileのバイナリ。拡張子.llamafileをつける。
  • gemma-3-4b-it-qatのGGUFファイル
sudo cp /opt/llamafile/bin/llamafile gemma.llamafile
cp ../gemma-3-4b-it-qat-Q4_K_M.gguf .

でここに.argsというファイルを作成する。これはllamafile実行時に渡すデフォルトの引数を書いておくもの。

.args
-m
gemma-3-4b-it-qat-Q4_K_M.gguf
--host
0.0.0.0
-ngl
9999

これをzipalignコマンドで一つにまとめる。zipalignを自分は知らなかったのだが、AndroidなどでアプリをAPKパッケージ化するのに使用されているみたい。これも/opt/llamafile/binにインストールされている。

zipalign -j0 \
    gemma.llamafile \
    gemma-3-4b-it-qat-Q4_K_M.gguf \
    .args

エラー。

出力
gemma.llamafile: Permission denied
used = 0

rootパーミッションになっているせいか。

ls -lt gemma.llamafile
出力
-rwxr-xr-x@ 1 root  staff  15940974  6  2 10:35 gemma.llamafile

ユーザ権限に変える

sudo chown kun432 gemma.llamafile

再度実行

zipalign -j0 \
    gemma.llamafile \
    gemma-3-4b-it-qat-Q4_K_M.gguf \
    .args
出力
used = 123'880

とりあえずできたみたい。先ほどよりファイルサイズが大きくなっているのがわかる。

ls -lta
出力
-rwxr-xr-x@  1 kun432  staff  2505922249  6  2 10:44 gemma.llamafile
drwxr-xr-x@  5 kun432  staff         160  6  2 10:37 .
-rw-r--r--@  1 kun432  staff          58  6  2 10:37 .args
-rw-r--r--@  1 kun432  staff  2489894016  6  2 10:35 gemma-3-4b-it-qat-Q4_K_M.gguf
drwxr-xr-x@ 27 kun432  staff         864  6  2 10:34 ..

では実行してみる。

./gemma.llamafile
出力
██╗     ██╗      █████╗ ███╗   ███╗ █████╗ ███████╗██╗██╗     ███████╗
██║     ██║     ██╔══██╗████╗ ████║██╔══██╗██╔════╝██║██║     ██╔════╝
██║     ██║     ███████║██╔████╔██║███████║█████╗  ██║██║     █████╗
██║     ██║     ██╔══██║██║╚██╔╝██║██╔══██║██╔══╝  ██║██║     ██╔══╝
███████╗███████╗██║  ██║██║ ╚═╝ ██║██║  ██║██║     ██║███████╗███████╗
╚══════╝╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚═╝╚══════╝╚══════╝
software: llamafile 0.9.3
model:    gemma-3-4b-it-qat-Q4_K_M.gguf
compute:  Apple Metal GPU
server:   http://127.0.0.1:8080/

A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.
>>> おはよう!
おはようございます! (Ohayō gozaimasu!) That means "Good morning!" How are you doing today? Is there anything I can help you with?

他のOSでも使えるか確認してみる。作成されたllamafileをUbuntu-22.04サーバにscpで持っていて、実行してみた。

uname -m -o
出力
x86_64 GNU/Linux
lsb_release -a
出力
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.5 LTS
Release:	22.04
Codename:	jammy
./gemma.llamafile

以下の箇所で止まってしまう。

出力

██╗     ██╗      █████╗ ███╗   ███╗ █████╗ ███████╗██╗██╗     ███████╗
██║     ██║     ██╔══██╗████╗ ████║██╔══██╗██╔════╝██║██║     ██╔════╝
██║     ██║     ███████║██╔████╔██║███████║█████╗  ██║██║     █████╗
██║     ██║     ██╔══██║██║╚██╔╝██║██╔══██║██╔══╝  ██║██║     ██╔══╝
███████╗███████╗██║  ██║██║ ╚═╝ ██║██║  ██║██║     ██║███████╗███████╗
╚══════╝╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚═╝╚══════╝╚══════╝
 loading backend...

CLIで直接使ってログを見てみると、どうやらCUDA周りで止まっているように思える。

./gemma.llamafile  --temp 0.7 -p " 日本の総理大臣は誰?"
出力
llamafile_log_command: /usr/local/cuda/bin/nvcc -arch=native -std=c++11 -O3 --shared --use_fast_math -Xcudafe --diag_suppress=177 -Xcudafe --diag_suppress=940 -Xcudafe --diag_suppress=1305 --forward-unknown-to-host-compiler --compiler-options "-fPIC -O3 -march=native -mtune=native -std=c++11 -Wno-unused-function -Wno-unused-result -Wno-return-type -Wno-pedantic" -DNDEBUG -DGGML_BUILD=1 -DGGML_SHARED=1 -DGGML_MULTIPLATFORM -DGGML_CUDA_DMMV_X=32 -DK_QUANTS_PER_ITERATION=2 -DGGML_CUDA_PEER_MAX_BATCH_SIZE=128 -DGGML_CUDA_MMV_Y=1 -DGGML_USE_CUBLAS -DGGML_MINIMIZE_CODE_SIZE -o /home/kun432/.llamafile/v/0.9.3/ggml-cuda.so.16gin1 /home/kun432/.llamafile/v/0.9.3/ggml-cuda.cu -lcublas -lcuda

GPUオフロードなしにするとちゃんと動作する。遅いけど。

./gemma.llamafile  --temp 0.7 -p " 日本の総理大臣は誰?" -ngl 0
出力
 日本の総理大臣は誰?

2024年5月15日現在、日本の総理大臣は**岸田文雄**氏です。

岸田文雄氏は、2021年10月31日に第100代内閣総理大臣に就任しました。
 [end of text]


llama_print_timings:        load time =     467.28 ms
llama_print_timings:      sample time =       8.33 ms /    62 runs   (    0.13 ms per token,  7442.08 tokens per second)
llama_print_timings: prompt eval time =     106.62 ms /     9 tokens (   11.85 ms per token,    84.41 tokens per second)
llama_print_timings:        eval time =    3287.64 ms /    61 runs   (   53.90 ms per token,    18.55 tokens per second)
llama_print_timings:       total time =    3417.23 ms /    70 tokens
kun432kun432

ちなみにサンプルで,公式が用意されているLLaVA-1.5-7BをLinuxでも試してみたが、こちらはダウンロードすればそのまま動いた。つまりMacとLinuxの両方で動作したということ。

ということは何かしらビルド環境とか手順を見直す必要がありそう。

kun432kun432

まとめ

モデルそのものが実行ファイルになる、というのは、環境に依存せず、環境構築も不要、ということで、配布を考えると非常に良いと思う。今回は上手くいかなかったけども、もう少しビルド環境については調べてみたい。

唯一デメリットとしてあるのは、llama.cppに依存しているので、llama.cppで動かせないものは当然動かせないだろうし、すべてのモデルがllama.cppに対応するわけではない、というところあたりかな。

このあたりは、モデル作成側でも、環境構築の手間が少なくて広く使われているllama.cppやollamaあたりに最初から対応してもらえると、利用度が上がってよいのではないかなと言う気がする(作成側には一手間増えることにはなるけども)

このスクラップは4ヶ月前にクローズされました