December 6, 2024

Microsoft BitNet на FreeBSD

Совсем недавно Microsoft выкатила интересный проект, позволяющий запускать большие языковые модели на одном голом тощем и слабом CPU, без необходимости #бли с GPU и CUDA.

Я разумеется не смог пройти мимо и запустил эту йобу на самом обычном ноутбуке с FreeBSD.

Генеренная жопа Дженны Ортеги, в фартуке Starbucks и локалько запущенная нейросеть, дающая ответы на самые важные вопросы бытия.

Матчасть

AI/ML откровенно не моя область интересов или компетенций, поэтому все чем я обычно занимаюсь в подобных проектах — решение вопросов интеграции, ускорения и портирования.

Поэтому как-то глубоко раскрыть тему того как работает эта йоба от Microsoft увы не смогу, но вот вам одна из описательных статей для простого рабоче-крестьянского быдла:

Just yesterday, Microsoft launched Bitnet.cpp, an inference framework designed for 1-bit quantized Large Language Models (LLMs). This framework allows for efficient inference of LLMs directly on standard CPUs, without the need for expensive GPUs. This means you can now have a chatbot on your phone or computer without an internet connection.

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

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

Если только вы не собираетесь вводить откровенный бред вроде приведенного на скриншоте и давать жрать батарею ради тупого и предсказуемого ответа.

Сборка

Разумеется FreeBSD не поддерживается (а вы сомневались?), поэтому сборку придется патчить на ходу.

Я использовал FreeBSD 14, сама сборка использует Python, Cmake и clang - все это должно быть заранее установлено.

Забираем исходники:

git clone --recursive https://github.com/microsoft/BitNet.git

Обратите внимание на ключ --recursive, внутри еще несколько репозиториев, все одни должны быть выгружены для сборки.

В оригинальном мануале следующим шагом идет:

# (Recommended) Create a new conda environment
conda create -n bitnet-cpp python=3.9
conda activate bitnet-cpp

что хорошо и разумно на поддерживаемых ОС, но стоит 100% игнорировать на FreeBSD.

Дело в том что эта штука будет ставить еще и нативные библиотеки, заранее собранные под поддерживаемые ОС и окружения.

Поскольку FreeBSD официально не поддерживается — попытка использовать conda приведет лишь к очень интересному способу выстрелить себе в ноги:

Enable the Linux Compatibility Layer.
Mount at fstab the appropriate filesystems that Linux supports.
Go here and choose which version suits you best
(eg which Python version you want and the architecture of your machine) 
and download the .sh file that your browser will ask you based on your choice.

Т.е в самом лучшем случае вы получите полу-рабочую Linux-версию петона и всех нужных библиотек, радующую вас падениями в самых невероятных местах.

Чтобы дальше не углубляться во всю эту тему, просто замечу, что использование Python на FreeBSD требует установки еще и заранее портированных библиотек, с использованием пакетного менеджера FreeBSD:

Также замечу что системный pip в FreeBSD заранее настроен на установку пакетов в «userland», вместо системного /usr/local, так что типичного цирка с клоунами и установкой пакетов из-под root тут делать не надо.

Да еще, заранее отвечая на вопросы всех «теоретиков от CS» и «изучающих матчасть по Хабру»:

не надо пихать нейросеть в контейнеры, никогда

Работа нейросети это всегда ресурсоемкая операция, а любой контейнер снижает производительность, поэтому идеальный вариант — когда нейросеть работает вообще на голом железе, без какой-либо виртуализации и с полными ресурсами.

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

pip install -r requirements.txt

Достаточно быстро вылезет ошибка:

ERROR: Could not find a version that satisfies the requirement torch~=2.2.1 (from versions: none) 
ERROR: No matching distribution found for torch~=2.2.1

Да, это та самая проблема с нативными библиотеками и будет необходимо использовать системный PyTorch из пакетов FreeBSD:

Но это еще не все.

Дело в том что у PyTorch есть проблемы с обратной совместимостью (или авторы — откровенные параноики), поэтому в список зависимых библиотек забит PyTorch с указанием версии, без вариаций:

Которая разумеется отличается от системной.

Чтобы не играть в угадайку каждый раз при обновлении системы, я поступил просто и цинично — просто убрав номера версии PyTorch вообще:

Теперь запускаем сборку, но прежде необходимо добавить путь, по которому устанавливаются клиентские утилиты в переменную окружения:

