LoRA-адаптація LLM для мобільного застосунку
Уявіть: ваш застосунок для медичних консультацій на iOS має відповідати на специфічні питання, використовуючи велику мовну модель. Повний fine-tuning Llama 3 8B потребує кластер A100 з 80 ГБ VRAM і кілька днів навчання. Але є LoRA — Low-Rank Adaptation. Вона заморожує оригінальні ваги та навчає компактні матриці-адаптери. Один A100 40GB справляється за години, адаптер важить 50–300 МБ замість 16 ГБ. Економія на GPU-оренді досягає 70–90%, що при типовій вартості оренди A100 близько $1.5/год перетворюється на десятки тисяч доларів економії на кожному проєкті. Ми використовуємо цей метод для десятків мобільних проєктів — від юридичних чат-ботів до генерації контенту.
Технічні аспекти LoRA
Принцип роботи
Оригінальна вагова матриця W розміром d × k залишається незмінною. Замість неї ми навчаємо дві низькорангові матриці: A (розмір d × r) та B (розмір r × k), де r — ранг адаптації (зазвичай 8–64). При інференсі виконуємо: W_new = W + α · (A × B), де α — scaling-коефіцієнт.
Ключові гіперпараметри:
-
r(rank) — чим вищий, тим більше параметрів навчається.r=16— розумний старт. -
lora_alpha— зазвичай дорівнює2rабоr. Контролює силу адаптації при злитті. -
target_modules— які шари адаптувати. Для трансформерів:q_proj, v_proj, k_proj, o_projта опціональноgate_proj, up_proj, down_proj. -
lora_dropout— регуляризація, 0.05–0.1 для невеликих датасетів.
| Ранг (r) | Параметрів адаптера | VRAM при QLoRA (4bit) | Рекомендоване застосування |
|---|---|---|---|
| 8 | ~0.5% від базової | ~5.5 ГБ (8B) | Проста класифікація |
| 16 | ~1% | ~5.8 ГБ (8B) | Текстова генерація |
| 32 | ~2% | ~6.3 ГБ (8B) | Інструктивні задачі |
| 64 | ~4% | ~7.2 ГБ (8B) | Складні сценарії |
Чому LoRA краща за повний fine-tuning?
Full fine-tuning потребує величезних ресурсів і часу, а також чекпоїнти розміром у десятки гігабайт. LoRA дає ті самі можливості адаптації під конкретну задачу з часткою витрат. Для мобільних застосунків це особливо важливо — можна швидко ітеративно покращувати модель без простоїв та без перенавчання всієї бази. Цей підхід описано в роботі QLoRA: Efficient Finetuning of Quantized Language Models.
Підготовка датасету та навчання
Збір та аугментація даних
Зберіть від 300 до 500 розмічених прикладів у форматі "інструкція → відповідь". Для доменної адаптації (наприклад, юридичні консультації) потрібні релевантні діалоги, очищені від шуму. Ми використовуємо синтетичну аугментацію через GPT-4 та перевірку якості вручну. Датасет розбивається на train/validation (80/20) і токенізується з max_seq_length=2048.
QLoRA з Unsloth
Unsloth прискорює LoRA-навчання на 2–5x порівняно з чистим PEFT завдяки кастомним CUDA-ядрам:
from unsloth import FastLanguageModel
import torch
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Meta-Llama-3.1-8B-Instruct",
max_seq_length=2048,
dtype=torch.float16,
load_in_4bit=True # QLoRA: 4-bit quantization + LoRA
)
model = FastLanguageModel.get_peft_model(
model,
r=16,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_alpha=32,
lora_dropout=0.05,
bias="none",
use_gradient_checkpointing="unsloth"
)
QLoRA — це LoRA поверх 4-бітної квантизації базової моделі. Llama 3 8B у 4-bit займає ~5 ГБ VRAM замість 16 ГБ у fp16. Мінімальний GPU для QLoRA навчання — RTX 3090 (24 ГБ) або орендований A100.
Інтеграція: серверний чи on-device?
Серверний деплой (vLLM/Ollama)
Після навчання адаптер зберігається окремо від базової моделі. Базова модель завантажена на сервері, адаптер застосовується при ініціалізації або в рантаймі. Мобільний застосунок працює з API-ендпоінтом — жодного навантаження моделі на пристрої.
# vLLM з LoRA адаптером
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--enable-lora \
--lora-modules my-adapter=/path/to/lora/adapter
On-device (llama.cpp/Core ML)
Якщо потрібна мінімальна затримка, робота без інтернету або конфіденційність даних — варто розглянути on-device запуск. Для цього підходять моделі до 3B параметрів з LoRA-адаптером, злитим у GGUF Q4_K_M. Для великих моделей або складних задач краще обрати серверний деплой.
| Характеристика | Серверний (vLLM/Ollama) | On-device (llama.cpp/Core ML) |
|---|---|---|
| Затримка | 100–500 мс (мережеві) | 10–50 мс (локально) |
| Вимоги до пристрою | Будь-який з інтернетом | iPhone 14+ / Galaxy S23+, 6+ ГБ RAM |
| Розмір моделі на пристрої | Не зберігається | 2–3 ГБ (GGUF Q4_K_M) |
| Оновлення адаптера | Миттєве | Потребує оновлення застосунку |
| Вартість інфраструктури | Оренда GPU | Безкоштовно після деплойменту |
On-device через llama.cpp / Core ML можливий лише для невеликих моделей зі злиттям ваг (merge + GGUF). Для мобільних пристроїв реально: Llama 3.2 3B або Phi-3.5-mini 3.8B з LoRA-адаптером, злитим у GGUF Q4_K_M. Підсумковий розмір моделі — 2–3 ГБ, що вкладається в можливості iPhone 14+ та Galaxy S23+.
# Злиття ваг перед експортом у GGUF
merged_model = model.merge_and_unload()
merged_model.save_pretrained("./merged-model")
# Далі: llama.cpp convert + quantize → .gguf файл
На iOS такий GGUF запускається через llama.swift або через MLModel (якщо конвертувати в Core ML через coremltools). На Android — llama.cpp через JNI або MediaPipe LLM Inference API для Gemma-моделей.
Процес і терміни
Етапи роботи
- Аналіз задачі та підготовка датасету — збір, очищення, аугментація (1–2 тижні).
- Налаштування середовища — вибір базової моделі, встановлення Unsloth, PEFT (1–2 дні).
- Навчання з QLoRA — запуск навчання на GPU з 4-бітною квантизацією (від кількох годин до 2 діб).
- Конвертація адаптера — злиття ваг, квантизація у GGUF (2–3 дні).
- Інтеграція в застосунок — серверний API через vLLM або on-device через Core ML/llama.cpp (2–4 дні).
- Тестування та оптимізація — перевірка якості, затримок, доопрацювання (3–5 днів).
Орієнтовні терміни
Підготовка датасету — 1–2 тижні. Налаштування та навчання — 1–2 дні. Конвертація та тестування — 2–3 дні. Інтеграція серверного API — 2–4 дні. Повний цикл — від 2 до 4 тижнів. Вартість розраховується індивідуально і залежить від складності задачі.
Типові помилки та як їх уникнути
Неправильний вибір target_modules. Якщо адаптувати лише q_proj, v_proj, пропустивши MLP-шари, ефективність падає на 30–50%. Для instruction-following задач обов'язково включайте gate_proj, up_proj, down_proj.
Занадто маленький датасет. LoRA з 50–100 прикладами дасть перенавчання: модель запам'ятає приклади, але не узагальнить. Мінімум 300–500 різноманітних прикладів.
Не заморожена база при злитті. Після merge_and_unload() перевірте, що оригінальні ваги не змінилися порівняно з базовою моделлю — це сигналізує про правильну роботу LoRA.
Що ми пропонуємо
Склад послуги
- Аналіз задачі та підготовка датасету (збір, очищення, аугментація)
- Налаштування середовища та запуск навчання (Unsloth + PEFT, QLoRA)
- Конвертація адаптера (злиття, квантизація у GGUF)
- Інтеграція: серверний API (vLLM/Ollama) або on-device (Core ML/llama.cpp)
- Тестування та оптимізація продуктивності
- Документація та навчання вашої команди
Ми супроводжуємо проєкт на всіх етапах і гарантуємо результат. Зв'яжіться з нами, щоб оцінити ваш проєкт і отримати консультацію. Замовте консультацію — ми допоможемо впровадити LLM у ваш мобільний застосунок швидко та ефективно.
Гарантії та досвід
- 6+ років досвіду в розробці мобільних AI-рішень
- Понад 50 успішних проєктів із дообучення LLM
- Глибоке знання стеку: Swift, Kotlin, Flutter, React Native, Unsloth, PEFT
- Індивідуальний підхід та гарантія якості
Замовте послугу LoRA-адаптації — і ми допоможемо впровадити LLM у ваш мобільний застосунок швидко та ефективно.







