Spaces:
Paused
Paused
| # Copyright 2020-2025 The HuggingFace Team. All rights reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| # This script generates tiny models used in the TRL library for unit tests. It pushes them to the Hub under the | |
| # `trl-internal-testing` organization. | |
| # This script is meant to be run when adding new tiny model to the TRL library. | |
| from huggingface_hub import HfApi, ModelCard | |
| from transformers import ( | |
| AutoProcessor, | |
| AutoTokenizer, | |
| BartConfig, | |
| BartModel, | |
| BloomConfig, | |
| BloomForCausalLM, | |
| CLIPVisionConfig, | |
| CohereConfig, | |
| CohereForCausalLM, | |
| DbrxConfig, | |
| DbrxForCausalLM, | |
| DeepseekV3Config, | |
| DeepseekV3ForCausalLM, | |
| FalconMambaConfig, | |
| FalconMambaForCausalLM, | |
| Gemma2Config, | |
| Gemma2ForCausalLM, | |
| GemmaConfig, | |
| GemmaForCausalLM, | |
| GPT2Config, | |
| GPT2LMHeadModel, | |
| GPTNeoXConfig, | |
| GPTNeoXForCausalLM, | |
| Idefics2Config, | |
| Idefics2ForConditionalGeneration, | |
| LlamaConfig, | |
| LlamaForCausalLM, | |
| LlamaForSequenceClassification, | |
| LlavaConfig, | |
| LlavaForConditionalGeneration, | |
| LlavaNextConfig, | |
| LlavaNextForConditionalGeneration, | |
| MistralConfig, | |
| MistralForCausalLM, | |
| OPTConfig, | |
| OPTForCausalLM, | |
| PaliGemmaConfig, | |
| PaliGemmaForConditionalGeneration, | |
| Phi3Config, | |
| Phi3ForCausalLM, | |
| Qwen2Config, | |
| Qwen2ForCausalLM, | |
| Qwen2ForSequenceClassification, | |
| Qwen3Config, | |
| Qwen3ForCausalLM, | |
| Qwen3ForSequenceClassification, | |
| SiglipVisionConfig, | |
| T5Config, | |
| T5ForConditionalGeneration, | |
| ) | |
| from transformers.models.idefics2.configuration_idefics2 import Idefics2VisionConfig | |
| ORGANIZATION = "trl-internal-testing" | |
| MODEL_CARD = """ | |
| --- | |
| library_name: transformers | |
| tags: [trl] | |
| --- | |
| # Tiny {model_class_name} | |
| This is a minimal model built for unit tests in the [TRL](https://github.com/huggingface/trl) library. | |
| """ | |
| api = HfApi() | |
| def push_to_hub(model, tokenizer, prefix=None, suffix=None): | |
| model_class_name = model.__class__.__name__ | |
| content = MODEL_CARD.format(model_class_name=model_class_name) | |
| model_card = ModelCard(content) | |
| if prefix is not None: | |
| model_class_name = f"{prefix}-{model_class_name}" | |
| repo_id = f"{ORGANIZATION}/{model_class_name}" | |
| if suffix is not None: | |
| repo_id += f"-{suffix}" | |
| if api.repo_exists(repo_id): | |
| print(f"Model {repo_id} already exists, skipping") | |
| else: | |
| model.push_to_hub(repo_id) | |
| tokenizer.push_to_hub(repo_id) | |
| model_card.push_to_hub(repo_id) | |
| # Decoder models | |
| for model_id, config_class, model_class, suffix in [ | |
| ("bigscience/bloomz-560m", BloomConfig, BloomForCausalLM, None), | |
| ("CohereForAI/aya-expanse-8b", CohereConfig, CohereForCausalLM, None), | |
| ("databricks/dbrx-instruct", DbrxConfig, DbrxForCausalLM, None), | |
| ("deepseek-ai/DeepSeek-R1", DeepseekV3Config, DeepseekV3ForCausalLM, None), | |
| # It's important to have R1-0528 as it doesn't have the same chat template | |
| ("deepseek-ai/DeepSeek-R1-0528", DeepseekV3Config, DeepseekV3ForCausalLM, "0528"), | |
| ("tiiuae/falcon-7b-instruct", FalconMambaConfig, FalconMambaForCausalLM, None), | |
| ("google/gemma-2-2b-it", Gemma2Config, Gemma2ForCausalLM, None), | |
| ("google/gemma-7b-it", GemmaConfig, GemmaForCausalLM, None), | |
| ("openai-community/gpt2", GPT2Config, GPT2LMHeadModel, None), | |
| ("EleutherAI/pythia-14m", GPTNeoXConfig, GPTNeoXForCausalLM, None), | |
| ("meta-llama/Meta-Llama-3-8B-Instruct", LlamaConfig, LlamaForCausalLM, "3"), | |
| ("meta-llama/Llama-3.1-8B-Instruct", LlamaConfig, LlamaForCausalLM, "3.1"), | |
| ("meta-llama/Llama-3.2-1B-Instruct", LlamaConfig, LlamaForCausalLM, "3.2"), | |
| ("mistralai/Mistral-7B-Instruct-v0.1", MistralConfig, MistralForCausalLM, "0.1"), | |
| ("mistralai/Mistral-7B-Instruct-v0.2", MistralConfig, MistralForCausalLM, "0.2"), | |
| ("facebook/opt-1.3b", OPTConfig, OPTForCausalLM, None), | |
| ("microsoft/Phi-3.5-mini-instruct", Phi3Config, Phi3ForCausalLM, None), | |
| ("Qwen/Qwen2.5-32B-Instruct", Qwen2Config, Qwen2ForCausalLM, "2.5"), | |
| ("Qwen/Qwen2.5-Coder-0.5B", Qwen2Config, Qwen2ForCausalLM, "2.5-Coder"), | |
| ("Qwen/Qwen3-4B", Qwen3Config, Qwen3ForCausalLM, None), | |
| ]: | |
| tokenizer = AutoTokenizer.from_pretrained(model_id) | |
| config = config_class( | |
| vocab_size=tokenizer.vocab_size + len(tokenizer.added_tokens_encoder.keys()), | |
| hidden_size=8, | |
| num_attention_heads=4, | |
| num_key_value_heads=2, | |
| num_hidden_layers=2, | |
| intermediate_size=32, | |
| ) | |
| model = model_class(config) | |
| push_to_hub(model, tokenizer, "tiny", suffix) | |
| # Two slightly bigger models, required for vLLM testing | |
| tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-32B-Instruct") | |
| config = Qwen2Config( | |
| vocab_size=tokenizer.vocab_size + len(tokenizer.added_tokens_encoder.keys()), | |
| hidden_size=128, # increase hidden size so that hidden_size // num_attention_heads = 32, required for vLLM | |
| num_attention_heads=4, | |
| num_key_value_heads=2, | |
| num_hidden_layers=2, | |
| intermediate_size=32, | |
| ) | |
| model = Qwen2ForCausalLM(config) | |
| push_to_hub(model, tokenizer, "small", "2.5") | |
| tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-4B") | |
| config = Qwen3Config( | |
| vocab_size=tokenizer.vocab_size + len(tokenizer.added_tokens_encoder.keys()), | |
| hidden_size=128, # increase hidden size so that hidden_size // num_attention_heads = 32, required for vLLM | |
| num_attention_heads=4, | |
| num_key_value_heads=2, | |
| num_hidden_layers=2, | |
| intermediate_size=32, | |
| ) | |
| model = Qwen3ForCausalLM(config) | |
| push_to_hub(model, tokenizer, "small") | |
| # Reward models | |
| for model_id, config_class, model_class, suffix in [ | |
| ("meta-llama/Llama-3.2-1B-Instruct", LlamaConfig, LlamaForSequenceClassification, "3.2"), | |
| ("Qwen/Qwen2.5-32B-Instruct", Qwen2Config, Qwen2ForSequenceClassification, "2.5"), | |
| ("Qwen/Qwen3-4B", Qwen3Config, Qwen3ForSequenceClassification, None), | |
| ]: | |
| tokenizer = AutoTokenizer.from_pretrained(model_id) | |
| config = config_class( | |
| vocab_size=tokenizer.vocab_size + len(tokenizer.added_tokens_encoder.keys()), | |
| hidden_size=8, | |
| num_attention_heads=4, | |
| num_key_value_heads=2, | |
| num_hidden_layers=2, | |
| intermediate_size=32, | |
| num_labels=1, | |
| ) | |
| model = model_class(config) | |
| push_to_hub(model, tokenizer, "tiny", suffix) | |
| # Encoder-decoder models | |
| for model_id, config_class, model_class, suffix in [ | |
| ("google/flan-t5-small", T5Config, T5ForConditionalGeneration, None), | |
| ("facebook/bart-base", BartConfig, BartModel, None), | |
| ]: | |
| tokenizer = AutoTokenizer.from_pretrained(model_id) | |
| config = config_class( | |
| vocab_size=tokenizer.vocab_size + len(tokenizer.added_tokens_encoder.keys()), | |
| d_model=16, | |
| encoder_layers=2, | |
| decoder_layers=2, | |
| d_kv=2, | |
| d_ff=64, | |
| num_layers=6, | |
| num_heads=8, | |
| decoder_start_token_id=0, | |
| is_encoder_decoder=True, | |
| ) | |
| model = model_class(config) | |
| push_to_hub(model, tokenizer, "tiny", suffix) | |
| # Vision Language Models | |
| # fmt: off | |
| for model_id, config_class, text_config_class, vision_config_class, model_class in [ | |
| ("HuggingFaceM4/idefics2-8b", Idefics2Config, MistralConfig, Idefics2VisionConfig, Idefics2ForConditionalGeneration), | |
| ("llava-hf/llava-1.5-7b-hf", LlavaConfig, LlamaConfig, CLIPVisionConfig, LlavaForConditionalGeneration), | |
| ("llava-hf/llava-v1.6-mistral-7b-hf", LlavaNextConfig, MistralConfig, CLIPVisionConfig, LlavaNextForConditionalGeneration), | |
| ("google/paligemma-3b-pt-224", PaliGemmaConfig, GemmaConfig, SiglipVisionConfig, PaliGemmaForConditionalGeneration), | |
| ]: | |
| # fmt: on | |
| processor = AutoProcessor.from_pretrained(model_id) | |
| kwargs = {} | |
| if config_class == PaliGemmaConfig: | |
| kwargs["projection_dim"] = 8 | |
| vision_kwargs = {} | |
| if vision_config_class in [CLIPVisionConfig, SiglipVisionConfig]: | |
| vision_kwargs["projection_dim"] = 8 | |
| if vision_config_class == CLIPVisionConfig: | |
| vision_kwargs["image_size"] = 336 | |
| vision_kwargs["patch_size"] = 14 | |
| config = config_class( | |
| text_config=text_config_class( | |
| vocab_size=processor.tokenizer.vocab_size + len(processor.tokenizer.added_tokens_encoder), | |
| hidden_size=8, | |
| num_attention_heads=4, | |
| num_key_value_heads=2, | |
| num_hidden_layers=2, | |
| intermediate_size=32, | |
| ), | |
| vision_config=vision_config_class( | |
| hidden_size=8, | |
| num_attention_heads=4, | |
| num_hidden_layers=2, | |
| intermediate_size=32, | |
| **vision_kwargs, | |
| ), | |
| **kwargs, | |
| ) | |
| model = model_class(config) | |
| push_to_hub(model, processor, "tiny") | |