1 · 結論與選型
建議選 Offline TRT。兩台的 Offline TRT 速度與 Online TRT 接近,但完整服務 RAM 大幅下降:Orin 推論後 cgroup current 比 Online TRT 少 55.4%,4090 少 77.5%。4090 的 VRAM 增量則幾乎相同,表示 Offline TRT 主要省下 host RAM/統一記憶體中的建圖成本。
正式 Orin 已切到 target-built Offline TRT bundle;engine 由 Orin 的 sm87/TensorRT runtime 產生,沒有搬用 4090 的 sm89 engine。模型權重、tokens 與主要服務 source hash 在兩平台相同。
2 · 測試方法與邊界
2.1 同一份 code
- branch:
feat/orin-tensorrt;HEAD:a16280f1ea7e。 origin/main:4ee182123144,已驗證為 HEAD 祖先。- 4090 從根目錄 Dockerfile 建 image;Orin 由
deploy.shbuild/push/deploy。 - 音訊 SHA-256 固定,三個後端共用同一份 3/6/15 秒 WAV。
2.2 重複與計時
- 模型 graph:T=50/100/250,暖機 10 次、正式 50 次,主計時不開 profiler。
- 直接 recognizer:每音長新程序,先以 3 秒暖機一次,再正式解碼 3 次。
- 完整服務:每後端一個新容器/Pod,暖機 3 次;3/6/15 秒 bulk、realtime 各跑 3 輪,表與線圖用三輪中位數。
- Hover 點位固定以同平台、同音長 CUDA 為基準,顯示毫秒與百分比。
使用的腳本與實際手法
| 腳本 | 用在哪裡 | 手法 |
|---|---|---|
deploy.sh | Orin | DVC 模型檢查、ARM64 image build、push、套用 k3s manifest、等待 rollout;本輪另記整段時間。 |
tests/batch_decode/provider_recheck.py | 4090 / Orin | 直接量 ORT graph、sherpa-onnx recognizer、載入時間與程序/cgroup 記憶體;短 profiler run 只證明 provider 分配。 |
tests/batch_decode/hardware_profile.py | 4090 / Orin 完整服務 | 經 5 行 wrapper 先載入服務 library 對齊,再執行版控腳本;單一 WebSocket series 比較 bulk 與 realtime。 |
service-memory.py(gitignored helper) | 完整服務 | 從 /proc/1/status、/proc/1/smaps_rollup、/sys/fs/cgroup 讀 ready/end;4090 再以 nvidia-smi 量整卡顯存。 |
兩平台 runtime 不完全相同(4090 ORT 1.23.2;Orin ORT 1.24.0),因此只比較各平台內後端差異,不用絕對毫秒做跨機排名。4090 GPU 還有其他程序,VRAM 以同測項前後增量解讀。
3 · RTX 4090 模型後端
Online TRT 與 Offline TRT 在 3、6 秒都快於 CUDA;15 秒三者接近,直接 recognizer 沒有顯示明顯 TRT 回歸。
精確數值
| 音長 | 後端 | p50 ms | p95 ms | 載入 s | 相對 CUDA |
|---|---|---|---|---|---|
| 3s | CUDA | 12.39 | 12.60 | 3.065 | +0.0% |
| 3s | Online TRT | 10.01 | 10.15 | 40.634 | -19.2% |
| 3s | Offline TRT | 9.80 | 10.12 | 1.490 | -20.9% |
| 6s | CUDA | 16.98 | 24.55 | 1.282 | +0.0% |
| 6s | Online TRT | 13.90 | 15.96 | 7.079 | -18.1% |
| 6s | Offline TRT | 14.22 | 22.36 | 1.499 | -16.3% |
| 15s | CUDA | 29.04 | 36.99 | 1.358 | +0.0% |
| 15s | Online TRT | 28.32 | 28.84 | 5.682 | -2.5% |
| 15s | Offline TRT | 29.86 | 36.18 | 1.602 | +2.8% |
固定 shape graph 與 provider 證明
| 後端 | T=50 p50 | T=100 p50 | T=250 p50 | profiler 節點 |
|---|---|---|---|---|
| CUDA | 8.23 | 8.19 | 10.66 | {'CUDAExecutionProvider': 2908, 'CPUExecutionProvider': 785} |
| Online TRT | 5.87 | 5.83 | 10.20 | {'TensorrtExecutionProvider': 1} |
| Offline TRT | 5.90 | 5.79 | 10.06 | {'TensorrtExecutionProvider': 1} |
4 · Orin AGX 模型後端
Orin 的 Online TRT 與 Offline TRT 幾乎重疊;3、6 秒加速最明顯,15 秒收益縮小。
精確數值
| 音長 | 後端 | p50 ms | p95 ms | 載入 s | 相對 CUDA |
|---|---|---|---|---|---|
| 3s | CUDA | 45.21 | 45.34 | 2.872 | +0.0% |
| 3s | Online TRT | 28.11 | 28.50 | 66.583 | -37.8% |
| 3s | Offline TRT | 27.81 | 28.07 | 7.945 | -38.5% |
| 6s | CUDA | 54.44 | 81.14 | 2.756 | +0.0% |
| 6s | Online TRT | 39.53 | 54.67 | 14.710 | -27.4% |
| 6s | Offline TRT | 39.60 | 52.71 | 7.932 | -27.3% |
| 15s | CUDA | 87.74 | 107.94 | 2.820 | +0.0% |
| 15s | Online TRT | 81.89 | 89.80 | 14.863 | -6.7% |
| 15s | Offline TRT | 81.25 | 86.93 | 7.930 | -7.4% |
固定 shape graph 與 provider 證明
| 後端 | T=50 p50 | T=100 p50 | T=250 p50 | profiler 節點 |
|---|---|---|---|---|
| CUDA | 36.30 | 36.99 | 44.97 | {'CUDAExecutionProvider': 2908, 'CPUExecutionProvider': 785} |
| Online TRT | 19.97 | 20.39 | 39.47 | {'TensorrtExecutionProvider': 1} |
| Offline TRT | 19.25 | 19.88 | 38.58 | {'TensorrtExecutionProvider': 1} |
Offline TRT artifact 在 Orin 冷建一次花 67.49 秒;4090 是 22.84 秒。這是產生平台專屬 EP context 與 engine 的一次性成本,不是每次服務啟動成本。
5 · 完整 STT 服務
5.1 RTX 4090
三輪中位數中 Offline TRT 的 3、6、15 秒 bulk 都快於 CUDA;15 秒另一次複測也落在相同區間。
realtime 的 final recognizer 延遲不含 3/6/15 秒送音時間;三個音長的 Offline TRT 中位數都低於 CUDA。
精確數值
| 送音 | 音長 | 後端 | 三輪中位數 ms | 範圍 ms | 相對 CUDA |
|---|---|---|---|---|---|
| bulk | 3s | CUDA | 24.29 | 22.70–25.69 | +0.0% |
| bulk | 3s | Online TRT | 16.17 | 13.12–20.90 | -33.4% |
| bulk | 3s | Offline TRT | 12.46 | 11.97–12.95 | -48.7% |
| bulk | 6s | CUDA | 26.86 | 26.49–30.88 | +0.0% |
| bulk | 6s | Online TRT | 17.24 | 17.13–19.86 | -35.8% |
| bulk | 6s | Offline TRT | 16.95 | 16.34–19.54 | -36.9% |
| bulk | 15s | CUDA | 41.95 | 40.50–54.10 | +0.0% |
| bulk | 15s | Online TRT | 33.84 | 33.58–42.53 | -19.3% |
| bulk | 15s | Offline TRT | 33.53 | 33.34–39.89 | -20.1% |
| realtime | 3s | CUDA | 36.53 | 24.39–39.90 | +0.0% |
| realtime | 3s | Online TRT | 10.81 | 10.80–18.64 | -70.4% |
| realtime | 3s | Offline TRT | 11.25 | 10.41–12.86 | -69.2% |
| realtime | 6s | CUDA | 23.18 | 22.24–32.37 | +0.0% |
| realtime | 6s | Online TRT | 18.20 | 12.29–22.08 | -21.5% |
| realtime | 6s | Offline TRT | 20.48 | 12.47–23.21 | -11.6% |
| realtime | 15s | CUDA | 34.92 | 32.39–42.28 | +0.0% |
| realtime | 15s | Online TRT | 21.47 | 20.98–34.35 | -38.5% |
| realtime | 15s | Offline TRT | 23.80 | 23.51–26.41 | -31.8% |
5.2 Orin AGX
Offline TRT 與 Online TRT 接近,且三個音長的 bulk 中位數都低於 CUDA。
Offline TRT 保留 Online TRT 的速度;15 秒的相對收益小於短句,但仍低於 CUDA。
精確數值
| 送音 | 音長 | 後端 | 三輪中位數 ms | 範圍 ms | 相對 CUDA |
|---|---|---|---|---|---|
| bulk | 3s | CUDA | 96.26 | 95.83–133.31 | +0.0% |
| bulk | 3s | Online TRT | 54.17 | 52.87–55.55 | -43.7% |
| bulk | 3s | Offline TRT | 54.10 | 51.91–59.33 | -43.8% |
| bulk | 6s | CUDA | 98.95 | 97.35–111.80 | +0.0% |
| bulk | 6s | Online TRT | 58.72 | 57.59–61.10 | -40.7% |
| bulk | 6s | Offline TRT | 59.23 | 59.19–65.61 | -40.1% |
| bulk | 15s | CUDA | 131.55 | 124.84–138.05 | +0.0% |
| bulk | 15s | Online TRT | 109.34 | 107.56–119.26 | -16.9% |
| bulk | 15s | Offline TRT | 107.73 | 100.35–125.06 | -18.1% |
| realtime | 3s | CUDA | 84.63 | 83.96–84.65 | +0.0% |
| realtime | 3s | Online TRT | 46.62 | 44.91–58.38 | -44.9% |
| realtime | 3s | Offline TRT | 45.98 | 42.30–47.78 | -45.7% |
| realtime | 6s | CUDA | 86.05 | 84.01–92.39 | +0.0% |
| realtime | 6s | Online TRT | 44.99 | 44.38–45.45 | -47.7% |
| realtime | 6s | Offline TRT | 45.65 | 45.53–45.75 | -46.9% |
| realtime | 15s | CUDA | 88.75 | 86.38–125.89 | +0.0% |
| realtime | 15s | Online TRT | 69.03 | 68.59–112.91 | -22.2% |
| realtime | 15s | Offline TRT | 67.63 | 66.83–68.03 | -23.8% |
6 · 記憶體:RAM / VRAM,不含 disk
6.1 RTX 4090 完整服務
推論後時,以 Offline TRT 的容器計帳記憶體最低;同一張固定尺度可直接比較切換前後。
載入完成時,以 Offline TRT 的容器計帳記憶體最低;同一張固定尺度可直接比較切換前後。
PSS、RSS 與程序峰值的口徑不同;容量決策先看 cgroup current,再用這張圖判讀程序共享頁與歷史峰值。
完整記憶體數值
| 後端 | 時點 | cgroup current | PSS | RSS | VmHWM | cgroup peak |
|---|---|---|---|---|---|---|
| CUDA | 載入完成 | 1872.79 | 2233.42 | 2240.68 | 2322.06 | 1960.53 |
| CUDA | 推論後 | 2002.88 | 2362.01 | 2369.20 | 2415.51 | 2412.32 |
| Online TRT | 載入完成 | 6751.16 | 8987.69 | 8994.94 | 9670.09 | 7438.35 |
| Online TRT | 推論後 | 6902.36 | 9138.48 | 9145.75 | 9670.09 | 7438.35 |
| Offline TRT | 載入完成 | 1412.39 | 1949.88 | 1957.09 | 2860.31 | 2326.56 |
| Offline TRT | 推論後 | 1553.64 | 1953.33 | 2098.27 | 2860.31 | 2326.56 |
6.2 Orin AGX 完整服務
推論後時,以 Offline TRT 的容器計帳記憶體最低;同一張固定尺度可直接比較切換前後。
載入完成時,以 Offline TRT 的容器計帳記憶體最低;同一張固定尺度可直接比較切換前後。
PSS、RSS 與程序峰值的口徑不同;容量決策先看 cgroup current,再用這張圖判讀程序共享頁與歷史峰值。
完整記憶體數值
| 後端 | 時點 | cgroup current | PSS | RSS | VmHWM | cgroup peak |
|---|---|---|---|---|---|---|
| CUDA | 載入完成 | 3807.70 | 1655.86 | 3894.80 | 3898.62 | kernel 未提供 |
| CUDA | 推論後 | 3936.52 | 1760.47 | 4021.76 | 4069.36 | kernel 未提供 |
| Online TRT | 載入完成 | 8487.49 | 6162.44 | 8582.18 | 9368.82 | kernel 未提供 |
| Online TRT | 推論後 | 8592.07 | 6265.84 | 8760.11 | 9368.82 | kernel 未提供 |
| Offline TRT | 載入完成 | 3632.59 | 1443.22 | 3776.89 | 4188.49 | kernel 未提供 |
| Offline TRT | 推論後 | 3831.88 | 1567.93 | 3976.35 | 4188.49 | kernel 未提供 |
6.3 模型後端本身:直接 recognizer
每個音長使用新程序;圖中取 3、6、15 秒三個 end 快照的中位數,能看出模型後端本身的容器記憶體成本。
直接 recognizer 記憶體中位數
| 後端 | cgroup current | PSS | RSS | VmHWM |
|---|---|---|---|---|
| CUDA | 1085.97 | 1315.22 | 1319.76 | 1352.11 |
| Online TRT | 5465.39 | 7545.49 | 7549.97 | 9423.36 |
| Offline TRT | 587.46 | 971.04 | 975.52 | 1579.04 |
每個音長使用新程序;圖中取 3、6、15 秒三個 end 快照的中位數,能看出模型後端本身的容器記憶體成本。
直接 recognizer 記憶體中位數
| 後端 | cgroup current | PSS | RSS | VmHWM |
|---|---|---|---|---|
| CUDA | 1091.46 | 1096.01 | 2286.68 | 2305.90 |
| Online TRT | 6778.99 | 5519.03 | 7015.89 | 8601.89 |
| Offline TRT | 3331.37 | 861.41 | 2163.17 | 2275.33 |
6.4 首次建 engine、暖快取與 Offline 載入
| 平台 | Online TRT 空 cache 載入 s | Online TRT 暖 cache 載入 s | Offline artifact 冷建 s | Offline TRT 載入 s |
|---|---|---|---|---|
| 4090 | 40.634 | 6.381 | 22.836 | 1.499 |
| Orin | 66.583 | 14.787 | 67.486 | 7.932 |
Orin 完整服務首次建 engine 記憶體
| 時點 | cgroup current MiB | PSS MiB | RSS MiB | VmHWM MiB |
|---|---|---|---|---|
| 載入完成 | 9053.33 | 6139.50 | 8649.60 | 10275.58 |
| 首次 3 秒推論後 | 9104.49 | 6163.42 | 8701.29 | 10275.58 |
空 cache 與暖 cache 取直接 recognizer 的新程序;Offline artifact 冷建只做一次。完整服務首次建 engine 使用 emptyDir,與暖快取主圖分列。
6.5 RTX 4090 整卡 VRAM
CUDA、Online TRT、Offline TRT 的服務顯存增量接近;整卡還包含其他程序,所以只把同測項前後差當近似增量。
VRAM 原始快照
| 後端 | 測前 MiB | 載入完成 MiB | 推論後 MiB | ready 增量 | end 增量 |
|---|---|---|---|---|---|
| CUDA | 9569 | 12042 | 12064 | +2473 | +2495 |
| Online TRT | 9569 | 12122 | 12230 | +2553 | +2661 |
| Offline TRT | 9569 | 12114 | 12222 | +2545 | +2653 |
6.6 指標、平台與手法
| 指標 | 4090 | Orin | 測什麼/怎麼測 |
|---|---|---|---|
| cgroup current | 有 | 有 | 整個容器目前被計帳的 RAM,含檔案快取;讀 /sys/fs/cgroup/memory.current,主圖優先看這個。 |
| PSS | 有 | 有 | 程序按比例分攤共享頁;讀 PID 1 的 smaps_rollup。 |
| RSS | 有 | 有 | 程序常駐 RAM,共享頁在每個程序都完整計入;讀 PID 1 的 VmRSS。 |
| VmHWM | 有 | 有 | 程序啟動至今最高 RSS;讀 PID 1 的 VmHWM。 |
| cgroup peak | 有 | kernel 未提供 | 容器歷史最高計帳 RAM;4090 讀 memory.peak,Orin 不填零。 |
| MemTotal / MemAvailable | 有 | 有 | 整台主機總 RAM 與當下可用 RAM,只作背景交叉檢查。 |
| GPU memory.used | 有 | 不另拆 | 4090 用 nvidia-smi 讀整卡 VRAM;Orin CPU/GPU 共用 LPDDR,沒有獨立 per-process VRAM。 |
7 · 新舊差異與不一致
正文只使用本輪 rebase 後數據。歷史附錄只比較上一輪 cycle 帶過來的 4090 CUDA/Online TRT;上一輪沒有同條件 Offline TRT 完整服務,因此不補推測值。Orin 全部採本輪新值,不混入舊數據。
4090 上一輪與本輪逐項差異
| 後端 | 送音 | 音長 | 上一輪 ms | 本輪 ms | 本輪差異 |
|---|---|---|---|---|---|
| CUDA | bulk | 3s | 22.45 | 24.29 | +8.2% |
| CUDA | bulk | 6s | 26.83 | 26.86 | +0.1% |
| CUDA | bulk | 15s | 72.64 | 41.95 | -42.2% |
| CUDA | realtime | 3s | 28.21 | 36.53 | +29.5% |
| CUDA | realtime | 6s | 30.55 | 23.18 | -24.1% |
| CUDA | realtime | 15s | 74.55 | 34.92 | -53.2% |
| Online TRT | bulk | 3s | 13.34 | 16.17 | +21.2% |
| Online TRT | bulk | 6s | 17.97 | 17.24 | -4.1% |
| Online TRT | bulk | 15s | 75.10 | 33.84 | -54.9% |
| Online TRT | realtime | 3s | 17.98 | 10.81 | -39.9% |
| Online TRT | realtime | 6s | 13.37 | 18.20 | +36.1% |
| Online TRT | realtime | 15s | 54.44 | 21.47 | -60.6% |
4090 15 秒沒有重現上一版報告的系統性異常。本輪三輪中位數的 Online TRT bulk 比 CUDA 快 19.3%;另一次單獨複測為 CUDA 39.17 ms、Online TRT 39.40 ms。單次樣本可互換快慢,但三輪與複測都落在約 34–42 ms,判定為短期變異,不列成當前回歸。
Orin Online TRT 15 秒 realtime 第一輪 112.91 ms,後兩輪約 68.59/69.03 ms;報告採三輪中位數並保留範圍,不隱藏這個離散值。
8 · Build、部署與驗證
| 項目 | 時間 | 說明 |
|---|---|---|
| 4090 基礎 image build | 36.52 s | 根目錄 Dockerfile;部分 dependency layer 命中 cache。 |
| 4090 TensorRT 測試層 | 459.27 s | 安裝 TensorRT 10.13.3.9;三後端共用這份 image。 |
Orin Online TRT deploy.sh | 531.20 s | 含 DVC、build、push、deploy;rollout 165.272 s。 |
Orin Offline TRT deploy.sh | 287.57 s | 正式切換;rollout 112.308 s,使用 target-built offline-a16280f bundle。 |
Dockerfile.orin 的 sherpa-onnx jobs 已改為 max(1, floor(nproc / 2));32 CPU 時是 16。這次 rebase 後兩次 deploy 的 sherpa layer都命中 cache,所以不能拿 deploy 總時間宣稱 CPU 公式帶來多少加速。
8.1 驗證結果
- 完整服務:108/108 個有效 final;另有 4090 15 秒 6 個複測結果與 Orin cold Online TRT 2 個結果。
- 正式 Offline TRT deployment 再跑 3/6/15 秒 bulk/realtime smoke,6/6 成功;這組只驗證進版,不混入三輪主統計。
- 報告結構、圖表、交叉引用、資料完整性與 TRT guard:82 passed/2.56 秒。
- graph 主計時全部 profiler-free;短 profiler 證明 Online TRT 與 Offline TRT 都只有 TensorRT provider 節點事件。
- 4090 測後容器清理、整卡 VRAM 回到 9569 MiB 背景基線;Orin 臨時 pods 清理,只保留正式 Offline TRT deployment。
- 失敗嘗試發生在送音前,已排除;完整清單保存在下載 JSON。
- 此輪依要求不 commit、不 push Git branch。
8.2 名詞定義
| 名詞 | 本報告的意思與影響 |
|---|---|
| Online TRT | 服務仍讀完整 ONNX,在目標 GPU 建圖或命中 engine cache;快取命中仍可能保留較高 host RAM。 |
| Offline TRT / EP context model | 先在目標機產生小型 ONNX context,載入時直接引用外部 TensorRT engine;本輪用來降低啟動建圖 RAM。 |
| sm87 / sm89 | NVIDIA GPU compute capability;Orin 是 sm87、RTX 4090 是 sm89。TensorRT engine 綁定架構與 runtime,不可跨機搬用,換平台必須重建。 |
| RSS | Resident Set Size,程序常駐 RAM;共享頁會重複計入,所以容量判斷不能只看 RSS。 |
| PSS | Proportional Set Size,把共享頁按比例分攤;比 RSS 更接近程序對共享 RAM 的份額。 |
| smaps / smaps_rollup | Linux 程序記憶體映射統計;本輪從 PID 1 的彙總檔讀 PSS。 |
| cgroup current / peak | 容器現在/歷史最高被計帳的 RAM;主容量比較使用 current,Orin kernel 沒有 peak 時明列不可用。 |
| VRAM | 獨立顯卡記憶體;4090 可由 nvidia-smi 量整卡,Orin 的 CPU/GPU 共用記憶體所以不另造一欄。 |