Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 228|回复: 0

本地部署Qwen3-omni

[复制链接]

426

主题

598

帖子

3491

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3491
发表于 2025-11-6 17:34:14 | 显示全部楼层 |阅读模式
以下是本地部署文件:
  1. import os
  2. os.environ['VLLM_USE_V1'] = '0'
  3. os.environ['VLLM_WORKER_MULTIPROC_METHOD'] = 'spawn'
  4. os.environ["VLLM_LOGGING_LEVEL"] = "ERROR"
  5. os.environ['CUDA_VISIBLE_DEVICES'] = "0"
  6. import torch
  7. import warnings
  8. import numpy as np

  9. warnings.filterwarnings('ignore')
  10. warnings.filterwarnings('ignore', category=DeprecationWarning)
  11. warnings.filterwarnings('ignore', category=FutureWarning)
  12. warnings.filterwarnings('ignore', category=UserWarning)

  13. from qwen_omni_utils import process_mm_info
  14. from transformers import Qwen3OmniMoeProcessor

  15. def _load_model_processor():
  16.     if USE_TRANSFORMERS:
  17.         from transformers import Qwen3OmniMoeForConditionalGeneration
  18.         if TRANSFORMERS_USE_FLASH_ATTN2:
  19.             model = Qwen3OmniMoeForConditionalGeneration.from_pretrained(MODEL_PATH,
  20.                                                                          dtype='auto',
  21.                                                                          attn_implementation='flash_attention_2',
  22.                                                                          device_map="auto")
  23.         else:
  24.             model = Qwen3OmniMoeForConditionalGeneration.from_pretrained(MODEL_PATH, device_map="auto", dtype='auto')
  25.     else:
  26.         from vllm import LLM
  27.         model = LLM(
  28.             model=MODEL_PATH, trust_remote_code=True, gpu_memory_utilization=0.95,
  29.             tensor_parallel_size=torch.cuda.device_count(),
  30.             limit_mm_per_prompt={'image': 1, 'video': 3, 'audio': 3},
  31.             max_num_seqs=1,
  32.             max_model_len=32768,
  33.             seed=1234,
  34.         )

  35.     processor = Qwen3OmniMoeProcessor.from_pretrained(MODEL_PATH)
  36.     return model, processor

  37. def run_model(model, processor, messages, return_audio, use_audio_in_video):
  38.     if USE_TRANSFORMERS:
  39.         text = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
  40.         audios, images, videos = process_mm_info(messages, use_audio_in_video=use_audio_in_video)
  41.         inputs = processor(text=text, audio=audios, images=images, videos=videos, return_tensors="pt", padding=True, use_audio_in_video=use_audio_in_video)
  42.         inputs = inputs.to(model.device).to(model.dtype)
  43.         text_ids, audio = model.generate(**inputs,
  44.                                             thinker_return_dict_in_generate=True,
  45.                                             thinker_max_new_tokens=8192,
  46.                                             thinker_do_sample=False,
  47.                                             speaker="Ethan",
  48.                                             use_audio_in_video=use_audio_in_video,
  49.                                             return_audio=return_audio)
  50.         response = processor.batch_decode(text_ids.sequences[:, inputs["input_ids"].shape[1] :], skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
  51.         if audio is not None:
  52.             audio = np.array(audio.reshape(-1).detach().cpu().numpy() * 32767).astype(np.int16)
  53.         return response, audio
  54.     else:
  55.         from vllm import SamplingParams
  56.         sampling_params = SamplingParams(temperature=1e-2, top_p=0.1, top_k=1, max_tokens=8192)
  57.         text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
  58.         audios, images, videos = process_mm_info(messages, use_audio_in_video=use_audio_in_video)
  59.         inputs = {'prompt': text, 'multi_modal_data': {}, "mm_processor_kwargs": {"use_audio_in_video": use_audio_in_video}}
  60.         if images is not None: inputs['multi_modal_data']['image'] = images
  61.         if videos is not None: inputs['multi_modal_data']['video'] = videos
  62.         if audios is not None: inputs['multi_modal_data']['audio'] = audios
  63.         outputs = model.generate(inputs, sampling_params=sampling_params)
  64.         response = outputs[0].outputs[0].text
  65.         return response, None
  66.    
复制代码

部署过程:需要下载的模型文件
是的,你需要下载 Qwen3OmniMoe 模型文件。这个模型应该是阿里云开发的大规模多模态模型。
Windows系统配置步骤
1. 环境准备
   安装Python 3.8+版本
   安装CUDA驱动(确保支持你的GPU)
   安装PyTorch with CUDA支持
2. 安装必要依赖包

  1. pip install torch torchvision torchaudio
  2. pip install transformers
  3. pip install numpy
  4. pip install qwen_omni_utils  # 如果这是特定的工具包
复制代码
对于vLLM支持(可选):
  1. pip install vllm
复制代码


3. 配置环境变量和参数
在Windows上,你需要设置以下几个关键变量:
   MODEL_PATH: 指向你下载的模型文件路径
   USE_TRANSFORMERS: 设置为 True 使用HuggingFace Transformers,或者 False 使用vLLM
   TRANSFORMERS_USE_FLASH_ATTN2: (可选)是否使用Flash Attention 2
4. 修改代码适配单GPU
当前代码已经通过 os.environ['CUDA_VISIBLE_DEVICES'] = "0" 限制只使用第一个GPU,这适合你的单GPU环境。
5. 运行程序

  1. # 设置必要的全局变量
  2. MODEL_PATH = "path/to/your/model"  # 修改为实际模型路径
  3. USE_TRANSFORMERS = True  # 或 False 使用vLLM
  4. TRANSFORMERS_USE_FLASH_ATTN2 = False  # 根据需要设置

  5. # 调用模型加载和运行函数
  6. model, processor = _load_model_processor()
  7. messages = [{"role": "user", "content": "你的问题"}]
  8. response, audio = run_model(model, processor, messages, return_audio=False, use_audio_in_video=False)
复制代码
6. 注意事项
确保有足够的磁盘空间存储模型文件(通常几十GB)
单GPU内存可能有限,考虑调整 gpu_memory_utilization 参数
Windows上某些依赖可能需要额外配置或替代方案


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-12-7 19:51 , Processed in 0.011628 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表