Перейти к содержимому
Ступень 1111.1 Как на работе

Деньги и компромиссы: API, своя модель или дообучение

Из чего складывается цена LLM-функции — токены, кэш, GPU-часы, утилизация, люди — и как на конкретном примере с явными допущениями сравнить API со своей моделью на 4×RTX 4080, найти зону безубыточности, пройти лестницу «промпт → RAG → дообучение → своя модель», выбрать рычаги экономии и уложить решение в одну страницу для руководителя.

УРОКstage-11/11-1-real-work/05-cost-and-tradeoffs.mdx2 ч 30 минУрок 5 из 5
После урока вы сможете
  • Разложить стоимость LLM-функции на статьи — токены на входе и выходе, кэш, GPU-часы, утилизация, люди и риски — и посчитать месячный счёт API и своих GPU при заданной нагрузке
  • Найти точку (точнее, зону) безубыточности и объяснить, почему она так сильно зависит от профиля нагрузки, длины промпта и людских расходов
  • Выбрать ступень лестницы «промпт → RAG → дообучение → своя модель» по признакам, а не по моде, и оценить рычаги — кэш, батчинг, квантование, каскад, дистилляцию — с их ценой в качестве и задержке
  • Изложить решение на одной странице с цифрами, допущениями, рисками и условием пересмотра

Руководитель поддержки маркетплейса просит: «Пусть модель пишет операторам черновики ответов. Сколько это будет стоить? И почему не поставить свою модель — у нас же есть машина с четырьмя видеокартами?» Ответ «своя всегда дешевле» и ответ «API проще» одинаково плохи: оба без чисел. Правильный ответ звучит как «при нашей нагрузке API дешевле вдвое; своя станет выгоднее с такой-то нагрузки; вот риски обоих вариантов».

В следующем уроке, 11.2.1, вы подробно научитесь считать «на салфетке», сколько карт нужно под нагрузку; здесь мы возьмём её результат готовым. Этот урок — про экономику решения поверх такой салфетки: из чего складывается цена, где точка безубыточности, когда подниматься по лестнице «промпт → RAG → дообучение → своя модель», какими рычагами снижать цену и как изложить всё это на одной странице.

СтатьяAPIСвои GPU
Входные токеныцена за 1 млн; попадания в кэш контекста — в разы дешевлеprefill: GPU-секунды на запрос
Выходные токеныцена за 1 млн (в наших условных ценах вчетверо дороже входа)decode: GPU-секунды на запрос
Железо—час карты × число карт × 24 × 30: карты стоят и ночью
Утилизацияплатите только за сделанную работуплатите за все часы, а работают карты часть времени
Людиинтеграция, эвал-набор, мониторингвсё то же плюс обновления драйверов и vLLM, дежурства, ремонт
Рискирост цены, лимиты, отключение моделей, данные уходят наружуотказ карты, нехватка мощности в пик

Отсюда главное различие. API — переменные расходыпеременные расходыEN variable costРасходы, пропорциональные объёму: оплата API за токены, аренда GPU по часам под фактическую нагрузку. При малой нагрузке переменные расходы обычно выгоднее постоянных.: нет запросов — нет счёта. Свои карты — постоянные расходыпостоянные расходыEN fixed costРасходы, которые не зависят от объёма работы: свои GPU, их амортизация, дежурства. Чем больше нагрузка, тем меньше их доля на один запрос.: счёт одинаков при любой нагрузке, пока хватает мощности. Поэтому при малой нагрузке выигрывает API, при большой — свои карты. Вопрос только в том, где граница.

Цена одного запроса к API, если TкэшT_{\text{кэш}} токенов промпта попали в кэш контекстакэширование контекста (кэш промпта)EN context caching / prompt cachingПровайдер хранит KV-кэш общего префикса запросов и не пересчитывает его; такие «попадания» стоят в разы дешевле. У DeepSeek — «кэш контекста на жёстком диске». провайдера (урок 8.1.1):

