|
|
@@ -54,7 +54,7 @@ class TestMetadataMethod(unittest.TestCase):
|
|
|
self.assertEqual(gguf.Metadata.get_model_id_components("NousResearch/Meta-Llama-3-8B"),
|
|
|
('Meta-Llama-3-8B', "NousResearch", 'Meta-Llama-3', None, None, '8B'))
|
|
|
|
|
|
- # Can't detect all non standard form in a heuristically safe way... best to err in caution and output nothing...
|
|
|
+ # Non standard naming
|
|
|
self.assertEqual(gguf.Metadata.get_model_id_components("Qwen1.5-MoE-A2.7B-Chat"),
|
|
|
('Qwen1.5-MoE-A2.7B-Chat', None, 'Qwen1.5-MoE', 'Chat', None, 'A2.7B'))
|
|
|
|
|
|
@@ -71,7 +71,7 @@ class TestMetadataMethod(unittest.TestCase):
|
|
|
self.assertEqual(gguf.Metadata.get_model_id_components("delphi-suite/stories-llama2-50k", 50 * 10**3),
|
|
|
('stories-llama2-50k', 'delphi-suite', 'stories-llama2', None, None, '50K'))
|
|
|
|
|
|
- # None standard and not easy to disambiguate
|
|
|
+ # Non standard and not easy to disambiguate
|
|
|
self.assertEqual(gguf.Metadata.get_model_id_components("DeepSeek-Coder-V2-Lite-Instruct"),
|
|
|
('DeepSeek-Coder-V2-Lite-Instruct', None, 'DeepSeek-Coder-V2-Lite', 'Instruct', None, None))
|
|
|
|
|
|
@@ -123,6 +123,51 @@ class TestMetadataMethod(unittest.TestCase):
|
|
|
self.assertEqual(gguf.Metadata.get_model_id_components("bigscience/bloom-7b1-petals"),
|
|
|
('bloom-7b1-petals', 'bigscience', 'bloom', 'petals', None, '7.1B'))
|
|
|
|
|
|
+ # Ignore full-text size labels when there are number-based ones, and deduplicate size labels
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("MaziyarPanahi/GreenNode-mini-7B-multilingual-v1olet-Mistral-7B-Instruct-v0.1"),
|
|
|
+ ('GreenNode-mini-7B-multilingual-v1olet-Mistral-7B-Instruct-v0.1', 'MaziyarPanahi', 'GreenNode-mini', 'multilingual-v1olet-Mistral-Instruct', 'v0.1', '7B'))
|
|
|
+
|
|
|
+ # Instruct in a name without a size label
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("mistralai/Mistral-Nemo-Instruct-2407"),
|
|
|
+ ('Mistral-Nemo-Instruct-2407', 'mistralai', 'Mistral-Nemo', 'Instruct', '2407', None))
|
|
|
+
|
|
|
+ # Non-obvious splitting relying on 'chat' keyword
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("deepseek-ai/DeepSeek-V2-Chat-0628"),
|
|
|
+ ('DeepSeek-V2-Chat-0628', 'deepseek-ai', 'DeepSeek-V2', 'Chat', '0628', None))
|
|
|
+
|
|
|
+ # Multiple versions
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("OpenGVLab/Mini-InternVL-Chat-2B-V1-5"),
|
|
|
+ ('Mini-InternVL-Chat-2B-V1-5', 'OpenGVLab', 'Mini-InternVL', 'Chat', 'V1-5', '2B'))
|
|
|
+
|
|
|
+ # TODO: DPO in the name
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("jondurbin/bagel-dpo-2.8b-v0.2"),
|
|
|
+ ('bagel-dpo-2.8b-v0.2', 'jondurbin', 'bagel-dpo', None, 'v0.2', '2.8B'))
|
|
|
+
|
|
|
+ # DPO in name, but can't be used for the finetune to keep 'LLaMA-3' in the basename
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("voxmenthe/SFR-Iterative-DPO-LLaMA-3-8B-R-unquantized"),
|
|
|
+ ('SFR-Iterative-DPO-LLaMA-3-8B-R-unquantized', 'voxmenthe', 'SFR-Iterative-DPO-LLaMA-3', 'R-unquantized', None, '8B'))
|
|
|
+
|
|
|
+ # Too ambiguous
|
|
|
+ # TODO: should "base" be a 'finetune' or 'size_label'?
|
|
|
+ # (in this case it should be a size label, but other models use it to signal that they are not finetuned)
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("microsoft/Florence-2-base"),
|
|
|
+ ('Florence-2-base', 'microsoft', None, None, None, None))
|
|
|
+
|
|
|
+ ## Invalid cases ##
|
|
|
+
|
|
|
+ # Start with a dash and has dashes in rows
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("mistralai/-Mistral--Nemo-Base-2407-"),
|
|
|
+ ('-Mistral--Nemo-Base-2407-', 'mistralai', 'Mistral-Nemo-Base', None, '2407', None))
|
|
|
+
|
|
|
+ ## LoRA ##
|
|
|
+
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("Llama-3-Instruct-abliteration-LoRA-8B"),
|
|
|
+ ('Llama-3-Instruct-abliteration-LoRA-8B', None, 'Llama-3', 'Instruct-abliteration-LoRA', None, '8B'))
|
|
|
+
|
|
|
+ # Negative size --> output is a LoRA adaper --> prune "LoRA" out of the name to avoid redundancy with the suffix
|
|
|
+ self.assertEqual(gguf.Metadata.get_model_id_components("Llama-3-Instruct-abliteration-LoRA-8B", -1234),
|
|
|
+ ('Llama-3-Instruct-abliteration-LoRA-8B', None, 'Llama-3', 'Instruct-abliteration', None, '8B'))
|
|
|
+
|
|
|
def test_apply_metadata_heuristic_from_model_card(self):
|
|
|
model_card = {
|
|
|
'tags': ['Llama-3', 'instruct', 'finetune', 'chatml', 'DPO', 'RLHF', 'gpt4', 'synthetic data', 'distillation', 'function calling', 'json mode', 'axolotl'],
|
|
|
@@ -134,7 +179,7 @@ class TestMetadataMethod(unittest.TestCase):
|
|
|
}
|
|
|
got = gguf.Metadata.apply_metadata_heuristic(gguf.Metadata(), model_card, None, None)
|
|
|
expect = gguf.Metadata()
|
|
|
- expect.base_models=[{'name': 'Mistral 7B Merge 14 v0', 'organization': 'EmbeddedLLM', 'version': 'v0', 'repo_url': 'https://huggingface.co/EmbeddedLLM/Mistral-7B-Merge-14-v0'}, {'name': 'Trinity v1', 'organization': 'Janai Hq', 'version': 'v1', 'repo_url': 'https://huggingface.co/janai-hq/trinity-v1'}]
|
|
|
+ expect.base_models=[{'name': 'Mistral 7B Merge 14 v0', 'organization': 'EmbeddedLLM', 'version': '14-v0', 'repo_url': 'https://huggingface.co/EmbeddedLLM/Mistral-7B-Merge-14-v0'}, {'name': 'Trinity v1', 'organization': 'Janai Hq', 'version': 'v1', 'repo_url': 'https://huggingface.co/janai-hq/trinity-v1'}]
|
|
|
expect.tags=['Llama-3', 'instruct', 'finetune', 'chatml', 'DPO', 'RLHF', 'gpt4', 'synthetic data', 'distillation', 'function calling', 'json mode', 'axolotl']
|
|
|
expect.languages=['en']
|
|
|
expect.datasets=['teknium/OpenHermes-2.5']
|