TurboPilot est un clone de copilote auto-hébergé qui utilise la bibliothèque derrière llama.cpp pour exécuter le modèle Salesforce Codegen de 6 milliards de paramètres dans 4 Go de RAM. Il est fortement basé et inspiré du projet fauxpilot.
NB : Il s'agit pour l'instant d'une preuve de concept plutôt que d'un outil stable. La saisie semi-automatique est assez lente dans cette version du projet. N'hésitez pas à jouer avec, mais votre kilométrage peut varier.
Prend désormais en charge StableCode 3B Instruct, utilisez simplement les modèles GGML quantifiés de TheBloke et définissez -m stablecode
.
Nouveau : Refactorisé + Simplifié : Le code source a été amélioré pour faciliter l'extension et l'ajout de nouveaux modèles à Turbopilot. Le système prend désormais en charge plusieurs versions de modèle
Nouveau : prise en charge de Wizardcoder, Starcoder, Santacoder - Turbopilot prend désormais en charge les modèles de complétion de code local de pointe qui fournissent davantage de langages de programmation et prennent en charge le « remplissage au milieu ».
Les PR de ce projet et du fork GGML correspondant sont les bienvenus.
Créez un fork, apportez vos modifications puis ouvrez un PR.
Le moyen le plus simple d'essayer le projet est de récupérer les modèles prétraités, puis d'exécuter le serveur dans Docker.
Vous avez 2 options pour obtenir le modèle
Vous pouvez télécharger les modèles pré-convertis et pré-quantifiés depuis Huggingface.
Pour les utilisateurs à faible RAM (4-8 Gio), je recommande StableCode et pour les utilisateurs à forte puissance (16+ Gio de RAM, GPU discret ou silicium Apple), je recommande WizardCoder.
Turbopilot prend toujours en charge les modèles Codegen de première génération à partir de v0.0.5
et des versions antérieures. Même si les anciens modèles doivent être requantifiés.
Vous pouvez trouver un catalogue complet de modèles dans MODELS.md.
Suivez ce guide si vous souhaitez expérimenter vous-même la quantification des modèles.
Téléchargez le dernier binaire et extrayez-le dans le dossier racine du projet. Si un binaire n'est pas fourni pour votre système d'exploitation ou si vous préférez le construire vous-même, suivez les instructions de construction
Courir:
./turbopilot -m starcoder -f ./models/santacoder-q4_0.bin
L'application doit démarrer un serveur sur le port 18080
, vous pouvez modifier cela avec l'option -p
mais c'est le port par défaut auquel vscode-fauxpilot essaie de se connecter, vous voudrez donc probablement le laisser tranquille, sauf si vous êtes sûr de savoir ce que vous voulez. je fais.
Si vous disposez d'un système multicœur, vous pouvez contrôler le nombre de processeurs utilisés avec l'option -t
- par exemple, sur mon AMD Ryzen 5000 qui possède 6 cœurs/12 threads que j'utilise :
./codegen-serve -t 6 -m starcoder -f ./models/santacoder-q4_0.bin
Pour exécuter les anciens modèles Codegen. Changez simplement l'indicateur de type de modèle -m
en codegen
à la place.
REMARQUE : Turbopilot 0.1.0 et versions ultérieures requantifient vos modèles codegen, anciens modèles à partir de la version 0.0.5 et antérieure. Je travaille sur la fourniture de modèles de codegen quantifiés mis à jour
Vous pouvez également exécuter Turbopilot à partir de l'image Docker prédéfinie fournie ici.
Vous devrez toujours télécharger les modèles séparément, puis vous pourrez exécuter :
docker run --rm -it
-v ./models:/models
-e THREADS=6
-e MODEL_TYPE=starcoder
-e MODEL= " /models/santacoder-q4_0.bin "
-p 18080:18080
ghcr.io/ravenscroftj/turbopilot:latest
Depuis la version v0.0.5, le turbocode prend désormais en charge l'inférence CUDA. Pour exécuter le conteneur compatible cuda, vous devrez activer nvidia-docker, utiliser les versions balisées cuda et transmettre --gpus=all
à docker avec accès à votre GPU comme ceci :
docker run --gpus=all --rm -it
-v ./models:/models
-e THREADS=6
-e MODEL_TYPE=starcoder
-e MODEL= " /models/santacoder-q4_0.bin "
-e GPU_LAYERS=32
-p 18080:18080
ghcr.io/ravenscroftj/turbopilot:v0.2.0-cuda11-7
Si vous disposez d'un GPU suffisamment grand, la configuration GPU_LAYERS
permettra à turbopilot de décharger entièrement le calcul sur votre GPU plutôt que de copier les données d'avant en arrière, accélérant considérablement l'inférence.
Remplacez ghcr.io/ravenscroftj/turbopilot:v0.1.0-cuda11
par ghcr.io/ravenscroftj/turbopilot:v0.2.0-cuda12-0
ou ghcr.io/ravenscroftj/turbopilot:v0.2.0-cuda12-2
si vous utilisez CUDA 12.0 ou 12.2 respectivement.
Vous aurez besoin de CUDA 11 ou CUDA 12 plus tard pour exécuter ce conteneur. Vous devriez pouvoir voir /app/turbopilot
répertorié lorsque vous exécutez nvidia-smi
.
Depuis la version 0.0.5, une version CUDA de l'exécutable Linux est disponible - elle nécessite que libcublas 11 soit installé sur la machine - je pourrais créer des debs Ubuntu à un moment donné, mais pour l'instant, exécuter dans Docker peut être plus pratique si vous souhaitez utiliser un GPU CUDA.
Vous pouvez utiliser le déchargement GPU via l'option --ngl
.
Le support du plugin copilot officiel VS Code est en cours (Voir ticket n°11). L'API devrait désormais être largement compatible avec OpenAI.
Pour utiliser l'API de VSCode, je recommande le plugin vscode-fauxpilot. Une fois installé, vous devrez modifier quelques paramètres dans votre fichier settings.json.
Preferences: Open User Settings (JSON)
{
... // other settings
"fauxpilot.enabled" : true ,
"fauxpilot.server" : " http://localhost:18080/v1/engines " ,
}
Vous pouvez maintenant activer Fauxpilot avec CTRL + SHIFT + P
et sélectionner Enable Fauxpilot
Le plugin enverra des appels API au processus codegen-serve
en cours d'exécution lorsque vous effectuez une frappe. Il attendra ensuite que chaque demande soit terminée avant d'envoyer d'autres demandes.
Vous pouvez envoyer des requêtes à http://localhost:18080/v1/engines/codegen/completions
qui se comporteront comme le même point de terminaison Copilot.
Par exemple:
curl --request POST
--url http://localhost:18080/v1/engines/codegen/completions
--header ' Content-Type: application/json '
--data ' {
"model": "codegen",
"prompt": "def main():",
"max_tokens": 100
} '
Vous devriez obtenir quelque chose comme ceci :
{
"choices" : [
{
"logprobs" : null ,
"index" : 0 ,
"finish_reason" : " length " ,
"text" : " n """ Main entry point for this script. """n logging.getLogger().setLevel(logging.INFO) n logging.basicConfig(format=('%(levelname)s: %(message)s')) nn parser = argparse.ArgumentParser( n description=__doc__, n formatter_class=argparse.RawDescriptionHelpFormatter, n epilog=__doc__) n "
}
],
"created" : 1681113078 ,
"usage" : {
"total_tokens" : 105 ,
"prompt_tokens" : 3 ,
"completion_tokens" : 102
},
"object" : " text_completion " ,
"model" : " codegen " ,
"id" : " 01d7a11b-f87c-4261-8c03-8c78cbe4b067 "
}