Статья обновлена 2025.11.10, см. комментарий.
Введение
В этой статье расскажу о том, как развернуть LM Studio как сервис в среде Ubuntu 25.04 (может подойдет и для других версий).
LM Studio в качестве сервера позволяет не только загружать языковые модели и работать с ними единолично, но и организовывать API для подключения внешних сервисов. При этом вернуться к локальной работе можно, остановив сервис и включив приложение как обычно.
Вы сможете:
- работать с разными языковыми моделями (по запросу с выгрузкой при неиспользовании)
- подключать к API свои приложения или плагины
Скачать
Скачайте AppImage (в статье мы говорим про приложение для Linux), сайт:
Разместите файл в папке ~/llm и сделайте его исполняемым:
chmod +x ~/llm/LM-Studio-0.3.27-4-x64.AppImage
На момент написания статьи эта версия была актуальной.
headless
Развертывание в виде сервиса требуется тогда, когда вы работаете с ним удаленно. Сразу определитесь:
а) на сервере (ПК/ноутбуке и т.д.) графика есть и пользователь уже логинился хотя бы раз в оболочку UI. Либо если вы работаете в UI - то пропустите этот шаг.
б) на сервере графики нет либо пользователь никогда не логинился в UI. В этом случае понадобится пара дополнительных команд, выполняемых разово:
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="-screen 0 1920x1080x24" %h/llm/LM-Studio-0.3.27-4-x64.AppImage --run-as-service
ExecStartPost=/bin/bash -c 'sleep 10 && exec lms server start'
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
Скрипт состоит из двух частей:
- запуск приложения
- старт серверной части
По своей сути такой скрипт является хрупким, так как состоит из двух частей, которые не знают о состоянии друг друга. Не используйте подобные решения в продакшене. И вообще LM Studio не используйте, так как VLLM значительно быстрее.
Заметьте, что здесь эмулируется экран, поэтому вам необходимо доустановить:
sudo apt update && sudo apt install xvfb
Обратите внимание, что systemd в данном примере будет установлена от пользователя, а не root.
Проделайте обычные операции для стартового скрипта (применить изменения и сделать автозапуск):
systemctl --user daemon-reload
systemctl --user enable --now lm-studio.service
Запуск
systemctl --user status lm-studio.service
Сервис сейчас должен молчать, поскольку его еще ни разу не запускали.
systemctl --user start lm-studio.service
и теперь проверьте статус сервера:
lms server status
он должен прослушивать порт 1234.
Строго говоря, вам следует сначала поиграть с UI LM Studio, чтобы установить нужные параметры и загрузить модели. А также перевести прослушивание с адреса 127.0.0.1 на 0.0.0.0, если нужно организовать внешнее подключение к вашему API (потенциально опасно, так как сначала установите шифрование и авторизацию)
CURL
Проверьте endpoint вашего сервера:
curl -v http://127.0.0.1:1234/v1/models
вам должны вернуться доступные модели:
* Trying 127.0.0.1:1234...
* Connected to 127.0.0.1 (127.0.0.1) port 1234
* using HTTP/1.x
> GET /v1/models HTTP/1.1
> Host: 127.0.0.1:1234
> User-Agent: curl/8.12.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
<
{
"data": [
{
"id": "nvidia_nvidia-nemotron-nano-9b-v2",
"object": "model",
"owned_by": "organization_owner"
},
{
"id": "text-embedding-qwen3-embedding-0.6b",
"object": "model",
"owned_by": "organization_owner"
},
{
"id": "qwen/qwen3-8b",
"object": "model",
"owned_by": "organization_owner"
},
{
"id": "google/gemma-3-4b",
"object": "model",
"owned_by": "organization_owner"
}
],
"object": "list"
* Connection #0 to host 127.0.0.1 left intact
REST API
Теперь вы можете подключаться к вашему REST API, используя эндпоинты:
GET http://127.0.0.1:1234/v1/models
POST http://127.0.0.1:1234/v1/chat/completions
POST http://127.0.0.1:1234/v1/completions
POST http://127.0.0.1:1234/v1/embeddings
