MiniCPM-o 2.6 多模态部署

参考:MiniCPM-o 2.6部署教程

测试效果

这是一幅超现实主义风格的抽象画,通常被归类为一种追求想象力潜力的风格。这种风格并不限制艺术表达的现实需求,而是鼓励创作者表达他们的想象力和对世界的自由解释。这种艺术流派的目的可能是通过挑战观众的感知和对现实的认知来引发情感或思考。虽然没有描述具体作品,这个流派往往涉及梦幻图像和非传统方式展示主题。这个风格的特点包括强调情感表现而非现实再现,以及打破传统形式和结构来表达看不见的内容。

这张图片展示了一幅游戏宣传图。画面中展示了一位角色站在岩石上,背对着观众,眺望着远处的山脉和一个宏伟的建筑物。角色穿着蓝色上衣和米色裤子,腿部穿着护具,背着弓和盾牌,还握着一把剑。背景中的天空有一些云彩,阳光从云层中透出。右侧有“THE LEGEND OF ZELDA BREATH OF THE WILD”的标题。在标题下方有一把剑,上面横放着一个风格化的图案。整体氛围充满冒险和史诗感。

这张图片是一张充满幻想色彩的动漫风格插画,来自游戏《原神》。画面背景是蓝天白云,展现出一种欢快而奇幻的氛围。 角色描述:左侧的角色穿着绿色和白色相间的服装,头发是绿色的,拥有翅膀和尾巴,给人以精灵或天使的感觉。从左数第二个角色穿着蓝色和紫色的服装,头发也是深蓝色,头上带有一些花朵装饰,显得优雅。中间的人物穿着白色和金色的服饰,头发是金黄色,显得非常亮丽和纯净。从右数第二个角色穿着简单但精致的白色和金色服饰,金色的头发,展现出一种高贵的气息。右侧的角色穿着深色的西装外套,内搭白色衬衫和金色领带,金发,带有些许神秘的气质。背景元素:天空中有许多飞行的生物,看起来像是鸟类,整体感觉愉悦和自由。背景还有一些漂浮的气球状物体,增加了场景的奇幻效果。其他细节:左上角有游戏《原神》的标志和创作团队的标志 © miHoYo。整体色调明亮,以蓝色和白色为主,衬托出宁静和友好的气氛。这张图片展现了多个人物角色在轻松愉快的场景中,可能代表着他们在游戏中的一些故事情节或场景

这是一个穿着西装领带的男人,站在讲台后面。他似乎正在和观众说话,并且抬起一只手做出表达性的手势。背景是蓝色的,布满了白色的星星图案,这表明场景可能是一个正式的活动,或者是一个重要的场合。讲台上有一个带有官方标志的徽章,表明这个地点可能是一个政府或官方的场地。整体氛围是正式和重要的。

问:图片中的人做的手势是不是纳粹礼?请你仔细判别,并根据文献给出理由

答:图片中的手势并非纳粹礼。在图片中,人的右手在向上伸展并弯曲,这与纳粹礼(即“_seigfriedຜຸສິ”)的手势不同,纳粹礼通常是由右手向上挥动,手掌向内,并与肘部垂直。此外,根据文化与历史背景的不同,不同的手势在不同地区可能有不同的含义,但这个特定的手势在许多西方文化中被广泛理解为一个和平手势,有时被称为“V字手势”或“胜利手势”。它通常与胜利或和平相关联,并不是带有仇恨或不友善的象征。因此,从图片中的这个手势看来,不能将它与纳粹礼联系起来。

这张图片来自经典美国动画电影,标题为《汤姆和杰瑞》,这部动画片是为电视和家庭观众制作的,任何人观看都可能会觉得有趣。图片中包含明显的标志,表明了动画系列的制作公司,这通常是识别和推广该作品的重要视觉元素。此外,由于人物的夸张特征,比如大嘴巴和大张的嘴巴,图片传达出一种喜剧混乱的场景,这种场景对各个年龄段的观众都很吸引人。整体风格和设计是标准的卫星广播电视频道呈现的动画片,该频道曾是这样一个经典卡通节目的播出平台。

