Ubuntu 25.04 で LM Studio をサービスとして展開

Статья обновлена 2025.11.10, см. комментарий。

はじめに

この記事では、Ubuntu 25.04 で LM Studio をサービスとしてデプロイする方法について説明します (他のバージョンでも機能する可能性があります)。

LM Studio をサーバーとして使用すると、言語モデルをロードしてローカルで作業できるだけでなく、外部サービスとの接続のための API を構成できます。 サービスを停止し、通常どおりアプリケーションを開始することで、ローカルでの作業に戻ることができます。

次のことが可能になります。

  • さまざまな言語モデル (未使用時にアンロード) で作業する
  • API に独自のアプリケーションまたはプラグインを接続する

ダウンロード

AppImage (Linux 用のアプリケーションについてこの記事で説明します) をダウンロードしてください。

https://lmstudio.ai/

ファイルを ~/llm フォルダに配置し、実行可能にします。

chmod +x ~/llm/LM-Studio-0.3.27-4-x64.AppImage

この記事を書いている時点では、このバージョンが最新でした。

headless

サービスとしてデプロイする必要があるのは、リモートで作業する場合です。 最初に決定してください。

a) サーバー (PC/ラップトップなど) にグラフィックスがあり、ユーザーは少なくとも一度 UI にログインしている。 または、UI で作業している場合は、この手順をスキップします。

b) サーバーにグラフィックスがないか、ユーザーが UI にログインしたことがない場合、1 回限りの追加コマンドが必要です。

sudo loginctl enable-linger $USER

このコマンドは、グラフィカルインターフェイスに入ることなく環境で作業できるようにします。

loginctl show-user ivan | grep Linger

このコマンドは設定の状態 (アクティブまたは利用不可) を表示します。

Linger=yes

何も邪魔していないことを確認するコマンド (出力に degraded などの理解可能な状態が表示される必要がありますが、エラーは許可されません)。

systemctl --user status
systemctl --user is-system-running

systemd

まだ headless モード (グラフィックスなし) に決めていない場合は、この手順をスキップします。

しかし、自動起動がすべてである場合は、スクリプトを作成してください。

~/.config/systemd/user/lm-studio.service

そして、LM Studio の実行可能ファイルが次の場所に配置されていると仮定しましょう。

%HOME/llm/LM-Studio-0.3.27-4-x64.AppImage

内容:

[Unit]
Description=LM Studio Service
After=network.target

[Service]
Type=simple

ExecStart=/usr/bin/xvfb-run -a --server-args="-

バージョン 0.3.31-2 と 0.3.31-7 の間に、リッスンインターフェースを外部から 127.0.0.1 に強制的に変更し、CORS を無効にする変更が発生しました。

LM Studio は HTTP サーバーの構成の hot-reload (少なくとも corsnetworkInterface の変更時) をサポートしているため、再起動なしで変更できます (一度だけ適用されます)。:

%h/.lmstudio/.internal/http-server-config.json
jq '.cors = true | .networkInterface = "0.0.0.0"' ~/.lmstudio/.internal/http-server-config.json | sponge ~/.lmstudio/.internal/http-server-config.json

sponge は moreutils パッケージに含まれているので、インストールすることを忘れないでください。

変更を自動的に行うには、起動スクリプトを変更します。:

$HOME/.config/systemd/user/lm-studio.service
[Unit]
Description=LM Studio Service
After=network.target

[Service]
Type=simple

ExecStart=/usr/bin/xvfb-run -a --server-args="-screen 0 1920x1080x24" %h/llm/lmstudio --run-as-service

# 1. HTTPサーバーの起動
ExecStartPost=/bin/bash -c 'sleep 15 && exec lms server start'

# 2. 必要な設定の適用 (サーバーがすでに起動した後)
ExecStartPost=/bin/bash -c ' \
  sleep 2 && \
  jq \".cors = true | .networkInterface = \\\"0.0.0.0\\\"\n     \\\"%h/.lmstudio/.internal/http-server-config.json\\\" \
     > \\\"%h/.lmstudio/.internal/http-server-config.json.tmp\\\" && \
  mv \\\"%h/.lmstudio/.internal/http-server-config.json.tmp\\\" \
     \\\"%h/.lmstudio/.internal/http-server-config.json\\\"\n'

Restart=always
RestartSec=10
Environment=PATH=%h/.local/bin:/usr/local/bin:/usr/bin:/bin:%h/.lmstudio/bin
Environment=DISPLAY=:99
WorkingDirectory=%h/llm

[Install]
WantedBy=default.target

変更を適用し、サービスを再起動します (sudo 不要)。:

systemctl --user daemon-reload
systemctl --user stop lm-studio.service
systemctl --user start lm-studio.service

OSのパラメータチューニングに注意してください。最適な動作のために。

私のシステムの例(Oculink経由で接続されたグラフィックカードを搭載したノートパソコン):

free -h
               total        used        free      shared  buff/cache   available
Mem:            37Gi       4.9Gi        29Gi       240Mi       3.5Gi        32Gi
Swap:          8.0Gi          0B       8.0Gi
cat /proc/meminfo | grep -E 'MemTotal|MemAvailable'

MemTotal:       39223064 kB
MemAvailable:   34073484 kB

VRAMは別途表示されます(MemTotalには含まれません):

nvidia-smi

Fri Nov 21 12:24:47 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.82.09              Driver Version: 580.82.09      CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 5060 Ti     Off |   00000000:01:00.0 Off |                  N/A |
|  0%   44C    P8              8W /  180W |      13MiB /  16311MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A            5314      G   /usr/bin/gnome-shell                      2MiB |
+-----------------------------------------------------------------------------------------+

どうするか

overcommitポリシーとswappinessの設定を確認してください:

cat /proc/sys/vm/overcommit_memory
cat /proc/sys/vm/overcommit_ratio
cat /proc/sys/vm/swappiness

推奨値:

2 # リミット = (RAM * ratio/100) + Swap
80 # これがratio
10 # 20以下に保つ。これは、swapが有効になるまで残りのRAMの割合。swapは8GiBが推奨(OSのハイブリッド機能を使わない場合、swapはメモリサイズと等しくなる)

実行コマンド:

sudo sysctl vm.overcommit_ratio=80
echo 'vm.overcommit_ratio=80' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf

重要: LLM(特にllama.cpp)でTHP = alwaysはログイン後に1分程度の遅延を引き起こす可能性があります。

cat /sys/kernel/mm/transparent_hugepage/enabled
# これでなければならない:[always] madvise never

ディスク(例:LLMの重みをSSDに書き込む場合)の設定では、writebackの設定が重要です:

cat /proc/sys/vm/dirty_ratio
cat /proc/sys/vm/dirty_background_ratio
cat /proc/sys/vm/dirty_expire_centisecs

NVMe向けの最適値:

10
5
1000(これは10秒)
echo 'vm.dirty_ratio=10' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf
echo 'dirty_background_ratio=5' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf
echo 'vm.dirty_expire_centisecs=1000' | sudo tee -a /etc/sysctl.d/99-ml-workstation.conf

lmstudioを起動する前に、メモリキャッシュをクリアすることを推奨します:

sync && echo 2 | sudo tee /proc/sys/vm/drop_caches