這個教程來自這個英偉達網址
????????教程的目標是提供用于部署 VLA 模型的優化量化和推理方法,以及針對新機器人、任務和環境的參考微調流程。在一個自包含的仿真環境中,結合場景生成和領域隨機化(MimicGen)對性能和準確性進行嚴格驗證。未來階段將包括與 Isaac Lab 和 ROS2 的 sim2real 集成、對 CrossFormer 等相關模型的研究,以及針對實時性能的神經網絡結構優化。
-
??針對 VLA 模型的量化和推理優化
-
? 原始 OpenVLA-7B 權重的準確性驗證
-
? 基于合成數據生成的參考微調工作流程
-
? 在 Jetson?AGX?Orin 上使用 LoRA 進行設備端訓練,以及在 A100/H100 實例上進行完全微調
-
? 在示例積木堆疊任務中通過領域隨機化達到 85% 的準確率
-
? 提供用于復現結果的示例數據集和測試模型
1. 量化
????????已在 NanoLLM 的流式 VLM 管道中添加對 OpenVLA 的支持,使用 MLC 在 INT4/FP8 量化下運行,并利用 TensorRT 以 FP16 精度執行視覺編碼器。
????????首先,我們將在 BridgeData V2 數據集(來自 Open X-Embodiment 集合中權重最高的數據集之一)上測試模型。該數據集也是模型的訓練集,用于在部署時驗證量化和推理是否正確。以下截圖摘自其官網,展示了數據集的樣貌:
????????下面的命令會啟動容器、下載數據集和模型(如有必要)、在首次運行時進行量化,并使用歸一化均方誤差(NRMSE)來衡量模型預測動作值與數據集真實值之間的準確度,以消除動作空間各個維度范圍不一致帶來的偏差。我們在 HuggingFace Hub 上抽取了原始 Bridge 數據集的 100 個 episode 子集,因此無需為這些測試下載完整的約 400?GB 數據集。
INT4:
jetson-containers run $(autotag nano_llm) \python3 -m nano_llm.vision.vla --api mlc \--model openvla/openvla-7b \--quantization q4f16_ft \--dataset dusty-nv/bridge_orig_ep100 \--dataset-type rlds \--max-episodes 10 \--save-stats /data/benchmarks/openvla_bridge_int4.json
FP8
jetson-containers run $(autotag nano_llm) \python3 -m nano_llm.vision.vla --api mlc \--model openvla/openvla-7b \--quantization q8f16_ft \--dataset dusty-nv/bridge_orig_ep100 \--dataset-type rlds \--max-episodes 10 \--save-stats /data/benchmarks/openvla_bridge_fp8.json
FP16
jetson-containers run $(autotag nano_llm) \python3 -m nano_llm.vision.vla --api hf \--model openvla/openvla-7b \--dataset dusty-nv/bridge_orig_ep100 \--dataset-type rlds \--max-episodes 10 \--save-stats /data/benchmarks/openvla_bridge_fp16.json
-
使用
--save-stats
可以將逐幀指標和平均值保存到文件; -
使用
--max-episodes
可以限制處理的 episode 數量。
-
測試環境:Jetson?AGX Orin 64GB,JetPack?6
-
量化精度對比:后續微調模型在 INT4 上的準確度將與 FP8/FP16 保持一致
每一幀都會打印模型預測的 7 維動作向量及其真實值,以及該幀的準確率、延遲和幀率。波浪號(~)后的數字為迄今為止各項指標的平均值,命令結束時最后一行報告的是整個數據集處理完畢后的總體均值。
# INT4
step 355 [-0.02692 0.00776 -0.00299 0.08160 0.07292 0.04791 0.99608] accuracy 0.8466 ~0.9017 time=336.2 ms fps=2.96 ~2.97
gt 355 [-0.02387 0.00760 -0.00318 0.15965 0.07707 0.03281 1.00000]# FP8
step 355 [-0.02392 0.00767 -0.00310 0.08160 0.07692 0.03217 0.99608] accuracy 0.9982 ~0.9523 time=469.7 ms fps=2.13 ~2.12
gt 355 [-0.02387 0.00760 -0.00318 0.15965 0.07707 0.03281 1.00000]# FP16
step 355 [-0.02392 0.00767 -0.00310 0.08160 0.07692 0.03217 0.99608] accuracy 0.9982 ~0.9531 time=842.3 ms fps=1.19 ~1.18
gt 355 [-0.02387 0.00760 -0.00318 0.15965 0.07707 0.03281 1.00000]
????????如上所述,Bridge 數據集已包含在訓練集中,下面我們還會在未參與訓練、具有更大場景變化的新數據上再次運行測試。此工具同樣支持加載 Open X-Embodiment 中的 RLDS/TFDS 格式數據集,以及 Robomimic/MimicGen 的 HDF5 格式數據。你也可以參考下面的代碼示例,利用公開的 API 自行創建 agent 和測試腳本。
2. 推理API
在容器中使用 NanoLLM 庫對攝像頭流運行 VLA 推理的代碼非常簡單:
from nano_llm import NanoLLM
from nano_llm.plugins import VideoSource# 加載視覺-語言-動作模型(VLA),使用 q4f16_ft 量化方式
model = NanoLLM.from_pretrained(model, quantization='q4f16_ft')
# 打開攝像頭(或視頻流),在 CUDA 流 0 上進行處理
camera = VideoSource(video_source, cuda_stream=0)assert(model.vla) # 確保加載的是 VLA 模型while True:# 捕獲一幀圖像,返回格式可以是 cudaImage、NumPy 數組或 GPU 上的 Torch 張量image = camera.capture()if image is None: # 如果因超時沒捕獲到圖像,就繼續重試continue# 基于當前圖像和指令,預測動作向量# 返回一個長度等于自由度數(dof)的數組或張量# 對于 OpenVLA,順序是 (Δx, Δy, Δz, Δroll, Δpitch, Δyaw, gripper)actions = model.vla.predict_action(image, instruction="pick up the nearest object", # “撿起最近的物體”action_space="normalized", # 返回已歸一化的動作值return_tensors='np', # 用 NumPy 數組格式返回)# 接著就可以把 actions 發給機器人控制器或 IK 解算器去執行啦...
quantization='q4f16_ft'
:在推理時使用 INT4 + FP16 混合量化,并進行過微調,以在嵌入式設備(如 Jetson)上獲得最佳性能和精度平衡。
VLA 模型也同樣被 Agent?Studio支持,該平臺還集成了仿真組件。
3. 在線驗證
????????鑒于該任務領域的挑戰性、動態反饋回路以及仿真/訓練/推理的計算需求,使用 VLA 進行語言引導的靈巧操作相比于僅使用 LLM 和 VLM,復雜度顯著提升。
????????要從在 token 級別預測 logits,到在一系列連續幀中不斷輸出足夠正確的動作以形成有用行為,就必須在訓練和推理流程的每個階段交叉檢驗輸出并衡量準確度,以便在出現性能回退時能夠定位原因。
????????與典型的監督學習應用不同,最終任務完成度和成功率并不是從不考慮時間序列和物理交互反饋及復合誤差的靜態預錄數據集中測量的——它們需要在線驗證,無論是在仿真中還是在真實測試中。
彌合仿真到現實的鴻溝:使用 NVIDIA Isaac Lab 訓練 Spot 四足機運動
????????在訓練期間,會根據真實動作標簽(即有多少動作 token 被準確預測)來測量 token 分類準確率,模型通過最小化該損失來優化(這與 LLM 的常規做法一致)。
????????同時,也會根據還原出的實值輸出與真實值的 L1 誤差來衡量連續域動作準確率。由于 token 分類不對“更接近目標”提供額外獎勵,連續動作準確率通常會略高于分類準確率。
????????實際上,為了在類似環境中成功完成任務,這兩項準確率都應保持在 95%以上。
????????為了達到如此高的準確度,相關工作和研究中通常會故意讓模型在相同的 90 萬個 episode 上訓練多達 30 個 epoch(OpenVLA),以實現“過擬合”。Transformer 擅長通過少量示例記憶特定知識,但也對過擬合和遺忘先前學到的信息非常敏感。因此,LLM 在常規微調中通常只訓練少數幾個 epoch,以保留其零樣本能力和對分布外輸入的泛化能力。
????????在本項目的微調階段,我們評估了不同訓練 episode 數量與重復數據 epoch 數量對模型準確率和任務成功率的影響。
????????直到推理階段才會測量實際的任務成功率,此時模型要么連入仿真器,要么在相似條件下進行一系列耗時的物理實驗。
????????我們將 MimicGen 直接集成到 OpenVLA 的訓練腳本中,以源源不斷地產生全新的數據,但在模型處理了大量 episode 后,遇到了梯度不穩定的問題。
4. 用MimicGen仿真
????????MimicGen 利用場景圖信息和任務/子任務的元數據(指出環境中哪些物體是當前子任務的目標),僅憑 10 個遠程示教樣本,就能生成隨機化的訓練回合——將原始示教軌跡插值到新的、隨機的位置和姿態中。
????????這樣即可產生大量獨特的訓練數據,提高模型的魯棒性,而無需投入大量人工來教機器人新技能和行為。
????????MimicGen 構建在 Robomimic 和 Robosuite 仿真器之上,可與 VLA 一同在 Jetson 上無頭運行,極大簡化了可復現性實驗的環境搭建。RoboCasa 項目基于 MimicGen,目前正與 NVIDIA Omniverse 和 OSMO 集成。未來我們還計劃引入 Isaac Lab,以獲得更好的可擴展性、更精準的物理模擬和更逼真的渲染效果。
????????MimicGen 包含 12 種任務,例如塊狀物堆疊、抓取與放置、裝配以及廚房場景。每種任務都有隨著學習進展而難度遞增的多個變體,這為對比“人工設計”的訓練順序與 OpenVLA 在 Open X?Embodiment 中采用的純隨機化順序,提供了很好的研究機會。
????????在本教程階段,我們將聚焦“塊狀物堆疊”任務,以了解要達到論文中 >75–80% 的成功率,所需的訓練需求和運行時性能指標。
????????這些分析將為在更多行為模式和更復雜的場景(如與 MimicGen 環境差異較大的部署環境)中擴展模型提供指導——正如原始 OpenVLA 權重在那些場景中完全沒有成功記錄所顯示的那樣。
4.1 數據生成
????????我們基于一份針對 aarch64+igpu 做了補丁的代碼分支,構建了用于 Jetson 的 MimicGen 容器,并增加了一些功能增強:
-
為相關任務生成帶有隨機變體的自然語言標簽
-
對物體的顏色/材質做額外的領域隨機化
(對應的環境版本命名為Stack_D2
、Stack_D3
和Stack_D4
)
????????在訓練 OpenVLA 時,會將圖像和標簽保存到磁盤;而后續的推理則在在線仿真中完成,以測量任務成功率。為此,我們將 MimicGen 與 Agent Studio 集成,可以交互式地測試模型,并快速插入諸如 ASR(自動語音識別)等組件,用以語音指令控制機器人。
????????在這個 OpenVLA 分支中,已初步支持將 MimicGen 直接集成到訓練流程,實現實時仿真與驗證,以及在無限新回合中訓練而不重復同一批數據(epoch)。我們發現 LoRA 微調后期出現梯度突增的問題,建議可嘗試降低學習率,或在完整微調腳本中同樣集成 MimicGen,并使用 FDSP 在 dGPU 上增大批量大小來穩健訓練。
????????下面的命令會生成指定數量的訓練回合,保存為 Robomimic HDF5 格式。我們已在 HuggingFace Hub 上提供了包含 1000 和 2500 回合的渲染數據集。OpenVLA 建議僅需 10–150 回合即可完成高效微調與適應,其他類似場景中表現可能相近,但我們發現在 MimicGen 環境下遠不足以達到預期效果。
jetson-containers run $(autotag nano_llm) \python3 -m mimicgen.generate \--tasks Stack_D4 \--episodes 100 \--output /data/datasets/mimicgen \--cameras agentview \--camera-width 224 \--camera-height 224
4.3?RLDS 轉換
????????OpenVLA 使用基于 TFDS 的 RLDS 格式數據集,所以我們提供了一個從 HDF5 到 RLDS 的轉換工具。對于大量回合的數據,這一步也可能非常耗時,這正是我們希望在訓練時在線運行 MimicGen 并直接將其集成到 OpenVLA 的原因之一。除非你需要生成不同的數據,否則可以跳過這一步,直接使用我們已經上傳為 RLDS 格式的 MimicGen 數據集。
jetson-containers run $(autotag nano_llm) \python3 -m nano_llm.datasets \--dataset /data/datasets/mimicgen/demo_src_stack_task_D4/demo.hdf5 \--dataset-type mimicgen \--convert rlds \--remap-keys agentview:image \--output /data/datasets/mimicgen/rlds/stack_d4_ep2500
????????運行轉換后,會在指定的輸出目錄下生成一組 TFRecord 文件,這些文件能夠被 OpenVLA 的訓練腳本直接加載使用。
5. 微調
????????本項目的主要目標之一是量化讓模型適應不同機器人和任務所需的訓練工作量。
????????我們的開發流程主要包括在 Jetson?AGX?Orin?64GB 上運行測試性 LoRA 微調并本地調試問題,當結果令人滿意時,再在 Brev.dev、Vast.ai 和 RunPod 等提供商的 A100/H100 云實例上,使用 FDSP 完整地進行微調。我們也嘗試過在兩臺 Jetson?AGX?Orin 上用 FDSP 做全量微調,但所有設置均因顯存不足而失敗。我們已將訓練好的測試模型上傳到 HuggingFace,供大家在下文的推理+仿真環境中試用。
以下是我們曾使用的訓練 GPU 配置及相應的最大化顯存利用的 batch size:
????????在 Jetson?AGX?Orin 和兩塊 A100 上訓練至收斂大約需要 24–36 小時,具體時長取決于數據量和訓練輪數(epoch)。為了盡量避免前文提到的過擬合,我們在完整微調時將 epoch 控制在 5 次以內,而通過增加訓練回合數來提升模型表現。
具體過程可以看OpenVLA的官方repo
6. 推理和仿真
????????為了衡量模型在完成任務時的真實表現,我們在 Agent Studio 中啟動了一個與 VLA 模型相連的 MimicGen 環境。它通過檢查仿真發放的獎勵來統計成功回合數——這些獎勵模型本身并不使用,僅用以標記任務何時完成。我們設置了 200 幀的執行上限,超過該幀數則判定為失敗。
jetson-containers run $(autotag nano_llm) \python3 -m nano_llm.studio --load OpenVLA-MimicGen-INT4jetson-containers run $(autotag nano_llm) \python3 -m nano_llm.studio --load OpenVLA-MimicGen-FP8jetson-containers run $(autotag nano_llm) \python3 -m nano_llm.studio --load OpenVLA-MimicGen-FP16
????????要開始基準測試,只需將 AutoPrompt 節點的輸出連接到 OpenVLA 節點。默認情況下它會無限運行——我們各做了 100 回合測試,由于仿真與模型推理同步運作,整個過程可能需要數小時(后續實驗會嘗試基于多步累積動作進行訓練,并縮小模型規模以提升性能)。
這里每個方框都是一個「模塊」,線條表示數據流向。
-
WebAudioIn
- 功能:從瀏覽器或麥克風抓取實時音頻流。
- 輸出:raw audio。
-
VADFilter
-
全稱 Voice Activity Detector,檢測「有人在說話」的時段,自動切掉靜音與噪聲。
-
輸入:raw audio;輸出:audio segments + interrupt 信號(暫中斷)。
-
-
WhisperASR
-
用 OpenAI Whisper 做自動語音識別,輸出 partial(中間結果)和 final(完整文字)。
-
作用:把語音轉換成文字命令。
-
-
TextOverlay → VideoOutput
-
TextOverlay:把識別出來的文字直接疊加到視頻幀上(右側仿真窗口里看到的綠色提示)。
-
VideoOutput:負責把最終合成的圖像以 ~5–6 FPS 推送到界面右側。
-
-
UserPrompt
-
用戶也可以手工在這里輸入文字(比如在測試時直接打“把紅塊放到大塊上”)。
-
-
AutoPrompt
-
把 WhisperASR 的結果、UserPrompt,以及 MimicGen 提供的上下文(見下)——綜合出一個“List”格式的、給 LLM 的 Prompt 列表。
-
-
MimicGen
-
這里是視覺+語言的示范合成器:
-
image:當前仿真畫面截圖;
-
text:可以是示范軌跡的文字描述或環境標注;
-
-
它會在內部根據示例自動生成更多“虛擬示范”,增強 LLM/策略的少樣本學習能力。
-
-
openvla-7b+stac
-
把上游的 Prompt 列表喂給一個 7B 參數量的 VLA(Vision-Language-Action)模型,輸出一系列 actions(機器人動作指令)。
-
“2.8 FPS” 表示這個模型的推理速度。
-
-
這些 actions 再回流到 VideoOutput,驅動仿真里的機械臂做實際操作。
????????此次測試使用的是在 2500 回合數據上微調 4 個 epoch 的模型。盡管任務相對簡單,該模型依然證明能夠達到約 85% 的預期成功率。量化對性能的提升幾乎呈線性增長,對準確率的影響不到 1%。
在評估了那些使用較少回合但訓練更多輪次的微調模型的成功率后,我們清楚地看到了增大數據集規模所帶來的影響:
????????這并不意味著使用 2500 回合訓練的模型就沒有過擬合——事實上,它已經學會了總是先堆放小方塊,基本忽略了指令。要解決這個問題,就需要在訓練中引入更多任務多樣性,而現在我們已有了這樣的數據流程。
????????與此同時,我們也希望將研究擴展到現實世界場景,而不僅僅局限于仿真環境,以驗證模型在真實操作中的可行性。
????????在操控這一極具挑戰的問題域中,要達到通用模型所需的變化量和數據量,不禁讓人思考:是采用完全隨機化的任務學習,還是在訓練進程中隨著復雜度遞增、以更有針對性和精心設計的方式進行指導,更能高效地培養出具備廣泛適應能力的模型?
7. 總結
????????搞了半天,應該去? Agent Studio?中找我想要的,如何啟動一個與 VLA 模型相連的 MimicGen 環境(只有mimicgen?能否使用其他VLA?)。