这张图片展示了两位身穿古代服饰的人物,其中一人头戴蓝色发带,类似古代官员或士兵的装扮。前景中的人物穿着浅灰色的长衫,下半身似乎装有两个袋子,可能是用来携带物品。背景似乎是传统的室内场景,有红色和蓝色的装饰。画面下方有文字标注“我操你妈”,这是用来表达惊讶或愤怒的粗俗语句。整体氛围显示出故事情节有些戏剧性和紧张。

这个图像描绘了一个夜景未来城市景观。主要元素包括:城市建筑:有多个带有照明窗户的高耸建筑,表明有活跃的城市环境。建筑物采用现代和可能未来主义的设计,强调垂直性和使用反光材料。标志和灯光:图中包括明亮的标志和霓虹灯,它们的颜色包括蓝色、绿色和红色,为夜空增添了活力。传统日本鸟居拱门被现代灯光和背景元素的混搭装饰,营造出复古和未来主义风格的融合。交通:几辆汽车以不同的方向行驶,其中一辆车由于其黄色颜色而突出。出现了描述不明的未来主义交通工具,为城市增添了科幻感。人物:可以看到几个形象,可能是角色或人物,带有防风衣和头盔,出现在画面的前景中。他们的存在为场景赋予了生活和活动,指向了场景内的叙事或情境。环境和氛围:地面是湿的,反射着灯光,表明最近下过雨或Currently raining。湿滑的表面为城市增添了码头的氛围,与明亮的灯光和现代化的建筑形成对比。总体而言,该图像呈现了一幅复杂且详细的场景,融合了传统和未来元素,暗示了融合了文化影响和科技进步的都市环境。

这张图片描绘了一个现代的城市景观,展示了两栋摩天大楼,它们在晴朗的蓝天背景下高耸入云。左侧的建筑是一栋带有独特倾斜设计的高大建筑,带有反光玻璃表面,太阳的光芒在它的外墙上形成了一道光带。右侧的摩天大楼也覆盖着玻璃外墙,似乎是直线设计,表面反射着阳光。在背景中,可以看到其他几个高层建筑,同样具有反光特性。在前景中,有一家带有中文字符的商业设施的标识,表明这是一个多元文化的城市地区。阳光明媚的一天突显了建筑物的反光特性以及周围环境的清澈

这张图片中有几个人围坐在一张圆木桌旁,可能是在家中或餐厅用餐。桌子上摆满了各种菜肴,有些盘子里似乎还有剩余的食物。环境给人一种温馨的感觉,背景墙是黄色的,并且桌上方有两盏带白色灯罩的灯具,为整个场景增添了温暖的氛围。大家都穿着休闲服装,氛围看起来很愉快,人们正在享用美食并进行交谈。

这张图片展示了一个家庭的温馨场景,由四个人组成,包括两位成年人和两个孩子。他们穿着接近的服装,具有节日的色彩。两位成年人似乎是在引导两个穿着红色服装的儿童,其中一名穿着红色上衣的男孩和一名穿着红色衣服的短发女孩。儿童们正在噼啪作响的烟花棒中找到快乐,在户外环境中,背景包括建筑元素和一个植物。场景传达了喜悦和庆祝的气氛,可能是为了特殊场合,比如新年。

这张图片显示了一位穿着制服的男士。他坐在一把黑色的椅子上,背后有一面中国国旗,显示出真实正式的场景。他穿着深色的制服,肩膀上有徽章,并在其外套胸部附近有一个编号。他的制服上还戴着肩章。背景中可以看到书架,上面摆放着一些书籍。整体环境显得正式而权威。

这张图片展示了一位年轻人在室内环境中进行篮球运动。他穿着黑色高领长袖上衣,灰色裤子和黑色鞋子,腰间系着一条细白色的吊带。他的脸上带着专注的表情,似乎正在向右边投篮。他的左臂伸直,轻轻地按压着篮球,似乎是在释放一个轻柔的投篮动作。背景是浅色的墙面,带有一些紫色和蓝色的装饰图案,右侧墙上有一个类似打印标志的图案。整体环境简洁,可能是用于室内训练或拍摄。