cAPI=Tпромах pвход+Tкэш pкэш+Tвыход pвыход106.c_{\text{API}} = \frac{T_{\text{промах}}\, p_{\text{вход}} + T_{\text{кэш}}\, p_{\text{кэш}} + T_{\text{выход}}\, p_{\text{выход}}}{10^6}.

Месячный счёт своих карт по схеме из 11.2.1: число карт под пик, умноженное на цену часа и на 720 часов, плюс люди:

N=⌈QPSпик⋅tGPUumax⁡⌉,Cсвои=N⋅pчас⋅24⋅30+Cлюди.N = \left\lceil \frac{\text{QPS}_{\text{пик}} \cdot t_{\text{GPU}}}{u_{\max}} \right\rceil, \qquad C_{\text{свои}} = N \cdot p_{\text{час}} \cdot 24 \cdot 30 + C_{\text{люди}}.

Здесь tGPUt_{\text{GPU}} — GPU-секунды на запрос, umax⁡=0.7u_{\max} = 0.7 — запас загрузки.

Час своей карты — это не цена электричества. Его считают так же, как совокупную стоимость владениясовокупная стоимость владения (TCO)EN total cost of ownershipВсе расходы на решение за срок его жизни, а не только цена покупки или токенов: железо и его амортизация, электричество, место, люди на сопровождение, дежурства, оценка и переобучение, простои., только на час. Пример с допущениями (все числа условные, подставьте свои):

СтатьяДопущениеНа карту в час
АмортизацияамортизацияEN depreciationРаспределение стоимости купленного оборудования по сроку службы: машина за 36 месяцев «стоит» 1/36 цены в месяц. Входит в цену часа своей карты вместе с электричеством и обслуживанием.машина с 4 картами — 16 000 долл., срок службы 2 года (17 520 ч): карты и модели быстро устаревают0.23 долл.
Электричествопод нагрузкой машина берёт около 1.6 кВт (4 × 320 Вт — паспорт штатной RTX 4080, плюс 300 Вт на остальное), охлаждение +30%, 0.12 долл. за кВт·ч0.06 долл.
Место, сеть, ремонт, время на железо250 долл. в месяц на машину0.09 долл.
Итого≈ 0.38 долл.

С запасом на простой и непредвиденное получается те самые 0.5 долл., которыми считает весь модуль. Заметьте: электричество — самая маленькая статья. Если машина уже куплена, её цена — невозвратные затратыневозвратные затратыEN sunk costДеньги, которые уже потрачены и не вернутся при любом решении (купленная машина). В сравнении вариантов их не учитывают; учитывают будущие расходы и альтернативную стоимость.: при решении «запустить сервис на ней или нет» амортизацию не считают, а считают электричество, обслуживание и альтернативную стоимостьальтернативная стоимостьEN opportunity costЦенность лучшего варианта, от которого отказались. Карта, занятая сервисом, не обучает модели: её «бесплатность» — иллюзия, если на ней стояли бы эксперименты. — карта, занятая сервисом, не обучает ваши LoRA и не гоняет эвалы. «Бесплатная» машина бесплатна, только если она простаивает.

Продолжаем обращения в поддержку из урока 11.1.1. Модель пишет оператору черновик ответа.

ПараметрЗначение
Нагрузка40 000 обращений в сутки, пик ×3 (операторы работают днём)
Промпт1 500 токенов: 600 — инструкции и примеры, общие для всех запросов; 700 — фрагменты базы знаний (RAG); 200 — обращение
Ответ300 токенов
SLOTTFT ≤ 2 с, TPOT ≤ 50 мс — как в 11.2.5
Своя модельQwen3-8B в BF16 на RTX 4080 32 ГБ (716.8 ГБ/с и 97.5 TFLOPS — паспорт штатной карты, для 32 ГБ это допущение)
Люди на свои GPU20 ч в месяц по условной внутренней ставке 50 долл./ч = 1 000 долл.

