モデルを、あらゆる環境で動作する実行ファイルに変換する「llamafile」を試す
GitHubレポジトリ
llamafile
referred from https://github.com/Mozilla-Ocho/llamafilellamafile は、LLM を単一ファイルで配布・実行できるようにします。(公式ブログ記事)
私たちの目標は、オープンな LLM を開発者やエンドユーザーの双方にとってよりアクセスしやすくすることです。そのために llama.cpp と Cosmopolitan Libc を一つのフレームワークに統合し、LLM の複雑さをすべて一つの実行可能ファイル(「llamafile」と呼ばれます)に集約しています。このファイルはほとんどのコンピュータ上でインストール不要でローカルに動作します。
llamafile は Mozilla Builders プロジェクトです。
llamafile の仕組み
llamafile は、自分のコンピュータ上で動作する実行可能な LLM です。指定したオープン LLM の重みと、モデルを動作させるために必要なものすべてを含んでいます。(いくつかの注意点は以降で説明しますが)インストールや設定は不要です。
これは llama.cpp と Cosmopolitan Libc を組み合わせることで実現されています。主な特長は以下の通りです。
- llamafile は複数の CPU マイクロアーキテクチャで動作します。最新の Intel システムで新しい CPU 機能を使いつつ、古いコンピュータもサポートできるよう llama.cpp にランタイムディスパッチを追加しています。
- llamafile は複数の CPU アーキテクチャで動作します。AMD64 と ARM64 のビルドをシェルスクリプトで連結し、適切なものを起動します。ファイル形式は WIN32 および多くの UNIX シェルと互換です。必要に応じて簡単にプラットフォームネイティブ形式に変換できます。
- llamafile は6つの OS(macOS, Windows, Linux, FreeBSD, OpenBSD, NetBSD)で動作します。独自の llamafile を作成する場合、一度だけ Linux 形式のツールチェーンでビルドすれば十分です。提供する GCC ベースのコンパイラ自体も Actually Portable Executable ですので、どの開発環境でも全 OS 向けにビルドできます。
- LLM の重みを llamafile 内に埋め込むことができます。GGML ライブラリに PKZIP 対応を追加し、非圧縮ウェイトを自己解凍アーカイブのように直接メモリにマッピングできるようにしました。オンライン配布される量子化ウェイトに llama.cpp の互換バージョンをプレフィックスすることで、当初の動作を無期限に再現できます。
- 本プロジェクトに含まれるツールで、任意の互換ウェイトを用いて 自分だけの llamafile を作成できます。作成した llamafile は、他の人もどんなコンピュータでも簡単に利用できます。
ライセンス
llamafile プロジェクトは Apache 2.0 ライセンスですが、llama.cpp への変更分は MIT ライセンス(llama.cpp 本体と同じ)とし、今後の互換性・アップストリーム適用を考慮しています。
なるほど、モデルをそのまま実行ファイル的にラップすることで、環境構築が不要で使えると。ポータ簿ビリティが良いね。
サポートされる 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 では外部ウェイトも利用でき、この方法については後述します。
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でもアクセスできるね。
用意されているモデルは他にもある
その他のサンプル llamafile
さまざまな種類の LLM で llamafile を簡単に試せるよう、他のモデル用のサンプル llamafile も提供しています。
上記以外にも、HuggingFaceには全部で50個ぐらいあった。
せっかくなので他のモデルも。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
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になっている。
右上のハンバーガーアイコンでモードを変更できる。
こちらのモードは、入力の途中からテキスト補完される。
自分でも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
)、unzip
(https://cosmo.zip/pub/cosmos/bin/ から入手可)が必要です。Windows ユーザーは cosmos bash シェルも必要です。
このダウンロード元のcosmo.zipというのは、プラットフォームに依存しない実行ファイルを作成する「Actually Portable Executables」というプロジェクトのビルド済みバイナリを配布しているらしく、ここにあるバイナリはWIndows/Linux/Mac/BSDそしてARM64/AMD64のどの環境でも動くらしい。
色々見てみた感じ、とりあえず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実行時に渡すデフォルトの引数を書いておくもの。
-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
ちなみにサンプルで,公式が用意されているLLaVA-1.5-7BをLinuxでも試してみたが、こちらはダウンロードすればそのまま動いた。つまりMacとLinuxの両方で動作したということ。
ということは何かしらビルド環境とか手順を見直す必要がありそう。
まとめ
モデルそのものが実行ファイルになる、というのは、環境に依存せず、環境構築も不要、ということで、配布を考えると非常に良いと思う。今回は上手くいかなかったけども、もう少しビルド環境については調べてみたい。
唯一デメリットとしてあるのは、llama.cppに依存しているので、llama.cppで動かせないものは当然動かせないだろうし、すべてのモデルがllama.cppに対応するわけではない、というところあたりかな。
このあたりは、モデル作成側でも、環境構築の手間が少なくて広く使われているllama.cppやollamaあたりに最初から対応してもらえると、利用度が上がってよいのではないかなと言う気がする(作成側には一手間増えることにはなるけども)