这张图片展示了一个现代化的城市场景,前景中的建筑物高度约为其他两座高楼的一半。这些建筑物采用玻璃和钢结构的建筑设计,给人一种现代感和高度感。前景中的建筑物是一个柱子连接到一个球状结构的圆柱形塔楼,这表明其设计包括独特的建筑元素,可能暗示着一个特定的用途,如观景塔或标志性地标。周围的建筑物也具有流线型的天际线,通常在繁忙的国际大都市地区可以看到。天空晴朗无云,表明这是一个阳光明媚的日子,非常适合展示这些建筑的优美设计。

部署

使用魔塔社区免费的24G GPU部署:

conda 使用3.10环境:

1
2
3
4
5
6
7
8
9
10
11
12
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash /root/autodl-tmp/ls/Miniconda3-latest-Linux-x86_64.sh
conda init​
source activate

conda create -n minicpmo python==3.10
conda activate minicpmo
pip3 install vllm>=0.7.1

#音视频推理,请安装视频/音频推理模块
pip3 install vllm[video]
pip3 install vllm[audio]
BASH

拉取模型:

1
git clone https://www.modelscope.cn/models/OpenBMB/MiniCPM-o-2_6
BASH

安装相关依赖:

1
pip3 install modelscope
BASH

运行 server,适当增加长度 max-model-len