Ставка инженера — не оценка рынка труда: возьмите внутреннюю ставку своей компании у руководителя или финансового отдела. Ниже станет видно, что в нашем примере именно эта строка решает исход.

API. Без кэша: (1500⋅0.30+300⋅1.20)/106=0.00081(1500 \cdot 0.30 + 300 \cdot 1.20)/10^6 = 0.00081 долл. за запрос. В месяц: 40 000⋅30⋅0.00081=97240\,000 \cdot 30 \cdot 0.00081 = 972 долл.

Свои карты. По методу из 11.2.1 и 11.2.5 (подробности расчёта — там и в ДЗ s11-hw04-capacity): TPOT ограничивает батч реплики 13 запросами, prefill занимает 0.50 с, шаг decode — 27.7 мс. GPU-секунды на запрос: 0.50+300⋅27.7 мс/13≈1.140.50 + 300 \cdot 27.7\ \text{мс} / 13 \approx 1.14 с. Карт: ⌈40 000/86 400⋅3⋅1.14/0.7⌉=⌈2.27⌉=3\lceil 40\,000/86\,400 \cdot 3 \cdot 1.14 / 0.7 \rceil = \lceil 2.27 \rceil = 3. В месяц: 3⋅0.5⋅720=1 0803 \cdot 0.5 \cdot 720 = 1\,080 долл. за железо и 1 000 за людей — 2 080 долл.

API дешевле вдвое. Посмотрим, как меняется картина с нагрузкой:

Обращений в суткиКартСвои: железоСвои: железо + людиAPI
10 00013601 360243
40 00031 0802 080972
100 00062 1603 1602 430
300 000186 4807 4807 290
500 0002910 44011 44012 150

Для фиксированного числа карт точка безубыточноститочка безубыточностиEN break-even pointОбъём нагрузки, при котором два варианта стоят одинаково, например свои GPU (постоянный расход) и API (плата за токены). Ниже точки дешевле API, выше — свои карты, пока им хватает мощности. считается одной формулой, как в ДЗ s11-hw04-capacity: нагрузка, при которой месячный счёт API равен счёту карт. Но карты докупаются целыми, и счёт своих растёт ступеньками. Одна карта держит около 17 600 наших обращений в сутки. Без учёта людей она дешевле API уже на 15 000 обращений, но на 18 000 нужна вторая карта — и свои снова дороже. Такая «пила» тянется до 75 000: только начиная с этой нагрузки свои карты дешевле при любом дальнейшем росте. С людьми граница уходит к 338 000 обращений в сутки — в 8.5 раза дальше текущей нагрузки.

Честная формулировка поэтому такая: «свои карты устойчиво дешевле, начиная с N», а не «точка безубыточности — N». Именно такую функцию вы напишете в практике.

Почему так дорого? Посчитаем среднюю утилизациюутилизация (загрузка) GPUEN GPU utilizationДоля времени, когда оплаченные карты делают полезную работу. Своя карта стоит одинаково и днём, и ночью, поэтому цена токена обратно пропорциональна средней загрузке: при 25% миллион токенов вчетверо дороже, чем при 100%.: в среднем за сутки карты заняты на 40 000/86 400⋅1.14/3≈18%40\,000/86\,400 \cdot 1.14 / 3 \approx 18\%. Ночью операторов нет, а карты оплачены. Цена миллиона выходных токенов своих карт при полной загрузке — около 0.53 долл., при 18% — 3.0 долл.: в 5.7 раза дороже. Для сравнения, API в нашем примере обходится в 2.7 долл. на миллион выходных токенов с учётом входа.

Отсюда два вывода. Первый: интерактивный сервис с дневным пиком — худший случай для своих карт. Второй: ночью свободные карты стоит загрузить пакетной работой — разметкой, суммаризацией архива, переводом. Так делает DeepSeek («Китайский угол» ниже) и так советует платформа из 11.2.5.

