
在物理 AI 與具身智能項目里最讓人頭疼的往往不是模型算法本身而是兩件事第一真實場景數據太貴、太難采集第二模型在垂直領域里表現不穩定。比如做智慧城市車流識別晴天效果尚可一到雨霧天氣誤報率就明顯上升做農業機器人采摘換一個果園、換一種光照之前調好的視覺模型又要重新調參。這些問題背后其實都繞不開三個關鍵詞世界基礎模型World Foundation Model, WFM、視覺語言模型Vision-Language Model, VLM和合成數據Synthetic Data。本文圍繞 Cosmos 3 后訓練實戰完整梳理一條可落地的技術鏈路先用 Cosmos 3 生成農業機器人場景的合成數據再結合少量真實數據構建 VLM 后訓練集微調后部署到智慧城市視頻流推理任務中做效果驗證。文章會說明每個環節為什么這樣做也會給出可運行的示例代碼、常見報錯排查表和工程落地建議。如果你正在做視覺語言模型選型、VLM 后訓練、合成數據增強或者想了解 Cosmos 3 能干什么這篇文章會比較適合你。全文采用中英雙語的術語注釋方式代碼關鍵位置也保留雙語注釋方便對照學習。1. 背景與核心概念1.1 Cosmos 3 是什么Cosmos 3 是 NVIDIA 推出的世界基礎模型World Foundation Model系列在 3.x 版本中的核心成果。它并不是一個單一模型而是一組面向物理 AI 場景的模型和工具鏈主要目標是讓模型理解“物理世界如何運轉”并能夠生成接近真實物理規律的視頻幀序列。在機器人、自動駕駛、智慧城市等場景中模型需要理解的不只是靜態圖像里的物體類別還包括物體的空間關系、運動趨勢、光照變化、遮擋關系、因果推斷等。這類能力很難從普通圖像分類數據集中學習而 Cosmos 3 等世界模型的核心價值就是通過對海量物理世界視頻的學習建立對“下一秒可能發生什么”的預測能力。與傳統的文生視頻模型相比Cosmos 3 更強調可控性和物理合理性。它能夠在文本指令、相機參數、運動軌跡等條件的約束下生成指定場景的連續視頻幀。這樣的合成視頻可以作為下游視覺模型的訓練數據從而減少對真實數據的依賴。1.2 什么是后訓練Post-training大模型領域通常把訓練過程分為預訓練Pre-training和后訓練Post-training兩個階段。預訓練負責讓模型學習通用語言、視覺和世界知識而后訓練則負責讓模型適配特定任務、特定領域和特定的交互方式。常見的后訓練方法包括方法英文全稱說明監督微調Supervised Fine-Tuning, SFT用帶標注的任務數據調整模型參數低秩適配Low-Rank Adaptation, LoRA凍結原模型只訓練低秩矩陣節省顯存基于人類反饋的強化學習RLHF通過獎勵模型優化生成質量直接偏好優化Direct Preference Optimization, DPO用偏好對直接優化無需獎勵模型在本文的場景中后訓練的主要目的是讓預訓練 VLM 更好地理解智慧城市和農業機器人這兩個垂直領域的圖像內容例如能夠正確回答“畫面中是否有行人闖紅燈”“這個番茄的成熟度是多少”等細粒度問題。1.3 VLM 推理解決什么問題視覺語言模型Vision-Language Model, VLM能夠同時處理圖像輸入和文本輸入輸出文本描述或結構化信息。與傳統的目標檢測模型相比VLM 的優勢在于支持開放詞匯不僅能識別訓練集中出現過的類別還能理解自然語言描述的新類別。具備上下文理解能結合畫面中的物體關系、場景背景進行推理。輸出更靈活可以直接輸出自然語言答案也可以借助提示詞輸出 JSON 等結構化格式。在智慧城市場景里VLM 可以完成事件檢測、要素描述、異常預警等任務。例如給定一段監控視頻幀模型能輸出“畫面中有 3 輛機動車1 輛正在左轉行人處于等待狀態”這類結構化描述。1.4 為什么需要合成數據智慧城市和農業機器人場景的數據采集都有明顯瓶頸。智慧城市視頻涉及隱私與合規問題農業機器人的田間數據受季節、天氣、地域限制采集成本高且難以覆蓋長尾場景。合成數據Synthetic Data可以在一定程度上緩解這些問題。使用 Cosmos 3 生成帶有物理規律的運動視頻讓模型在訓練階段見過更多“對抗樣本”例如夜間強光、雨天反光、果實遮擋等情況。這樣當模型部署到真實環境時泛化能力會更強。但需要強調合成數據不是萬能的它不能完全替代真實數據。更合理的做法是“真實數據 合成數據”混合訓練并通過驗證集持續評估數據質量。2. 環境準備與版本說明在開始實操之前先理清當前示例環境。后續代碼基于以下配置運行如果你的環境不同需要根據實際情況調整。2.1 硬件與系統要求Cosmos 3 合成數據生成和 VLM 后訓練都屬于資源密集型任務建議使用 NVIDIA GPU。顯存規模直接決定了可以生成的視頻分辨率以及微調時使用的批量大小。資源建議要求GPUNVIDIA RTX 3090 / 4090 / A100 / H100 或更高顯存16 GB 以上生成高分辨率視頻或微調 7B 以上模型時需要更大顯存系統Ubuntu 22.04 或 Windows 11WSL2磁盤建議預留 100 GB 以上空間存放模型權重和數據集如果暫時沒有足夠顯存可以先使用小模型、低分辨率和更小的 batch size 驗證流程再遷移到更大規模環境。2.2 Python 與深度學習框架以下版本組合是當前比較常見且穩定的配置具體以官方文檔為準Python 3.10 或 3.11CUDA 12.1 或更高PyTorch 2.1 或更高Transformers 4.40 或更高PEFT 0.10 或更高Datasets 2.18 或更高Accelerate 0.30 或更高先創建一個獨立的 Conda 環境conda create -n cosmos-ai python3.11 -y conda activate cosmos-ai pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 pip install transformers peft accelerate datasets pillow tensorboard注意PyTorch 的安裝命令需要結合 CUDA 版本調整。如果使用 WSL2需要確保 Windows 側已安裝最新的 NVIDIA 驅動并在 WSL2 內執行nvidia-smi確認 GPU 可見。2.3 項目目錄結構為了方便后續操作建議按照下面結構組織項目cosmos-finetune-lab/ ├── data/ │ ├── real/ # 真實圖像與標注 │ ├── synthetic/ # Cosmos 生成數據 │ └── annotations/ # 標注 JSON ├── models/ │ ├── pretrained/ # 預訓練 VLM 權重 │ └── finetuned/ # 后訓練輸出權重 ├── scripts/ │ ├── generate_synthetic.py # 合成數據生成腳本 │ ├── prepare_dataset.py # 數據集構建腳本 │ ├── train_lora.py # LoRA 后訓練腳本 │ └── inference.py # VLM 推理腳本 ├── configs/ │ ├── lora_config.yaml │ └── data_config.yaml └── output/ ├── logs/ └── results/3. 核心原理拆解后訓練、VLM 推理與合成數據生成在進入完整代碼前先拆解三個關鍵模塊的原理這能幫助你理解后面每一步操作的意義。3.1 后訓練到底改了什么預訓練模型已經具備很強的通用能力但在垂直領域中會出現“能力有但不在點子上”的情況。例如模型知道番茄是紅色的果實但無法判斷“番茄表面有明顯褐色斑點”是否意味著病蟲害。后訓練就是通過新的標注數據把模型原先分散的知識引導到特定任務上。以 LoRA 為例它的做法是在原始權重矩陣旁邊新增兩個低秩矩陣訓練時只更新這兩個矩陣。# 示意LoRA 的更新邏輯簡化版 # 原始公式output W * input # LoRA 公式output (W A B) * input # 其中 W 被凍結A 和 B 是低秩矩陣秩為 r import torch import torch.nn as nn class LoRALinear(nn.Module): def __init__(self, in_features, out_features, r16): super().__init__() self.weight nn.Parameter(torch.randn(out_features, in_features)) self.weight.requires_grad False # 凍結原權重 self.lora_a nn.Parameter(torch.randn(in_features, r) * 0.01) self.lora_b nn.Parameter(torch.randn(r, out_features) * 0.01) def forward(self, x): # 原始輸出 低秩增量 base_out x self.weight.T lora_out (x self.lora_a) self.lora_b return base_out lora_outLoRA 的核心優勢是顯存占用小、訓練速度快同時可以通過切換不同的 LoRA 權重實現多任務適配很適合在單卡環境下做垂直領域探索。3.2 VLM 推理從圖像到文字的基本鏈路VLM 的推理鏈路通常包含三個部分視覺編碼器Vision Encoder把圖像轉換為視覺令牌visual tokens。投影層Projection Layer把視覺特征映射到語言模型的嵌入空間。語言模型Language Model結合文本提示詞和視覺令牌逐步生成回答。理解這條鏈路很重要因為后訓練通常需要決定“改哪一部分”。如果任務主要是理解圖像語義視覺編碼器可以凍結只微調語言模型如果任務涉及特殊的圖像特征例如紅外波段或高空俯拍視角則需要考慮是否解凍視覺編碼器。# 一個標準的 VLM 推理調用流程 from transformers import AutoProcessor, AutoModelForVision2Seq from PIL import Image model_id your-finetuned-model-path processor AutoProcessor.from_pretrained(model_id) model AutoModelForVision2Seq.from_pretrained(model_id) image Image.open(test_frame.jpg) prompt Describe the traffic status in this image. inputs processor(imagesimage, textprompt, return_tensorspt) outputs model.generate(**inputs, max_new_tokens256) print(processor.decode(outputs[0], skip_special_tokensTrue))這段代碼把圖像和文本提示詞送入模型模型輸出文本描述。這里的processor負責將圖像和文本轉換成模型需要的張量格式。3.3 Cosmos 合成數據生成的工作流Cosmos 3 生成合成數據的工作流可以概括為文本描述 條件控制 → 視頻生成 → 抽幀標注 → 數據集構建。其中文本描述的質量直接影響生成效果。為了生成符合農業機器人視角的數據需要在提示詞中明確以下信息相機視角第一人稱、第三人稱、固定視角等。場景內容農作物種類、成熟度、病蟲害特征。運動行為機械臂運動、果實抓取、自主移動等。環境條件光照、天氣、季節。下面是一個雙語提示詞模板English prompt: A first-person view from an agricultural robot moving between tomato rows. The robotic arm extends forward and gently picks a ripe red tomato. Natural sunlight, slight shadow on the left side, leaves are green and healthy. 中文提示詞 農業機器人第一人稱視角在番茄種植行中移動。 機械臂向前伸展輕輕摘取一顆成熟的紅色番茄。 自然光照左側有輕微陰影葉片翠綠健康。建議在合成數據生成時將英文提示詞作為主輸入中文提示詞作為輔助描述這樣可以在一定程度上提高生成結果與中文標注的一致性。3.4 圖像批量推理的效率問題在智慧城市場景中VLM 推理往往需要處理大量圖像比如每隔幾秒從視頻流中抽幀檢測一次。如果逐張圖像調用模型耗時較長也不利于 GPU 利用率。常見的做法是批量推理batch inference將多張圖像組成一個 batch 送入模型。# 圖像批量推理的常見思路 from PIL import Image import torch images [Image.open(fframes/frame_{i:04d}.jpg) for i in range(1, 9)] prompts [Describe the traffic condition.] * len(images) inputs processor( imagesimages, textprompts, return_tensorspt, paddingTrue, ) with torch.no_grad(): outputs model.generate(**inputs, max_new_tokens128)批量推理的核心收益是提高 GPU 利用率減少推理總時間。但它也有代價batch 中不同圖像的 token 長度不同模型需要做 padding在處理超長視頻抽幀時可能遇到顯存壓力。后續在“常見問題”章節會進一步展開。4. 完整實戰從合成數據生成到 VLM 后訓練與推理下面進入本文的核心實戰。整個流程分為五個步驟每一部分都提供完整代碼和運行說明。4.1 準備智慧城市監控數據先準備一組智慧城市場景的真實圖像。出于示例目的我們假設你有少量來自公開數據集的圖像和標注。你可以先創建data/real目錄并準備如下格式的標注文件data/annotations/real_annotations.json[ { filename: frame_001.jpg, question: 這段路口有哪些交通參與者, answer: 畫面中有兩輛直行的小汽車、一輛左轉的電動車以及一名正在斑馬線旁等候的行人。 }, { filename: frame_002.jpg, question: 是否有車輛違規, answer: 沒有。所有車輛均在車道線內行駛行人信號燈為綠色通行狀態正常。 } ]然后運行下面的數據準備腳本將標注轉換為后訓練所需的統一格式# 文件路徑scripts/prepare_dataset.py import json import os import argparse def build_dataset(image_dir, annotation_file, output_file): # 讀取原始標注 with open(annotation_file, r, encodingutf-8) as f: annotations json.load(f) samples [] for item in annotations: # 每個樣本包含圖像路徑和一輪對話 samples.append({ images: [os.path.join(image_dir, item[filename])], conversations: [ { role: user, content: item[question] }, { role: assistant, content: item[answer] } ] }) with open(output_file, w, encodingutf-8) as f: json.dump(samples, f, ensure_asciiFalse, indent2) print(f[INFO] Dataset ready, total {len(samples)} samples.) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--image_dir, typestr, defaultdata/real) parser.add_argument(--annotation_file, typestr, defaultdata/annotations/real_annotations.json) parser.add_argument(--output_file, typestr, defaultdata/dataset_real.json) args parser.parse_args() build_dataset(args.image_dir, args.annotation_file, args.output_file)運行python scripts/prepare_dataset.py如果看到Dataset ready, total 2 samples.說明真實數據準備完成。在實際項目中樣本數量建議至少在數百條以上否則后訓練效果非常有限。4.2 用 Cosmos 生成農業機器人合成數據接下來使用 Cosmos 3 生成農業機器人場景的合成視頻。由于不同版本的 Cosmos 對模型導入方式和推理接口差異較大下面的代碼是演示思路具體 API 名稱需要參考你部署的官方文檔。# 文件路徑scripts/generate_synthetic.py # 演示代碼實際接口請參考 Cosmos 官方倉庫 import os import json from PIL import Image # 假設 Cosmos 提供了一個生成器對象 # 這里用注釋說明初始化方式不綁定具體類名 # from cosmos import CosmosVideoGenerator def generate_agriculture_frame(prompt_en, prompt_zh, save_dir): 使用 Cosmos 生成農業機器人視角的視頻幀。 參數: prompt_en: 英文提示詞 prompt_zh: 中文提示詞 save_dir: 輸出目錄 # 1. 構造生成請求 generation_prompt f{prompt_en}. {prompt_zh} # 2. 調用 Cosmos 生成視頻 # generator CosmosVideoGenerator.from_pretrained(nvidia/cosmos-3-wfm) # output_video generator.generate( # promptgeneration_prompt, # duration3.0, # 生成 3 秒視頻 # height720, # width1280, # fps30 # ) # 3. 將視頻流抽幀保存為 JPEG 圖像 # frames extract_frames(output_video) # 這里僅做目錄初始化 os.makedirs(save_dir, exist_okTrue) # 4. 記錄對應的文本描述 annotation { prompt_en: prompt_en, prompt_zh: prompt_zh, scene: agriculture_robot, frames: [ # 假設抽幀后得到 10 幀 fsynthetic_agri_001_frame_{i:02d}.jpg for i in range(10) ] } with open(os.path.join(save_dir, annotation.json), w, encodingutf-8) as f: json.dump(annotation, f, ensure_asciiFalse, indent2) print(f[INFO] Synthetic data saved to {save_dir}) if __name__ __main__: save_dir data/synthetic/agriculture_01 generate_agriculture_frame( prompt_enFirst-person view of an agricultural robot in a tomato greenhouse, a robotic arm reaches out and gently picks a ripe tomato, natural light., prompt_zh農業機器人第一人稱視角在番茄溫室中機械臂伸出并輕輕摘取一顆成熟的番茄自然光照。, save_dirsave_dir )你需要根據實際模型版本替換初始化與生成邏輯。生成后的視頻幀可以繼續用作圖像級 VLM 后訓練數據也可以保留視頻序列用于后續世界模型訓練或行為預測任務。4.3 構建混合后訓練數據集合成數據與真實數據需要統一格式才能送入訓練腳本。這里寫一個融合腳本將真實數據集和合成數據集合并并寫入訓練集與驗證集。# 文件路徑scripts/merge_datasets.py import json import random import argparse def load_json(path): with open(path, r, encodingutf-8) as f: return json.load(f) def split_dataset(samples, val_ratio0.2): random.shuffle(samples) val_size int(len(samples) * val_ratio) train_set samples[val_size:] val_set samples[:val_size] return train_set, val_set if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--real_data, typestr, defaultdata/dataset_real.json) parser.add_argument(--synthetic_data, typestr, defaultdata/dataset_synthetic.json) parser.add_argument(--output_train, typestr, defaultdata/dataset_train.json) parser.add_argument(--output_val, typestr, defaultdata/dataset_val.json) parser.add_argument(--val_ratio, typefloat, default0.2) args parser.parse_args() real_samples load_json(args.real_data) synthetic_samples load_json(args.synthetic_data) all_samples real_samples synthetic_samples train_set, val_set split_dataset(all_samples, args.val_ratio) with open(args.output_train, w, encodingutf-8) as f: json.dump(train_set, f, ensure_asciiFalse, indent2) with open(args.output_val, w, encodingutf-8) as f: json.dump(val_set, f, ensure_asciiFalse, indent2) print(f[INFO] Train samples: {len(train_set)}, Val samples: {len(val_set)})合并數據的比例需要根據實際情況調整。如果合成數據出現明顯重復模式應該適度降低合成數據占比避免模型對合成數據過擬合。4.4 LoRA 微調 VLM下面使用 PEFT 庫對 VLM 做 LoRA 后訓練。示例中使用的是 Hugging Face 生態的AutoModelForVision2Seq你可以替換成自己選定的 VLM 基座模型。# 文件路徑scripts/train_lora.py import json import torch from transformers import ( AutoProcessor, AutoModelForVision2Seq, TrainingArguments, Trainer, DataCollatorForLanguageModeling, ) from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training from PIL import Image from torch.utils.data import Dataset class VLMDataset(Dataset): 讀取統一格式的 VLM 對話數據集。 def __init__(self, json_path, processor): self.data json.load(open(json_path, r, encodingutf-8)) self.processor processor def __len__(self): return len(self.data) def __getitem__(self, idx): item self.data[idx] image_path item[images][0] conversations item[conversations] user_text conversations[0][content] assistant_text conversations[1][content] image Image.open(image_path).convert(RGB) # 構造模型輸入 messages [ {role: user, content: user_text}, {role: assistant, content: assistant_text}, ] text self.processor.apply_chat_template( messages, tokenizeFalse, add_generation_promptFalse ) inputs self.processor( imagesimage, texttext, return_tensorspt, paddingTrue, ) # 移除 batch 維度簡化 item 結構 return { pixel_values: inputs[pixel_values][0], input_ids: inputs[input_ids][0], attention_mask: inputs[attention_mask][0], } def collate_fn(batch): 動態 padding 到 batch 內最大長度。 pixel_values torch.stack([b[pixel_values] for b in batch]) input_ids torch.nn.utils.rnn.pad_sequence( [b[input_ids] for b in batch], batch_firstTrue, padding_value0 ) attention_mask torch.nn.utils.rnn.pad_sequence( [b[attention_mask] for b in batch], batch_firstTrue, padding_value0 ) return { pixel_values: pixel_values, input_ids: input_ids, attention_mask: attention_mask, } def main(): model_id your-base-vlm-id # 例如 meta-llama/Llama-3.2-11B-Vision-Instruct train_json data/dataset_train.json val_json data/dataset_val.json processor AutoProcessor.from_pretrained(model_id) model AutoModelForVision2Seq.from_pretrained( model_id, torch_dtypetorch.bfloat16, device_mapauto, ) # 配置 LoRA lora_config LoraConfig( r16, lora_alpha32, lora_dropout0.05, target_modules[q_proj, v_proj, k_proj, o_proj], task_typeCAUSAL_LM, ) model prepare_model_for_kbit_training(model) model get_peft_model(model, lora_config) model.print_trainable_parameters() train_dataset VLMDataset(train_json, processor) val_dataset VLMDataset(val_json, processor) training_args TrainingArguments( output_diroutput/logs/, per_device_train_batch_size2, per_device_eval_batch_size2, gradient_accumulation_steps4, learning_rate2e-4, num_train_epochs3, logging_steps10, eval_strategysteps, eval_steps100, save_steps100, remove_unused_columnsFalse, report_totensorboard, ) trainer Trainer( modelmodel, argstraining_args, train_datasettrain_dataset, eval_datasetval_dataset, data_collatorcollate_fn, ) trainer.train() # 保存 LoRA 權重和處理器 model.save_pretrained(models/finetuned/lora_weights) processor.save_pretrained(models/finetuned/lora_weights) if __name__ __main__: main()這段代碼有幾個關鍵點需要注意VLMDataset里使用了apply_chat_template不同模型對對話模板的處理方式不同。collate_fn負責動態 padding確保不同長度的輸入可以在一個 batch 內計算。LoRA 的target_modules需要與模型結構匹配。如果模型使用了不同的線性層命名需要調整。4.5 智慧城市 VLM 推理完成 LoRA 后訓練后將 LoRA 權重加載到預訓練模型上對智慧城市場景的圖像進行推理。# 文件路徑scripts/inference.py import torch from transformers import AutoProcessor, AutoModelForVision2Seq from peft import PeftModel from PIL import Image def load_finetuned_model(base_model_id, lora_path): processor AutoProcessor.from_pretrained(lora_path) model AutoModelForVision2Seq.from_pretrained( base_model_id, torch_dtypetorch.bfloat16, device_mapauto, ) model PeftModel.from_pretrained(model, lora_path) model.eval() return processor, model def infer_image(processor, model, image_path, prompt): image Image.open(image_path).convert(RGB) inputs processor(imagesimage, textprompt, return_tensorspt).to(model.device) with torch.no_grad(): outputs model.generate( **inputs, max_new_tokens256, do_sampleFalse, ) result processor.decode(outputs[0], skip_special_tokensTrue) return result if __name__ __main__: base_model_id your-base-vlm-id lora_path models/finetuned/lora_weights processor, model load_finetuned_model(base_model_id, lora_path) # 分別測試智慧城市和農業場景 test_cases [ (data/real/frame_001.jpg, 描述該路口的交通參與者及通行狀態。), (data/synthetic/agriculture_01/annotation.json_frame_00.jpg, 判斷番茄果實是否成熟。), ] for image_path, prompt in test_cases: result infer_image(processor, model, image_path, prompt) print(fImage: {image_path}) print(fPrompt: {prompt}) print(fResult: {result}) print(- * 60)輸出示例Image: data/real/frame_001.jpg Prompt: 描述該路口的交通參與者及通行狀態。 Result: 畫面中有兩輛直行的小汽車、一輛左轉的電動車以及一名正在斑馬線旁等候的行人。4.6 運行與驗證依次執行以下命令即可完整復現本文流程# 1. 準備真實數據 python scripts/prepare_dataset.py # 2. 生成合成數據需要 Cosmos 環境 python scripts/generate_synthetic.py # 3. 合并數據集 python scripts/merge_datasets.py # 4. 后訓練 python scripts/train_lora.py # 5. 推理驗證 python scripts/inference.py如果使用的是自己的模型路徑需要修改腳本中的model_id、base_model_id等參數。后訓練過程中建議保存訓練日志方便后續定位是否過擬合或欠擬合。5. 常見問題與排查思路在實際運行過程中常見問題集中在環境依賴、數據格式、顯存限制和推理結果異常幾個方面。下面用表格整理排查思路。問題現象常見原因解決思路nvidia-smi不可用WSL2 未啟用 GPU 或驅動版本過低更新 Windows 驅動確保 WSL2 內執行nvidia-smi正常導入 Cosmos 包報錯官方庫名或依賴與版本不匹配查閱官方文檔確認安裝命令檢查 Python 版本模型加載 CUDA out of memory顯存不足降低 batch size開啟 gradient_accumulation_steps或使用更小基座模型推理結果與預期差距大數據標注質量差或訓練輪次過多檢查訓練集標注一致性觀察驗證集損失降低 epoch 或學習率中文輸出質量不穩定基座模型中文能力有限替換中文能力更強的基座模型或增加中文示例在訓練集中的占比批量推理時 padding 導致結果異常不同輸入長度差異大使用模型自帶的動態 padding或在構建 batch 時按長度排序LoRA 訓練后模型輸出亂碼target_modules與模型結構不匹配檢查模型參數名確認q_proj、v_proj等名稱是否存在合成數據與真實數據風格差異過大提示詞未覆蓋目標場景加入更多環境、光照、相機參數描述生成后進行人工篩選5.1 顯存不足的排查示例顯存不足是最常見的問題。先通過nvidia-smi查看占用情況nvidia-smi如果看到類似CUDA out of memory的錯誤依次嘗試減小per_device_train_batch_size從 2 調整到 1。開啟gradient_accumulation_steps8保證有效 batch size 不變。使用bf16或fp16混合精度訓練。對視頻抽幀時降低圖像分辨率例如從 1280x720 降到 640x360。5.2 推理加速的常見手段智慧城市場景對推理延遲有較高要求。這里給出幾種常見的推理加速手段不同方法的收益和復雜度不同。方法 1批量推理Batch Inference 適用離線批量抽幀檢測 收益提高 GPU 利用率 方法 2TensorRT / 模型編譯 適用服務化部署、線上推理 收益顯著降低單次推理延遲 注意需要針對具體模型與 GPU 做轉換 方法 3圖編譯Graph Compiler 適用PyTorch 生態下的動態圖模型 收益減少算子調度開銷 注意可能與動態 video 輸入存在兼容問題 方法 4減小輸入尺寸 / 降低幀率 適用視頻流場景 收益直接減少計算量 注意需要評估精度損失關于 TensorRT 部署需要說明的是具體安裝方式和可支持的算子版本變化較快建議以官方部署文檔為準。不要盲目追求把全部模型轉成 TensorRT圖編譯和批量推理往往已經能帶來可觀的收益。6. 最佳實踐與工程建議6.1 合成數據質量控制合成數據不是“生成多少用多少”必須經過質量篩。建議記錄每段生成視頻的提示詞、生成參數和標注來源并通過可視化工具抽幀審查。建議建立如下篩選流程自動過濾去掉黑幀、重復幀、畫面異常的視頻。規則校驗利用目標檢測模型檢查關鍵物體是否存在例如“畫面中是否出現番茄”。人工抽檢隨機抽 10% 左右的樣本由人工確認語義一致性。標注校準如果 Cosmos 生成結果與文本描述不一致需要修正標注或丟棄樣本。6.2 后訓練數據混合策略真實數據與合成數據的比例需要謹慎控制。一般來說如果合成數據與真實場景分布差距較大合成數據占比過高會導致模型在真實數據上反而變差。一個比較穩妥的做法是訓練集 80% 真實數據 20% 合成數據 驗證集 100% 真實數據先用這個比例評估再根據驗證集表現逐步調整。如果合成數據覆蓋了真實場景缺乏的長尾情況可以適當提高比例。6.3 后訓練超參數調優建議超參數建議范圍說明LoRA rank8 ~ 32rank 越大表達能力越強但顯存占用也更高learning rate1e-5 ~ 5e-4視覺語言模型微調通常比純文本模型更小的學習率batch size1 ~ 8根據顯存調整配合梯度累積epoch2 ~ 5從 2 開始觀察驗證集損失防止過擬合warmup ratio0.03 ~ 0.1避免訓練初期不穩定6.4 安全與合規邊界在智慧城市場景中處理視頻數據時要特別注意隱私和合規問題。實際項目中建議做到以下幾點對涉及個人的視頻幀做匿名化處理例如人臉模糊、車牌脫敏。只在授權范圍內采集和使用真實數據。使用 Cosmos 生成合成數據時保留提示詞和生成參數方便追溯數據來源。對外發布模型權重時檢查基座模型的許可協議是否允許二次分發。7. 總結與下一步學習路線到這里我們完整走通了一條“Cosmos 3 合成數據生成 → VLM 后訓練 → 智慧城市推理”的技術鏈路。你掌握的是一套可以復用到多個物理 AI 場景的實驗流程而不只是某個具體項目的配置。下一步可以從這幾個方向繼續深入把合成視頻從單一視角擴展到多相機視角研究世界模型中的 3D 一致性問題。對比不同后訓練方法SFT、LoRA、DPO在垂直場景中的效果差異。嘗試把后訓練好的 VLM 接入實際機器人控制鏈路用人類反饋進一步優化行為策略。研究推理加速方案將模型部署到邊緣端服務于實時智慧城市監控。實際項目中優先關注數據質量和評估指標不要一上來就追求大模型。合成數據幫你拓寬數據邊界后訓練幫你對齊業務需求VLM 推理幫你把能力落到具體應用中三步缺一不可。希望這篇文章能幫你少踩一些坑也歡迎在評論區交流你的實測結果。