1
vllm serve /mnt/workspace/MiniCPM-o-2_6 --dtype auto --max-model-len 4096 --api-key token-abc123 --gpu_memory_utilization 1 --trust-remote-code
BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/root/miniconda3/envs/minicpmo/lib/python3.10/site-packages/_distutils_hack/__init__.py:53: UserWarning: Reliance on distutils from stdlib is deprecated. Users must rely on setuptools to provide the distutils module. Avoid importing distutils or import setuptools first, and avoid setting SETUPTOOLS_USE_DISTUTILS=stdlib. Register concerns at https://github.com/pypa/setuptools/issues/new?template=distutils-deprecation.yml
warnings.warn(
INFO 02-13 14:09:33 __init__.py:190] Automatically detected platform cuda.
INFO 02-13 14:09:34 api_server.py:840] vLLM API server version 0.7.2
INFO 02-13 14:09:34 api_server.py:841] args: Namespace(subparser='serve', model_tag='/mnt/workspace/MiniCPM-o-2_6', config='', host=None, port=8000, uvicorn_log_level='info', allow_credentials=False, allowed_origins=['*'], allowed_methods=['*'], allowed_headers=['*'], api_key='token-abc123', lora_modules=None, prompt_adapters=None, chat_template=None, chat_template_content_format='auto', response_role='assistant', ssl_keyfile=None, ssl_certfile=None, ssl_ca_certs=None, ssl_cert_reqs=0, root_path=None, middleware=[], return_tokens_as_token_ids=False, disable_frontend_multiprocessing=False, enable_request_id_headers=False, enable_auto_tool_choice=False, enable_reasoning=False, reasoning_parser=None, tool_call_parser=None, tool_parser_plugin='', model='/mnt/workspace/MiniCPM-o-2_6', task='auto', tokenizer=None, skip_tokenizer_init=False, revision=None, code_revision=None, tokenizer_revision=None, tokenizer_mode='auto', trust_remote_code=True, allowed_local_media_path=None, download_dir=None, load_format='auto', config_format=<ConfigFormat.AUTO: 'auto'>, dtype='auto', kv_cache_dtype='auto', max_model_len=4096, guided_decoding_backend='xgrammar', logits_processor_pattern=None, model_impl='auto', distributed_executor_backend=None, pipeline_parallel_size=1, tensor_parallel_size=1, max_parallel_loading_workers=None, ray_workers_use_nsight=False, block_size=None, enable_prefix_caching=None, disable_sliding_window=False, use_v2_block_manager=True, num_lookahead_slots=0, seed=0, swap_space=4, cpu_offload_gb=0, gpu_memory_utilization=1.0, num_gpu_blocks_override=None, max_num_batched_tokens=None, max_num_seqs=None, max_logprobs=20, disable_log_stats=False, quantization=None, rope_scaling=None, rope_theta=None, hf_overrides=None, enforce_eager=False, max_seq_len_to_capture=8192, disable_custom_all_reduce=False, tokenizer_pool_size=0, tokenizer_pool_type='ray', tokenizer_pool_extra_config=None, limit_mm_per_prompt=None, mm_processor_kwargs=None, disable_mm_preprocessor_cache=False, enable_lora=False, enable_lora_bias=False, max_loras=1, max_lora_rank=16, lora_extra_vocab_size=256, lora_dtype='auto', long_lora_scaling_factors=None, max_cpu_loras=None, fully_sharded_loras=False, enable_prompt_adapter=False, max_prompt_adapters=1, max_prompt_adapter_token=0, device='auto', num_scheduler_steps=1, multi_step_stream_outputs=True, scheduler_delay_factor=0.0, enable_chunked_prefill=None, speculative_model=None, speculative_model_quantization=None, num_speculative_tokens=None, speculative_disable_mqa_scorer=False, speculative_draft_tensor_parallel_size=None, speculative_max_model_len=None, speculative_disable_by_batch_size=None, ngram_prompt_lookup_max=None, ngram_prompt_lookup_min=None, spec_decoding_acceptance_method='rejection_sampler', typical_acceptance_sampler_posterior_threshold=None, typical_acceptance_sampler_posterior_alpha=None, disable_logprobs_during_spec_decoding=None, model_loader_extra_config=None, ignore_patterns=[], preemption_mode=None, served_model_name=None, qlora_adapter_name_or_path=None, otlp_traces_endpoint=None, collect_detailed_traces=None, disable_async_output_proc=False, scheduling_policy='fcfs', override_neuron_config=None, override_pooler_config=None, compilation_config=None, kv_transfer_config=None, worker_cls='auto', generation_config=None, override_generation_config=None, enable_sleep_mode=False, calculate_kv_scales=False, disable_log_requests=False, max_log_len=None, disable_fastapi_docs=False, enable_prompt_tokens_details=False, dispatch_function=<function serve at 0x7f7f59c5d090>)
INFO 02-13 14:09:34 api_server.py:206] Started engine process with PID 1581
/root/miniconda3/envs/minicpmo/lib/python3.10/site-packages/_distutils_hack/__init__.py:53: UserWarning: Reliance on distutils from stdlib is deprecated. Users must rely on setuptools to provide the distutils module. Avoid importing distutils or import setuptools first, and avoid setting SETUPTOOLS_USE_DISTUTILS=stdlib. Register concerns at https://github.com/pypa/setuptools/issues/new?template=distutils-deprecation.yml
warnings.warn(
INFO 02-13 14:09:37 __init__.py:190] Automatically detected platform cuda.
INFO 02-13 14:09:39 config.py:542] This model supports multiple tasks: {'generate', 'embed', 'score', 'classify', 'reward'}. Defaulting to 'generate'.
INFO 02-13 14:09:43 config.py:542] This model supports multiple tasks: {'reward', 'classify', 'embed', 'generate', 'score'}. Defaulting to 'generate'.
INFO 02-13 14:09:43 llm_engine.py:234] Initializing a V0 LLM engine (v0.7.2) with config: model='/mnt/workspace/MiniCPM-o-2_6', speculative_config=None, tokenizer='/mnt/workspace/MiniCPM-o-2_6', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, override_neuron_config=None, tokenizer_revision=None, trust_remote_code=True, dtype=torch.bfloat16, max_seq_len=4096, download_dir=None, load_format=auto, tensor_parallel_size=1, pipeline_parallel_size=1, disable_custom_all_reduce=False, quantization=None, enforce_eager=False, kv_cache_dtype=auto, device_config=cuda, decoding_config=DecodingConfig(guided_decoding_backend='xgrammar'), observability_config=ObservabilityConfig(otlp_traces_endpoint=None, collect_model_forward_time=False, collect_model_execute_time=False), seed=0, served_model_name=/mnt/workspace/MiniCPM-o-2_6, num_scheduler_steps=1, multi_step_stream_outputs=True, enable_prefix_caching=False, chunked_prefill_enabled=False, use_async_output_proc=True, disable_mm_preprocessor_cache=False, mm_processor_kwargs=None, pooler_config=None, compilation_config={"splitting_ops":[],"compile_sizes":[],"cudagraph_capture_sizes":[256,248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,4,2,1],"max_capture_size":256}, use_cached_outputs=True,
INFO 02-13 14:09:44 cuda.py:230] Using Flash Attention backend.
INFO 02-13 14:09:44 model_runner.py:1110] Starting to load model /mnt/workspace/MiniCPM-o-2_6...
INFO 02-13 14:09:45 cuda.py:214] Cannot use FlashAttention-2 backend for head size 72.
INFO 02-13 14:09:45 cuda.py:227] Using XFormers backend.
Loading safetensors checkpoint shards: 0% Completed | 0/4 [00:00<?, ?it/s]
Loading safetensors checkpoint shards: 25% Completed | 1/4 [00:12<00:38, 12.95s/it]
Loading safetensors checkpoint shards: 50% Completed | 2/4 [00:31<00:32, 16.46s/it]
Loading safetensors checkpoint shards: 75% Completed | 3/4 [00:44<00:14, 14.92s/it]
Loading safetensors checkpoint shards: 100% Completed | 4/4 [00:55<00:00, 13.06s/it]
Loading safetensors checkpoint shards: 100% Completed | 4/4 [00:55<00:00, 13.79s/it]

