Quem quer ter o seu próprio laboratório de IA? – Parte 1 de 2.

Olá a todos.

No panorama atual da inteligência artificial, a capacidade de executar modelos localmente tornou-se não apenas desejável, mas essencial para muitos programadores e entusiastas de tecnologia. O Ollama destaca-se como uma ferramenta excecional neste contexto, permitindo a execução de modelos de linguagem de grande porte (LLMs) diretamente nos nossos computadores pessoais, das nossas PME’s ou até dos nossos homlabs.

Neste post, exploraremos o processo de instalação do Ollama em sistemas Linux e macOS, juntamente com configurações avançadas para maximizar o desempenho, incluindo a utilização de GPUs, otimização da memória unificada (UMA) nos Mac, gestão de threads e configuração do acesso à rede.

ollama logo

O que é o Ollama?

Antes de mergulharmos nos detalhes técnicos, é importante compreender o que é o Ollama. Trata-se de uma ferramenta de código aberto que simplifica a execução de LLMs localmente, sem necessidade de ligação contínua à Internet ou dependência de serviços na nuvem. Isto proporciona vantagens significativas em termos de privacidade, latência e custos, especialmente para utilizadores que necessitam de interagir frequentemente com estes modelos.

Instalação do Ollama em Linux

O meu special souce em Linux é a seguinte configuração:

  • CPU moderno com suporte para AVX2 (a maioria dos CPUs desde 2013)
  • Mínimo de 8GB de RAM (16GB+ recomendado para modelos maiores)
  • GPU com suporte para CUDA (NVIDIA) ou ROCm (AMD) para aceleração
  • Distribuição Linux moderna (Ubuntu 20.04+, Debian 11+, Fedora 35+, etc.)

Experimentei com multi threading á seria em servidores com mais de 56 cores e existe um sweetspot para IA. Não abusem do numero de threads se as tiverem, porque se não tiverem memoria para acompanhar, provavelmente vão criar um bottleneck ao vosso processamento.

Passos de Instalação no Linux

  1. Instalação direta via scriptA maneira mais simples de instalar o Ollama é através do script oficial:
    curl -fsSL https://ollama.com/install.sh | sh
    

    Este script deteta automaticamente o nosso sistema operativo e instala os componentes necessários.

  2. Instalação manualSe preferirem um controlo mais granular, podem efetuar a instalação manualmente:
    # Descarregar o binário mais recente
    wget https://github.com/ollama/ollama/releases/latest/download/ollama-linux-amd64
    
    # Tornar o ficheiro executável
    chmod +x ollama-linux-amd64
    
    # Mover para um diretório no PATH
    sudo mv ollama-linux-amd64 /usr/local/bin/ollama
    
  3. Verificação da instalaçãoPara confirmar que o Ollama foi instalado corretamente executem:
    ollama --version
    

    O output deverá ver a versão atual do Ollama visível na linha de comandos.

Instalação do Ollama em macOS

Requisitos do Sistema

Para aqueles elitistas que usam macOS – :] – recomendo:

  • Mac com processador Intel ou Apple Silicon (M1/M2/M3)
  • macOS 12 (Monterey) ou superior
  • Mínimo de 8GB de RAM (16GB+ recomendado)

Passos de Instalação no macOS

  1. Utilizando o Homebrew
    Se tiver o Homebrew instalado, a instalação é extremamente simples:

    brew install ollama 
  2. Instalação manual.
    Alternativamente, podem descarregar o ficheiro de instalação diretamente do site oficial:

    # Descarregar o instalador
    curl -fsSL https://ollama.com/download/ollama-darwin-amd64 -o ollama
    
    # Tornar o ficheiro executável
    chmod +x ollama
    
    # Mover para um diretório no PATH
    sudo mv ollama /usr/local/bin/
    

    Para Apple Silicon (M1/M2/M3), utilize o binário específico para a arquitetura:

    curl -fsSL https://ollama.com/download/ollama-darwin-arm64 -o ollama
    
  3. Verificação da instalação
    Confirmem a instalação com:

    ollama --version
    

