模組四|從 2D 到 3D(Day 20–25)
Day 20 把限制寫死了——那篇的結論是:我手上沒有專業級顯卡,所以每一條「把 2D 圖變成 3D 模型」的路線,都得先過「這台機器跑不跑得動」這一關。這篇實際跑路線 A:把《矽墟》(我正在寫的科幻小說連載,整部用管軟體專案的方式在管)的角色三視圖,餵給 Microsoft 的 image-to-3D 模型 TRELLIS.2。
結論先說:跑成功了,第一次就成功,拿到一個帶完整 PBR(Physically Based Rendering,基於物理的算繪)材質的模型——簡單說就是這份材質進到 3D 軟體裡會對燈光有正確反應,金屬像金屬、布料像布料——角色認得出來。而我用的機器沒有任何一張符合官方要求的顯卡。
這篇講三件事:這個模型憑什麼能處理衣擺和髮絲、官方的硬體門檻到底寫了什麼、以及沒有那張卡的人實際上要從哪裡進去。
TRELLIS.2 的 GitHub repo 在 Prerequisites 底下寫的是這兩行:
System: The code is currently tested only on Linux.
Hardware: An NVIDIA GPU with at least 24GB of memory is necessary.
The code has been verified on NVIDIA A100 and H100 GPUs.
24GB 起跳,驗證平台是 A100 和 H100,而且只在 Linux 上測過。
這個門檻對個人創作者的意思很直接:消費級顯卡絕大多數出局。 24GB 這條線把選擇壓縮到很少數的卡,而官方實際驗證過的兩張都是資料中心卡。
repo 裡另外提到,不支援 flash-attn(一套讓注意力運算跑得更快、更省記憶體的加速函式庫)的卡(它舉的例子是 V100)要自己裝 xformers(另一套做同樣加速的替代品)並設 ATTN_BACKEND 環境變數,告訴程式改用哪一套。這句話透露的訊息是:就算你湊到記憶體,還有一層相容性要處理。
答案不在 repo 的安裝說明裡,在專案首頁上。
microsoft.github.io/TRELLIS.2 頂部有四個連結:Watch Intro Video、Read Research Paper、Code、Demo。前三個分別指向影片、論文、GitHub。Demo 那個指向的是 Hugging Face 上的 microsoft/TRELLIS.2 Space。
也就是說,微軟官方掛出來的線上試用入口只有這一個,而它是一個 HF Space——Hugging Face(模型代管平台)上的線上試用頁,模型跑在對方的機器上,你只要開瀏覽器上傳圖片。
那個 Space 頁面上標示的執行環境是 ZeroGPU。ZeroGPU 的模式是:GPU 不常駐給單一 Space,而是在你送出請求的當下動態配給,用完釋放。對使用者的意義是登入之後有一份免費配額可以用,尖峰時要排隊,付費的 PRO 帳號配額更高、排得比較前面。
所以「24GB 顯卡」這個門檻對想試一次的人來說,實際上可以繞過:你不用去買那張卡,去借官方那台就行。
我就是這樣跑的。一次就過,沒有失敗重試。
這是我真正想弄懂的部分,因為它決定了這條路線適不適合角色。
多數 image-to-3D 的方法底層是某種等值面場(iso-surface field)——先學一個空間中的純量場,再抽出等值面變成網格。這個做法有一個結構性的限制:它天生描述的是「有內外之分的封閉表面」。
而角色身上最麻煩的東西剛好都不封閉:
| 東西 | 幾何性質 |
|---|---|
| 衣擺、披風、裙襬 | 開放曲面,只有一層,沒有厚度 |
| 髮絲 | 大量細片狀開放曲面 |
| 交錯的配件 | 非流形(non-manifold),邊被兩個以上的面共用 |
| 外衣底下的內襯 | 被包住的封閉內部結構 |
TRELLIS.2 的核心表示法叫 O-Voxel(voxel 是體素,也就是 3D 版的像素——把空間切成一格一格的小方塊來記錄形狀;「稀疏」則是只記有東西的那些格子,空的不佔位),官方對它的定位是一個「field-free」(無場)的稀疏體素結構——不走場、不抽等值面。專案頁上直接列出它宣稱能處理的三類:open surfaces、non-manifold geometry、enclosed interior structures,而且用了剖面圖來展示被包住的內部結構確實生出來了。
「不用場」這件事之所以關鍵,是因為前面那張表裡的四樣東西,全部都是等值面方法會做壞的地方。裙襬會被補成有厚度的殼,髮絲會糊成一塊,內襯根本不會存在。
換句話說:這不是「品質比較好」的差別,是「做不做得出來」的差別。 對純角色的專案,這一條就足以決定選型。
第二個我原本沒預期的點是材質。
這個模型產出的是一組可以做 PBR 的表面屬性:Base Color(基礎顏色)、Roughness(粗糙度)、Metallic(金屬度),以及 Opacity(不透明度)。彩色貼圖只是其中一個通道。
有 Roughness 和 Metallic 的意思是,模型進到引擎裡之後會對場景燈光有正確反應——金屬件會像金屬,布料不會反光。這跟只有一張 base color 貼圖、靠美術硬畫出高光的做法,是兩個層級的東西。
官方對規模的說法是 4B 參數、最高可以產到 1536³ 解析度的帶材質資產,底層是原生 3D VAE(Variational Autoencoder,變分自編碼器——把 3D 資料壓成小很多的表示、要用時再還原回來的壓縮器)搭 16× 空間壓縮。
輸入是三張三視圖,就是模組三那條產線的產物——正面、背面、側面:
char-chenger-front.png 999 × 1438
char-chenger-back.png 999 × 1438
char-chenger-side.png 465 × 1438
參數只動了兩個:
resolution 1024
seed 175029927
resolution 是輸出的解析度,數字越大細節越多、跑越久;seed 是隨機種子,把它記下來,下次才有機會重跑出同一個結果。
產出是一個 GLB(glTF Binary,把網格、材質、貼圖全部打包進單一檔案的 3D 交換格式):
13,206,732 bytes (12.59 MiB)
材質是四張 2048×2048:
baseColor 3.13 MB
metallicRoughness_packed 0.80 MB
metallic 0.46 MB
roughness 0.18 MB
metallicRoughness_packed 是把 metallic 和 roughness 兩張圖塞進同一張圖的不同色彩通道,內容跟另外兩張重複,只是引擎讀起來比較省。
打開來看,角色認得出來,是秤兒(模組三那條產線一直在畫的那個角色)沒錯。衣服的層次在,材質完整,該有的通道都在。
以「能不能從三張 2D 圖生出一個帶完整材質的 3D 角色」這個問題來說,答案是能,而且比我預期的好。
官方在專案頁上給的數字是這樣(標註測試環境為 NVIDIA H100):
| 解析度 | 總時間(幾何 + 材質) |
|---|---|
| 512³ | 3 秒(2 + 1) |
| 1024³ | 17 秒(10 + 7) |
| 1536³ | 60 秒(35 + 25) |
我跑的是 1024,對應到 17 秒那一列。
這裡要說清楚:那 17 秒是 H100 上的推論時間。我從按下按鈕到拿到檔案,實際等得更久,因為走 ZeroGPU 還要加上排隊等配給的時間,而那段時間取決於當下有多少人在用,沒有固定值,我也沒有可靠的方式量它。
所以我能誠實給的是官方的推論時間,加上一句:體感上,等待主要花在排隊,不在算圖。
第一個代價是可重現性。
我沒有跑在自己的機器上,我跑在一個我不控制的環境裡。這代表環境不是我的、版本不是我釘的、配額不是我的。今天能跑,是因為那個 Space 現在活著而且我還有額度。這在做一次性嘗試的時候完全沒問題,但它不能當成產線的一部分——你不能把一條會被人家關掉的路放進流程裡。
第二個代價是規模。
免費配額適合跑一個角色看看行不行,不適合跑二十個。一旦這條路線要真的用在整個專案上,前面那個 24GB 的門檻就會回來找你,只是換成雲端 GPU 的帳單形式。這跟 Day 17 講的成本結構是同一件事:能跑一次跟能跑一輪,中間隔著一個乘法。
第三個代價比較微妙:這次太順了。
一次就成功、模型好看、材質完整,很容易讓人在這個時間點下結論說路線 A 成立。而我下這個結論下得太早了——明天那篇就是在講,我拿到這個模型之後發現我沒辦法用它,而問題全部都跟「生得像不像」無關。
一、官方硬體要求要去 repo 裡逐字讀,不要看二手轉述。
「要 24GB」和「只在 Linux 測過、只在 A100/H100 驗證過、不支援 flash-attn 的卡要自己換 backend」是很不一樣的兩件事。前者是一個數字,後者是一份實際的相容性清單。
二、門檻寫得很高的模型,先去專案首頁找 Demo 連結。
會把硬體要求寫成 24GB 的團隊,通常也知道大部分人沒有那張卡,所以多半會掛一個官方線上入口。這個入口省錢是其次,重點是讓你在投入硬體之前先確認這條路線值不值得投入。
判斷句:在我為這件事買任何東西之前,有沒有一個官方管道能讓我先跑一次?
三、選型先問「做不做得出來」,再問「品質好不好」。
我原本以為 image-to-3D 的差別是精細度高低。實際上對角色來說,關鍵是底層表示法能不能處理開放曲面與非流形幾何:裙襬和髮絲在等值面那條路上根本做不對,跟「做得比較差」是兩回事。
看到一個模型宣稱自己 field-free、無等值面,要去確認它列的是不是你的東西真正會踩到的那幾類。
四、免費額度可以驗證,不能生產。
借來的環境適合回答「這條路行不行」,不適合回答「這條路能不能養活我的專案」。這兩個問題的答案經常不一樣,而把第一個的答案當成第二個來用,是選型階段最常見的自我欺騙。
五、一次就成功的時候,先別急著下結論。
順利的第一次會讓人跳過「拿到之後要怎麼用」這個問題。我就跳過了,而代價是明天那一整篇。
明天 Day 22,講拿到這個模型之後才浮出來的四個問題。它們有一個共同點:全部跟模型生得像不像無關,所以在評估階段完全沒被看到。