Две кутии од класата DGX Spark, еден модел: копија на секоја ја надминува поделената верзија

Операции

Седум недели нашиот локален јазичен модел работеше поделен на две NVIDIA GB10 машини со тензорска паралелизација. На 22 октомври тоа го заменивме со целосна копија на моделот на секоја машина и прокси со најмалку врски (least-connection) напред. Пропусноста порасна од околу 180 на 210 токени во секунда, и секоја машина сега може да се рестартира без да го отстрани моделот.

Зошто го поделивме

Секоја машина има 128 GB меморија што ја делат CPU и GPU. Во септември моделот се вклопуваше на една машина, но неговиот кеш едвај: верзијата на vLLM што ја користевме не можеше да го држи KV кешот на овој модел во FP8, па кешот беше во BF16, и една машина имаше место за 499.110 токени од него. Тоа е помалку од два барања при полниот контекст на моделот од 262.144 токени. Поделен на двете машини со тензорска паралелизација преку нивната директна мрежна врска, кешот порасна на повеќе од три милиони токени. Го поделивме моделот за место, а не за брзина.

Што се промени

Поснова 4-битна верзија на истиот модел (NVFP4, направена со дестилација свесна за квантизација) зазема околу 71 GiB меморија, а заедничка верзија на vLLM за GB10 (eugr/spark-vllm-b12x) го извршува неговиот кеш во FP8. Сега една машина го држи целиот модел и кеш од 0,76 до 1,08 милиони токени, место за 2,9 до 4,1 барања при полн контекст, во зависност од тоа колку меморија ѝ дава машината. Двете копии го користат сопствениот спекулативен декодирање на моделот (MTP, четири црни токени). Пред префрлувањето го пуштивме нашиот тест за повикување алатки на новата верзија: постигна 86, а верзијата што ја замени 75.

Што измеривме

Поделен на две машиниКопија на секоја машина
KV кешповеќе од 3 милиони токени0,76 и 1,08 милиони токени
Барања при полн контекстоколу 122,9 и 4,1
Пропусност под наше оптоварувањеоколу 180 токени/с210 токени/с (111 + 99)
Стартувањеоколу 20 минути5 до 13 минути по копија
Една машина се рестартирамоделот е долендругата копија опслужува

Еден примерок сам по себе, според бројот на барања што ги опслужува истовремено: со кратки промпти, 1 барање даваше 36 токени во секунда, 4 даваа 82, 8 даваа 109 и 16 даваа 150. Со подолгите промпти на нашиот агент за е-пошта, 4 даваа 81, 8 даваа 113 и 16 само 87: по осум такви барања, повеќе барања го забавуваа работењето.

Во текот на едно попладне, едниот примерок примаше најмногу 12 барања истовремено, а другиот 8. Првиот произведуваше 91 до 93 токени во секунда и завршуваше 26 до 27 барања во минута; вториот 81 до 83 токени во секунда и 22 барања во минута. Сега двата примаат по 12.

Што жртвувавме

Простор. Поделениот модел имаше една кеш-меморија со повеќе од три милиони токени; примероците имаат две помали, а барањето може да ја користи само кеш-меморијата на примерокот што го опслужува. Нашите агенти испраќаат многу кратки и средни барања и за нив пропусноста беше поважна. Ако опслужувате неколку многу долги контексти истовремено, поделбата може сè уште да е подобар избор. Го задржавме поделениот поставување и враќањето назад е еден скрипт.

Што тргна наопаку при префрлувањето

  1. Единаесет минути без модел, потоа 30 секунди 502-ки. Поделениот модел мораше да застане пред примерокот да се вчита на истите машини, па нашите агенти чекаа околу единаесет минути. Кога првиот примерок се активираше, прокси-серверот сè уште одговараше со „502 no live upstreams“ околу 30 секунди: ги означил бекендите како неуспешни додека биле исклучени (max_fails=3, fail_timeout=30s) и не ги пробал повторно додека не истече тоа време.
  2. Клиент што го прескокна прокси-серверот. Еден од нашите пакетни процеси ја имаше адресата на првата машина во својата конфигурација, па целиот негов товар отиде на еден примерок, додека другиот имаше слободен капацитет. Сега сите клиенти одат преку прокси-серверот; сопствените адреси на машините се само за проверки на здравјето.
  3. Метрики што скокаа. Нашиот монитор за пропусност ги читаше /metrics на vLLM преку прокси-серверот. Со два бекенда, последователните читања доаѓаа од различни примероци, бројачите скокаа напред-назад и мониторот го пријави моделот како исцрпен. Сега ги чита секој примерок директно и ги собира вредностите.
  4. Стар watchdog што би ја запрел новата копија. Поставката со поделба имаше watchdog што го рестартираше неговиот сервис кога моделот престана да одговара. Новиот сервис декларира Conflicts= со стариот, па тоа рестартирање би ја запрело новата копија. Мораше да се исклучи со systemctl disable --now, а не само да се запре, бидејќи нашиот слој за операции ги рестартира единицата што се овозможени, но не работат.
  5. Меморија на машината што врши друга работа. Една машина ги извршува и нашите бази на податоци и изградбите на сајтови. Со gpu-memory-utilization на vLLM поставено на 0.78, остануваа само 5 GiB за сè друго, па го намаливме на 0.74 и рестартиравме само таа копија додека другата го носеше товарот. На овие машини, делот што му го давате на vLLM се зема од истата меморија како и сè друго.

Ако имате две од овие машини

Factory Floor го испорачува проксито и конфигурациите за стартување за една или две машини, проверката на здравје и тестот за користење алатки што ги извршуваме пред да ги префрлиме моделите, со watchdogs и заштитни механизми за меморија за остатокот од машината.

Ажурирано: