OpenGVLab/InternVL
510
1# --------------------------------------------------------2# InternVL3# Copyright (c) 2024 OpenGVLab4# Licensed under The MIT License [see LICENSE for details]5# --------------------------------------------------------6 7import base648import json9from io import BytesIO10 11import requests12from PIL import Image13 14 15def get_model_list(controller_url):16 ret = requests.post(controller_url + '/refresh_all_workers')17 assert ret.status_code == 20018 ret = requests.post(controller_url + '/list_models')19 models = ret.json()['models']20 return models21 22 23def get_selected_worker_ip(controller_url, selected_model):24 ret = requests.post(controller_url + '/get_worker_address',25 json={'model': selected_model})26 worker_addr = ret.json()['address']27 return worker_addr28 29 30def pil_image_to_base64(image):31 buffered = BytesIO()32 image.save(buffered, format='PNG')33 return base64.b64encode(buffered.getvalue()).decode('utf-8')34 35 36controller_url = 'http://10.140.60.209:10075'37model_list = get_model_list(controller_url)38print(f'Model list: {model_list}')39 40selected_model = 'InternVL2-1B'41worker_addr = get_selected_worker_ip(controller_url, selected_model)42print(f'model_name: {selected_model}, worker_addr: {worker_addr}')43 44 45# 多轮/多图对话请把数据组织成以下格式:46# send_messages = [{'role': 'system', 'content': system_message}]47# send_messages.append({'role': 'user', 'content': 'question1 to image1', 'image': [pil_image_to_base64(image)]})48# send_messages.append({'role': 'assistant', 'content': 'answer1'})49# send_messages.append({'role': 'user', 'content': 'question2 to image2', 'image': [pil_image_to_base64(image)]})50# send_messages.append({'role': 'assistant', 'content': 'answer2'})51# send_messages.append({'role': 'user', 'content': 'question3 to image1 & 2', 'image': []})52 53image = Image.open('image1.jpg')54print(f'Loading image, size: {image.size}')55system_message = """我是书生·万象,英文名是InternVL,是由上海人工智能实验室及多家合作单位联合开发的多模态大语言模型。人工智能实验室致力于原始技术创新,开源开放,共享共创,推动科技进步和产业发展。56请尽可能详细地回答用户的问题。"""57send_messages = [{'role': 'system', 'content': system_message}]58send_messages.append({'role': 'user', 'content': 'describe this image in detail', 'image': [pil_image_to_base64(image)]})59 60pload = {61 'model': selected_model,62 'prompt': send_messages,63 'temperature': 0.8,64 'top_p': 0.7,65 'max_new_tokens': 2048,66 'max_input_tiles': 12,67 'repetition_penalty': 1.0,68}69headers = {'User-Agent': 'InternVL-Chat Client'}70response = requests.post(worker_addr + '/worker_generate_stream',71 headers=headers, json=pload, stream=True, timeout=10)72for chunk in response.iter_lines(decode_unicode=False, delimiter=b'\0'):73 if chunk:74 data = json.loads(chunk.decode())75 if data['error_code'] == 0:76 output = data['text'] # 这里是流式输出77 else:78 output = data['text'] + f" (error_code: {data['error_code']})"79# 完整的输出80print(output)81 