Контрпример — пакетный перевод карточек из 11.2.1: 500 000 карточек в сутки, пик всего ×1.5 (очередь сглаживает нагрузку), батч 64 без ограничений по TPOT и 0.30 GPU-секунды на карточку. Там 4 карты и люди — 2 440 долл. в месяц против 8 550 у API, свои в 3.5 раза дешевле, а граница проходит уже на 80 000 карточек в сутки. Одна и та же машина, одни и те же цены — противоположные ответы. Решает профиль нагрузки.

Лестница решений: промпт → RAG → дообучение → своя модель

Заголовок раздела «Лестница решений: промпт → RAG → дообучение → своя модель»

Прежде чем выбирать, где запускать модель, решите, как приспособить её к задаче. Это две разные оси: открытую модель можно запустить у себя с одним промптом, а дообучить модель — через API провайдера. Ступени второй оси:

flowchart TD
E["Эвал-набор 100–300 примеров<br/>и порог качества"] --> P["1. Промпт<br/>(8.1.2, 8.4.1)"]
P -->|"порог пройден"| OK["Стоп: выкатываем,<br/>следим за качеством"]
P -->|"упёрлись"| Q{"Чего не хватает?"}
Q -->|"знаний: факты компании,<br/>свежие данные"| R["2. RAG<br/>(8.2)"]
Q -->|"поведения: формат, стиль;<br/>промпт слишком длинный"| F["3. Дообучение: LoRA, SFT<br/>(6.1–6.2)"]
R -->|"знания есть,<br/>поведения нет"| F
F -->|"нужной способности нет<br/>ни у одной открытой модели"| O["4. Своя модель:<br/>дообучение претрейна или с нуля"]
Каждая ступень — только после того, как предыдущая измерена на эвал-наборе и упёрлась в потолок
СтупеньРазовые затратыПостоянные затратыКогда переходить дальше
Промптдни инженера, эвал-набортокены: длинный промпт оплачивается в каждом запросе3–5 итераций промпта не дают порога на эвал-наборе
RAGконвейер индексации, неделиобновление индекса, эмбеддинги, +700 токенов в каждом промпте, контроль качества поискафакты находятся, а ответ всё равно не того формата или стиля
Дообучение1–10 тыс. размеченных примеров (это люди!), GPU-часы, эвалпереобучение при смене базовой модели или данных, обслуживание своей моделинужной способности нет ни у одной базовой модели
Своя модельогромные: только финальный прогон DeepSeek-V3 — около 2.79 млн GPU-часов H800, порядка 5.6 млн долл. по аренде, без экспериментов и людейкоманда и инфраструктура—

Три правила, которые экономят месяцы.

  1. Ни шагу без эвал-набора. «Промпт не справляется» — это число на эвал-наборе, а не ощущение. Без набора вы не узнаете, помог ли RAG или дообучение (уроки 7.3 и 8.4.2).
  2. RAG и дообучение решают разные проблемы. Модель не знает новую политику возвратов — это знания, и дообучение тут плохо помогает: факты меняются каждый месяц, а переобучать каждый месяц дорого. Модель знает, но отвечает простынёй вместо трёх строк — это поведение, и его дешевле один раз выучить, чем каждый раз объяснять в промпте.
  3. Дообучение — это ещё и экономия токенов: усвоенные инструкции и примеры больше не нужно отправлять в каждом запросе. В нашем примере промпт сокращается с 1 500 до 600 токенов.

Своя модель «с нуля» для продуктовой задачи почти никогда не окупается: её делают, когда модель — сам продукт или когда нужного языка и домена нет ни в одной открытой модели. Вы прошли этот путь в учебном масштабе (MiniMind, урок 5.6.2) — теперь видно, сколько стоит настоящий.

Цену можно снизить, почти всегда чем-то заплатив. Рычаги на нашем примере:

