Code Llama : Meta convertit Llama 2 à la génération de code
Meta AI a dévoilé Code Llama, son alternative à Codex d’OpenAI et à CodeWhisper d’AWS. Les modèles de la collection s’avèrent performants, allant jusqu’à surpasser les capacités de Codex d’OpenAI, le modèle à l’origine de GitHub Copilot, et StarCoder, le projet développé par Servicenow et Hugging Face.
Tout comme Llama 2, Code Llama et ses variantes peuvent être utilisés à des fins commerciales. Ils sont soumis à la même licence propriétaire permissive.
Cette collection de grands modèles de langages (LLM) est dérivée du fine-tuning de Llama 2 sur un corpus comprenant des séquences de code et du texte. C’est une approche différente de celle de l’équipe BigCode (ServiceNow et Hugging Face), dont les modèles StarCoder sont uniquement entraînés à partir de séquences de code.
Dans le détail, Meta AI évoque un modèle de fondation, Code Llama, un modèle spécialisé dans la génération de code Python, Code Llama-Python, et un modèle de suivi d’instructions tel GPT-4, nommé Code Llama-Instruct.
Là encore, la branche de recherche en IA propose trois modèles de taille différente par variante. Ils sont dotés de 7, 13 et 34 milliards de paramètres.
Si Meta AI avait jusqu’alors mis à disposition un LLM de 70 milliards de paramètres, Llama 2-34B était également évoqué dans l’article technique paru en juillet dernier. Au total, les neuf modèles ont réclamé l’équivalent de 400 000 heures-GPU de calcul. Ils ont été entraînés à l’aide de cartes Nvidia A100 dotées de 80 Go de VRAM chacune (les chercheurs n’en précisent pas le nombre) depuis le HPC Research Super Cluster. Rappelons que les collections Llama 2 et Code Llama ont été entraînées simultanément, entre janvier et juillet 2023.
Meta AI décline ses méthodes d’entraînement
En sus des deux billions de tokens (un token correspond à une suite de trois à quatre caractères N.D.L.R.) utilisés pour former Llama 2, Code Llama a été entraîné à partir d’un corpus de 500 milliards de tokens composé à 85 % de code issu de dépôt Git public. Ce jeu de données contient des portions de code écrites en Bash, Python, C++, Java, PHP, C#, ou encore en TypeScript. Les proportions sont en revanche inconnues.
Le reste du corpus est composé de « langage naturel relatif au code » (des discussions à propos de langage de programmation et des commentaires de snippets de code) ainsi que de textes.
Pour obtenir Code Llama-Python, Code Llama a été affiné (« fine tuné ») à l’aide d’un corpus de 100 milliards de tokens supplémentaires composé à 75 % de code écrit en Python. Ici, Meta partage la philosophie d’IBM.
Les chercheurs de Meta AI précisent que le corpus de préentraînement de Llama 2 ne contenait « que » 80 milliards de tokens de code sur les deux billions de tokens collectés.
Pour entraîner Code Llama-Instruct, Meta AI a utilisé trois jeux de données différents.
Les chercheurs ont réutilisé le data set d’instruction propriétaire RLHF v5 obtenu à travers diverses passes d’apprentissage par renforcement avec feedbacks humains, afin d’obtenir des données sûres et fiables. L’idée est de distiller les garde-fous de Llama 2-Chat dans Code Llama-Instruct.
Considérant que l’annotation humaine de code serait coûteuse, les chercheurs ont ensuite généré 62 000 paires de questions-réponses relatives à la programmation à l’aide de Llama 2-70B. Puis, ils ont réclamé dix solutions avec Code Llama 7B, avant de les tester. Chaque fois qu’une solution passait le test, le trio question-test-solution était ajouté au jeu de données d’instruction. Le data set final comprend 14 000 triplets.
Le corpus de Code Llama-Instruct contient également 6 % d’exemples de code et 2 % de texte.
Là encore, Meta AI a fait appel à une Red Team, cette fois-ci composée de 25 personnes ayant des compétences en IA, en analyse de logiciels malicieux et en cybersécurité offensive. Cela a permis de limiter la propension des modèles à générer du code malicieux. Dans le cas où un usager contourne les garde-fous mis en place, les productions de ces LLMs seront facilement détectées, selon un membre de la red team de Meta AI.
« Le développement avancé de logiciels malveillants dépasse les capacités actuelles des LLM disponibles. Même un LLM avancé associé à un développeur de logiciels malveillants expert n’est pas particulièrement utile », assure-t-il. « La difficulté n’est pas d’écrire le code du logiciel malveillant. Cela dit, ces LLM peuvent produire un code qui sera aisément détecté s’il est utilisé directement ».
Une meilleure compréhension du contexte et des capacités de complétion de code
Aussi, les modèles Code Llama ont été entraînés à l’aide d’une fenêtre de contexte de 16 384 tokens, quand cette dernière est de 4 096 tokens pour Llama 2. Une étape de fine-tuning supplémentaire a permis de tester l’élargissement de cette fenêtre de contexte jusqu’à 100 000 tokens, afin de traiter de larges portions de code en entrée. Ici, Meta AI veut surpasser MosaicML, dont l’un des modèles peut prendre en charge jusqu’à 65 000 tokens en entrée, et égaler Claude 2 d’Anthropic, qui dispose d’une fenêtre de contexte de 100 000 tokens.
Pour cela, les chercheurs ont revu la manière d’implémenter la méthode RoPE (Rotary Position Embedding) dans la couche d’auto attention de leur architecture Transformer. Les « Positional Embeddings » sont des vecteurs qui représentent la position absolue d’un mot par rapport à un autre dans une phrase ou un texte. Elle se distingue de la méthode dite des positions relatives (Relative Position Embeddings) qui consiste à calculer la distance relative entre les mots d’un texte. Bien que précise, cette deuxième méthode s’avère gourmande en ressources de calcul. L’approche RoPE vise à bénéficier des avantages des deux techniques précédentes en appliquant une matrice de rotation aux vecteurs à position absolue. L’angle de la rotation représente la position d’un mot par rapport à un autre. RoPE demeure efficace, peu importe la fenêtre de contexte, et permet de réduire l’interdépendance des mots au fur et à mesure que leur distance relative croît. Qui plus est, son exécution s’avère moins gourmande en ressources.
Ici, pour obtenir une fenêtre de contexte de 16 000 tokens et plus, Meta AI a augmenté de 10 000 à 1 million la fréquence de rotation des vecteurs lors du fine-tuning des modèles.
Code LLama 7B et 13B et leurs variantes Instruct peuvent également effectuer des tâches de complétion de code. Ce deuxième objectif lors de la phase d’entraînement des modèles a été complété en combinant les approches de prédiction autorégressive et causale. Ici, les modèles ont été entraînés pour que le code généré corresponde au mieux aux préfixes et suffixes existants, en masquant une partie du code à générer.
Les « petits » de Code Llama, déjà dans la cour des grands
Résultat, tous les modèles Code Llama surpassent les capacités de Llama 2 lors des benchmarks. Code Llama-34B bat Codex d’OpenAI de 10 points dans chacune des trois évaluations réalisées : HumanEval, MBPP et Multilingual Eval. Les modèles battent de peu leurs équivalents StarCoder. « Sur les tests multilingues, même notre plus petit modèle (Code Llama-7B) dépasse tous les autres modèles publics », écrivent les chercheurs de Meta AI.
Sur le tableau communiqué par Meta AI, GPT-4 demeure le champion au test HumanEval.
Pour autant, GPT-4 pourrait déjà avoir trouvé un compétiteur à sa hauteur. WizardLM, une équipe essentiellement composée de chercheurs de l’université baptiste de Hong Kong, a présenté le 26 août WizardCoder Python-34B. Cette déclinaison de Code Llama-Python-34B a été entraînée à l’aide du jeu de données synthétique Evol-Instruct… en à peine deux jours.
WizardCoder Python-34B obtient 73,2 % au test HumanEval Pass@1 quand GPT-4 obtenait 67 % à cette même évaluation en mars dernier. Toutefois, selon les benchmarks effectués par WizardLM, avec les API les plus récentes, GPT-4 obtenait 82 % le 26 août 2023.
En sus de la disponibilité du code d’inférence et des poids (sur demande sur la page GitHub de Meta AI), Code Llama et ses variantes sont accessibles depuis Hugging Face.
Afin de les utiliser, l’éditeur de la plateforme recommande de déployer une instance équipée d’un GPU Nvidia A10G pour les modèles dotés de 7 milliards de paramètres, un Nvidia A100 pour les modèles « 13B » et deux GPU Nvidia A100 (ou un seul avec la quantification activée) pour les variantes avec 34 milliards de paramètres. En utilisant la quantification sur 4 bits, une méthode de compression, Code Llama-34B peut s’exécuter sur un GPU grand public haut de gamme. Les porte-parole de Hugging Face ont pu tester la technique avec le RTX 3090, équipé de 24 Go de VRAM GDDR6X.