INFO 02-13 14:10:41 model_runner.py:1115] Loading model weights took 15.7985 GB
/root/miniconda3/envs/minicpmo/lib/python3.10/site-packages/transformers/models/auto/image_processing_auto.py:590: FutureWarning: The image_processor_class argument is deprecated and will be removed in v4.42. Please use `slow_image_processor_class`, or `fast_image_processor_class` instead
warnings.warn(
Using a slow image processor as `use_fast` is unset and a slow processor was saved with this model. `use_fast=True` will be the default behavior in v4.48, even if the model was saved with a slow processor. This will result in minor differences in outputs. You'll still be able to use a slow processor with `use_fast=False`.
INFO 02-13 14:10:47 worker.py:267] Memory profiling takes 6.46 seconds
INFO 02-13 14:10:47 worker.py:267] the current vLLM instance can use total_gpu_memory (23.69GiB) x gpu_memory_utilization (1.00) = 23.69GiB
INFO 02-13 14:10:47 worker.py:267] model weights take 15.80GiB; non_torch_memory takes 0.06GiB; PyTorch activation peak memory takes 3.39GiB; the rest of the memory reserved for KV Cache is 4.45GiB.
INFO 02-13 14:10:47 executor_base.py:110] # CUDA blocks: 5207, # CPU blocks: 4681
INFO 02-13 14:10:47 executor_base.py:115] Maximum concurrency for 4096 tokens per request: 20.34x
INFO 02-13 14:10:50 model_runner.py:1434] Capturing cudagraphs for decoding. This may lead to unexpected consequences if the model is not static. To run the model in eager mode, set 'enforce_eager=True' or use '--enforce-eager' in the CLI. If out-of-memory error occurs during cudagraph capture, consider decreasing `gpu_memory_utilization` or switching to eager mode. You can also reduce the `max_num_seqs` as needed to decrease memory usage.
Capturing CUDA graph shapes: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 35/35 [00:14<00:00, 2.37it/s]
INFO 02-13 14:11:04 model_runner.py:1562] Graph capturing finished in 15 secs, took 0.75 GiB
INFO 02-13 14:11:04 llm_engine.py:431] init engine (profile, create kv cache, warmup model) took 23.74 seconds
INFO 02-13 14:11:04 api_server.py:756] Using supplied chat template:
INFO 02-13 14:11:04 api_server.py:756] None
INFO 02-13 14:11:04 launcher.py:21] Available routes are:
INFO 02-13 14:11:04 launcher.py:29] Route: /openapi.json, Methods: HEAD, GET
INFO 02-13 14:11:04 launcher.py:29] Route: /docs, Methods: HEAD, GET
INFO 02-13 14:11:04 launcher.py:29] Route: /docs/oauth2-redirect, Methods: HEAD, GET
INFO 02-13 14:11:04 launcher.py:29] Route: /redoc, Methods: HEAD, GET
INFO 02-13 14:11:04 launcher.py:29] Route: /health, Methods: GET
INFO 02-13 14:11:04 launcher.py:29] Route: /ping, Methods: GET, POST
INFO 02-13 14:11:04 launcher.py:29] Route: /tokenize, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /detokenize, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /v1/models, Methods: GET
INFO 02-13 14:11:04 launcher.py:29] Route: /version, Methods: GET
INFO 02-13 14:11:04 launcher.py:29] Route: /v1/chat/completions, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /v1/completions, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /v1/embeddings, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /pooling, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /score, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /v1/score, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /rerank, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /v1/rerank, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /v2/rerank, Methods: POST
INFO 02-13 14:11:04 launcher.py:29] Route: /invocations, Methods: POST
INFO: Started server process [1554]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
TXT

