Пост

Установка и использование Ollama на Raspberry Pi

Ollama — это платформа для локального запуска и работы с языковыми моделями на вашем собственном оборудовании. Установка Ollama на Raspberry Pi позволяет экспериментировать с ИИ-моделями без использования облачных сервисов, обеспечивая конфиденциальность данных и полный контроль над системой.

Установка и использование Ollama на Raspberry Pi

Введение

Ollama — это платформа для локального запуска и работы с языковыми моделями на вашем собственном оборудовании. Установка Ollama на Raspberry Pi позволяет экспериментировать с ИИ-моделями без использования облачных сервисов, обеспечивая конфиденциальность данных и полный контроль над системой.

Требования и ограничения

  • Raspberry Pi 4 или 5 с минимум 4GB оперативной памяти (рекомендуется 8GB)
  • Raspberry Pi OS 64-bit (Bullseye или новее)
  • Минимум 10GB свободного места на SD-карте
  • Активное подключение к интернету для загрузки моделей
  • Понимание, что производительность будет ограничена возможностями Raspberry Pi

Подготовка Raspberry Pi

Обновление системы

Перед установкой обновите систему:

1
2
3
sudo apt update
sudo apt upgrade -y
sudo reboot

Проверка архитектуры

Убедитесь, что используете 64-битную систему:

1
uname -m

Ожидаемый вывод: aarch64

Установка Ollama

Способ 1: Установка через официальный скрипт

Самый простой способ установки:

1
curl -fsSL https://ollama.com/install.sh | sh

Способ 2: Ручная установка

Для большего контроля над процессом:

Загрузка и установка двоичного файла:

1
2
3
4
5
6
7
8
9
10
11
12
# Создание директории для Ollama
mkdir -p ~/ollama
cd ~/ollama

# Загрузка последней версии для ARM64
curl -L https://ollama.com/download/ollama-linux-arm64 -o ollama

# Назначение прав на выполнение
chmod +x ollama

# Запуск Ollama
./ollama serve

Способ 3: Установка как службы systemd

Для автоматического запуска при загрузке:

Создание службы:

1
sudo nano /etc/systemd/system/ollama.service

Добавьте содержимое:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
Type=simple
User=pi
Group=pi
ExecStart=/usr/local/bin/ollama serve
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="HOME=/home/pi"

[Install]
WantedBy=multi-user.target

Активация службы:

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable ollama
sudo systemctl start ollama

Проверка установки

Проверьте статус службы:

1
sudo systemctl status ollama

Проверьте работу Ollama API:

1
curl http://localhost:11434/api/tags

Установка моделей

Доступные модели для Raspberry Pi

Из-за ограниченных ресурсов рекомендуется использовать легковесные модели:

TinyLlama (1.1B параметров):

1
ollama pull tinyllama

Phi-2 (2.7B параметров):

1
ollama pull phi

Gemma 2B (2B параметров):

1
ollama pull gemma:2b

Stable Code (3B параметров):

1
ollama pull stable-code

Запуск моделей

Интерактивный режим:

1
ollama run tinyllama

Пример сессии:

1
2
3
>>> Напиши приветственное сообщение для Raspberry Pi
Привет! Добро пожаловать в мир Raspberry Pi и локального ИИ! 
Здесь вы можете экспериментировать с языковыми моделями прямо на вашем одноплатном компьютере.

Пакетный режим:

1
echo "Что такое Raspberry Pi?" | ollama run tinyllama

Использование API

Отправка запросов через cURL:

1
2
3
4
5
curl http://localhost:11434/api/generate -d '{
  "model": "tinyllama",
  "prompt": "Объясни, что такое искусственный интеллект простыми словами",
  "stream": false
}'

Python-скрипт для работы с Ollama:

Создайте файл ollama_client.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
import json

def ask_ollama(prompt, model="tinyllama"):
    url = "http://localhost:11434/api/generate"
    data = {
        "model": model,
        "prompt": prompt,
        "stream": False
    }
    
    response = requests.post(url, json=data)
    if response.status_code == 200:
        return response.json()["response"]
    else:
        return f"Ошибка: {response.status_code}"

# Пример использования
if __name__ == "__main__":
    question = "Что можно сделать с Raspberry Pi?"
    answer = ask_ollama(question)
    print(f"Вопрос: {question}")
    print(f"Ответ: {answer}")

Оптимизация производительности

Настройка параметров модели:

При запуске моделей можно указать параметры для оптимизации использования памяти:

1
ollama run tinyllama --num-predict 128 --temperature 0.7

Использование swap-файла:

Создайте swap-файл для увеличения доступной памяти:

1
2
3
4
5
6
7
8
# Создание swap-файла 2GB
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Добавление в fstab для автоматического монтирования при загрузке
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Настройка zram:

Более эффективная альтернатива swap для Raspberry Pi:

1
2
sudo apt install zram-tools -y
sudo nano /etc/default/zramswap

Установите параметры:

1
2
3
PERCENT=50
ALGO=lz4
PRIORITY=100

Перезапустите службу:

1
sudo systemctl restart zramswap

Интеграция с веб-интерфейсом

Установка Open WebUI (ранее Ollama WebUI):

1
2
3
4
5
6
7
8
9
10
11
# Установка Docker (если не установлен)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker pi

# Запуск Open WebUI
docker run -d -p 3000:8080 \
  -v open-webui:/app/backend/data \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main

