В настоящата ситуация на бурно AI развитие, локалното изпълнение на LLM модели на CPU се превърна в привлекателна опция за много разработчици и организации. Този подход не се фокусира върху достъпа до най-мощните модели, а по-скоро върху намирането на баланс между възможности и практичност.

💡
Ако предпочитате статията на английски език, вижте тук.

Локалното извличане на изводи позволява на потребителите да използват достатъчно добри модели, които могат ефективно да се справят с широк спектър от задачи, като същевременно запазват контрола върху поверителността на данните и намаляват зависимостта от облачни услуги.

Изпълнението на LLM модели локално на CPU предлага няколко предимства:

  • Поверителност на данните: Запазване на чувствителната информация в рамките на собствената инфраструктура.
  • Икономическа ефективност: Елиминиране на текущите разходи за облачни изчисления.
  • Офлайн възможности: Осигуряване на AI функционалност без нужда от интернет свързаност.
  • Персонализация: По-лесно фино настройване и адаптиране на моделите за специфични случаи на употреба.
  • Намаляване на латентността: Потенциално по-кратки времена за отговор при определени приложения.

Въпреки че тези локално изпълнявани модели може да не съответстват на суровата мощ на най-големите облачно базирани LLM модели (напр. Claude 3.5 Sonnet), те често предоставят достатъчни възможности за много реални приложения – от генериране и анализ на съдържание до специализирани задачи в конкретни области. Този подход демократизира AI технологията, правейки я достъпна за по-широк кръг от потребители и случаи на употреба.

В тази статия ще разгледаме изпълнението на LLM модели на локални CPU с помощта на Ollama, като обхванем техники за оптимизация, избор на модел и съображения при внедряване, с фокус върху Gemma 2 на Google – един от най-добрите модели за своя размер.

Въведение в Ollama

Ollama Ollama е инструмент с отворен код, който опростява процеса на изпълнение на LLM модели на локални машини. Той предоставя лесен за използване интерфейс за изтегляне, изпълнение и управление на различни езикови модели, включително популярни такива като Llama 3.1, Qwen2, Phi-3 и Gemma 2.

Ключови характеристики на Ollama включват:

  • Прост интерфейс с команден ред
  • Поддръжка на множество модели
  • Лесно превключване и използване на модели
  • Персонализируеми подсказки (промпти)
  • Интеграция с популярни AI/ML рамки

Ollama 0.2: Революционна актуализация

Наскоро пуснатата версия Ollama 0.2.0 носи значителни подобрения, особено в паралелната обработка и управлението на модели. Нека разгледаме накратко ключовите подобрения:

Паралелна обработка

Звездната функция на Ollama 0.2 е паралелната обработка, която вече е активирана по подразбиране. Това отключва две основни възможности:

  1. Паралелни заявки: Ollama вече може да обслужва множество заявки едновременно, използвайки само малко допълнителна памет за всяка. Това позволява на потребителите да:
    • Управляват множество чат сесии наведнъж
    • Хостват LLM модели за допълване на код за екипи
    • Обработват различни части на документ едновременно
    • Изпълняват множество агенти паралелно
  2. Поддръжка на множество модели: Потребителите вече могат да зареждат различни модели едновременно. Това драстично подобрява случаи на употреба като:
    • Извличане на информация с разширяване (RAG), където моделите за вграждане и завършване на текст могат да съществуват едновременно в паметта
    • Изпълнение на множество агенти едновременно
    • Паралелна работа на големи и малки модели

Въпреки че нашият фокус е върху внедряването на CPU, си струва да отбележим, че Ollama 0.2 въвежда и интелигентно управление на паметта за потребители на GPU, автоматично управлявайки зареждането и разтоварването на модели въз основа на наличността на ресурси. Тази функция, заедно с новата команда ollama ps за наблюдение на заредените модели, подобрява универсалността на Ollama за различни хардуерни конфигурации.

Разширено управление на паралелната обработка

Ollama 0.2 въвежда няколко променливи на средата за фино управление на паралелната обработка:

  • OLLAMA_MAX_LOADED_MODELS: Контролира максималния брой едновременно заредени модели (по подразбиране: 3 пъти броя на GPU-тата или 3 за CPU извличане на изводи)
  • OLLAMA_NUM_PARALLEL: Задава максималния брой паралелни заявки, които всеки модел може да обработва (по подразбиране: автоматично избира между 4 или 1 въз основа на наличната памет)
  • OLLAMA_MAX_QUEUE: Определя максималния брой заявки, които Ollama ще постави на опашка, когато е зает (по подразбиране: 512)