РычагЧто даёт в примереЧем платимУрок
Кэш общего префиксаAPI: 0.00081 → 0.000648 долл. за запрос; vLLM: 1.14 → 0.70 GPU-с (600 общих токенов не пересчитываются)промпт строится «общее — в начало»; кэш живёт ограниченное время7.1.2, 8.1.1
Точный кэш ответовминус доля повторов от счётатолько детерминированные запросы и учёт версий; у живых обращений повторов мало8.4.3
Батчингв 11.2.1 батч 64 удешевил карточку в 31 раззадержка: здесь TPOT ограничил батч до 137.1.2
Квантование весов в INT81.14 → 0.81 GPU-с, с кэшем префикса 0.70 → 0.49проверка качества на эвал-наборе7.2.1
Дообучение вместо инструкцийпромпт 1 500 → 600 токенов: API 0.00054 долл., своя INT8 — 0.34 GPU-сданные, переобучение6.2
Маленькая модель + каскад15% запросов к модели, которая вдесятеро дороже: 0.00081+0.15⋅0.0081≈0.00200.00081 + 0.15 \cdot 0.0081 \approx 0.0020 долл. вместо 0.0081p95 задержки (ниже) и качество на границе11.2.4
Дистилляциямаленькая модель учится на ответах большой; 20 000 примеров от API — около 16 долл.время на данные и проверку; условия провайдера об обучении на его ответах6.4.4

Как рычаги двигают границу (люди — 1 000 долл. в месяц, API и своя модель используют одни и те же приёмы):

ВариантGPU-с на запросКарт при 40 тыс.Свои: железо + людиAPIСвои устойчиво дешевле с
Исходный: BF16, промпт 1 5001.1431 080 + 1 000972≈ 338 тыс. в сутки
+ кэш префикса0.702720 + 1 000778≈ 182 тыс.
+ INT80.491360 + 1 000778≈ 126 тыс.
Дообучение (промпт 600), INT80.341360 + 1 000648≈ 129 тыс.

Почему INT8 так сильно сдвигает границу: шаг decode упирается в чтение весов из памяти (урок 7.1.1), а веса в INT8 вдвое легче — шаг короче, батч под тот же TPOT больше. Цена — проверка качества квантованной модели на эвал-наборе (7.2.1).

Видно, что при 40 тысячах обращений своё железо можно ужать до одной карты (360 долл. против 778 у API), но 1 000 долл. на людей всё равно делают API выгоднее. На малом масштабе решают люди, а не GPU.

Каскад и p95. Пусть маленькая модель отвечает за 4 с, а большая — за 9 с, и неуверенные случаи идут ко второй после первой: 13 с. Если к большой модели уходит больше 5% запросов, 95-й перцентиль задержкихвостовая задержка (p95, p99)EN tail latencyЗадержка, которую не превышают 95% или 99% запросов. Среднее скрывает медленные запросы, а пользователи помнят именно их. попадает в медленную ветку. При 15% эскалаций p95 ≈ 13 с, и SLOцелевой уровень сервиса (SLO)EN service level objectiveИзмеримая цель, например «p95 TTFT меньше 2 с при 8 пользователях». По ней планируют железо и поднимают тревоги. «p95 ≤ 10 с» нарушен, хотя средняя задержка — 5.4 с. При 4% эскалаций p95 ≈ 5 с. Поэтому SLO проверяют по замерам перцентилей, а не по среднему, — это вторая половина практики.

Задержка своих карт. В нашем расчёте полный черновик идёт 0.50+300⋅49.5 мс≈150.50 + 300 \cdot 49.5\ \text{мс} \approx 15 с — это следствие TPOT 50 мс. Если операторам нужен черновик за 8 с, придётся уменьшать батч, то есть покупать больше карт: требование к задержке — тоже статья расходов.

Руководитель тратит на документ две минуты и должен выйти с решением. Правила одной страницы:

  1. Решение — первой строкой, а не в конце.
  2. Цифры — таблицей: варианты по столбцам, статьи расходов по строкам, итог внизу.
  3. Допущения — явно и с датой: цены, нагрузка, длины, ставка. Тот, кто не согласен, спорит с допущением, а не с выводом.
  4. Чувствительность: что будет, если цена API вырастет вдвое, нагрузка — впятеро, а реальная скорость окажется 60% от салфетки. Решение, которое переворачивается от любого допущения, — не решение, а ставка.
  5. Риски с мерами и условие пересмотра: при каком числе вы вернётесь к вопросу.
  6. Что нужно: деньги, люди, сроки.

