Dans le cadre d’un projet personnel, je me suis équipé d’un GPU NVIDIA (une RTX 3060) afin de pouvoir faire tourner convenablement des modèles de LLM en local.

Pour utiliser facilement différent modèle, je m’appuie sur OpenWebUI (avec Ollama) ; comme l’installation peut être un peu épique, je récapitule les différentes étapes ici.

Image designed by author

Configuration utilisée

Dans mon PC, j’ai :

Ce qui permet de faire tourner correctement (une trentaine de tokens/s) des modèles de 14B.

Installation des drivers Nvidia

Il y a plusieurs méthodes, j’ai utilisé celle du site d’Ubuntu : NVIDIA drivers installation

En résumé, on fait :

sudo ubuntu-drivers list
sudo ubuntu-drivers install

Puis on vérifie avec nvidia-smi . On doit obtenir quelque chose de ce style :

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.120                Driver Version: 550.120        CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 3060        Off |   00000000:01:00.0  On |                  N/A |
|  0%   39C    P8             10W /  170W |     664MiB /  12288MiB |      1%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A      2909      G   /usr/lib/xorg/Xorg                            281MiB |
|    0   N/A  N/A      3245      G   /usr/bin/gnome-shell                          138MiB |
|    0   N/A  N/A     20152      G   ...onEnabled --variations-seed-version        140MiB |
+-----------------------------------------------------------------------------------------+

Installation de Docker avec support des GPU NVIDIA

Pas de difficultés particulières, il faut bien suivre les docs (et ne pas oublier de redémarrer son PC après l’installation du toolkit NVIDIA).

Docker

On suit la documentation officielle. J’ai choisi la méthode avec les dépôts aptinstall-using-the-repository . Et on oublie pas le post-installationlinux-postinstall/ (pour éviter de faire un sudo à chaque commande Docker).

NVIDIA Container Toolkit

Idem que précédemment, j’ai utilisé la documentation officielle avec aptinstall-guide.html#installing-with-apt pour installer le Toolkit.

Puis on configuration Docker : install-guide.html#configuring-docker

On passe à l’étape de vérification afin de voir que Docker peut bien utiliser le GPU : running-a-sample-workload.

On devrait obtenir quelque chose qui ressemble à ça :

sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
                                                                                                     
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.120                Driver Version: 550.120        CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 3060        Off |   00000000:01:00.0  On |                  N/A |
|  0%   43C    P8             12W /  170W |     625MiB /  12288MiB |     31%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+

Ollama et OpenWebUI dans docker-compose

On arrive presque au bout !

Pour gérer facilement Docker (dans un réseau local), j’aime bien utiliser Portainer. Mais on peut aussi le faire sous Vim évidemment, je ne suis pas sectaire.

Pour écrire mon docker-compose.yaml, j’ai utilisé l’exemple d’OpenWebUI : docker-compose.yaml.

Pour que Docker puisse utiliser le GPU, je me suis basé sur cet exemple-ci : docker-compose.gpu.yaml.

Ce qui donne :

services:
  ollama:
    volumes:
      - ollama:/root/.ollama
    container_name: ollama
    pull_policy: always
    tty: true
    restart: unless-stopped
    image: ollama/ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities:
                - gpu

  open-webui:
    build:
      context: .
      args:
        OLLAMA_BASE_URL: '/ollama'
      dockerfile: Dockerfile
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    volumes:
      - open-webui:/app/backend/data
    depends_on:
      - ollama
    ports:
      - 3000:8080
    environment:
      - 'OLLAMA_BASE_URL=http://ollama:11434'
      - 'WEBUI_SECRET_KEY='
    extra_hosts:
      - host.docker.internal:host-gateway
    restart: unless-stopped

volumes:
  ollama: {}
  open-webui: {}

Voilà pour une installation de base, pour une utilisation simple (n’allez pas me mettre ça en prod dans cet état, malheureux !!).

N’hésitez pas à me faire part de vos remarques et bon chat avec vos LLM :-)