显存使用:

1
watch -n 0.1 nvidia-smi
BASH

图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from openai import OpenAI
import base64
openai_api_key = "token-abc123" # your api key set in launch server
openai_api_base = "http://localhost:8000/v1" # http id
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)

# 用于传本地图片
with open('test.jpg','rb') as file:
image = "data:image/jpeg;base64,"+ base64.b64encode(file.read()).decode('utf-8')

chat_response = client.chat.completions.create(
model="/mnt/workspace/MiniCPM-o-2_6", # model_local_path or huggingface id
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "请描述这张图片"},
# {"type": "text", "text": "图片中的人在干嘛"},
{
"type": "image_url",
"image_url": {
"url": image,#这里也可以不是用base64编码的图片,可以使用网络图片地址
},
},
],
}],
extra_body={
"stop_token_ids": [151645, 151643]
}
)
print("Chat response:", chat_response)
print("Chat response content:", chat_response.choices[0].message.content)
PY

对上图的OCR 结果:

这张图片是一个命令行界面的截图,显示了使用nvidia-smi命令获取NVIDIA GPU的信息。以下是图片中的详细内容:

  1. 时间戳:

    • 截图显示的时间是2025年2月13日星期四下午2点13分41秒。
  2. nvidia-smi命令信息:

    • nvidia-smi显示间隔为每个0.1秒。
    • 当前显示的设备驱动版本是470.103.01,CUDA版本是12.1。
  3. GPU信息:

    • GPU Name: NVIDIA A10
    • Persistence-M: On
    • Pwr/Usage/Cap: 74W / 150W (默认未指定)
    • Bus-Id: 0
    • Volatile: Off
    • Uncorr. ECC: Off
    • Memory-Usage: 22238 MiB / 24258 MiB (90%使用)
    • GPU-Util: 0%
    • Compute MINS: Default
    • MIG MINS: N/A
  4. GPU过程信息:

    • 主要有两列显示GPU和进程ID,处理器ID,类型和进程名称,分别对应每个GPU及对应进程。
    • 当前未显示任何进程数据,只有一些ID。

这张图片用于监控NVIDIA GPU的性能和使用情况,可以看到当前GPU的内存使用率较高,接近上限。

视频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from openai import OpenAI
import base64

openai_api_key = "token-abc123"
openai_api_base = "http://localhost:8000/v1"

# 初始化OpenAI客户端
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)

# 读取视频文件并编码为base64
with open('test.mp4', 'rb') as video_file:
video_base64 = base64.b64encode(video_file.read()).decode('utf-8')

# 构建请求数据
chat_response = client.chat.completions.create(
model="/mnt/workspace/MiniCPM-o-2_6",
messages=[
{
"role": "system",
"content": "You are a helpful assistant.",
},
{
"role": "user",
"content": [
{"type": "text", "text": "请描述这个视频"},
{
"type": "video_url",
"video_url": {
"url": f"data:video/mp4;base64,{video_base64}",
},
},
],
},
],
extra_body={
"stop_token_ids": [151645, 151643]
}
)

