# Развертывание LM Studio как сервиса в Ubuntu 25.04 **Category:** [AI](https://discuss.rabkesov.ru/c/ai/7) **Created:** 2025-09-29 20:01 UTC **Views:** 66 **Replies:** 2 **URL:** https://discuss.rabkesov.ru/t/razvertyvanie-lm-studio-kak-servisa-v-ubuntu-25-04/215 --- ## Post #1 by @ivan
``` Статья обновлена 2025.11.10, см. комментарий. ``` ### Введение В этой статье расскажу о том, как развернуть LM Studio как сервис в среде Ubuntu 25.04 (может подойдет и для других версий). >LM Studio в качестве сервера позволяет не только загружать языковые модели и работать с ними единолично, но и организовывать API для подключения внешних сервисов. При этом вернуться к локальной работе можно, остановив сервис и включив приложение как обычно. Вы сможете: - работать с разными языковыми моделями (по запросу с выгрузкой при неиспользовании) - подключать к API свои приложения или плагины ![В черном и белом стиле изображен программист, сосредоточенно работающий за компьютером с сигаретой в руке, окруженный книжными полками. (Подпись к изображению от AI)|689x394](upload://lGZiKaFv7a47ChrLB6WhLMt9PMU.jpeg) ### Скачать Скачайте AppImage (в статье мы говорим про приложение для Linux), сайт: https://lmstudio.ai/ Разместите файл в папке `~/llm` и сделайте его исполняемым: ``` chmod +x ~/llm/LM-Studio-0.3.27-4-x64.AppImage ``` На момент написания статьи эта версия была актуальной. ### headless Развертывание в виде сервиса требуется тогда, когда вы работаете с ним удаленно. Сразу определитесь: а) на сервере (ПК/ноутбуке и т.д.) графика есть и пользователь уже логинился хотя бы раз в оболочку UI. Либо если вы работаете в UI - то пропустите этот шаг. б) на сервере графики нет либо пользователь никогда не логинился в UI. В этом случае понадобится пара дополнительных команд, выполняемых разово: ```bash sudo loginctl enable-linger $USER ``` эта команда делает возможным работать с окружением, не входя в графический интерфейс ```bash 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 ``` --- ## Post #2 by @ivan Где-то между версиями 0.3.31-2 и 0.3.31-7 произошло изменение, которое принудительно меняет прослушиваемый интерфейс с внешнего на 127.0.0.1 и отключает CORS. Поскольку LM Studio поддерживает **hot-reload** конфига HTTP-сервера (по крайней мере, при изменении `cors` и `networkInterface` ), то сделать изменение можно без перезапуска (сработает разово): ``` %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\\\"\" \ \"%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\" \ ' 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 ``` --- ## Post #3 by @ivan Обратите внимание на тюнинг параметров ОС для оптимальной работы. ### Пример Вот пример из моей системы (это ноутбук с подключенной видеокартой с помощью 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 - это сколько оставшейся RAM должно быть, чтобы начал работать swap, сам swap может быть 8 GiB, если у тебя не используется гибернация ОС, тогда своп будет равен размеру оперативки ``` Команды для выполнения: ``` 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` может вызывать паузы (задержки в минуту после логина в ОС) ``` 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 ``` --- **Canonical:** https://discuss.rabkesov.ru/t/razvertyvanie-lm-studio-kak-servisa-v-ubuntu-25-04/215 **Original content:** https://discuss.rabkesov.ru/t/razvertyvanie-lm-studio-kak-servisa-v-ubuntu-25-04/215