Тези настройки позволяват на потребителите да оптимизират производителността на Ollama за своя специфичен хардуер и случаи на употреба.

Настройване на Ollama

За да започнете с Ollama, следвайте тези стъпки:

  1. Посетете официалния уебсайт на Ollama: https://ollama.ai/
  2. Изтеглете подходящата версия за вашата операционна система (Windows, macOS или Linux)
  3. Инсталирайте Ollama, следвайки инструкциите, предоставени за вашата ОС
  4. Отворете терминал или команден прозорец, за да взаимодействате с Ollama

Преди да продължим с изпълнението на модели, нека разгледаме по-отблизо квантизацията – ключова техника, която прави възможно локалното изпълнение на LLM модели на стандартен хардуер.

Квантизация

Квантизацията е ключова техника за изпълнение на големи езикови модели на потребителски хардуер, особено когато се използват CPU. Този процес преобразува теглата на модела от по-висока прецизност (напр. 32-битови числа с плаваща запетая) в формати с по-ниска прецизност (напр. 8-битови цели числа).

Квантизация

Ползите от квантизацията включват:

  • Намалено използване на памет: Квантизираните модели изискват значително по-малко RAM, което прави възможно изпълнението на по-големи модели на устройства с ограничена памет.
  • По-бързо извличане на изводи (inference): Изчисленията с по-ниска прецизност могат да се извършват по-бързо, особено на CPU.
  • По-малък обем на съхранение: Квантизираните модели заемат по-малко дисково пространство, което е полезно за внедряване и разпространение.

Например, модел с 27 милиарда параметъра, който може да изисква над 100GB RAM при пълна прецизност, потенциално би могъл да работи на система с 32GB или по-малко след квантизация. Инструменти като transformers от Hugging Face или специализирани библиотеки за квантизация могат да ви помогнат да извършите тази оптимизация.

Колко памет ми е необходима

Необходимата памет за изпълнение на LLM модел е тясно свързана с броя на неговите параметри. Като общо правило, са необходими около 4 байта памет на параметър за модели с пълна прецизност (FP32). Това означава, че модел с 27 милиарда параметъра теоретично би изисквал около 108GB RAM в пълната си форма.

Въпреки това, чрез техники като квантизация (намаляване на прецизността до INT8 или дори INT4), изискванията за памет могат да бъдат значително намалени, потенциално 2-4 пъти или повече. Дори с тези оптимизации, изпълнението на модел с 27 милиарда параметъра на примерен Mac M1 с 8GB RAM би било почти невъзможно.

Обикновено потребителските устройства с 8GB RAM са по-подходящи за модели в диапазона от 1 до 7 милиарда параметъра, в зависимост от нивото на квантизация и приложените техники за оптимизация. За по-големи модели като версията с 27 милиарда параметъра, обикновено ще ви трябва повече RAM (16GB+) или ще трябва да приложите още по-напреднали техники като размяна на диска, което може сериозно да повлияе на производителността.

За точна оценка на изискванията за памет за различни размери модели, проверете този страхотен калкулатор, предоставен от Hugging Face: https://huggingface.co/spaces/hf-accelerate/model-memory-usage

Избор на модел

Изборът на правилния модел за локално изпълнение на CPU е от решаващо значение за балансиране на производителността и използването на ресурси. Вземете предвид следните фактори:

  • Размер на модела: По-малките модели (1-7 милиарда параметъра) са по-подходящи за повечето потребителски CPU.
  • Специализация на задачата: Изберете модели, фино настроени за вашата конкретна задача.
  • Езикова поддръжка: За задачи, които не са на английски език, помислете за модели, обучени на целевия език.
  • Готовност за квантизация: Търсете модели, които имат налични квантизирани версии или са лесни за квантизация. Много модели в Hugging Face вече предлагат GGUF (GPT-Generated Unified Format) версии, които са оптимизирани за извличане на изводи на CPU.
  • Подкрепа от общността: Моделите с активна подкрепа от общността често имат повече ресурси и оптимизации, налични за локално внедряване.

