# Guide de déploiement de llama-server et du point de terminaison OpenAI

Nous sommes en train de déployer Devstral-2 - voir [devstral-2](https://unsloth.ai/docs/fr/modeles/tutorials/devstral-2 "mention") pour plus de détails sur le modèle.&#x20;

Obtenez la dernière `llama.cpp` sur [GitHub ici](https://github.com/ggml-org/llama.cpp). Vous pouvez aussi suivre les instructions de compilation ci-dessous. Changez `-DGGML_CUDA=ON` en `-DGGML_CUDA=OFF` si vous n'avez pas de GPU ou si vous voulez simplement de l'inférence CPU. **Pour les appareils Apple Mac / Metal**, définissez `-DGGML_CUDA=OFF` puis continuez comme d'habitude - le support Metal est activé par défaut.

{% code overflow="wrap" %}

```bash
apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone https://github.com/ggml-org/llama.cpp
cmake llama.cpp -B llama.cpp/build \
    -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-mtmd-cli llama-server llama-gguf-split
cp llama.cpp/build/bin/llama-* llama.cpp
```

{% endcode %}

{% hint style="info" %}
Lors de l'utilisation de `--jinja` llama-server ajoute le message système suivant si des outils sont pris en charge : `Répondez au format JSON, soit avec tool_call (une demande d'appel d'outils), soit avec response en réponse à la requête de l'utilisateur` . Cela provoque parfois des problèmes avec les fine-tunes ! Voir le [dépôt llama.cpp](https://github.com/ggml-org/llama.cpp/blob/12ee1763a6f6130ce820a366d220bbadff54b818/common/chat.cpp#L849) pour plus de détails.
{% endhint %}

Téléchargez d'abord Devstral 2 :

{% code overflow="wrap" %}

```python
# !pip install huggingface_hub hf_transfer
import os
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
from huggingface_hub import snapshot_download
snapshot_download(
    repo_id = "unsloth/Devstral-2-123B-Instruct-2512-GGUF",
    local_dir = "Devstral-2-123B-Instruct-2512-GGUF",
    allow_patterns = ["*UD-Q2_K_XL*", "*mmproj-F16*"],
)
```

{% endcode %}

Pour déployer Devstral 2 en production, nous utilisons `llama-server` Dans un nouveau terminal, par exemple via tmux, déployez le modèle via :

{% code overflow="wrap" %}

```bash
./llama.cpp/llama-server \
    --model Devstral-Small-2-24B-Instruct-2512-GGUF/Devstral-Small-2-24B-Instruct-2512-UD-Q4_K_XL.gguf \
    --mmproj Devstral-Small-2-24B-Instruct-2512-GGUF/mmproj-F16.gguf \
    --alias "unsloth/Devstral-Small-2-24B-Instruct-2512" \
    --threads -1 \
    --n-gpu-layers 999 \
    --prio 3 \
    --min_p 0.01 \
    --ctx-size 16384 \
    --port 8001 \
    --jinja
```

{% endcode %}

Lorsque vous exécutez ce qui précède, vous obtiendrez :

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FJSTkWDCcHk5DI6otb72X%2Fimage.png?alt=media&#x26;token=b685008e-e9ad-4dea-8f1d-af3fdade8e3b" alt=""><figcaption></figcaption></figure>

Puis dans un nouveau terminal, après avoir fait `pip install openai`, faites :

{% code overflow="wrap" %}

```python
from openai import OpenAI
import json
openai_client = OpenAI(
    base_url = "http://127.0.0.1:8001/v1",
    api_key = "sk-no-key-required",
)
completion = openai_client.chat.completions.create(
    model = "unsloth/Devstral-Small-2-24B-Instruct-2512",
    messages = [{"role": "user", "content": "What is 2+2?"},],
)
print(completion.choices[0].message.content)
```

{% endcode %}

Ce qui affichera simplement 4.\
\
Vous pouvez revenir à l'écran de llama-server et vous verrez peut-être des statistiques qui peuvent être intéressantes :

<figure><img src="https://550366147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2F6msFgOWJEWXEEgXvLRnr%2Fimage.png?alt=media&#x26;token=25fa1784-f671-4e0d-9bad-a4534525afb6" alt=""><figcaption></figcaption></figure>

Pour des arguments comme l'utilisation du décodage spéculatif, voir <https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md>

## :grey\_question:Particularités de llama-server

* Lors de l'utilisation de `--jinja` llama-server ajoute le message système suivant si des outils sont pris en charge : `Répondez au format JSON, soit avec tool_call (une demande d'appel d'outils), soit avec response en réponse à la requête de l'utilisateur` . Cela provoque parfois des problèmes avec les fine-tunes ! Voir le [dépôt llama.cpp](https://github.com/ggml-org/llama.cpp/blob/12ee1763a6f6130ce820a366d220bbadff54b818/common/chat.cpp#L849) pour plus de détails.\
  \
  Vous pouvez arrêter cela en utilisant `--no-jinja` mais alors `les outils` ne sont plus pris en charge.\
  \
  Par exemple, FunctionGemma utilise par défaut :

  <pre class="language-notebook-python" data-overflow="wrap"><code class="lang-notebook-python">Vous êtes un modèle qui peut appeler des fonctions avec les fonctions suivantes
  </code></pre>

  Mais à cause de llama-server qui ajoute un message supplémentaire, nous obtenons :

  <pre class="language-notebook-python" data-overflow="wrap"><code class="lang-notebook-python">Vous êtes un modèle capable d'appeler des fonctions avec les fonctions suivantes\n\nRépondez au format JSON, soit avec `tool_call` (une demande d'appel d'outils), soit avec `response` en réponse à la requête de l'utilisateur
  </code></pre>

  Nous avons signalé le problème à <https://github.com/ggml-org/llama.cpp/issues/18323> et les développeurs de llama.cpp travaillent sur un correctif !\
  \
  En attendant, pour tous les fine-tunes, veuillez ajouter l'invite spécifiquement pour l'appel d'outils !

## :toolbox:Appel d'outils avec llama-server

Voir [tool-calling-guide-for-local-llms](https://unsloth.ai/docs/fr/bases/tool-calling-guide-for-local-llms "mention") sur la façon de faire l'appel d'outils !