Пример (числа качества и задержки API в нём условные):

# Черновики ответов поддержки: API или своя модель — 06.10.2026
**Решение.** Запускаем через API с кэшем префикса. Свою модель не разворачиваем, пока нагрузка
ниже 100 тыс. обращений в сутки (устойчиво дешевле свои станут со 126 тыс.).
| В месяц, долл. | API | Свои 4×RTX 4080 (Qwen3-8B INT8) |
|-------------------------|-----|---------------------------------|
| Токены / железо | 778 | 360 (1 карта) |
| Сопровождение | 0 | 1 000 (20 ч инженера) |
| Итого | 778 | 1 360 |
**Допущения.** 40 тыс. обращений в сутки, пик ×3; промпт 1 500 токенов (600 общих), ответ 300.
Цены API (условные; в настоящей записке — с сайта провайдера и с датой): 0.30 / 0.03 (кэш) / 1.20 долл.
за 1 млн токенов. Час карты 0.5 долл.
**Качество и задержка.** Эвал-набор 300 обращений: API — 86% приемлемых черновиков [82; 90],
Qwen3-8B — 79% [74; 83]. p95 полного черновика: API 9 с, своя — 16 с; SLO — 20 с.
**Чувствительность.** Цена API ×2 — свои выгоднее с 45 тыс. в сутки: пересмотреть сразу.
Нагрузка ×3 (120 тыс.) — свои дешевле на 11%. Реальная скорость своей модели 60% от расчёта —
граница уходит к 274 тыс.
**Риски.** Персональные данные клиентов уходят провайдеру → маскирование до отправки, договор.
Провайдер меняет или отключает модель → вызов через шлюз, эвал-набор для миграции за день.
Рост нагрузки → ежемесячный пересчёт этой таблицы.
**Пересмотр.** Нагрузка > 100 тыс. в сутки две недели подряд; цена API +50%; запрет передавать данные наружу.
**Нужно.** 800 долл. в месяц и 2 недели инженера на интеграцию и эвал.

Обратите внимание на строку про качество: дешёвый вариант, который не проходит порог качества, — не вариант. Сравнение качества — парным бутстрэпом на одном эвал-наборе (7.3.2). И на строку про риски: отключение моделей — не теория. В уроке 8.1.1 разобрано, как DeepSeek отключила имена deepseek-chat и deepseek-reasoner 24.07.2026, и код, который на них ссылался, перестал работать.

Соберите калькулятор из этого урока: цена запроса к API с кэшем, число карт под пик, месячный счёт двух вариантов, устойчивая граница безубыточности с учётом «пилы» и выбор самого дешёвого варианта, который укладывается в SLO по p95. Тесты проверяют числа этого урока и пример из 11.2.1. Больше практики с теми же деньгами, но вместе с расчётом мощностей — в ДЗ s11-hw04-capacity модуля 11.2.

Калькулятор: API против своих GPU, граница безубыточности и SLOnumpy · нужен интернет7 тестов
"""Калькулятор стоимости LLM-функции: API против своих GPU, точка безубыточности и проверка SLO.

Все цены — УСЛОВНЫЕ примеры из урока (на 2026-10-06; настоящие смотрите у провайдера на дату расчёта):
API — 0.30 долл. за 1 млн входных токенов, 0.03 за 1 млн входных из кэша, 1.20 за 1 млн выходных;
час своей карты — 0.5 долл. (амортизация, электричество, обслуживание железа).
"""
import math

import numpy as np

SECONDS_PER_DAY = 86_400