Помнете, че най-големият или най-новият модел невинаги е най-добрият избор за локално изпълнение на CPU. Често добре оптимизиран по-малък модел може да осигури по-добра реална производителност на ограничен хардуер.

За тази статия ще се съсредоточим върху Gemma 2 на Google, но си струва да отбележим, че има няколко други отлични опции за локално използване, включително Phi-3 на Microsoft и Llama 3 на Meta.

Изпълнение на Gemma 2 на Ollama

Gemma 2 на Google е съвременен езиков модел, наличен в два размера: 9 милиарда и 27 милиарда параметъра. Статията е достъпна тук, ако се интересувате да научите повече за данните за обучение, архитектурата и т.н.

Нека разгледаме как да изпълняваме тези модели с помощта на Ollama. Според много мнения на практикуващи, това е един от най-добрите модели за своя размер.

Gemma 2: 9 милиарда параметъра

За да изпълните версията с 9 милиарда параметъра на Gemma 2, използвайте следната команда:


ollama run gemma2

Тази команда ще изтегли модела, ако вече не присъства във вашата система, и ще стартира интерактивна сесия.

Gemma 2: 27 милиарда параметъра

За по-голямата версия с 27 милиарда параметъра, използвайте:


ollama run gemma2:27b

Версията с 27 милиарда параметъра предлага по-добра производителност, но изисква повече изчислителни ресурси.

Производителност и ефективност

Gemma 2 е проектиран за водеща в класа си производителност и ефективност. Нека разгледаме как се сравнява с други популярни модели в различни тестове:

Тест Метрика Gemma 2 9B Gemma 2 27B Llama 3 8B Llama 3 70B Grok-1 314B
Общ MMLU (5-shot, top-1) 71.3 75.2 66.6 79.5 73.0
Разсъждение BBH (3-shot, CoT) 68.2 74.9 61.1 81.3
HellaSwag (10-shot) 81.9 86.4 82
Математика GSM8K (5-shot, maj@1) 68.6 74.0 45.7 62.9 (8-shot)
MATH (4-shot) 36.6 42.3 23.9
Код HumanEval (pass@1) 40.2 51.8 63.2 (0-shot)

Тази таблица демонстрира ефективността на Gemma 2, особено версията с 9 милиарда параметъра, която се конкурира добре с по-големи модели в тези тестове.

За да изследвате техники за фино настройване на Gemma 2, включително значителни подобрения в скоростта и паметта, проверете тази статия.

Практически приложения

Gemma 2, подобно на други отворени LLM модели, има широк спектър от приложения в различни области. Ето някои ключови области, където можете да използвате този модел:

  • Създаване на съдържание и комуникация: Автоматизирано писане, съставяне на имейли и разработка на чатботове
  • Научни изследвания и образование: Обобщаване на литература, отговаряне на въпроси и генериране на хипотези
  • Разработка на софтуер: Допълване на код, генериране на документация и откриване на грешки
  • Анализ на данни: Класификация на текст, анализ на настроения и генериране на отчети
  • Творчески задачи: Планиране на истории, създаване на поезия и превод на езици

Интегриране на Gemma 2 с популярни ML рамки

Ollama улеснява интегрирането на Gemma 2 с популярни рамки за машинно обучение.

Ето примери с използване на LangChain и LlamaIndex:

LangChain интеграция:


from langchain_community.llms import Ollama

llm = Ollama(model="gemma2")
response = llm.invoke("Защо небето е синьо?")
print(response)

LlamaIndex интеграция:


from llama_index.llms.ollama import Ollama

llm = Ollama(model="gemma2")
response = llm.complete("Защо небето е синьо?")
print(response)

Съображения при локално използване на LLM

При настройването на LLM модели за локално изпълнение на CPU, трябва да се вземат предвид няколко практически фактора:

  1. Съвместимост с операционната система: Уверете се, че инструментите и библиотеките, които използвате, са съвместими с вашата ОС. Например, някои настройки на Docker може да се нуждаят от корекция между Linux, macOS и Windows.
  2. CPU архитектура: Различните CPU архитектури (напр. x86, ARM) може да изискват специфични изграждания или оптимизации на избрания от вас модел или рамка.
  3. Охлаждане и захранване: Изпълнението на LLM модели може да бъде изчислително интензивно. Уверете се, че вашата система има адекватно охлаждане, особено при продължителна употреба. При лаптопи, имайте предвид увеличената консумация на енергия.
  4. Скорост на съхранение: Бързото съхранение (като SSD) може да подобри времената за зареждане на модела и производителността, когато е необходима размяна.
  5. Фонови процеси: Затворете ненужните приложения, за да освободите CPU и памет ресурси за LLM модела.
  6. Честота на актуализации: Поддържайте вашите библиотеки и рамки актуализирани, тъй като по-новите версии често включват подобрения в производителността и отстраняване на грешки, които са от решаващо значение за локалното изпълнение на LLM.

