Этот проект все еще находится в стадии разработки. Некоторые функции могут быть еще не реализованы, а документация может быть неполной.
Крошечная, но мощная система вывода LLM, предназначенная для исследовательских целей.
Производительность, эквивалентная vLLM, всего с 2 тыс. строк кода (2% от vLLM).
Существует множество платформ с открытым исходным кодом для обслуживания LLM, включая HuggingFace Transformers, vLLM, LightLLM, DistServe и DeepSpeed-MII. Почему SwiftLLM?
Причина в том, что эти структуры предназначены для производства , а не для исследований . Они оснащены многочисленными функциями, такими как поддержка более 100 моделей, различные аппаратные поддержки, LoRA, квантование, мультимодальность, кэширование префиксов, поиск луча и так далее. Несмотря на то, что это универсальное решение для производства, их кодовая база слишком велика и сложна для понимания и изменения (например, vLLM имеет более 100 тысяч строк кода), что затрудняет их использование в исследовательских целях. Кроме того, их историческое бремя также является проблемой.
SwiftLLM представляет собой крошечную, но мощную систему вывода LLM, предназначенную для исследовательских целей . «Маленький» означает, что он сохраняет только те функции, которые необходимы для исследований, «мощный» означает, что он не имеет компромиссов в производительности, и, наконец, «быстрый» означает, что его легко понять и изменить. Несмотря на поддержку базовых функций (см. список ниже) и возможность достижения производительности, эквивалентной vLLM, кодовая база SwiftLLM составляет менее 2 тысяч строк кода (~ 2% от vLLM), написанного на Python и OpenAI Triton (DSL для написания Ядра CUDA), что упрощает чтение, изменение, отладку, тестирование, расширение и позволяет легко интегрировать ваши новые и блестящие исследовательские идеи.
В настоящее время SwiftLLM поддерживает следующие функции:
В будущем мы планируем добавить поддержку следующих функций:
Чтобы сохранить небольшую кодовую базу, мы не будем поддерживать следующие функции. Если вы хотите использовать их в своем исследовательском проекте, возможно, вам придется реализовать их самостоятельно:
Помните, что SwiftLLM НЕ является универсальным решением для производства. Рекомендуется рассматривать его как «фундамент» для вашего исследовательского проекта, и вам, возможно, придется реализовать некоторые функции самостоятельно. Мы призываем вас, мой дорогой исследователь, прочитать код, понять его, изменить и расширить в соответствии с вашими исследовательскими потребностями.
Архитектуру SwiftLLM можно разделить на две основные части: плоскость управления и плоскость данных .
Короче говоря, плоскость управления решает, «что вычислять» или «как планировать», тогда как плоскость данных решает, «как вычислять» или «как реализовать», и выполняет конкретные вычисления. Они работают по принципу «главный-работник»: плоскость управления действует как мастер, который выполняет планирование и координацию высокого уровня и отправляет задания в плоскость данных, которая действует как рабочий, выполняющий вычисления низкого уровня.
Код плоскости управления находится в каталоге swiftllm/server
и включает такие компоненты, как Engine
, Scheduler
, сервер API и TokenizationEngine
. Код плоскости данных находится в каталоге swiftllm/worker
, включая описания графа вычислений (в swiftllm/worker/model.py
), реализацию слоев в модели (в swiftllm/layers
) и ядра OpenAI Triton ( вы можете представить «ядра» как функции, выполняемые на графическом процессоре) (в swiftllm/kernels
).
В качестве примера возьмем игрушечный API-сервер (расположенный в swiftllm/server/api_server.py
):
EngineConfig
для создания Engine
.Engine.initialize
, где он создает Scheduler
, TokenizationEngine
и набор (на данный момент только один, поскольку тензорный параллелизм не поддерживается) воркеров. Затем он дает команду рабочему выполнить profile_num_blocks
для расчета количества блоков графического процессора, после чего движок дает команду всем рабочим процессам выделить свой кэш KV и подкачку KV.Engine.start_all_event_loops
. На каждом этапе цикла механизм запрашивает у планировщика следующий пакет запросов для вычисления, дает команду исполнителю выполнить замену, а затем отправляет пакет исполнителю для вычисления. В настоящее время плоскость управления ( Engine
) и плоскость данных ( LlamaModel
) находятся на одном узле. После реализации тензорного параллелизма/конвейерного параллелизма плоскость данных может быть распределена по нескольким узлам.
Мы предлагаем два способа использования SwiftLLM: использовать одновременно плоскость управления и плоскость данных или использовать только плоскость данных.
Если ваша идея достаточно проста или элегантна и может быть легко интегрирована в существующую плоскость управления, вы можете использовать как плоскость управления, так и плоскость данных. В другом случае, когда вы хотите реализовать великолепную идею, вы можете использовать только плоскость данных и самостоятельно реализовать новую плоскость управления.
Сначала давайте настроим среду:
packaging
через pip install packaging
И далее идет установка:
git clone https://github.com/interestingLSY/swiftLLM.git
cd
в репозиторий ( cd swiftLLM
) и установите другие зависимости с помощью pip install -r requirements.txt
.pip install -e .
для установки SwiftLLM в вашу среду.pip install -e csrc
Вот несколько примеров:
.bin
и .safetensors
. Предположим, что вес вашей модели хранится в /data/to/weight/
.python3 examples/offline.py --model-path /data/to/weight
. В этом примере используется только плоскость данных. Если вы планируете использовать SwiftLLM без плоскости управления, это хорошая отправная точка.Engine
, вы можете попробовать python3 examples/online.py --model-path /data/to/weight
. Это отличный пример, если вы планируете использовать как плоскость управления, так и плоскость данных.swiftllm/server/api_server.py
. Он запускает сервер API и предоставляет интерфейс, подобный vLLM, для онлайн-обслуживания. Несмотря на свои крошечные размеры (крошечные тоже могут быть очаровательными!), SwiftLLM не идет на компромисс с производительностью. Мы оценили SwiftLLM в нескольких сценариях и продемонстрировали, что SwiftLLM может достичь эквивалентной или даже лучшей производительности по сравнению с vLLM.
Первый сценарий — это «одна прямая операция», когда мы снабжаем модель пакетом входных данных и позволяем ей генерировать один выходной токен (эквивалент одной «прямой» операции). Это основная операция вывода LLM (как онлайн, так и офлайн), поэтому ее производительность имеет решающее значение.
Здесь мы используем модель LLaMA-3 7B с графическим процессором NVIDIA A100 80G PCIE/RTX 4090 с точностью FP16. Результаты показаны ниже (чем ниже, тем лучше):
Видно, что SwiftLLM может достичь производительности, эквивалентной (или даже превосходящей) производительности vLLM при тех же настройках.
Второй сценарий — «онлайн-обслуживание», когда мы запускаем сервер API, берем образцы запросов из реального набора данных и позволяем модели генерировать завершения. Это сценарий, в котором LLM используется в реальных приложениях, таких как чат-боты или автодополнение кода.
Здесь мы используем набор данных ShareGPT для выборки подсказок и используем процесс Пуассона с разными лямбда-выражениями для имитации различных скоростей поступления запросов. Результаты показаны ниже (чем ниже, тем лучше):
Видно, что на A100 80G PCIE SwiftLLM может достичь производительности, эквивалентной vLLM, а на RTX 4090 SwiftLLM значительно превосходит vLLM (в основном из-за того, что наша плоскость управления имеет меньшие накладные расходы).