Pull to refresh

Comments 9

Кажется можно докторскую защищать. Это очень круто!

Думаю для докторской нужно нечто больше, чем инфа из интернета.

Все так, никакой научной новизны в данном посте нет. У него цель скорее сделать обзор и показать как стоит применять "это дело" на практике.

а что с качеством при увеличении скорости ?

Сильно зависит от метода, с которым получаем ускорение. Например, для квантизации почти всегда удается получить незначимую просадку в качестве, для дистилляции она обычно чуть более ощутимая.

Но в любом случае стоит помнить про Парето фронт, который проиллюстрирован в начале статьи. Методы ускорения дают нам больше возможностей выбора финальной модели для нашей задачи, то есть больше точек на этой кривой.

Финальное решение принимают все равно люди: смотрят на имеющиеся вычислительные бюджеты, на получившуюся Парето кривую и выбирают оптимум в зависимости от конкретного продукта/задачи.

Спасибо, отличный теоретический материал, многое объяснил. А на практике вы какой актуальный общедоступный (в котором выкладывают модели) метод/формат квантизации по балансу в сохранении исходного качества модели/большей скорости/экономии GPU памяти могли бы порекомендовать: GPTQ / GGUF [2, 3, 4, 5, 6 and 8-bit] / AWQ / transformers [fp8/fp16]+bitsandbytes [4, 8-bit] / другой вариант и софт для инференса: transformers / llama.cpp / vLLM / другой?

Отличный вопрос!

Я бы смотрел на фреймворк инференса TRT LLM, из общедоступных он дает наилучшую скорость и всю необходимую поддержку фичей.

По методам сильно зависит от сценария, в котором хотим запуститься.

  1. Если инференс собираемся делать с небольшим batch_size и на больших моделях (7B+), то отлично подойдет weight-only квантизация. Из поддержанных в TRT LLM сейчас пожалуй лучше всего себя AWQ покажет.

  2. Если batch_size очень большой и/или модель маленькая (до 1B), то выбора по сути нет и подойдет только квантизация и весов, и активаций. Для богатеев надо вообще не думать и использовать FP8 инференс, который доступен на Hopper и Blackwell. Если все-таки таких современных карт нет, то SmoothQuant вполне хорошо сработает.

Имеет ли при инференсе большой квантованной модели значение для скорости на скольких GPU она запущена, например, на одной 80ГБ A100 или на двух 40ГБ A100 - т.е. участвуют ли при сетапе на N картах вторая...N'тая карты в вычислениях или просто являются расширением GPU Ram для весов/kv-кеша модели не поместившихся на первую карту? Ситуация всегда будет одинакова, или для архитектур как MoE она отличается (часто в новостях пишут, что для запуска надо, например, 4 40Гб A100 имея ввиду потребность модели в 160 Гб GPU Ram, а то, что это 2 карты 80Гб A100 не упоминают - м.б. есть причина)?

При weight-only квантизации что происходит с KV кешем - необходимая под него RAM автоматически уменьшается в соответствии (также кратно) с уменьшением размера квантованных весов относительно изначальных или KV кеш всегда квантуют отдельно при инференсе, например, во многих фреймворках есть опции - 16/8/4-bit KV Cache?

А если речь не о LLM, а о векторной модели, например, int8 quantized intfloat-multilingual-e5-large, то квантованными в ней будут только веса или выходные вектора из модели тоже будут в int8? Сейчас всё больше БД поддерживают разные числовые типы полей с векторами, но как получать вектора в таких типах из общедоступных моделей (optimum'ом можно делать или м.б. есть какие-то специальные инструменты)?

Снова отличные вопросы!

  1. Конечно же имеет. Тут стоит вспомнить про Tensor Parallel режим инференса (подробнее можно тут почитать). Он отлично себя показывает, когда присутствует NVLink между картами, тогда все GPU отлично утилизируют свои вычислительные ресурсы. Также этот метод отлично сочетается с wNaM квантизацией. По итогу в такой схеме у нас на N картах хранится суммарно одна квантизованная копия весов, то есть 1 / N часть модели. Такой режим позволяет нам вмещать огромный batch_size в карточки, что оч положительно сказывается на RPS нашей API.

  2. Для weight-only квантизации KV-кэш не квантуется, т.к. кэш это часть активаций и с весам ничего общего не имеет.

  3. Напоминаю, что в данном посте мы говорили только про квантизации линейных слоев. Поэтому, если в таком embedder-е на выходе в архитектуре стоит линейный слой, то нет никакой проблемы получать на выходе int8 тензоры.

Sign up to leave a comment.