Views
No views yet
1import numpy as np
2import torch
3from PIL import Image
4from transformers import AutoModel, AutoTokenizer
5
6model_id = "yujiepan/minicpm-v-4-tiny-random"
7model = AutoModel.from_pretrained(model_id, trust_remote_code=True,
8 attn_implementation='sdpa', torch_dtype=torch.bfloat16)
9model = model.eval().cuda()
10tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
11
12image = Image.fromarray(np.random.randint(0, 255, (224, 224, 3), dtype=np.uint8), 'RGB')
13question = "What is the landform in the picture?"
14msgs = [{'role': 'user', 'content': [image, question]}]
15answer = model.chat(
16 msgs=msgs,
17 image=image,
18 tokenizer=tokenizer,
19 max_new_tokens=32,
20)
21print(answer)
22
23# Second round chat, pass history context of multi-turn conversation
24msgs.append({"role": "assistant", "content": [answer]})
25msgs.append({"role": "user", "content": [
26 "What should I pay attention to when traveling here?"]})
27answer = model.chat(
28 msgs=msgs,
29 image=None,
30 tokenizer=tokenizer,
31 max_new_tokens=32,
32)
33print(answer)1import json
2from pathlib import Path
3
4import accelerate
5import torch
6from huggingface_hub import hf_hub_download
7from transformers import (
8 AutoConfig,
9 AutoModel,
10 AutoModelForCausalLM,
11 AutoProcessor,
12 AutoTokenizer,
13 GenerationConfig,
14 set_seed,
15)
16
17source_model_id = "openbmb/MiniCPM-V-4"
18save_folder = "/tmp/yujiepan/minicpm-v-4-tiny-random"
19
20processor = AutoProcessor.from_pretrained(source_model_id, trust_remote_code=True)
21processor.save_pretrained(save_folder)
22
23with open(hf_hub_download(source_model_id, filename='config.json', repo_type='model',), 'r', encoding='utf-8') as f:
24 config_json = json.load(f)
25for k, v in config_json['auto_map'].items():
26 config_json['auto_map'][k] = f'{source_model_id}--{v}'
27automap = config_json['auto_map']
28
29config_json['head_dim'] = 32
30config_json["hidden_size"] = 128 # required by Sampler -- num_heads=embed_dim // 128
31config_json['intermediate_size'] = 128
32config_json['num_attention_heads'] = 2
33config_json['num_key_value_heads'] = 1
34config_json['num_hidden_layers'] = 2
35config_json['tie_word_embeddings'] = True
36
37factor = config_json['rope_scaling']['long_factor']
38config_json['rope_scaling']['long_factor'] = factor[:16]
39config_json['rope_scaling']['short_factor'] = factor[:16]
40
41config_json['vision_config']['intermediate_size'] = 128
42config_json['vision_config']['hidden_size'] = 64
43config_json['vision_config']['num_attention_heads'] = 2
44config_json['vision_config']['num_hidden_layers'] = 2
45
46with open(f"{save_folder}/config.json", "w", encoding='utf-8') as f:
47 json.dump(config_json, f, indent=2)
48
49config = AutoConfig.from_pretrained(
50 save_folder,
51 trust_remote_code=True,
52)
53print(config)
54torch.set_default_dtype(torch.bfloat16)
55model = AutoModel.from_config(config, trust_remote_code=True)
56torch.set_default_dtype(torch.float32)
57model.generation_config = GenerationConfig.from_pretrained(
58 source_model_id, trust_remote_code=True,
59)
60set_seed(42)
61num_params = sum(p.numel() for p in model.parameters())
62with torch.no_grad():
63 for name, p in sorted(model.named_parameters()):
64 torch.nn.init.normal_(p, 0, 0.1)
65 print(name, p.shape, p.dtype, p.device, f'{p.numel() / num_params * 100: .2f}%')
66 pass
67model.save_pretrained(save_folder)
68
69def modify_automap(path, source_model_id):
70 import json
71 with open(path, 'r', encoding='utf-8') as f:
72 content = json.load(f)
73 automap = {}
74 if content.get('auto_map', None) is not None:
75 for key, value in content.get('auto_map').items():
76 if isinstance(value, str):
77 value = source_model_id + '--' + value.split('--')[-1]
78 else:
79 value = [(source_model_id + '--' + v.split('--')[-1]) for v in value]
80 automap[key] = value
81 with open(path, 'w', encoding='utf-8') as f:
82 json.dump({**content, 'auto_map': automap}, f, indent=2)
83
84modify_automap(f"{save_folder}/config.json", source_model_id)
85modify_automap(f'{save_folder}/processor_config.json', source_model_id)
86modify_automap(f'{save_folder}/preprocessor_config.json', source_model_id)
87modify_automap(f'{save_folder}/tokenizer_config.json', source_model_id)
88for f in Path(save_folder).glob('*.py'):
89 f.unlink()