def api_cost_per_request(prompt_tokens, output_tokens, price_in, price_out, cached_tokens=0, price_hit=None):
    """Цена одного запроса через API, долл. Цены — за 1 млн токенов.

    cached_tokens — сколько токенов промпта попали в кэш провайдера: они стоят price_hit
    (None — кэша нет, такие токены стоят как обычные). Остальные prompt_tokens − cached_tokens — по price_in.
    api_cost_per_request(1500, 300, 0.30, 1.20) == 0.00081
    """
    # TODO: ваш код
    ...


def gpus_needed(requests_per_day, peak_factor, gpu_seconds_per_request, max_utilization=0.7):
    """Сколько карт держать под пиковую нагрузку (урок 11.2.1).

    Пиковый QPS = requests_per_day / 86 400 · peak_factor; карт = ⌈QPS · GPU-секунды / max_utilization⌉,
    но не меньше одной: даже ночью без запросов сервис должен работать.
    """
    # TODO: ваш код
    ...


def monthly_bill(requests_per_day, api_per_request, *, peak_factor, gpu_seconds_per_request, gpu_hour_price,
                 people_per_month, max_utilization=0.7, days=30):
    """Месячный счёт двух вариантов, долл.

    Возвращает словарь:
      api       requests_per_day · days · api_per_request — платим только за запросы
      gpus      gpus_needed(...)
      hardware  gpus · gpu_hour_price · 24 · days — свои карты оплачиваются круглые сутки
      people    people_per_month — сопровождение своей инфраструктуры
      self      hardware + people
    """
    # TODO: ваш код
    ...


def break_even_load(api_per_request, *, peak_factor, gpu_seconds_per_request, gpu_hour_price, people_per_month,
                    max_utilization=0.7, step=1000, max_requests=2_000_000):
    """Точка безубыточности: наименьшая нагрузка R (запросов в сутки, кратная step), НАЧИНАЯ С КОТОРОЙ свои карты
    не дороже API при любой нагрузке на сетке step, 2·step, …, max_requests.

    Карты докупаются целыми, поэтому стоимость своих растёт ступеньками, и сразу за первой «выгодной» нагрузкой
    свои могут снова стать дороже (нужна ещё одна карта). Поэтому ищем последнюю нагрузку, где свои дороже,
    и берём следующую точку сетки. Если свои дороже даже при max_requests — None.
    """
    # TODO: ваш код
    ...


def latency_p95(latencies_s):
    """95-й перцентиль задержки, с (np.percentile с интерполяцией по умолчанию). Пустой список — ValueError."""
    # TODO: ваш код
    ...


def choose_option(options, slo_p95_s):
    """Самый дешёвый вариант, который укладывается в SLO по p95 задержки.

    options — {имя: {"monthly_cost": долл. в месяц, "latencies": замеры задержки, с}}.
    Вариант проходит, если latency_p95(latencies) <= slo_p95_s. Возвращает имя или None, если не проходит никто.
    """
    # TODO: ваш код
    ...


# Пример урока: помощник оператора поддержки, 40 000 обращений в сутки, промпт 1500 токенов, ответ 300.
api = api_cost_per_request(1500, 300, 0.30, 1.20)
api_cached = api_cost_per_request(1500, 300, 0.30, 1.20, cached_tokens=600, price_hit=0.03)
print("API за запрос:", api, "| с кэшем префикса:", api_cached)
params = dict(peak_factor=3, gpu_seconds_per_request=1.143, gpu_hour_price=0.5, people_per_month=1000)
if api is not None:
    print("счёт за месяц:", monthly_bill(40_000, api, **params))
    print("безубыточность, запросов в сутки:", break_even_load(api, **params))