Оптимизиране на CPU производителността

  1. Изпълнението на LLM модели на CPU изисква внимателна оптимизация за постигане на възможно най-добра производителност. Първото съображение е избор на подходящ размер на модела за вашия хардуер.
  2. По-малките модели, обикновено в диапазона от 1 до 7 милиарда параметъра, са по-подходящи за повечето потребителски CPU. Тези модели постигат баланс между възможности и изисквания за ресурси, позволявайки разумни скорости на извличане на изводи на стандартен хардуер.
  3. Управлението на паметта е от решаващо значение при изпълнението на LLM модели на CPU. Увеличаването на RAM на вашата система може значително да подобри производителността, тъй като позволява повече от модела да се съхранява в паметта, намалявайки нуждата от размяна на диска. Въпреки това, дори с ограничена RAM, техники като памет мапинг и ефективно зареждане на данни могат да помогнат за управлението на по-големи модели.
  4. Ефективното конструиране на подсказки (промптове) е друг ключов фактор за оптимизиране на CPU производителността. Създаването на ясни, кратки подсказки, които директно адресират задачата, може да намали ненужните изчисления. Това не само подобрява времето за отговор, но и помага за поддържане на контекста в рамките на ограничения контекстов прозорец на модела.
  5. Когато се справяте с множество заявки или големи набори от данни, помислете за внедряване на пакетна обработка. Групирането на подобни заявки заедно може да използва по-ефективно способността на CPU да извършва паралелни изчисления, потенциално увеличавайки производителността.
  6. Ограничаването на паралелните задачи във вашата система, докато изпълнявате LLM модела, също може да повиши производителността. Фоновите процеси могат да се конкурират за CPU ресурси, така че затварянето на ненужни приложения и услуги може да осигури повече изчислителна мощ за модела.
  7. Управлението на температурата често се пренебрегва, но е критично за поддържане на устойчива производителност, особено по време на дълги сесии на извличане на изводи. Уверете се, че вашата система има адекватно охлаждане, тъй като CPU могат да намалят своята производителност, когато прегреят, което води до по-бавни времена за извличане на изводи.
  8. Квантизацията, както беше споменато по-рано, е мощна техника за CPU оптимизация. Чрез намаляване на прецизността на теглата на модела, квантизацията не само намалява използването на памет, но може и да ускори изчисленията на CPU архитектури, оптимизирани за операции с по-ниска прецизност.
  9. Накрая, помислете за въздействието на избрания от вас софтуерен стек. Някои рамки и библиотеки са по-добре оптимизирани за CPU извличане на изводи от други. Например, ONNX Runtime или TensorRT могат да осигурят значителни подобрения в скоростта в сравнение със стандартните PyTorch или TensorFlow имплементации за определени модели.
  10. Прилагайки тези стратегии за оптимизация, можете значително да подобрите производителността на LLM модели, изпълнявани на CPU, правейки локалния AI по-достъпен и ефективен за широк спектър от приложения.
    GUI опции за взаимодействие с локални LLM модели
  11. Докато интерфейсите с команден ред са мощни, графичните потребителски интерфейси (GUI) могат да направят взаимодействието с вашия локален LLM модел по-интуитивно и удобно за потребителя. Ето някои популярни опции:
  • Chatbot OllamaИнтерфейс, подобен на ChatGPT, който работи добре с моделите, обвити от Ollama. Той осигурява познато чат изживяване и е сравнително лесен за настройка.
  • Open WebUI: Друг уеб-базиран интерфейс, проектиран специално за Ollama модели, предлагащ чист и отзивчив дизайн.
  • Streamlit: Python библиотека, която ви позволява бързо да създавате персонализирани уеб интерфейси. Тя е силно персонализируема и може да бъде адаптирана към вашия специфичен случай на употреба.
  • Gradio: Подобно на Streamlit, Gradio позволява бързо разработване на уеб интерфейси за модели за машинно обучение, включително LLM.
  • LM Studio: Десктоп приложение, което предоставя удобен за потребителя интерфейс за изтегляне, изпълнение и взаимодействие с различни LLM модели с отворен код.