Доступ к веб-интерфейсу: http://ваш_ip:3000

Проекты с использованием Ollama на Raspberry Pi

Голосовой помощник:

Создайте файл voice_assistant.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import speech_recognition as sr
import requests
import pyttsx3

class VoiceAssistant:
    def __init__(self):
        self.recognizer = sr.Recognizer()
        self.engine = pyttsx3.init()
        
    def listen(self):
        with sr.Microphone() as source:
            print("Слушаю...")
            audio = self.recognizer.listen(source)
            try:
                text = self.recognizer.recognize_google(audio, language="ru-RU")
                print(f"Вы сказали: {text}")
                return text
            except:
                return ""
    
    def ask_ollama(self, prompt):
        response = requests.post(
            "http://localhost:11434/api/generate",
            json={"model": "tinyllama", "prompt": prompt, "stream": False}
        )
        return response.json()["response"]
    
    def speak(self, text):
        self.engine.say(text)
        self.engine.runAndWait()
    
    def run(self):
        while True:
            command = self.listen()
            if command:
                if "стоп" in command.lower():
                    break
                response = self.ask_ollama(command)
                print(f"Ответ: {response}")
                self.speak(response)

if __name__ == "__main__":
    assistant = VoiceAssistant()
    assistant.run()

Чат-бот для Telegram:

Установите необходимые библиотеки:

1
pip install python-telegram-bot requests

Создайте файл telegram_bot.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import logging
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters
import requests

# Настройка логирования
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)

class OllamaBot:
    def __init__(self, token):
        self.token = token
    
    def get_ollama_response(self, prompt):
        try:
            response = requests.post(
                "http://localhost:11434/api/generate",
                json={"model": "tinyllama", "prompt": prompt, "stream": False},
                timeout=30
            )
            return response.json()["response"]
        except Exception as e:
            return f"Ошибка: {str(e)}"
    
    async def start(self, update: Update, context):
        await update.message.reply_text("Привет! Я бот с локальной языковой моделью. Задайте мне вопрос!")
    
    async def handle_message(self, update: Update, context):
        user_message = update.message.text
        response = self.get_ollama_response(user_message)
        await update.message.reply_text(response[:4000])  # Ограничение Telegram
    
    def run(self):
        application = Application.builder().token(self.token).build()
        
        application.add_handler(CommandHandler("start", self.start))
        application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, self.handle_message))
        
        application.run_polling()

if __name__ == "__main__":
    # Замените YOUR_TOKEN на ваш токен от BotFather
    bot = OllamaBot("YOUR_TOKEN")
    bot.run()

Типичные проблемы и решения

Проблема: Недостаточно памяти для загрузки модели

  • Решение: Используйте более легкие модели (tinyllama, phi), увеличьте swap-файл
  • Убедитесь, что закрыты другие ресурсоемкие приложения

Проблема: Медленная работа моделей

  • Решение: Уменьшите параметр num_predict, используйте более простые промпты
  • Рассмотрите использование Raspberry Pi 5 с активным охлаждением

Проблема: Ошибка при установке через официальный скрипт

  • Решение: Используйте ручную установку или проверьте подключение к интернету
  • Убедитесь, что используется 64-битная система

Проблема: Модель не отвечает или зависает

  • Решение: Перезапустите службу Ollama, проверьте использование памяти
    1
    2
    
    sudo systemctl restart ollama
    free -h
    

Проблема: Высокая температура процессора

  • Решение: Установите радиатор и/или активное охлаждение
  • Мониторьте температуру: vcgencmd measure_temp

Мониторинг и обслуживание

Наблюдение за использованием ресурсов:

Создайте скрипт мониторинга:

1
sudo nano /usr/local/bin/monitor_ollama.sh
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
echo "=== Мониторинг Ollama ==="
echo "Дата: $(date)"
echo "Температура: $(vcgencmd measure_temp)"
echo "Память:"
free -h
echo "Процессы Ollama:"
ps aux | grep ollama
echo "Использование порта 11434:"
sudo netstat -tulpn | grep 11434

Автоматический перезапуск при сбоях:

Настройте systemd для автоматического перезапуска:

1
sudo nano /etc/systemd/system/ollama.service

Убедитесь, что есть строки:

1
2
Restart=always
RestartSec=10

Резервное копирование настроек и моделей:

1
sudo nano /usr/local/bin/backup_ollama.sh
1
2
3
4
5
#!/bin/bash
BACKUP_DIR="/home/pi/ollama-backups"
mkdir -p $BACKUP_DIR
tar -czf "$BACKUP_DIR/ollama-backup-$(date +%Y%m%d).tar.gz" \
  ~/.ollama /etc/systemd/system/ollama.service

Рекомендации по использованию

  • Начинайте с самых легких моделей (tinyllama)
  • Используйте короткие промпты для быстрых ответов
  • Регулярно обновляйте Ollama: ollama --version
  • Экспериментируйте с разными моделями для разных задач
  • Учитывайте ограничения Raspberry Pi при работе с большими контекстами

Ollama на Raspberry Pi открывает возможности для экспериментов с локальными языковыми моделями. Хотя производительность ограничена аппаратными возможностями, система прекрасно подходит для обучения, прототипирования и небольших проектов. Регулярно обновляйте систему и следите за температурой процессора при длительной работе.

Авторский пост защищен лицензией CC BY 4.0 .

© evdokimoff. Некоторые права защищены.

Использует тему Chirpy для Jekyll