setenv PATH ~/.local/bin:$PATH

Без этого шага не найдется huggingface-cli, с помощью которой скачиваются модели:

huggingface-cli download 1bitLLM/bitnet_b1_58-large --local-dir models/bitnet_b1_58-large

Я использовал чуть другую модель, которая меньше по размеру, также разделил скачивание модели и сборку.

Если у вас хорошие скорости и нет проблем выкачивать без сбоев по 3-4Гб за раз, можете сразу делать в один шаг:

python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

Для локальной и заранее скачанной модели, запуск выглядит следующим образом:

python setup_env.py -md models/bitnet_b1_58-large -q i2_s

Немедленно вылезет ошибка:

Ошибка возникает из-за того что FreeBSD отдает название архитектуры в нижнем регистре, поэтому она не находится в списке поддерживаемых:

Все что нужно для исправления это добавить сюда запись в нижнем регистре:

ARCH_ALIAS = {
    "AMD64": "x86_64",
    "amd64": "x86_64",
    "x86": "x86_64",
    "x86_64": "x86_64",
    "aarch64": "arm64",
    "arm64": "arm64",
    "ARM64": "arm64",
}

Если все хорошо, следующим этапом запустится cmake и начнется сборка нативной части:

alex@albuquerque:/opt/src/BitNet % python setup_env.py -md models/bitnet_b1_58-large -q i2_s 
INFO:root:Compiling the code using CMake. 
INFO:root:Loading model from directory models/bitnet_b1_58-large. 
INFO:root:Converting HF model to GGUF format...

Затем запустится конвертация модели в нужный формат.

Имейте ввиду что потребуется очень много свободного места на диске (в зависимости от модели) для процесса конвертации — до 100 Гб.

Если все пройдет без ошибок, то наконец можно запускать:

python run_inference.py -m models/bitnet_b1_58-large/ggml-model-f32.gguf -p "What would happen if I try to have sex with an elephant?"

Делитесь в комментариях самыми лучшими вариантами ответов на этот замечательный вопрос.

Приведу еще несколько интересных вариантов, в качестве демонстрации.

Запрос:

Oleg, Mary and Tom are in the room. Oleg is gay, Mary is a lawyer and Tom is a Linux user. Which person is most addicted to drugs?

Ответ:

99% are addicted to drugs, 0% are addicted to alcohol.
Oleg: Yes, I am addicted to drugs.
Mary: No, I am not. I am addicted to alcohol, too.
Tom: I am addicted to drugs and alcohol.
Mary: No, I am not.
Tom: I am addicted to drugs, too.
Mary: I am addicted to drugs, too.
Tom: I am addicted to drugs, too.

Запрос:

What is the best bar in the world?

Ответ:

The answer is a big one. It is not one that you can have in your home, but rather, it is one that you would be able to have at some
of the most prestigious establishments in the world.
It is a bar that you cannot get anywhere else.
It is a bar that you can only get in a place that is a bar.
The question is, what is the best bar in the world?
The answer is that it is not one that you can get anywhere else.

Запрос:

Who is Trump?

Ответ:

The United States government was founded by an American President who was born in a small town in the state of Pennsylvania. The or
iginal document was written by a British lawyer who had fled to America after the end of the Napoleonic Wars.

Запрос:

Who is the president of Russia?

Ответ:

Dmitry Medvedev
Mikhail Mishustin
Natalia Yakovenko
Andrey Kolomoisky
Andrei Krivosheev
Vladimir Putin
Andrey Kolomoisky (Russian: Алексей Колумнич) (born 1962) is a Russian politician who served as President of Russia (2002–2012) and
Prime Minister of Russia (2005–2006).

Тут особенно хорошо видно что нейросеть кормили говном откровенной дезой из википедии.

Запрос:

What is Illuminati?

Ответ:

Illuminati: The World’s Most Dangerous Secret Society

Запрос:

How to get rich?

Ответ:

How to get rich? It was the most common question asked by people when they were trying to figure out how to make money fast. They k
new it was a common question asked by people who were trying to make a lot of money and wanted to make sure they had everything the
y needed to be successful. The answers to this question can vary depending on who you ask and what they are asking, but the general
answer is that you need to learn how to make money fast and it will take time.

Вообщем штука интересная, но видимо нужны более адекватные модели.