При избора на GUI, вземете предвид фактори като лекота на настройката, опции за персонализация, използване на ресурси и съвместимост с избрания от вас модел и метод на внедряване. Някои интерфейси може да изискват допълнителни стъпки за настройка или зависимости, така че вземете това предвид в плана си за внедряване.

Алтернативи на Ollama

Въпреки че Ollama предоставя отлично решение за локално изпълнение на LLM модели, има и други алтернативи, които си струва да се разгледат:

Hugging Face Transformers

Hugging Face предлага обширна библиотека за работа с трансформер-базирани модели, включително инструменти за локално изпълнение на модели.

Предимства:

  • Обширна библиотека с модели
  • Гъвкаво API
  • Силна подкрепа от общността

Пример за употреба:


from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")

input_text = "Здравей, как си?"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
output = model.generate(input_ids, max_length=50)

print(tokenizer.decode(output[0], skip_special_tokens=True))

GGUF формат и llama.cpp

GGUF (GPT-Generated Unified Format) е файлов формат, проектиран за ефективно съхранение и зареждане на големи езикови модели. Той е особено полезен за изпълнение на модели на потребителски хардуер.

Предимства:

  • Силно оптимизиран за CPU извличане на изводи
  • Поддържа квантизация за намалено използване на памет
  • Крос-платформена съвместимост

Пример за употреба с llama.cpp:


# Клониране на хранилището
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

# Изграждане на проекта
make

# Изтегляне на GGUF модел (напр. Gemma 2B)
wget https://huggingface.co/mlabonne/gemma-2b-GGUF/resolve/main/gemma-2b.Q2_K.gguf

# Изпълнение на модела
./llama-cli -m gemma-2b.Q2_K.gguf -n 128 -p "Здравей, как си?"

Локално внедряване на Mac с Apple Silicon

За потребители с Mac устройства, включващи Apple Silicon чипове (M1, M2, M3), има оптимизирани решения за локално изпълнение на LLM модели:

MLX рамка

MLX рамката на Apple е проектирана специално за машинно обучение на Apple Silicon.

Предимства:

  • Оптимизирана за Apple Silicon
  • Поддържа различни архитектури на модели
  • Интегрира се добре с екосистемата на Apple

Пример за употреба:


import mlx.core as mx
import mlx.nn as nn

# Зареждане на предварително обучен модел (опростен пример)
model = nn.TransformerLM(...)
model.load_weights("път/до/теглата")

# Генериране на текст
input_text = "Здравей, как си?"
tokens = tokenize(input_text)
output = model.generate(tokens, max_length=50)
print(detokenize(output))

Заключение

Локалното изпълнение на LLM модели на CPU с помощта на инструменти като Ollama и неговите алтернативи отваря свят от възможности за разработчици, изследователи и ентусиасти. Ефективността на модели като Gemma 2, комбинирана с лекотата на използване, предоставена от тези инструменти, прави възможно експериментирането и внедряването на съвременни езикови модели на стандартен хардуер.

Докато изследвате възможностите на локално изпълняваните LLM модели, запомнете следното:

  1. Изберете подходящия инструмент и модел за вашия конкретен случай на употреба
  2. Оптимизирайте вашите работни процеси за CPU извличане на изводи
  3. Вземете предвид компромисите между размера на модела, производителността и изискванията за ресурси
  4. Следете за най-новите разработки в областта на локалното внедряване на LLM модели, тъй като тази област се развива бързо

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

Локалното изпълнение на LLM модели не само демократизира достъпа до AI технологии, но и отваря нови възможности за иновации в области, където поверителността на данните, офлайн функционалността или персонализацията са от първостепенно значение. Докато продължавате да изследвате и експериментирате с тези технологии, помнете, че ключът към успеха често лежи в намирането на правилния баланс между сложност на модела и практическа приложимост за вашите специфични нужди.

С непрекъснатото развитие на хардуера и софтуера, можем да очакваме още по-ефективни и мощни решения за локално AI в бъдеще. Останете любопитни, продължавайте да учите и не се страхувайте да експериментирате с различни модели и конфигурации, за да намерите оптималното решение за вашите проекти.