基于 Qwen3-Omni-30B-A3B-Instruct 模型,ms-swift 4.1.0.dev0 训练框架分析。
Qwen3-Omni 处理视频+音频输入时,token 序列的整体结构为:
展开代码<|im_start|>user <|vision_start|><|audio_start|> [视频token与音频token交叉排列] <|audio_end|><|vision_end|> 用户的文本 prompt... <|im_end|> <|im_start|>assistant 模型回复... <|im_end|>
本文以一个真实的视频剪辑教学样本为例,深入拆解 Qwen3-Omni 模型在 ms-swift 训练和 vLLM 推理中,视频帧采样、图像 resize、视频 token、音频 token 的完整计算过程,并对比两者的差异。
本文基于 OpenCode 源码分析,带你深入理解这个 AI 编程助手从接收用户输入到返回结果的完整链路。
OpenCode 采用客户端-服务端分离架构,即使在 CLI 模式下也是如此。TUI(终端 UI)运行在主线程,Server 运行在 Worker 线程,二者通过 HTTP + SSE 通信:
针对 Qwen3-Omni-30B-A3B-Instruct 模型,60K tokens 长上下文 Megatron SFT 训练场景。 基于 ms-swift 源码分析,所有参数引用均标注源码位置。
针对于我修改后的代码,可以这么统计每个样本的实际 token 长度:
bash展开代码IMAGE_MAX_TOKEN_NUM=5000 USE_AUDIO_IN_VIDEO=true VIDEO_MAX_PIXELS=307200 \
python scripts/count_token_lengths.py \
--model /mnt/cpfs/model/Qwen3-Omni-30B-A3B-Instruct \
--dataset /mnt/cpfs/datasets/ShortsTemplateEdits/anno_jianying_mp4_seed18_train.jsonl \
--num_samples 200 \
--dataset_num_proc 16
... --num_samples 500
... --num_samples 0
... --output_csv /tmp/lengths.csv
~/.claude/settings.json新建或覆盖为以下内容,并替换为自己的 API Key 和 Base URL:
json展开代码{
"env": {
"ANTHROPIC_API_KEY": "your-api-key-here",
"ANTHROPIC_BASE_URL": "https://example.com",
"ANTHROPIC_MODEL": "route/claude-haiku-4-5-20251001-thinking"
},
"model": "route/claude-haiku-4-5-20251001-thinking"
}
在训练之前可以使用swift export进行 token 缓存,使用这个指令:
展开代码IMAGE_MAX_TOKEN_NUM=5000 USE_AUDIO_IN_VIDEO=true VIDEO_MAX_PIXELS=307200 USE_AUDIO_IN_VIDEO=true \ swift export \ --model /mnt/cpfs/model/Qwen3-Omni-30B-A3B-Instruct \ --dataset /mnt/cpfs/datasets/ShortsTemplateEdits/anno_jianying_mp4_seed18_train.jsonl \ --split_dataset_ratio 0 \ --dataset_num_proc 72 \ --to_cached_dataset true \ --max_length 20000 --truncation_strategy left \ --output_dir /mnt/cpfs/datasets/ShortsTemplateEdits/pack_cached_cpfs/anno_jianying_mp4_seed18_train_len20k
truncation_strategy split 策略只允许用于预训练(pre-training),不允许用于 SFT