print("Chat response:", chat_response)
print("Chat response content:", chat_response.choices[0].message.content)
PY
设置弹幕颜色
设置弹幕类型
0:00 / 0:00
速度
洗脑循环
显示弹幕
海量弹幕
弹幕透明度
0.5
0.75
正常
1.25
1.5
2
[x]
Player version
Player FPS
Video type
Video url
Video resolution
Video duration
视频加载失败

结果:

这个视频显示了一个紧凑的电子设备,类似于个人助手,矗立在一个多彩,带有独特按键的键盘前。这个电子设备有一个小屏幕,显示类似于聊天窗口的界面,并带有简体中文字符。它被安置在一个支架上,底座为白色。

在这个视频的不同时间点,我们可以看到电子设备屏幕上的文字变化:

  1. 最初,屏幕上显示的是“好的,说出你要的事”。
  2. 出现“好的”。后伴随着“好的,说出你要的事…”,屏幕上出现了一个加载或对话框的图标。
  3. 屏幕上出现了一块空白,然后显示了一段较长的文字,解释了设备正在“努力理解你的话…”以及可能需要等待更多时间来看到结果。
  4. 之后,屏幕显示“好的:总是在我身边好的”,仍然显示相同的聊天对话框图标。
  5. 最后,屏幕上显示“好的:简单地说,一小时后你就可以看到一些非常棒的红色表情 앛GY:在拖着同样的表情…”,还有一个说话的图标。

在整个视频中,背景显示了一个显示屏,显示的是代码,应该是一个终端窗口,有各种命令和输出。界面的设计表明了一个围绕编码任务的环境,可能是Ubuntu系统,考虑到终端的外观。

整个视频中,环境保持一致,强调电子设备的互动性与显示屏上的代码并存。

这个详细的描述提供了对视频内容的全面视角,突出了电子设备的互动过程以及环境背景。

音频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from openai import OpenAI
import base64

# 你的API密钥和基础URL
openai_api_key = "token-abc123"
openai_api_base = "http://localhost:8000/v1"

# 初始化OpenAI客户端
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)

# 读取音频文件并编码为base64
with open('test.mp3', 'rb') as audio_file:
audio_base64 = base64.b64encode(audio_file.read()).decode('utf-8')

# 构建请求数据
chat_response = client.chat.completions.create(
model="/mnt/workspace/MiniCPM-o-2_6", # 替换为你的模型ID
messages=[
{
"role": "system",
"content": "You are a helpful assistant.",
},
{
"role": "user",
"content": [
{"type": "text", "text": "请正确识别并将这个音频翻译成中文"},
{
"type": "audio_url",
"audio_url": {
"url": f"data:audio/mpeg;base64,{audio_base64}",
},
},
],
},
],
extra_body={
"stop_token_ids": [151645, 151643]
}
)

# 打印响应
print("Chat response:", chat_response)
print("Chat response content:", chat_response.choices[0].message.content)
PY

素材:

设置弹幕颜色
设置弹幕类型
0:00 / 0:00
速度
洗脑循环
显示弹幕
海量弹幕
弹幕透明度
0.5
0.75
正常
1.25
1.5
2
[x]
Player version
Player FPS
Video type
Video url
Video resolution
Video duration
视频加载失败

结果:

1
2
Chat response: ChatCompletion(id='chatcmpl-1445107950d4473e94ad94cb2fd07523', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='我很高兴能参加这个论坛,这里聚集了不同领域的企业领袖、领袖、科学家、艺术家和外交官,共同探讨世界局势。', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=[], reasoning_content=None), stop_reason=None)], created=1739427820, model='/mnt/workspace/MiniCPM-o-2_6', object='chat.completion', service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=30, prompt_tokens=299, total_tokens=329, completion_tokens_details=None, prompt_tokens_details=None), prompt_logprobs=None)
Chat response content: 我很高兴能参加这个论坛,这里聚集了不同领域的企业领袖、领袖、科学家、艺术家和外交官,共同探讨世界局势。
TXT