自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Qwen原生多模態(tài)開源,淺析一下!

發(fā)布于 2025-3-28 00:45
瀏覽
0收藏

Qwen2.5-Omni 7B開源,Qwen的第一個(gè)端到端的多模態(tài)模型,可以文本、圖像、音頻和視頻輸入,同時(shí)以流式方式生成文本和自然語音回復(fù)。

提出了 Thinker-Talker 架構(gòu)。

Qwen原生多模態(tài)開源,淺析一下!-AI.x社區(qū)

PR還沒合進(jìn)去,要注意安裝方式

Qwen原生多模態(tài)開源,淺析一下!-AI.x社區(qū)

評測的榜似乎畫的有點(diǎn)趕,看不出信息量。

Qwen原生多模態(tài)開源,淺析一下!-AI.x社區(qū)

提出了一種新的位置嵌入,稱為 TMRoPE(時(shí)間對齊多模態(tài) RoPE),用于同步視頻輸入的時(shí)戳與音頻。

資源占用:理論值如下,實(shí)際要在高1.2倍,看起來消耗有點(diǎn)大。


瞄下代碼,關(guān)于輸入,每個(gè)模態(tài)都有專門的處理組件:

class Qwen2_5OmniProcessor(ProcessorMixin):
    attributes = ["omni_processor", "feature_extractor", "tokenizer"]
    omni_processor_class = "Qwen2VLImageProcessor"
    feature_extractor_class = "WhisperFeatureExtractor"
    tokenizer_class = ("Qwen2Tokenizer", "Qwen2TokenizerFast")

視頻這里,還計(jì)算每個(gè)視頻時(shí)間網(wǎng)格對應(yīng)的實(shí)際秒數(shù),用于TMRoPE中的時(shí)間對齊

if videos is not None:
    videos_inputs = self.omni_processor(images=None, videos=videos, **output_kwargs["videos_kwargs"])
    if fps is None:
        fps = [2.0] * len(videos)
    videos_inputs["video_second_per_grid"] = [
        fps[i] / self.omni_processor.temporal_patch_size for i in range(len(fps))
    ]

模型代碼的核心由3塊構(gòu)成,Thinker,Talker,Token2Wav

talker是將文本轉(zhuǎn)成語音編碼,Token2Wav是將編碼轉(zhuǎn)成波形。

里邊實(shí)現(xiàn)了幾個(gè)Token2Wav變體:

  • Qwen2_5OmniToken2WavDiTModel:基于擴(kuò)散模型的波形生成
  • Qwen2_5OmniToken2WavBigVGANModel:基于GAN的波形生成
  • Qwen2_5OmniToken2WavModel:通用基類

文本輸出和語音輸出是兩條并行的路徑:

  • 文本輸出:輸入 → Thinker → 文本輸出
  • 語音輸出:輸入 → Thinker → Talker → Token2Wav → 語音輸出

只有當(dāng)需要語音輸出時(shí),才會(huì)激活Talker模塊和Token2Wav模塊,將Thinker生成的文本內(nèi)容轉(zhuǎn)換為語音。

細(xì)節(jié)可以自行看源碼,不貼了。


在看看新的位置編碼。

對于純文本,使用常規(guī)的1D位置編碼。

對于包含視覺(圖像/視頻)和文本的混合輸入,函數(shù)分別計(jì)算:

  • 視覺部分用3D位置編碼
  • 文本部分用1D位置編碼

比如說,一個(gè)有3個(gè)時(shí)間片、2×2空間分辨率的視頻示例:

輸入序列: [V V V V V V V V V V V V T T T T T]
視覺時(shí)間位置ID: [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2]
視覺高度位置ID: [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1]
視覺寬度位置ID: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
文本位置ID從視覺最大位置ID+1開始: [3, 4, 5, 6, 7]

將時(shí)間維度映射到位置ID,考慮每秒對應(yīng)多少個(gè)位置單位(position_id_per_seconds)

t_index = (torch.arange(grid_t) * second_per_grids[video_idx] * position_id_per_seconds).long()
llm_pos_ids = self.get_llm_pos_ids_for_vision(
    start_idx, video_idx, spatial_merge_size, t_index, grid_hs, grid_ws
)

針對視頻中包含音頻的情況,還單獨(dú)處理了,視頻和音頻交替編碼,按時(shí)間塊組織,每個(gè)時(shí)間塊包含視頻幀和對應(yīng)的音頻段,音頻有特殊的開始和結(jié)束標(biāo)記(audio_start_token_id和audio_end_token_id)

# 視頻和音頻混合處理
t_index_split_chunk = self.split_list_into_ranges(t_index, t_ntoken_per_chunk)

for t_chunk in t_index_split_chunk:
    vision_ntoken_per_chunk = len(t_chunk) * grid_h * grid_w // (spatial_merge_size**2)
    new_src_item.extend([video_token_id] * vision_ntoken_per_chunk)
    # 為視頻區(qū)塊分配位置ID
    
    new_src_item.extend(min(t_ntoken_per_chunk, pure_audio_len - added_audio_len) * [audio_token_id])
    # 為音頻區(qū)塊分配位置ID

最后開源地址:https://huggingface.co/Qwen/Qwen2.5-Omni-7B

代碼地址:https://github.com/huggingface/transformers/blob/3a1ead0aabed473eafe527915eea8c197d424356/src/transformers/models/qwen2_5_omni/modeling_qwen2_5_omni.py#L1175

本文轉(zhuǎn)載自??NLP前沿??,作者:NLP前沿


收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