Configuração Avançada do Ollama

Após termos uma instalação bem-sucedida, vamos explorar as configurações avançadas que permitem maximizar o desempenho do Ollama nos nossos sistemas.

Configuração de GPU para Aceleração

O Ollama é rei com processamento e memoria das GPUs, acelerando significativamente a inferência dos modelos.

Para NVIDIA GPUs (Linux)

  1. Instalação dos drivers CUDA
    Primeiro, certifique-se de que tem os drivers NVIDIA e o toolkit CUDA instalados:

    # Ubuntu/Debian
    sudo apt update
    sudo apt install nvidia-driver-535 nvidia-cuda-toolkit
    
    # Fedora
    sudo dnf install akmod-nvidia xorg-x11-drv-nvidia-cuda
    
  2. Verificação da instalação CUDA
    Confirmem que o CUDA está corretamente instalado:

    nvidia-smi
    
  3. Configuração do Ollama para utilizar GPU
    Por predefinição, o Ollama deteta automaticamente GPUs disponíveis. Podem verificar se está a utilizar a GPU com:

    OLLAMA_DEBUG=1 ollama run llama2
    

    No output, se tudo estiver bem, deverão ver informações sobre o GPU sendo utilizada.

Para AMD GPUs (Linux)

  1. Instalação do ROCm
    Para GPUs AMD, instale o ROCm:

    # Ubuntu 22.04+
    sudo apt update
    sudo apt install rocm-hip-runtime
    
  2. Configuração do Ollama para ROCmConfigure o Ollama para utilizar ROCm através de variáveis de ambiente:
    export OLLAMA_AMD=1
    

    Para tornar esta configuração permanente, adicione esta linha ao seu ~/.bashrc ou ~/.zshrc.

Otimização da UMA para Apple Silicon

Agora a sério, a arquitetura da Apple brilha quase com o mesmo brilho qui AI em GPU’s, pois os processadores Apple Silicon (M1/M2/M3) utilizam uma arquitetura de Memória Unificada (UMA) que pode ser otimizada para o Ollama.

  1. Configuração da memória disponível
    Definam a quantidade de memória que o Ollama pode utilizar:

    export OLLAMA_RAM=12000 # Define 12GB como limite de memória (em MB)
    
  2. Ativação da otimização específica para Metal
    Permitam acesso de baremetal, de forma a garantir o melhor desempenho com a GPU integrada:

    export OLLAMA_METAL=1
    
  3. Otimização da quantidade de threads
    Ajustem o número de threads de acordo com o seu processador:

    # Para M1 Pro/Max ou M2/M3 (10+ cores)
    export OLLAMA_NUM_THREAD=8
    
    # Para M1 básico (8 cores)
    export OLLAMA_NUM_THREAD=6
    

Como é obvio, os valores acima deverão ser alinhados para o numero de processadores/cores/threads que o vosso hardware permita :).

Configuração do Número de Threads

Conforme falamos anteriormente, o ajuste do número de threads é crucial para otimizar o desempenho em diferentes configurações de hardware.

  1. Determinar o número ideal de threads
    Como regra geral, defina o número de threads para 75% do total de núcleos lógicos do vosso sistema:

    # Verificar o número de núcleos lógicos
    nproc --all
    
    # Configurar o número de threads
    export OLLAMA_NUM_THREAD=12 # Ajuste de acordo com o seu hardware
    
  2. Adicionando configurações permanentes
    Para tornar estas configurações permanentes, adicione-as ao vosso ficheiro de perfil:

    echo 'export OLLAMA_NUM_THREAD=12' >> ~/.bashrc
    # ou
    echo 'export OLLAMA_NUM_THREAD=12' >> ~/.zshrc
    

    Depois, recarreguem o ficheiro de configuração:

    source ~/.bashrc # ou source ~/.zshrc
    

Configuração do Ollama para Escutar na Placa de Rede/Over a Network.

