Генеративный анализ данных

Проект драйвера Llamafile LLM повышает производительность ядер процессора

Дата:

Удобный инструмент с открытым исходным кодом для упаковки LLM в единые универсальные исполняемые файлы чат-бота, которые легко распространять и запускать, по-видимому, увеличил производительность процессора на 30–500 процентов на системах x86 и Arm.

Проект называется Ламафайли был создан Джастин Танни при поддержке Mozilla.

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

Одним из таких программ является лама.cpp – простая программа на C++, разработанная в первую очередь Георгием Гергановым. Хотя llama.cpp предназначен для поддержки серии моделей Meta LLaMA (отсюда и название), он также может работать с множеством других LLM, таких как Mistral-7B и Orion-14B.

Вдохновленный оригинальным драйвером LLaMA от Meta на основе Python, llama.cpp довольно крут тем, что не имеет зависимостей, работает, по крайней мере, в Windows, Linux, macOS и FreeBSD и может использовать преимущества аппаратного ускорения — от графических процессоров Nvidia до Apple. Расширения Intel и AMD.

Вы можете создать и запустить llama.cpp в собственном коде, предоставить ему модель для загрузки, а затем взаимодействовать с этим LLM различными способами. Сложность заключается в том, что используемые файлы моделей обычно имеют довольно большой размер, и может быть немного сложно понять, какой вариант лучше всего использовать.

И именно здесь полезен Llamafile — объединение выбранного файла LLM с llama.cpp для создания единого универсального исполняемого файла, который может работать на macOS, Windows, Linux, FreeBSD, OpenBSD и NetBSD с 64-битными процессорами x86 и Arm. . Что делает это возможным, так это откровенно волшебное Космополитен Либк проект, который позволяет создавать код C/C++ таким образом, чтобы результирующий один исполняемый файл просто бежит на вышеупомянутых операционных системах и архитектурах процессоров.

Это значительно упрощает распространение, если вы просто хотите дать кому-нибудь модель на пробу. Аккуратный.

Повышение скорости

Всего несколько дней назад Танни написал в блоге в глубине как она внедрила 84 новых ядра матричного умножения, чтобы повысить производительность процессора llamafile во время вывода на 30–500 процентов при использовании моделей с весами типа FP16 или Q8_0. Нам сообщили, что «улучшения наиболее значительны для компьютеров ARMv8.2+ (например, RPI 5), Intel (например, Alderlake) и AVX512 (например, Zen 4)».

Танни протестировал код на широком спектре оборудования — от скромного, но дешевого Raspberry Pi 5 до 96-ядерного флагманского процессора AMD Threadripper Pro 7995WX. Почти во всех случаях как для моделей Mistral 7B, так и для моделей TinyLlama 1.1B улучшенный llamafile (версия 0.7) уверенно опережал llama.cpp (версия 2024 марта 03 г.) и опережал llamafile 26. Чтобы внести ясность: большие выгоды в значительной степени достигаются во время оперативной оценки, когда LLM обрабатывает входные данные. На этапе вывода (то есть оценки) улучшения были менее значительными.

Например, на Intel Skylake Core i9-9900 скорость обработки запросов подскочила на 50 процентов по сравнению с llama.cpp, тогда как оценка осталась прежней.

Хотя заявленное повышение производительности относится к весам типов данных FP16 и Q8_0, ограниченное тестирование для других типов также показало большие улучшения. На Core i9-9900 с использованием варианта Q4_0 Mistral 7B производительность при использовании llamafile была на 65 процентов выше. Threadripper Pro 7995WX показал увеличение производительности более чем в два раза при использовании FP32, что также было достигнуто в Mistral 7B.

Однако для llamafile 0.7 это не было полной очисткой. В Mac Studio на базе Apple M2 Ultra наблюдалось некоторое снижение производительности как при запросе, так и при оценке для типа данных Q8_0. Очевидно, это произошло потому, что llama.cpp уже оптимизирован для оборудования Apple, и Танни не выбрал собственный компилятор Apple.

Оно превосходит даже программное обеспечение Intel для умножения матриц.

Достижение столь впечатляющего прироста производительности представляло собой многоэтапный процесс, который Танни подробно задокументировал. По ее оценке, производительность vanilla llama.cpp составляет 233 гигафлопс на ее компьютере с процессором Core i9-9900, а при включении библиотеки математического ядра Intel (MKL) эта производительность может быть увеличена до 384 гигафлопс.

По словам Танни, хотя прирост производительности, обеспечиваемый MKL, огромен, тот факт, что его исходный код закрытый, не идеален для проекта с открытым исходным кодом. Она отметила, что «интеграция сторонних библиотек BLAS в llama.cpp не столь практична из-за особенностей работы модели потоков». А поскольку исходный код MKL закрыт, невозможно просто посмотреть на него и понять, как его можно улучшить.

Это, очевидно, не остановило Танни, который написал: «Я считаю, что хитрость математических ядер ЦП заключается в использовании параллелизма на уровне команд с меньшим количеством обращений к памяти». Далее разработчик показал, как развертывание двух внешних циклов в llama.cpp привело к созданию кода, который может работать со скоростью 810 гигафлопс с использованием OpenMP на процессоре Intel Alderlake i9-14900K с оперативной памятью 6400 МТ/с. Напротив, тот же код, выполняемый через MKL, требует всего 295 гигафлопс.

Проблемы совместимости означали, что OpenMP нельзя было использовать для llamafile, но специальная структура ядра смогла в основном сохранить производительность на уровне 790 гигафлопс. Это более чем в два раза быстрее, чем самая быстрая реализация с использованием MKL.

Хотя это решение является быстрым, оно плохо масштабируется при увеличении сложности. MKL выигрывает (Танни не сказал, насколько), когда сложность увеличивается с 1,024 до 512. Однако Танни предположил, что на данный момент это не критическая проблема – поскольку llama.cpp по умолчанию выполняет задачи меньшего размера, и она надеется со временем выяснить, как оптимизировать контент для больших размеров.

Оптимизация и поддержка BF16 были отправлены непосредственно в llama.cpp, и они были приняты положительно. Герганов сказал, что мерж-реквесты будут отзывы В ближайшие дни. ®

Spot_img

Последняя разведка

Spot_img

Чат с нами

Всем привет! Могу я чем-нибудь помочь?