Интерфейс контроллера искусственного интеллекта (AICI) позволяет вам создавать контроллеры, которые ограничивают и прямую вывод большой языковой модели (LLM) в режиме реального времени. Контроллеры - это гибкие программы, способные реализовать ограниченное декодирование, динамическое редактирование подсказок и сгенерированного текста, а также координация выполнения в нескольких, параллельных поколениях. Контроллеры включают пользовательскую логику во время токенового декодирования и поддерживает состояние во время запроса LLM. Это позволяет разнообразным стратегиям контроллера, от программного или на основе запросов декодирования до многоагентных разговоров, чтобы эффективно выполняться в жесткой интеграции с самим LLM.
Цель AICI - облегчить создание и экспериментировать как с существующими, так и совершенно новыми стратегиями контроллера для улучшения поколений LLM. Отразив детали реализации базового вывода LLM и обслуживающего двигателя, AICI стремится упростить разработку контроллеров, облегчить писать быстрые контроллеры и облегчить совместимость с помощью вывода LLM и обслуживания двигателей.
AICI предназначена как для локального, так и для облачного выполнения, включая (в конечном итоге) развертывание многоятных LLM. Контроллеры реализуются как легкие модули Webassembly (WASM), которые работают на той же машине, что и двигатель вывода LLM, используя процессор, в то время как графический процессор занят генерацией токенов. AICI - это один слой в стеке выводов и предназначен для того, чтобы разрешить библиотеки управления, такие как руководство, LMQL и другие, чтобы работать на вершине и повысить эффективность и повышение производительности, а также переносимость в результате вывода LLM и обслуживающих двигателей.
В настоящее время AICI интегрируется с llama.cpp, трансформаторами huggingface и RLLM (пользовательский двигатель вывода LLM на основе TCH), с VLLM в работах.
AICI есть:
AICI - это прототип, разработанный и построенный в Microsoft Research.
В этом QuickStart мы проведем вас через следующие шаги:
Чтобы компилировать компоненты AICI, вам необходимо настроить среду разработки для ржавчины. Для этого QuickStart вам также нужен Python 3.11 или позже, чтобы создать контроллер.
Примечание
Пользователи Windows : Пожалуйста, используйте WSL2 или включенный DevContainer. Добавление нативной поддержки Windows отслеживается здесь.
Пользователи MacOS : Пожалуйста, убедитесь, что у вас есть инструменты командной строки XCode, установленные путем запуска xcode-select -p , и, если не установлены, запустите xcode-select --install .
CUDA : сборка CUDA зависит от конкретной установки Libtorch. Настоятельно рекомендуется использовать включенный DevContainer.
Если вы используете DevContainer, вы можете пропустить следующий раздел.
Используя диспетчер пакетов системы, установите необходимые инструменты для строительного кода в репозитории, включая git , cmake и ccache .
Например, в WSL / Ubuntu с помощью apt :
sudo apt-get install --assume-yes --no-install-recommends
build-essential cmake ccache pkg-config libssl-dev libclang-dev clang llvm-dev git-lfs
Или с помощью домашнего завода на macOS:
brew install git cmake ccache
Затем установите ржавчину, ржавчину и груз , следуя инструкциям, представленным здесь и здесь:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
После установки убедитесь, что команда rustup --version доступна, запустив ее с терминала. Если команда не распознана, попробуйте открыть новую сессию терминала.
Следующая установка компонент Rust wasm32-wasi:
rustup target add wasm32-wasi
Если у вас уже была установлена ржавчина или вы получаете жалобы от груза на устаревшие версии, запустите:
rustup update
Наконец, чтобы работать с контроллерами Python и сценариями (например, этот урок) запустите эту команду, чтобы установить необходимые пакеты:
pip install pytest pytest-forked ujson posix_ipc numpy requests
Сервер RLLM имеет две бэкэнды, одна из которых основана на libtorch и CUDA ( rllm-cuda ), а другая на основе llama.cpp ( rllm-llamacpp ).
Бэкэнд rllm-cuda работает только с графическими процессорами NVIDIA с вычислительными возможностями 8.0 или более поздней версии (A100 и позже; RTX 30x0 и позже) и требует скромной настройки Libtorch-настоятельно рекомендуется использовать включенный DevContainer. В то время как это руководство фокусируется на бэкэнд rllm-llamacpp , шаги сборки одинаковы для rllm-cuda , модулируйте имя папки.
После настройки Dev Env выше, клонируйте репозиторий AICI и выполните следующие шаги, изложенные ниже.
Используйте следующую команду, чтобы построить и запустить aicirt и rllm-llamacpp :
cd rllm/rllm-llamacpp
./server.sh phi2
Вы можете передавать другие имена моделей в качестве аргумента (запустить ./server.sh без аргументов, чтобы увидеть доступные модели). Вы также можете использовать URL -адрес higgingface в файл .gguf или локальный путь к файлу .gguf . (Для rllm-cuda Используйте идентификатор модели HuggingFace или Path в папку).
./server.sh orca
Вы можете найти более подробную информацию о rllm-llamacpp здесь.
Сервер RLLM предоставляет интерфейс HTTP, используемый для задач конфигурации и запросов обработки. Вы также можете использовать этот интерфейс, чтобы быстро проверить его статус. Например, если вы откроете http://127.0.0.1:4242/v1/models, вы должны увидеть:
{
"object" : " list " ,
"data" : [
{
"object" : " model " ,
"id" : " TheBloke/phi-2-GGUF " ,
"created" : 946810800 ,
"owned_by" : " owner "
}
]
}подтверждая, что выбранная модель загружается.
AICI позволяет размещать пользовательскую логику, называемую контроллерами , которые инициируют, прекращают и взаимодействуют с генерацией токенов LLMS. Контроллеры принимают входные аргументы, обрабатывают их и возвращают результат с помощью журналов, токенов LLM и переменных.
Репозиторий включает в себя некоторые примеры, в частности:
В этом примере мы используем Pyctrl для управления генерацией токенов с помощью простого сценария Python . Если вы хотите, вы можете создавать и загружать Pyctrl, однако по умолчанию сервер автоматически загрузит последний выпуск Pyctrl из github.
В целом, контроллеры требуют строительства и развертывания, в то время как сценарии (Python или JavaScript) отправляются с каждым запросом.
Следующее иллюстрирует взаимосвязь между сервером RLLM, временем выполнения AICI и контроллером:
Эрдиаграмма
Хост ||-| {CPU: ""
Хост ||-| {GPU: ""
ЦП ||-|| «Сервер RLLM»: выполнить
CPU ||-| {"AICI Runtime": выполнить
"AICI Runtime" ||-|| «Контроллер»: экземпляр
GPU ||-| {"LLM Generation": выполнить
Предположим, мы стремимся к модели сгенерировать список, придерживаться определенного формата и содержащего только пять пунктов.
Как правило, достижение этого включает в себя быстрое разработку, создавая подсказку точно с четкими инструкциями, такими как:
What are the five most popular types of vehicles?
Return the result as a numbered list.
Do not add explanations, only the list.
Подсказка также будет варьироваться в зависимости от используемой модели, учитывая, что каждая модель имеет тенденцию добавлять объяснения и понимает инструкции по -разному.
С AICI мы переключаем управление на код, и мы можем упростить приглашение:
What are the most popular types of vehicles?
Использование кода для:
Давайте создадим файл Python list-of-five.py со следующим контентом:
import pyaici . server as aici
# Force the model to generate a well formatted list of 5 items, e.g.
# 1. name 1
# 2. name 2
# 3. name 3
# 4. name 4
# 5. name 5
async def main ():
# This is the prompt we want to run.
# Note how the prompt doesn't mention a number of vehicles or how to format the result.
prompt = "What are the most popular types of vehicles? n "
# Tell the model to generate the prompt string, ie. let's start with the prompt "to complete"
await aici . FixedTokens ( prompt )
# Store the current position in the token generation process
marker = aici . Label ()
for i in range ( 1 , 6 ):
# Tell the model to generate the list number
await aici . FixedTokens ( f" { i } ." )
# Wait for the model to generate a vehicle name and end with a new line
await aici . gen_text ( stop_at = " n " )
await aici . FixedTokens ( " n " )
# Store the tokens generated in a result variable
aici . set_var ( "result" , marker . text_since ())
aici . start ( main ())Запуск сценария не слишком отличается от отправки подсказки. В этом случае мы отправляем логику управления и инструкции все вместе.
Чтобы увидеть конечный результат, выполните следующую команду:
./aici.sh run list-of-five.py
Результат:
Running with tagged AICI Controller: gh:microsoft/aici/pyctrl
[0]: FIXED 'What are the most popular types of vehicles?n'
[0]: FIXED '1.'
[0]: GEN ' Carsn'
[0]: FIXED '2.'
[0]: GEN ' Motorcyclesn'
[0]: FIXED '3.'
[0]: GEN ' Bicyclesn'
[0]: FIXED '4.'
[0]: GEN ' Trucksn'
[0]: FIXED '5.'
[0]: GEN ' Boatsn'
[0]: FIXED 'n'
[DONE]
[Response] What are the most popular types of vehicles?
1. Cars
2. Motorcycles
3. Bicycles
4. Trucks
5. Boats
response saved to tmp/response.json
Usage: {'sampled_tokens': 16, 'ff_tokens': 37, 'cost': 69}
Timing: {'http_response': 0.05193686485290527, 'data0': 0.05199289321899414, 'first_token': 0.0658726692199707, 'last_token': 0.1784682273864746}
Tokens/sec: {'prompt': 861.0913072488067, 'sampling': 89.65181217019571}
Storage: {'result': '1. Carsn2. Motorcyclesn3. Bicyclesn4. Trucksn5. Boatsnn'}
Этот репозиторий содержит ряд компонентов, и какие из них вам нужны, зависит от вашего варианта использования.
Вы можете использовать существующий модуль контроллера . Мы предоставляем PYCTRL и JSCTRL, которые позволяют вам контроллеры сценария с использованием сервера Python и JavaScript соответственно. Пакет Pyaici содержит инструмент командной строки aici , который позволяет вам загружать и запускать сценарии с любым контроллером (мы также предоставляем определение API REST для любопытных).
?
Мы ожидаем, что библиотеки будут построены на вершине контроллеров. Мы приводим пример в Promptlib - библиотеке Python на стороне клиента, которая генерирует взаимодействие с Decktrl через пакет Pyaici.
Пример ноутбука, в котором используется racklib для взаимодействия с Decktrl.
Контроллеры можно запускать в облачном или локальном двигателе вывода LLM с поддержкой AIC. Вы можете запустить предоставленный справочный механизм (RLLM) локально с бэкэндом Libtorch+Cuda или Llama.cpp.
Для разработки нового контроллера используйте проект стартера Rust, который показывает использование библиотеки AICI_ABI, которая упрощает реализацию интерфейса AICI низкого уровня.
? Sample Code для минимального нового контроллера, чтобы вы начали
Чтобы добавить поддержку AICI к новому двигателю вывода LLM , вам необходимо будет реализовать LLM-сторону протокола, который общается со временем выполнения AICI.
Наконец, вы можете изменить любой из предоставленных компонентов - PRS наиболее приветствуются!
AICI Abstracts LLM Двигатель вывода от контроллера и наоборот, как на рисунке ниже. Округлые узлы желательны. Дополнительные слои могут быть построены сверху - мы предоставляем racklib, но мы твердо верим, что руководство, LMQL, SGLANG, Outlines, JSONFORMER, LMFE и т. Д. Также может работать поверх AICI (либо с пользовательскими контроллерами, либо с использованием Pyctrl или JSCTRL).
График тд
Pyctrl-AICI-> AICIRT [AICI-RINTIME]
Jsctrl -aici -> aicirt
Руководство ([[GuidancectRl]) -AICI -> AICIRT
lmql ([lmql ctrl]) -aici -> aicirt
AICIRT -POSIX SHM -> RLLM
AICIRT -POSIX SHM -> LLAMA [llama.cpp]
AICIRT -POSIX SHM -> PYAICI
pyaici -python -> vllm (vllm)
Pyaici -Python -> HF [HF Transformers]
Пакет Pyaici облегчает интеграцию AICI с помощью двигателей LLM на основе Python. Взгляните на интеграцию с трансформаторами HuggingFace, хотя обратите внимание, что он не поддерживает разбрызгивание (генерация нескольких последовательностей параллельно). Сервер VLLM REST в настоящее время устарел. Пожалуйста, используйте RLLM-CUDA или RLLM-LLAMA.CPP на данный момент.
aicirt работает в отдельном процессе и может работать под другим пользователем, чем в двигателе LLMaici_host_* , реализованные в hostimpl.rsaicirt также обнажает частичный интерфейс WASI; Однако почти все функции не являются OP, за исключением fd_write , которые Decriptors 1 и 2 файла SHIMS (STDOUT и STDERR) для печати сообщений отладкиВ частности, модули WASM не могут получить доступ к файловой системе, сети или любым другим ресурсам. Они также не могут вращать потоки или получить доступ к каким -либо таймерам (это имеет отношение к атакам Spectre/Meltdown).
Большинство вычислений в контроллерах AICI происходит на процессоре, параллельно с генерацией логита на графическом процессоре. Генерация происходит по шагам, где логиты генерируются параллельно для нового токена для каждой последовательности в партии (обычно от 1 до 50). Это включает в себя чтение всей модели и кВ -кэша для последовательностей в партии из памяти графического процессора. Для оптимальной пропускной способности пакетов модель и KV -кэши должны использовать большую часть памяти графического процессора, а чтение всей памяти занимает около 40 мс на графическом процессоре A100 (80 ГБ).
Таким образом, каждый шаг генерации берет на себя порядка 20-50 мс. При тщательной технике этого более чем достаточно для вычисления набора допустимых токенов в ржавчине, скомпилированных в WASM. Они могут быть объединены либо в ржавчине, либо через Python или JavaScript, которые мы предоставляем.
Например, вычислительные допустимые токен, установленные в 32000-сильном словаре модели Llama Model:
Приведенные выше цифры представлены для одной последовательности, однако каждая последовательность обрабатывается в отдельном процессе, и, следовательно, если есть больше ядер, чем последовательностей (что типично), они не изменяются. Они также включают в себя накладные расходы на призыв к интерпретатору Python, реализованным в WASM, а затем вернулись в код, генерируемый Rust, для самого ограничения. Все они хорошо в пределах 20-50 мс, поэтому вообще не влияют на время поколения.
Существует также некоторые накладные расходы в критическом пути отбора проб. Это снижается примерно до 0,3 мс на этап генерации при выполнении 10 последовательностей параллельно (это не зависит от используемого ограничения). Накладные расходы достигают около 0,7 мс для 40 последовательностей (хотя она еще не была полностью оптимизирована).
Webassembly предназначена для минимальных накладных расходов по сравнению с собственным кодом. По нашему опыту, высоко оптимизированный код ржавчины менее чем на 2 раза медленнее при запуске в wasmtime, чем нативном. Это 10-100x лучше, чем JavaScript или Python.
Все измерения, проведенные на AMD EPYC 7V13 с графическим процессором NVIDIA A100 с 80 ГБ VRAM.
Интерфейс низкого уровня, который обеспечивает время выполнения AICI, позволяет:
Это может быть использовано на любом языке, который компилизируется WASM.
Этот репозиторий предоставляет библиотеку ржавчины, которая облегчает реализацию контроллеров в ржавчине и обеспечивает эффективные реализации конкретных ограничений (регулярные выражения, грамматики YACC, подстроки). Мы также предоставляем переводчиков Python и JavaScript, которые позволяют смешивать эти ограничения вместе. All of these can be easily extended.
Если вы найдете полезный интерфейс контроллера ИИ и его идеи для определения нового уровня в стеке вывода LLM, пожалуйста, укажите пакет, используя следующую ссылку:
Bibtex:
@misc { Moskal2024 ,
author = { Moskal, Michal and Musuvathi, Madan and {Ki ci man}, Emre } ,
title = { {AI Controller Interface} } ,
year = { 2024 } ,
publisher = { {GitHub} } ,
journal = { {GitHub} repository } ,
howpublished = { url{https://github.com/microsoft/aici/} }
}Этот проект приветствует вклады и предложения. Большинство взносов требуют, чтобы вы согласились с лицензионным соглашением о участнике (CLA), заявив, что вы имеете право и фактически предоставить нам права на использование вашего вклада. Для получения подробной информации, посетите https://cla.opensource.microsoft.com.
Когда вы отправляете запрос на привлечение, бот CLA автоматически определит, нужно ли вам предоставить CLA и правильно украсить PR (например, проверка состояния, комментарий). Просто следуйте инструкциям, предоставленным ботом. Вам нужно будет сделать это только один раз во всех репо, используя наш CLA.
Этот проект принял код поведения с открытым исходным кодом Microsoft. Для получения дополнительной информации см. Кодекс поведения FAQ или свяжитесь с [email protected] с любыми дополнительными вопросами или комментариями.
Этот проект может содержать товарные знаки или логотипы для проектов, продуктов или услуг. Уполномоченное использование товарных знаков или логотипов Microsoft подлежит и должно следовать указаниям Microsoft по товарной марке и брендам. Использование товарных знаков Microsoft или логотипов в модифицированных версиях этого проекта не должно вызывать путаницу или подразумевать спонсорство Microsoft. Любое использование сторонних товарных знаков или логотипов подвержена политике сторонних сторон.