Les premiers pas
OLMo est un dépôt pour l'entraînement et l'utilisation des modèles de langage ouverts de pointe d'AI2. Conçu par des scientifiques, pour des scientifiques.
Installation
Installez d'abord PyTorch en suivant les instructions spécifiques à votre système d'exploitation.
Pour l'entraînement et le réglage fin, nous recommandons l'installation depuis les sources :
|
git clone https://github.com/allenai/OLMo.git cd OLMo pip install -e .[all] |
Vous pouvez également installer depuis PyPI avec :
| pip install ai2-olmo |
Pré-entraînement
Le pré-entraînement OLMo suit une procédure d'entraînement en deux étapes. Dans un premier temps, nous nous entraînons sur de grandes quantités de données, principalement issues du web : OLMo-mix-1124. Dans un deuxième temps, nous nous entraînons sur une plus petite quantité de données ciblées et de haute qualité : Dolmino-mix-1124.
Vous trouverez tous les points de contrôle, au minimum toutes les 1 000 étapes d'entraînement, dans le noyau OLMo et au format Hugging Face :
| Variante | OLMo Format (Stage 1) | OLMo Format (Stage 2) | Hugging Face Format |
|---|---|---|---|
| OLMo-2 1B | OLMo-2 1B | OLMo-2 1B | Hugging Face pour la variante 1B |
| OLMo-2 7B | OLMo-2 7B | OLMo-2 7B | Hugging Face pour la variante 7B |
| OLMo-2 13B | OLMo-2 13B | OLMo-2 13B | Hugging Face pour la variante 13B |
| OLMo-2 32B | OLMo-2 32B | OLMo-2 32B | Hugging Face pour la variante 32B |
Remarque : La variante 32B a été entraînée sur notre nouveau simulateur. Pour entraîner ou affiner OLMo-2 32B, rendez-vous sur OLMo-core.
Étapes de reproduction
Pour reproduire l'un des processus d'entraînement décrits ci-dessous, exécutez :
| torchrun --nproc_per_node=8 scripts/train.py {path_to_train_config} |
Pour la configuration d'entraînement, utilisez l'une des configurations listées ci-dessous.
Si vous souhaitez remplacer certains paramètres de la configuration d'entraînement sans avoir à écrire une nouvelle configuration à chaque fois, procédez comme suit :
|
torchrun --nproc_per_node=8 scripts/train.py {path_to_train_config} \ --setting1=value \ --setting2=value \ --setting3.subsetting1=value |
Les configurations d'entraînement ci-dessous concernent les données d'entraînement diffusées en direct via HTTP. Pour une reproduction à grande échelle, nous vous recommandons de télécharger les fichiers localement et de modifier les chemins d'accès pour qu'ils pointent vers votre système de fichiers local.
Pour une exécution sur des appareils Mac :
| python scripts/train.py {path_to_train_config} |
Exemple :
| python scripts/train.py configs/tiny/OLMo-20M.yaml --save_overwrite |
Remarque : Vous devez mettre à jour PyTorch vers la version 2.5.x pour l'exécuter.
Étape 1
L'étape 1 est la plus importante. Nous nous entraînons sur des jetons de 4 T ou 5 T, principalement basés sur des données Web.
| OLMo2 1B | OLMo2 7B | OLMo2 13B | |
|---|---|---|---|
| Nombre de jetons | 4 000 milliards | 4 000 milliards | 5 000 milliards |
| Point de contrôle | stage1-step1907359-tokens4001B | stage1-step928646-tokens3896B | stage1-step596057-tokens5001B |
| Configuration d'entraînement | OLMo2-1B-stage1.yaml | OLMo2-7B-stage1.yaml | OLMo2-13B-stage1.yaml |
| WandB | wandb.ai/OLMo2-1B | wandb.ai/OLMo2-7B | wandb.ai/OLMo2-13B |
Vous trouverez ici les fichiers .csv.gz contenant les données d'entraînement.
Étape 2 pour le 1B
Pour le modèle 1B, nous avons formé trois fois avec un ordre de données différent sur 50B jetons de haute qualité, en utilisant le dernier point de contrôle de la graine 42 comme point de contrôle final.
| Point de contrôle | Configuration d'entraînement | WandB | |
|---|---|---|---|
| graine aléatoire 42049 | stage2-ingredient1-step23852-tokens50B | OLMo2-1B-stage2-seed42069.yaml | wandb.ai/OLMo2-1B |
| graine aléatoire 666 | stage2-ingredient2-step23852-tokens50B | OLMo2-1B-stage2-seed666.yaml | wandb.ai/OLMo2-1B |
| graine aléatoire 42 (main) | stage2-ingredient3-step23852-tokens50B | OLMo2-1B-stage2-seed42.yaml | wandb.ai/OLMo2-1B |
Étape 2 pour le modèle 7B
Pour le modèle 7B, nous effectuons trois entraînements avec un ordre de données différent sur 50 B jetons de haute qualité, puis nous calculons la moyenne des modèles.
| Point de contrôle | Configuration d'entraînement | WandB | |
|---|---|---|---|
| graine aléatoire 42 | stage2-ingredient1-step11931-tokens50B | OLMo2-7B-stage2-seed42.yaml | wandb.ai/OLMo2-7B |
| graine aléatoire 42069 | stage2-ingredient2-step11931-tokens50B | OLMo2-7B-stage2-seed42069.yaml | wandb.ai/OLMo2-7B |
| graine aléatoire 666 | stage2-ingredient3-step11931-tokens50B | OLMo2-7B-stage2-seed666.yaml | wandb.ai/OLMo2-7B |
| modèle final gonflé | main | pas de configuration, ils ont juste fait la moyenne des poids en Python |
Les configurations d'entraînement liées ici sont configurées pour télécharger le dernier point de contrôle après l'étape 1 et démarrer l'entraînement à partir de là.
Étape 2 pour le modèle 13B
Pour le modèle 13B, ils effectuent trois entraînements avec un ordre de données différent sur 100 B de jetons de haute qualité, puis une fois de plus sur 300 B de jetons de haute qualité. Ils calculons ensuite la moyenne des modèles.
| Point de contrôle | Configuration d'entraînement | WandB | |
|---|---|---|---|
| graine aléatoire 1110, 100B | stage2-ingredient1-step11931-tokens100B | OLMo2-13B-stage2-seed1110-100B.yaml | wandb.ai/OLMo2-13B |
| graine aléatoire 2662, 100B | stage2-ingredient2-step11931-tokens100B | OLMo2-13B-stage2-seed2662-100B.yaml | wandb.ai/OLMo2-13B |
| graine aléatoire 6209, 100B | stage2-ingredient3-step11931-tokens100B | OLMo2-13B-stage2-seed6209-100B.yaml | wandb.ai/OLMo2-13B |
| graine aléatoire 2662, 300B | stage2-ingredient4-step11931-tokens300B | OLMo2-13B-stage2-seed2662-300B.yaml | wandb.ai/OLMo2-13B |
| modèle final gonflé | main | pas de configuration, ils ont juste fait la moyenne des poids en Python |
Les configurations d'entraînement liées ici permettent de télécharger les derniers points de contrôle après l'étape 1 et de démarrer l'entraînement à partir de là.
Remarque : Vous trouverez toutes les informations sur le 32B dans le dépôt OLMo-core.
Variantes optimisées pour les instructions
Pour les variantes optimisées pour les instructions de ces modèles, consultez :
- OLMo2 1B Instruct
- OLMo2 7B Instruct
- OLMo2 13B Instruct
- OLMo2 32B Instruct
Inférence
Vous pouvez utiliser notre intégration Hugging Face pour exécuter une inférence sur les points de contrôle des Transformers OLMo :
- from transformers import AutoModelForCausalLM, AutoTokenizer
- olmo = AutoModelForCausalLM.from_pretrained("allenai/OLMo-2-0425-1B")
- tokenizer = AutoTokenizer.from_pretrained("allenai/OLMo-2-0425-1B")
- message = ["La modélisation du langage est "]
- inputs = tokenizer(message, return_tensors='pt', return_token_type_ids=False)
- # vérification facultative de cuda
- # inputs = {k: v.to('cuda') for k,v in inputs.items()}
- # olmo = olmo.to('cuda')
- response = olmo.generate(**inputs, max_new_tokens=100, do_sample=True, top_k=50, top_p=0.95)
- print(tokenizer.batch_decode(response, skip_special_tokens=True)[0])
Alternativement, avec l'abstraction du pipeline Hugging Face :
- from transformers import pipeline
- olmo_pipe = pipeline("text-generation", model="allenai/OLMo-2-0425-1B")
- print(olmo_pipe("La modélisation du langage est"))
Quantification
- olmo = AutoModelForCausalLM.from_pretrained("allenai/OLMo-2-0425-1B", torch_dtype=torch.float16, load_in_8bit=True) # nécessite bitsandbytes
Le modèle quantifié est sensible aux types d'entrée et à la gestion CUDA. Pour éviter tout problème potentiel, nous recommandons de convertir explicitement les identifiants d'entrée en CUDA à l'aide de : inputs.input_ids.to('cuda')
Évaluation
Des outils supplémentaires pour l'évaluation des modèles OLMo sont disponibles dans les dépôts OLMo Eval et olmes.
Hébergement Modal.com
Un exemple de script est fourni pour héberger un modèle OLMo 2 sur Modal.com à l'aide de l'API OpenAI dans ./scripts/olmo2_modal_openai.py. Pour l'exécuter :
- Suivez les instructions de la section «Getting Started in the Modal.com» pour installer la bibliothèque Modal et les outils de ligne de commande.
- Suivez les instructions de la section «Secrets in the Modal.com» pour créer un secret Modal nommé «example-secret-token» définissant une valeur pour la variable MODAL_TOKEN de votre serveur.
- Exécutez ensuite
| modal deploy ./scripts/olmo2_modal_openai.py |
Vous pouvez vérifier votre point de terminaison à l'aide de curl de la manière suivante :
|
curl -X POST \ -H "Authorization: Bearer [the secret token from above]" \ -H "Content-Type: application/json" \ -d @body.json \ https://[the web endpoint modal creates above]/v1/chat/completions |
où body.json est de la forme :
- {
- "model": "OLMo-2-1124-13B-Instruct",
- "messages": [
- {
- "role": "user",
- "content": "Who was Alan Turing?"
- }
- ],
- "max_tokens": 100,
- "temperature": 0.9,
- "stream": true
- }
Citer :
- @misc{olmo20242olmo2furious,
- title={2 OLMo 2 Furious},
- author={Team OLMo and Pete Walsh and Luca Soldaini and Dirk Groeneveld and Kyle Lo and Shane Arora and Akshita Bhagia and Yuling Gu and Shengyi Huang and Matt Jordan and Nathan Lambert and Dustin Schwenk and Oyvind Tafjord and Taira Anderson and David Atkinson and Faeze Brahman and Christopher Clark and Pradeep Dasigi and Nouha Dziri and Michal Guerquin and Hamish Ivison and Pang Wei Koh and Jiacheng Liu and Saumya Malik and William Merrill and Lester James V. Miranda and Jacob Morrison and Tyler Murray and Crystal Nam and Valentina Pyatkin and Aman Rangapur and Michael Schmitz and Sam Skjonsberg and David Wadden and Christopher Wilhelm and Michael Wilson and Luke Zettlemoyer and Ali Farhadi and Noah A. Smith and Hannaneh Hajishirzi},
- year={2024},
- eprint={2501.00656},
- archivePrefix={arXiv},
- primaryClass={cs.CL},
- url={https://arxiv.org/abs/2501.00656},
- }