rng = np.random.default_rng(0)
fast = rng.normal(4.0, 0.5, 850)
slow = rng.normal(13.0, 1.0, 150)
print("p95 каскада, где 15% запросов уходят к большой модели:", latency_p95(np.concatenate([fast, slow])))
Проверь себя6 вопросов
1 Запрос: промпт 2 000 токенов, из них 1 500 попали в кэш; ответ 400 токенов. Цены за 1 млн: вход 0.30, кэш 0.03, выход 1.20 долл. Сколько долларов стоят 10 000 таких запросов?
2 При полной загрузке миллион выходных токенов на своих картах стоит 0.53 долл. Сервис работает днём, средняя загрузка карт — 25%. Сколько стоит миллион токенов на самом деле? Округлите до сотых.
3 Одна карта уже дешевле API при 15 000 запросов в сутки. Почему нельзя сказать, что своя инфраструктура выгоднее при любой нагрузке выше 15 000?
4 Помощник поддержки уверенно отвечает по старой политике возвратов: её поменяли месяц назад. Промпт уже выжат. Какая следующая ступень?
5 Каскад: маленькая модель отвечает за 3 с, неуверенные случаи (10%) после неё идут к большой модели, ещё 8 с. SLO — p95 задержки не больше 6 с. Выполняется ли SLO?
6 Машина 4×RTX 4080 уже куплена и 80% времени простаивает. Что учитывать в решении «поднять на ней сервис или платить API»? Выберите все.Можно выбрать несколько ответов
  • Цена LLM-функции — это токены (вход, кэш, выход), GPU-часы и их утилизация, люди и риски. API — переменные расходы, свои карты — постоянные: при малой нагрузке выигрывает API, при большой — свои.
  • Час своей карты включает амортизацию, электричество и обслуживание; цена токена делится на среднюю загрузку. Интерактивный сервис с дневным пиком загружает карты на 15–20%, пакетная работа — гораздо плотнее.
  • Граница безубыточности — зона из-за целых карт; честно говорить «свои устойчиво дешевле, начиная с N». На малом масштабе её отодвигают люди, а не железо.
  • Лестница «промпт → RAG → дообучение → своя модель»: следующая ступень — только когда предыдущая упёрлась на эвал-наборе; RAG лечит нехватку знаний, дообучение — поведение и длину промпта. Рычаги экономии (кэш, батчинг, INT8, каскад, дистилляция) всегда чем-то оплачиваются, и SLO проверяют по перцентилям.
  • Решение для руководителя — одна страница: решение первой строкой, таблица, допущения с датой, чувствительность, риски, условие пересмотра.

Дальше: урок 11.2.1 — проектирование ML-системы по схеме на 45 минут: от уточнения задачи до мониторинга, с оценками «на салфетке», которые вы только что превратили в деньги.

Закончили урок?Урок пройден

Отметьте его — и 6 карточек из урока попадут в колоду повторения. · 6 карточек — в колоде повторения

Первоисточники 5

  • EN
    Chip Huyen — AI Engineering (O’Reilly, 2025)
    гл. 4: «Cost and Latency» и «Model Build Versus Buy» (свои модели или API); гл. 7: «When to Finetune», «Reasons Not to Finetune», «Finetuning and RAG»; гл. 9 — оптимизация инференса. В репозитории — оглавление и конспекты главпересказ
  • EN
    DeepSeek — Day 6: DeepSeek-V3/R1 Inference System Overview (февраль 2025)
    раздел «Statistics of DeepSeek’s Online Service»: дневной и ночной режим флота, доля попаданий в кэш, цены R1 за попадание и промах кэша, ночные скидкипересказ
  • ZH
    Datawhale · self-llm — «Инструкция по употреблению открытых больших моделей»
    рецепты развёртывания открытых моделей через vLLM и их LoRA-дообучения — как выглядит «своя модель» на практике; переводы двух рецептов есть на сайте курсассылка · Apache-2.0
  • EN
    Qwen3 — README
    «All our open-weight models are licensed under Apache 2.0» — лицензия открытых весов как статья рискассылка
  • EN
    Kimi K3 License (Moonshot AI)
    файл LICENSE: условия для Model-as-a-Service с выручкой больше 20 млн долл. за 12 месяцев и требование показывать «Kimi K3» в крупных продуктах; внутреннее использование не затрагиваетсяссылка

Лицензия текста урока: CC-BY-SA-4.0 · обновлено 2026-10-06