import gradio as gr import os import random import time import numpy as np import torch import warnings from PIL import Image from transformers import AutoTokenizer, AutoModelForCausalLM from model.model import Transformer from model.LMConfig import LMConfig from model.vision_utils import get_vision_model, get_img_process, get_img_embedding warnings.filterwarnings('ignore') def count_parameters(model): return sum(p.numel() for p in model.parameters() if p.requires_grad) def init_model(lm_config): tokenizer = AutoTokenizer.from_pretrained('./model/minimind_tokenizer') model_from = 2 # 1从权重,2用transformers if model_from == 1: moe_path = '_moe' if lm_config.use_moe else '' ckp = f'./out/{lm_config.dim}{moe_path}_vlm_sft.pth' model = Transformer(lm_config) state_dict = torch.load(ckp, map_location=device) # 处理不需要的前缀 unwanted_prefix = '_orig_mod.' for k, v in list(state_dict.items()): if k.startswith(unwanted_prefix): state_dict[k[len(unwanted_prefix):]] = state_dict.pop(k) for k, v in list(state_dict.items()): if 'mask' in k: del state_dict[k] # 加载到模型中 model.load_state_dict(state_dict, strict=False) else: model = AutoModelForCausalLM.from_pretrained('minimind-v-v1', trust_remote_code=True) model = model.to(device) print(f'模型参数: {count_parameters(model) / 1e6} 百万 = {count_parameters(model) / 1e9} B (Billion)') (vision_model, preprocess) = get_vision_model() vision_model = vision_model.to(device) return model, tokenizer, (vision_model, preprocess) def chat(prompt, current_image_path): # 打开图像并转换为RGB格式 image = Image.open(current_image_path).convert('RGB') image_process = get_img_process(image, preprocess).to(vision_model.device) # 对图像进行编码 image_encoder = get_img_embedding(image_process, vision_model).unsqueeze(0) prompt = f'{lm_config.image_special_token}\n{prompt}' messages = [{"role": "user", "content": prompt}] # print(messages) new_prompt = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True )[-(max_seq_len - 1):] x = tokenizer(new_prompt).data['input_ids'] x = (torch.tensor(x, dtype=torch.long, device=device)[None, ...]) with torch.no_grad(): res_y = model.generate(x, tokenizer.eos_token_id, max_new_tokens=max_seq_len, temperature=temperature, top_k=top_k, stream=stream, image_encoders=image_encoder) # print('[A]: ', end='') try: y = next(res_y) except StopIteration: print("No answer") return "No answer" history_idx = 0 while y != None: answer = tokenizer.decode(y[0].tolist()) if answer and answer[-1] == '�': try: y = next(res_y) except: break continue # print(answer) if not len(answer): try: y = next(res_y) except: break continue yield answer[history_idx:] try: y = next(res_y) except: break history_idx = len(answer) if not stream: break def launch_gradio_server(server_name="0.0.0.0", server_port=7788): with gr.Blocks() as demo: # # 顶部下拉菜单 # model_choice = gr.Dropdown(label="选择模型", choices=["minimind-v1-v", "minimind-v1-small-v"], # value="minimind-v1-v") gr.HTML(f"""