Архітектури, спроектовані вручну, — результат досвіду та інтуїції, але їх перебір обмежений. Ми в TrueTech використовуємо автоматичний пошук архітектури нейронних мереж (NAS) — алгоритмічний пошук архітектурного простору з оптимізацією під конкретну задачу, датасет та hardware target. Це не заміна архітектурному мисленню, а спосіб знайти конфігурації, до яких людина не дійде за розумний час. Використовуємо методи DARTS, Once-for-All та predictor-based підхід — кожен для своїх умов. Хочете перевірити, чи принесе NAS користь вашому проєкту? Зв'яжіться — зробимо попередню оцінку за пару днів.
Чому наївний NAS вбиває GPU-бюджет
Класичний NAS у ранніх реалізаціях (наприклад, NASNet від Google) вимагав до 500 GPU-днів на A100-еквіваленті. Кожна кандидатна архітектура навчалася з нуля до збіжності. При просторі пошуку в 10^10 конфігурацій повний перебір неможливий. Сучасні підходи вирішують це через три принципово різні ідеї:
- One-shot NAS / Weight Sharing. Супермережа включає всі можливі підграфи, кожен кандидат — «шлях» через неї з вже навченими вагами. DARTS, SNAS, Single-Path NAS — час пошуку падає з сотень GPU-днів до 1-4 днів (прискорення в 100 разів порівняно з еволюційними методами).
- Predictor-based NAS. Сурогатна модель передбачає accuracy без повного навчання. 100-200 реальних оцінок → предиктор для наступних мільйонів кандидатів.
- Hardware-aware NAS. Оптимізація за accuracy та latency на конкретному пристрої. MNasNet, FBNet, Once-for-All будують Pareto-фронт (accuracy vs latency). Критично для edge deployment.
Як DARTS вирішує проблему швидкості?
DARTS (Differentiable Architecture Search) — один із найбільш використовуваних one-shot методів. Замість дискретного вибору операції (3×3 conv vs 5×5 conv vs skip) використовуються безперервні ваги α, що оптимізуються через gradient descent. Детальний опис — в оригінальній статті Liu et al., DARTS: Differentiable Architecture Search, arXiv:1806.09055.
import torch
import torch.nn as nn
from torch.nn import functional as F
class MixedOp(nn.Module):
def __init__(self, C: int, stride: int):
super().__init__()
self._ops = nn.ModuleList()
for primitive in PRIMITIVES:
op = OPS[primitive](C, stride, affine=False)
self._ops.append(op)
def forward(self, x: torch.Tensor, weights: torch.Tensor) -> torch.Tensor:
return sum(w * op(x) for w, op in zip(weights, self._ops))
class DARTSCell(nn.Module):
def __init__(self, steps, multiplier, C_prev_prev, C_prev, C, reduction, reduction_prev):
super().__init__()
self._steps = steps
self._multiplier = multiplier
def forward(self, s0, s1, weights):
states = [s0, s1]
offset = 0
for i in range(self._steps):
s = sum(self._ops[offset + j](h, weights[offset + j]) for j, h in enumerate(states))
offset += len(states)
states.append(s)
return torch.cat(states[-self._multiplier:], dim=1)
def train_darts_step(model, architect, optimizer_w, optimizer_alpha, train_queue, valid_queue, lr_w):
for step, (input_train, target_train) in enumerate(train_queue):
input_valid, target_valid = next(iter(valid_queue))
architect.step(input_train, target_train, input_valid, target_valid, lr=lr_w, optimizer=optimizer_w, unrolled=False)
optimizer_w.zero_grad()
logits = model(input_train)
loss = F.cross_entropy(logits, target_train)
loss.backward()
nn.utils.clip_grad_norm_(model.parameters(), max_norm=5.0)
optimizer_w.step()
Головна інженерна складність — дворівнева оптимізація: ваги мережі w та архітектурні ваги α чергуються. Однак у чистому DARTS виникає колапс операцій: skip-connection «перемагають» через нульові параметри. Рішення — DARTS+ (відсікання skip), P-DARTS (прогресивна глибина), GDAS (Gumbel-softmax).
Що дає hardware-aware NAS на практиці?
Покроковий запуск OFA для мобільного деплою
- Завантажте передтреновану супермережу
ofa_mbv3_d234_e346_k357_w1.0. - Виміряйте latency всіх операцій на цільовому пристрої (наприклад, Note10).
- Створіть предиктор ефективності на основі замірів.
- Запустіть еволюційний пошук з обмеженням latency (25ms) — 500 ітерацій.
- Витягніть найкращу підмережу та експортуйте в ONNX.
Once-for-All (MIT) — супермережа, з якої без донавчання витягуються підмережі під будь-який hardware constraint:
from ofa.model_zoo import ofa_net
o fa_network = ofa_net('ofa_mbv3_d234_e346_k357_w1.0', pretrained=True)
from ofa.nas.efficiency_predictor import Latency_MBV3_MeasuredNet
efficiency_predictor = Latency_MBV3_MeasuredNet('note10', ofa_network)
from ofa.nas.search_algorithm.evolution_finder import EvolutionFinder
finder = EvolutionFinder(efficiency_constraint=25, efficiency_predictor=efficiency_predictor, accuracy_predictor=accuracy_predictor, population_size=100, max_time_budget=500)
best_valids, best_info = finder.run_evolution_search()
У реальному проєкті: NAS під MobileNetV3-space для класифікації виробничого браку (640×480, 12 класів) на NVIDIA Jetson Nano. Ручна MobileNetV3-Large: 28.4ms, accuracy 91.3%. OFA-пошук за 6 годин: 22.1ms, accuracy 92.7% — без жодної ручної зміни. При цьому DARTS швидший за еволюційний пошук у 100 разів, але дає менш точні передбачення latency на нестандартному залізі.
| Метод | Час пошуку (GPU-дні) | Точність (acc) | Рівень автоматизації | Підходить для edge |
|---|---|---|---|---|
| Evolutionary NAS | 300-500 | Висока | Низький | Ні |
| DARTS (one-shot) | 1-4 | Висока | Середній | Обмежено |
| Predictor-based | 1-3 | Середня | Високий | Так |
| Hardware-aware (OFA) | 0.25-1 | Висока | Високий | Так |
Що входить у роботу над NAS?
| Етап | Дії | Артефакти |
|---|---|---|
| Визначення search space | Завдання блоків, операцій, діапазонів каналів | JSON-конфіг search space |
| Вибір стратегії | DARTS / evolutionary / predictor-based | План експерименту |
| Профілювання заліза | Замір latency всіх операцій на production hardware | CSV з профілями |
| Пошук кандидатів | Запуск пошуку, трекінг у W&B (MLOps) | Знайдені архітектури |
| Повне навчання | Навчання фінальної архітектури з нуля | Ваги моделі, чекпоінти |
| Валідація | Holdout set, тест на цільовому залізі | Звіт з метриками |
Коли NAS виправданий?
NAS не потрібен для стандартних задач з даними < 50k прикладів — візьміть передтреновану ResNet-50. Він виправданий при:
- кастомних hardware-обмеженнях (Jetson, Coral, ASIC),
- нетипових вхідних даних (гіперспектр, лідари, медичні знімки),
- необхідності кардинально зменшити модель без втрати якості.
Наші сертифіковані інженери мають більше 5 років досвіду в оптимізації нейромереж, реалізували 15+ проєктів з автоматичним пошуком архітектури. Гарантуємо якісний результат та економію бюджету — використання NAS дозволяє заощадити до 40% витрат на розробку. Отримайте консультацію — оцінимо, які методи NAS спрацюють для вашої задачі.







