LLM Open barque
Dans l’article précédent IArmateurs, j’expliquais les problématiques de coût. Utiliser le mode gratuit ne peut se faire qu’à travers les applications Web ou intégrées fournis par les IArmateurs mais aux prix d’accepter que vos données soient utilisés pour entraîner les modèles.
Donc, j’ai voulu essayer d’utiliser ma propre petite barque: des modèles open-weight sur des machines locales. Mais est ce que c’est utilisable? quelle puissance de machine faut-il? peut-on l’utiliser “à la place de” dans les outils de dev ? si non, faut-il developper ses propres clients (chatbot, visual studio extension)? est-ce raisonnable? Dans tous les cas, l’exercice est au moins interessant pour l’aspect pédagogique.
Les librairies ou frameworks
On peut faire tourner un modèle open-weight (le terme d’usage est ‘inférer’ à la place de ‘faire tourner’) dans Ollama, LM studio (avec ou sans GUI) , ou plus compliqué, llama.cpp.
llama.cpp est une librairie c++ qui peut être chargée dans une application (à condition que le langage de l’application permette de charger la librairie C++ statique ou dll sous windows). En c# et python, c’est le cas. Notons qu’avec Python, il existe d’autres librairies pour ça.
| Solution | Usage “in-process” | Modèles supportés |
|---|---|---|
| llama.cpp | Oui | Llama, autres GGML |
| TensorFlow | Oui | Tous formats TF/Keras |
| PyTorch | Oui | Tous formats Torch |
| ONNX | Oui | Tous formats onnx |
Chaque librairie a son format mais Il existe des outils pour convertir de nombreux modèles entre formats TensorFlow, PyTorch, ONNX, GGML, etc. :
En dotnet, si on utilise Semantic kernel, le plus simple est d’installer Ollama en local sous docker. Evidemment, s’il s’agit d’une application desktop qu’on veut fournir aux collégues, le déploiment via un installateur ne s’en trouvera pas facilité. Mais dans un premier temps, pour mon usage personel, surtout pour experimenter les limites des ‘petits’ modèles, c’est plus simple. En fait, Ollama encapsule Llama.cpp en fournissant un service REST, comme celui pour OpenAI azure. Malheureusement, ce n’est pas le même protocol mais Semantic Kernel fournit plusieurs providers dont un pour Ollama. J’ai vu que le github contenant les sources llama.cpp fournissait aussi un serveur REST. Mais pas sur que ça soit très avancé. Il y a aussi LocalAI à tester.
Avec Ollama
private bool ConfigureAzureOpenAI(IKernelBuilder kernelBuilder)
{
var azureConfig = _options.AzureOpenAI;
if (azureConfig != null)
{
kernelBuilder.AddAzureOpenAIChatCompletion(
azureConfig.DeploymentName,
azureConfig.Endpoint,
azureConfig.ApiKey
);
}
return azureConfig != null;
}
private bool ConfigureLocalOllamaLLM(IKernelBuilder kernelBuilder)
{
kernelBuilder.Services.AddHttpClient();
var localConfig = _options.LocalOllama;
if (localConfig != null)
{
try
{
_logger.LogInformation("Configuring Ollama LLM at {Endpoint} with model {ModelId}",localConfig.Endpoint, localConfig.ModelId);
var httpClient = new HttpClient(new MyHttpMessageHandler(_logger)) { Timeout = TimeSpan.FromSeconds(1000) };
httpClient.BaseAddress = new Uri(_options.LocalOllama.Endpoint+"/v1");
kernelBuilder.AddOpenAIChatCompletion(
modelId: localConfig.ModelId,
apiKey: "not-needed",
httpClient: httpClient
);
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to configure Ollama LLM");
return false;
}
}
else
{
return false;
}
}
J’avais tenté lors d’une première approche d’utiliser le package Microsoft.SemanticKernel.Connectors.Olama. Erreur! les pluggins ( spécification OpenAI) ne sont pas du tout envoyés dans le contexte avec le prompt. J’ai cru à un problème avec le modèle testé (mistral-small3.2) alors qu’il fonctionne très bien (Ce qui n’empèche que peux de modèle supporte le tooling).
private bool ConfigureLocalOllamaLLM_2(IKernelBuilder kernelBuilder)
{
kernelBuilder.Services.AddHttpClient();
var localConfig = _options.LocalOllama;
if (localConfig != null )
{
kernelBuilder.AddOllamaChatCompletion(
modelId:localConfig.ModelId,
baseUrl: new Uri(localConfig.Endpoint)
);
return true;
}
else
{
return false;
}
}
Pour installer Ollama , depuis WSL ou n’importe quelle console Docker, il suffit d”exécuter :
docker run -d --name ollama -p 11434:11434 ollama/ollama
- -d : lance le conteneur en arrière-plan
- –name ollama : nomme le conteneur « ollama »
- -p 11434:11434 : ouvre le port 11434 pour utiliser l’API Ollama
- ollama/ollama : image officielle sur Docker Hub
Autre possibilité, le docker-compose (sous wsl):
version: '3.8'
services:
ollama:
image: ollama/ollama
container_name: ollama
ports:
- "11434:11434"
volumes:
- /mnt/d/ollama:/root/.ollama
restart: unless-stopped
docker ps
“ollama” doit apparaitre dans la liste.
Il faut rentrer dans le conteneur pour utiliser la CLI :
docker exec -it ollama bash
Et ensuite utiliser les commandes fourni par l’utilitaire ollama qui est présent dans l’image docker.
Pour afficher la liste des commandes:
ollama -h
Large language model runner
Usage:
ollama [flags]
ollama [command]
Available Commands:
serve Start ollama
create Create a model
show Show information for a model
run Run a model
stop Stop a running model
pull Pull a model from a registry
push Push a model to a registry
signin Sign in to ollama.com
signout Sign out from ollama.com
list List models
ps List running models
cp Copy a model
rm Remove a model
help Help about any command
Flags:
-h, --help help for ollama
-v, --version Show version information
Ollama fournit differents modèles que l’on peut consulter sur le lien suivant https://ollama.com/library.
Pour installer un model:
ollama pull llama3.2
Il est possible d’installer plusieurs modèles .
La commande suivante permet de voir l’ensemble des modèles installés en local.
ollama list
Et celle ci permet d’avoir des infos sur l’un des modèles installés
ollama show llama3.2
L’API Ollama est accessible de l’exterieur du containeur via http://localhost:11434 (port par défault mais changeable au moment de créer le containeur en changeant le docker-compose.yml ou le paramètre -p 11434:11434 du docker run)
Quand on fait un appel à l’API, il suffit de spécifier le modèle via le champ model dans la requête.
Exemple avec curl :
curl http://localhost:11434/api/generate -d '{
"model": "mixtral",
"prompt": "Comment se positionner en mer ?"
}'
Pour utiliser Llama :
curl http://localhost:11434/api/generate -d '{
"model": "llama3.2",
"prompt": "Comment se positionner en mer?"
}'