2026年5月5日火曜日

SwiftBarで構築するLLM(llama-server)のワンクリック起動環境

 

1. 実装のゴール

M4 Maxのパワーを活かし、ローカルLLM環境(llama.cpp)をターミナルなしで制御することを目指します。

  • メニューバーにステータス(起動中/停止中)を表示。

  • ワンクリックで llama-server を起動・停止。

  • SwiftBarの仕様に基づき、エラー(はてなマーク)を徹底排除する。

2. 起動・制御用シェルスクリプト

今回作成した llama_control.1s.sh の全容です。

--------------Bash-------------------
#!/bin/bash

# --- 環境設定 ---
# GUIアプリから呼ばれるため、PATHを明示してコマンドを見失わないようにする
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

# パス設定(各自の環境に合わせて変更)
MODEL_PATH="/Users/hidenari/models/Qwen3.5-9B-Q8_0.gguf"
LOG_FILE="/tmp/llama.log"
# SwiftBarに無視させるため、PIDファイルはドット(.)で始めるのがコツ
PID_FILE="/Users/hidenari/Documents/SwiftBar/.llama-server.pid"
# 自分自身のフルパス(SwiftBarの再帰呼び出しを確実にするため)
SELF_PATH="/Users/hidenari/Documents/SwiftBar/llama_control.1s.sh"

# --- プロセスチェック ---
# pgrepでプロセスを直接確認。名前で狙い撃ち
CURRENT_PID=$(pgrep -f "llama-server.*Qwen3.5-9B")

if [ -n "$CURRENT_PID" ]; then
    STATUS="Running"
    COLOR="green"
    ICON="🤖"
else
    STATUS="Stopped"
    COLOR="red"
    ICON="💤"
fi

# --- SwiftBarへの出力 ---
# メニューバーの表示
echo "$ICON LLM: $STATUS | color=$COLOR"
echo "---"

if [ "$STATUS" = "Stopped" ]; then
    # 起動コマンド:ターミナルを開かずバックグラウンドで実行
    echo "Launch Qwen 3.5 | bash='$SELF_PATH' param1=start terminal=false"
else
    # 停止コマンド
    echo "Stop llama-server | bash='$SELF_PATH' param1=stop terminal=false"
    echo "PID: $CURRENT_PID"
fi

# --- 実行ロジック(SwiftBarからの引数 $1 で分岐) ---
case "$1" in
    start)
        if [ -z "$CURRENT_PID" ]; then
            cd /Users/hidenari/llama.cpp/build/bin/
            # M4 Maxの性能をフル活用(GPU全レイヤー、Flash Attention有効)
            nohup ./llama-server -m "$MODEL_PATH" -c 65536 --n-gpu-layers 99 --port 8080 --flash-attn on > "$LOG_FILE" 2>&1 &
            sleep 2
        fi
        ;;
    stop)
        # 確実にプロセスを終了させる
        TARGET_PID=$(pgrep -f "llama-server.*Qwen3.5-9B")
        [ -n "$TARGET_PID" ] && kill -9 $TARGET_PID
        ;;
esac
---------------------------------------------------

3. こだわりの「記載過程」とエンジニアの知恵

① 「はてなマーク」との決別:隠しファイルの活用

SwiftBarはディレクトリ内の全ファイルを自動実行しようとします。以前、プロセスIDを保存する llama-server.pidを置いていたところ、SwiftBarがそれを「スクリプト」と勘違いして実行しようとし、エラー(はてなマーク)が発生しました。

  • 対策: ファイル名を .llama-server.pid とドットから始まる隠しファイルに。SwiftBarはこのファイルを無視するため、メニューバーがクリーンに保たれます。

② 「自分自身」をフルパスで定義する

GUIアプリであるSwiftBarから呼び出される際、相対パス($0)は不安定になりがちです。

  • 対策SELF_PATH 変数にスクリプトのフルパスを直接記載。これにより、メニューからクリックした際のコマンド実行ミスをゼロにしました。

③ M4 Maxのポテンシャルを活かす

起動パラメータに --n-gpu-layers 99 と --flash-attn on を指定。

  • これにより、Qwen 3.5クラスのモデルも爆速で動作。ハードの性能を最大限引き出すのがインフラエンジニアの醍醐味です。

0 件のコメント:

コメントを投稿

SwiftBarで構築するLLM(llama-server)のワンクリック起動環境

  1. 実装のゴール M4 Maxのパワーを活かし、ローカルLLM環境( llama.cpp )をターミナルなしで制御することを目指します。 メニューバーにステータス(起動中/停止中)を表示。 ワンクリックで  llama-server  を起動・停止。 SwiftBarの仕様...