Por predefinição, o Ollama escuta apenas em localhost (127.0.0.1), o que significa que só podem aceder a ele a partir da mesma máquina onde está a ser executado. Para permitir o acesso a partir de outros dispositivos na sua rede, precisam de configurá-lo para escutar num endereço IP acessível.

  1. Identificar o seu endereço IP na rede local
    # Em Linux
    ip addr show | grep "inet " | grep -v 127.0.0.1
    
    # Em macOS
    ifconfig | grep "inet " | grep -v 127.0.0.1
    
  2. Configurar o Ollama para escutar num endereço específico
    export OLLAMA_HOST=192.168.1.100:11434 # Substitua pelo seu IP real
    

    Ou, para escutar em todas as interfaces:

    export OLLAMA_HOST=0.0.0.0:11434
    
  3. Iniciar o serviço do Ollama
    ollama serve
    
  4. Configuração como serviço systemd (Linux)Para configurar o Ollama como um serviço que inicia automaticamente de forma persistente a cada reboot:
    sudo nano /etc/systemd/system/ollama.service 

    Adicionem o seguinte conteúdo:

    [Unit]
    Description=Ollama Service
    After=network.target
    
    [Service]
    Type=simple
    User=seu_usuario
    Environment="OLLAMA_HOST=0.0.0.0:11434"
    Environment="OLLAMA_NUM_THREAD=12"
    # Adicione outras variáveis de ambiente conforme necessário
    ExecStart=/usr/local/bin/ollama serve
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    

    Depois, ativem e iniciem o serviço:

    sudo systemctl daemon-reload
    sudo systemctl enable ollama
    sudo systemctl start ollama
    
  5. Para o cenário de macOS: Configuração como serviço launchd
    Criem um ficheiro plist para o launchd:

    nano ~/Library/LaunchAgents/com.ollama.service.plist
    

    Adicionem o seguinte conteúdo:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.ollama.service</string>
        <key>ProgramArguments</key>
        <array>         <string>/usr/local/bin/ollama</string>
            <string>serve</string>
        </array>
        <key>EnvironmentVariables</key>
        <dict>
            <key>OLLAMA_HOST</key>
            <string>0.0.0.0:11434</string>
            <key>OLLAMA_NUM_THREAD</key>
            <string>8</string>
            <key>OLLAMA_METAL</key>
            <string>1</string>
        </dict>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <true/>
    </dict>
    </plist>
    

    Carreguem e iniciem o serviço:

    launchctl load ~/Library/LaunchAgents/com.ollama.service.plist
    launchctl start com.ollama.service
    

Verificação da Instalação e Configuração

Com o Ollama configurado, vamos verificar se tudo está a funcionar corretamente:

  1. Teste básico
    ollama pull llama2; ollama run llama2 "Olá, sou um modelo de linguagem a correr localmente!"
    

    Nota: Na primeira parte do comando, estamos a descarregar um modelo de testes, de nome llama2.

  2. Verificação da utilização de GPU
    OLLAMA_DEBUG=1 ollama run llama2 "Este é um teste para verificar o uso da GPU"
    
  3. Verificação do acesso remoto
    De outro dispositivo na mesma rede:

    curl http://$IP:11434/api/tags
    

    Deverão receber uma resposta JSON com a lista de modelos disponíveis, sendo o $IP o ip da máquina na vossa rede onde instalaram o ollama.

E eis que chegamos ao fim de mais um post semanal. Neste vimos o processo para instalação e configuração do Ollama que será o primeiro passo para criar o nosso poderoso (!) homelab de IA.
Com os passos apresentados neste guia, já deverão ter o Ollama a funcionar otimamente no vosso sistema, tirando partido do hardware disponível e permitindo o acesso a partir de outros dispositivos na vossa rede.

No próximo post, exploraremos como instalar e configurar o Ollama WebUI através do Docker, uma interface web que facilita a interação com os modelos, além de oferecer funcionalidades avançadas como bases de conhecimento, memória adaptativa e RAG (Retrieval-Augmented Generation).

Até lá, experimente diferentes modelos disponíveis através do comando ollama pull [nome-do-modelo]  (podem consultar a lista aqui) e comecem a explorar as possibilidades que o Ollama oferece para o seu homelab de IA.

Um abraço
Nuno