Saltar al contenido

TRELLIS 2 on 8 GB: generating 3D models locally on an RTX 2080 SUPER

Officially, TRELLIS 2 asks for 24 GB of VRAM. My RTX 2080 SUPER has 8. And it came out in 2019. Obviously, it had to be tried.

Microsoft presents TRELLIS.2 as a 4-billion-parameter image-to-3D model: you give it an image and it returns a 3D object with geometry and PBR materials, ready to export to GLB. The official repository recommends an NVIDIA GPU of at least 24 GB and publishes reference timings measured on an H100.

This article is not a guide. It is an experiment with data: fitting the full pipeline onto a six-year-old 8 GB card and measuring everything that can be measured. Not «it started once»: I built a benchmark with 36 generations, 0 out-of-memory errors, with VRAM, RAM, per-stage timings, geometry and texture quality logged for each one.

TRELLIS 2 on 8 GB: generating 3D models locally on an RTX 2080 SUPER (Turing). An experiment with data on a 2019 card.

Results summary

MetricMeasured value
Completed generations36 / 36
Out-of-memory errors (OOM)0
Fallback to CPU path (sm75_fallback)0
Process VRAM~5.3 GB (5,264–5,296 MB), flat across all 36
GPU total peak7.28–7.38 GB of 8.19
Process RAM (RSS)14.5–17.8 GB
Time per generation115–638 s (highpoly Q8 median ≈ 183 s; lowpoly 117–135 s)
UV unwrap (xatlas, CPU)0–364 s
Mesh faces1,900 (lowpoly) to 668,000 (highpoly)
Watertight meshes0 / 36
Summary of the TRELLIS 2 benchmark on the RTX 2080 SUPER.

Yes: in this implementation, TRELLIS 2 fits on an 8 GB GPU. The hard part was explaining that to TRELLIS 2.

What TRELLIS 2 is and what it generates

The flow, in human terms: an image goes in, a textured 3D model comes out. Under the hood, in cascade:

  1. Sparse structure — a flow-matching DiT estimates a coarse 64³ grid.
  2. Geometry (SLAT) — two more DiTs refine the shape at low and high resolution through the O-Voxel representation.
  3. Material (texture SLAT) — a fourth DiT generates base color, metallic, roughness and alpha.
  4. Mesh + texture — voxel→mesh dual contouring, remesh and simplification (CuMesh), UV unwrap (xatlas), rasterization and baking (nvdiffrast).

It is a 4B-parameter model; the official one reaches resolutions of 1536³. Microsoft quotes ~3 s at 512³, ~17 s at 1024³ and ~60 s at 1536³… on an H100.

Worth saying up front: don’t compare those 17 seconds with the ~183 in this article as if they were two GPUs doing the same work. It’s different hardware, a different implementation (here, quantized GGUF on ComfyUI) and a different pipeline. What this benchmark measures is not «how much slower the 2080 is», but whether it works, with what margin and which configuration is worth using.

Turing wasn’t invited

Cartoon: a muscular bouncer labeled NVIDIA Ampere blocks the door of the «TRELLIS 2 Party — only Ampere architecture and above» and points a small, dejected RTX 2080 SUPER (Turing) away; the little card thinks «But I'm sm_75! Why weren't I invited?» while RTX 3090 and A6000 cards dance inside.
The node’s prebuilt wheels are built for Ampere and up; on Turing (sm_75) every CUDA extension aborts with error 209.

The first problem wasn’t speed. Nor VRAM. It was that the software didn’t ship compiled instructions for my GPU’s architecture.

The node’s prebuilt wheels for ComfyUI are built for Ampere cards and later. On a 2080 SUPER (Turing, sm_75), every CUDA extension aborts with:

CUDA error 209: cudaErrorNoKernelImageForDevice

It affects all four native pieces of the pipeline:

KernelFunction
o_voxelvoxel → mesh dual contouring
CuMeshremesh, simplification, hole filling
FlexGEMMsparse convolution
nvdiffrastrasterization + texture baking
The pipeline’s four CUDA extensions: without sm_75, all of them fail on Turing.

Without them the only remaining route is a CPU path so slow that a single object took 17 minutes on UV unwrap alone. Useless for a benchmark.

Four kernels and three patches

What had to be touched (the detail and the script to reproduce it ship with the workflow, further down):

  1. Recompile the four extensions for sm_75 from source, with Turing as the target architecture (TORCH_CUDA_ARCH_LIST="7.5;8.6"). After resolving several toolchain clashes —CUDA 12.8 doesn’t accept gcc 15’s libstdc++, a polluted LD_LIBRARY_PATH breaks ninja— the 2080 runs the entire pipeline on the GPU.
  2. Replace grid_sample_3d. In my sm_75 build, the CUDA version of grid_sample_3d left a fringe of black speckle at the edge of the sparse volume; replacing it with a PyTorch implementation removed it. I haven’t isolated the cause with a minimal case or checked it on another Turing machine, so I give it as an observation about this build, not a general kernel bug.
  3. Change the texture atlas gutter fill. The default method (cv2.inpaint TELEA) over the ~45% empty area of the atlas degenerates into salt-and-pepper noise; it is replaced by a smooth extension of the edge color (nearest valid neighbor + smoothing).
  4. Understand the GGUF at load time. The node dequantizes every tensor to BF16 at the moment of loading. That detail —that Q4_K_M and Q8_0 end up identical in memory— explains half this article.
Replacing grid_sample_3dBefore (CUDA kernel)After (torch)
Black speckle at the volume edge12%0%
Color deviation inside the UV charts6524
Effect of replacing grid_sample_3d on the texture speckle.

Methodology

Interior of the Acuántico Power lab PC with custom red liquid cooling: AMD Ryzen 7 5800X and NVIDIA GeForce RTX 2080 SUPER 8 GB.
The benchmark rig: RTX 2080 SUPER 8 GB and Ryzen 7 5800X.

Hardware and environment

GPUNVIDIA RTX 2080 SUPER · 8 GB · sm_75 (Turing)
CPU / RAMRyzen 7 5800X · 32 GiB
SoftwareComfyUI 0.26 + TRELLIS 2 GGUF node · Python 3.12 · torch 2.9.1+cu128
ModelTRELLIS.2-4B GGUF, Q4_K_M and Q8_0 formats
Benchmark hardware and software.

Dataset

Three «datasheet» images, product on a dark background, 1408×768. The benchmark starts from the raw JPG with automatic background removal, which is how a reader would use it. Each object stresses different things:

  • chair — thin tubular steel legs, wood veneer, glossy surface. The hard case: thin geometry + mixed materials + reflections.
  • mug — simple geometry but with a handle and a hole (genus-1 topology). Almost smooth matte ceramic.
  • sneaker — organic: laces, mesh, midsole, sole cavity. Lots of mid-scale detail.
The benchmark's three starting images: the chair, the mug and the sneaker, on a black background
The three starting images. From each one TRELLIS 2 generated the 3D model.

Benchmark design: 36 generations

It was 36 generations, not 36 images: 3 objects × 12 configurations. The 12 configurations:

TrackQuantizationTextureSamplerStepsMeshNo.
baseline (contrast)Q4_K_M1024euler + heun8/8/8 · 12/12/12 · 20/16/12highpoly6
highpolyQ8_02048euler8/8/8 · 12/12/12 · 20/16/12highpoly3
lowpolyQ8_02048euler12/12/12target_face_num 2k · 8k · 20k3
The 12 configurations per object — 36 generations in total.

«Highpoly» means no effective face cap (target_face_num = 2 M, never reached). Steps are noted as structure/shape/texture.

The 36 generations of the TRELLIS 2 benchmark on the RTX 2080 SUPER, rendered in Blender
The 36 generations, rendered in Blender. Three objects × twelve configurations.

Instrumentation

An HTTP client submits each job to the ComfyUI API. A thread samples every 250 ms: device and process VRAM (NVML) and the process tree’s RSS (psutil). The log is parsed for voxel count, faces after simplification, holes, xatlas seconds and OOM markers. Each generation leaves its artifacts (GLB mesh, VRAM trace as CSV, log slice) and a row in the results table. The benchmark is resumable: if it’s interrupted, you relaunch it and it only does what’s missing.

Quality metrics

  • hf_std — standard deviation of the high-frequency residual of the base color atlas (the image minus its 7×7 moving average), computed on the atlas resampled to 1024 px so that it measures the same spatial band at 1024 and at 2048. (The only exception is the exploratory ten-diagnostic table, marked as measured on the native atlas.) A speckle proxy; lower is better. Caveat: it also drops when there is simply less detail to measure.
  • sil_IoU — silhouette overlap against the datasheet cutout. The mesh is rendered from 64 views (16 azimuth × 4 elevation), each mask is normalized to its bounding box and the best IoU is taken. It measures that there exists an angle with that silhouette, not 3D geometric fidelity or pose; higher is better. Taking the best of 64 views makes it a deliberately optimistic measure.
  • Geometry: vertices, faces, faces after simplification, dual-contouring voxels, holes, watertight, GLB size.

Reproducibility

Fixed seed across all 36. As a check, the highpoly Q4 track was run twice: in that repeat the geometry was very stable —faces within 0.4%, timings within ~10%. I didn’t run a multi-seed campaign or repeat the 36 conditions, so this check measures point repeatability, not the pipeline’s statistical variability.

The 36 rows of measurements (performance, VRAM, geometry and the quality metrics), the VRAM trace sampled every 250 ms for each generation, the corresponding log slice and the pinned hashes and versions are published so that the numbers in this article can be audited. It does not include the GLB meshes (≈365 MB); it does include all their metrics.

Choosing the final configuration

Before the full battery, ten diagnostics on the same generation (chair · 12/12/12 · euler), changing a single lever at a time:

Varianthf_std ↓p99 ↓wall sVRAM devOOM
Q4_K_M · tex 1024 (baseline)4.2161877212no
Q4_K_M · tex 1024 · median gutter fill7.4271377283no
Q4_K_M · tex 1024 · tiled decoder OFF4.015.61817368no
Q4_K_M · tex 20482.17.61837375no
Q8_0 · tex 10244.015.51337386no
Q8_0 · tex 20482.27.71337394no
Q8_0 · tex 1024 · texture_steps 304.216.31417426no
Q4_K_M · grid_sample replacement OFF6.021.31977421no
Q4_K_M · tex 2048 · grid_sample OFF4.115.81987403no
lowpoly · tex 2048 · 8,000 faces1.55.21397382no
Ten diagnostics: a single lever changed at a time (chair · 12/12/12 · euler). Exploratory table predating the battery: its hf_std/p99 were measured on the native atlas and are not normalized (those diagnostic generations were not archived). The rest of the article uses hf_std normalized to 1024 px, so these two columns are not comparable with those below; for 2048 they overstate the improvement over 1024.

Readings: Q8_0 doesn’t penalize VRAM (identical) or time in any consistent way —in these diagnostics it was faster— → Q8_0 is chosen. tex 2048 reduces speckle, though considerably less than the raw number in the table suggests (see Limitations). The grid_sample replacement reduces noise (6.0 → 4.0, both measured at 1024). More texture steps don’t help; the tiled decoder is indifferent. Median gutter fill makes things worse (it preserves edges → stair-steps): gaussian is used.

Benchmark configuration: GGUF Q8_0 · pipeline 1024_cascade · texture_size 2048 · sampler euler · grid_sample replacement active · fixed seed.

Anatomy of a generation

Time breakdown of one mug generation (12/12/12 · euler · Q8_0 · 2048, 181 s wall): sparse-structure sampling ~59 s, 64³ decode and model loads ~18 s, low-resolution SLAT shape sampling ~4 s and high-resolution ~20 s, dual contouring of 929,939 voxels with remesh and simplification ~15 s, UV unwrap with xatlas on CPU (100 charts) 48 s, texture baking ~15 s.
Where the time goes in a typical generation. Sparse-structure sampling and UV unwrap take more than half the time between them; the latter, moreover, never touches the GPU.

Results

Execution

36 of 36 completed, 0 OOM, 0 CPU fallbacks, across the whole range: Q4 and Q8, texture 1024 and 2048, from 8/8/8 to 20/16/12 steps, euler and heun, from 500,000 to 1,900 faces.

TrackGenerationsOKOOMwatertight
baseline Q4 / 1024181800 / 18
highpoly Q8 / 20489900 / 9
lowpoly Q8 / 20489900 / 9
Execution: 36 of 36, no OOM.

Memory

TrackDevice VRAM (MB)Process VRAM (MB)RSS (MB)
baseline Q4 / 10247,282 / 7,294 / 7,3365,264 / 5,264 / 5,29616,561 / 17,174 / 17,828
highpoly Q8 / 20487,335 / 7,350 / 7,3805,264 / 5,264 / 5,29614,752 / 15,158 / 15,877
lowpoly Q8 / 20487,335 / 7,335 / 7,3675,264 / 5,264 / 5,29614,553 / 15,286 / 15,533
Memory — min / median / max per track. Device VRAM cap: 8,192 MB.

min / median / max. Device VRAM cap: 8,192 MB.

Two things. First: process VRAM is flat —5,264–5,296 MB— whatever you do with steps, quantization or texture. Second, and these must not be conflated: process VRAM is not the total memory occupied on the card. The process used ~5.3 GB; the rest up to ~7.3–7.4 GB is the desktop, the compositor and the CUDA context. The model wasn’t balancing on the edge of the abyss.

Speed

TrackWall (s)xatlas (s)
baseline Q4 / 1024123 / 235 / 63810 / 60 / 364
highpoly Q8 / 2048115 / 183 / 23510 / 48 / 72
lowpoly Q8 / 2048117 / 123 / 1350 / 0 / 1
Speed — min / median / max per track.

min / median / max.

  • The Heun sampler costs 1.5–3× more than Euler for near-identical geometry and quality. On none of the three objects did it give the best visual result; it often came out dirtier.
  • Going from 8/8/8 to 20/16/12 steps adds ~60–100 s. Looking at the 36 captures, above 12/12/12 there was no consistent visual improvement; with texture 2048, 12/12/12 + Euler was the most balanced across the three objects. This is a result of this benchmark —three objects, one GGUF implementation—, not a general conclusion about TRELLIS 2.

More steps, more waiting and a difference you often have to hunt for with a magnifying glass. Computing doesn’t always reward enthusiasm.

The bottleneck wasn’t in the GPU

UV unwrap (xatlas) runs on the CPU and its time ranges from 10 s to 364 s in highpoly. It spikes with curved-surface meshes and many charts —the mug at 20/16/12 heun: 311 s of unwrap alone—. In lowpoly it drops to 0–1 s.

While I was eyeing an eight-gig RTX like a suspect, the one that could spend six minutes thinking was xatlas, on the CPU.

Geometry

TrackVoxelsFaces (final mesh)HolesGLB (MB)
baseline Q4 / 1024248k / 713k / 914k228k / 315k / 668k0 / 58 / 2,6727 / 10 / 18
highpoly Q8 / 2048391k / 612k / 930k245k / 319k / 510k0 / 11 / 96312 / 16 / 18
lowpoly Q8 / 2048400k / 585k / 930k1,896 / 7,988 / 20,4590 / 2 / 632 / 4 / 6
Geometry — min / median / max per track.
  • Highpoly faces by object complexity: chair ~248k, sneaker ~320k, mug ~510k. The target_face_num of 2 M is never reached: the dual-contouring resolution limits it.
  • Low target_face_num is honored precisely: you ask for 2,000 / 8,000 / 20,000 and you get ~1,900 / ~7,900 / ~19,900.
  • None of the 36 meshes is watertight. Holes range from 0 to a few thousand and don’t correlate with visual quality. Direct 3D printing would need a repair step.

Quantization: Q4 doesn’t save VRAM

The expectation was to use the most aggressive quantization (Q4_K_M) to make it fit, and accept worse quality. Comparing the benchmark’s two main configurations, at equal object, steps and sampler:

Object · stepsWall Q4 → Q8hf_std Q4 → Q8Process VRAM
chair 8/8/8123 → 115 s6.7 → 7.25,264 → 5,264
chair 12/12/12137 → 193 s7.4 → 6.15,264 → 5,264
chair 20/16/12182 → 175 s12.1 → 5.65,264 → 5,264
mug 8/8/8149 → 149 s16.0 → 10.25,296 → 5,296
mug 12/12/12189 → 183 s17.0 → 8.15,264 → 5,296
mug 20/16/12297 → 219 s18.3 → 4.55,264 → 5,296
sneaker 8/8/8205 → 173 s25.1 → 12.85,264 → 5,264
sneaker 12/12/12196 → 191 s16.4 → 5.95,264 → 5,264
sneaker 20/16/12269 → 235 s10.9 → 12.35,264 → 5,264
Q4 / 1024 versus Q8 / 2048, holding object, steps and sampler. Two variables change at once.

This table’s hf_std is normalized to 1024 px, but it still mixes quantization and texture (Q4 goes to 1024, Q8 to 2048): in 7 of the 9 cases the Q8 / 2048 atlas has less speckle than the Q4 / 1024 one; in 2 (chair 8/8/8 and sneaker 20/16/12), it doesn’t. It is not a single-factor comparison. What is clean: process VRAM is identical, and time shows no consistent penalty for Q8. Since the GGUF tensors are dequantized to BF16 at load, quantization only changes the size on disk and the weight error, not the runtime memory. If Q4 doesn’t save memory where it matters, I’ll stick with Q8, which has better weights. The GGUF repository offers Q4_K_M, Q5_K_M, Q6_K and Q8_0 of the different components.

Texture 1024 → 2048

The first measurement, with a pixel-by-pixel hf_std, suggested that moving to 2048 halved the speckle. It was partly a measurement artifact: a fixed-size filter spans a finer spatial band on a 2048 atlas than on a 1024 one, so the metric also dropped due to resolution.

Atlas normalized to 1024 pxhf_std ↓ (median)
baseline · Q4_K_M · texture 102416.0
highpoly · Q8_0 · texture 20487.2
lowpoly · Q8_0 · texture 20483.8
Speckle with the atlases brought to a common resolution. The 1024→2048 jump also compounds the Q4→Q8 change; it is not a single factor.

Less speckle, with no appreciable time cost and without triggering any OOM: roughly a factor of ~2 in the normalized median —not ~4 as the raw number claimed—, and mixed with the quantization change. The clearest evidence that 2048 looks better is the plates. Even so, turning the knob to the right did do something useful.

Highpoly versus lowpoly

The other big result. The same generation (Q8 · 2048 · 12/12/12 · euler), varying only the face cap:

ConfigFacesGLBxatlashf_std ↓sil_IoU ↑
chair · highpoly249,90312.1 MB68 s6.100.596
chair · lowpoly 2k1,9343.3 MB0 s3.770.583
chair · lowpoly 8k7,9883.6 MB0 s3.970.581
chair · lowpoly 20k19,5224.4 MB1 s3.880.579
mug · highpoly510,30017.6 MB48 s8.100.949
mug · lowpoly 2k1,8962.5 MB0 s1.890.955
mug · lowpoly 8k7,4822.6 MB0 s2.000.950
mug · lowpoly 20k19,8603.0 MB0 s2.110.950
sneaker · highpoly320,67715.2 MB62 s5.910.896
sneaker · lowpoly 2k1,9024.4 MB0 s3.520.898
sneaker · lowpoly 8k8,1565.0 MB0 s3.890.897
sneaker · lowpoly 20k20,4595.6 MB1 s3.970.896
Highpoly versus lowpoly: same generation, only the face cap changes. hf_std with the atlas normalized to 1024 px (all these variants use texture 2048, so the comparison is homogeneous).

At ~1,900 faces —roughly 0.4–0.8% of the full version— the silhouette barely moves: the largest absolute sil_IoU difference across the three objects is 0.013. The GLB ends up about 3.5–7 times smaller and UV unwrap goes from 48–68 s to zero.

With one caveat: hf_std (here already normalized to 1024) also drops because with few faces there is less high frequency to measure; even so, lowpoly at 2048 is consistently lower than highpoly at 2048, which supports the mechanism I describe below. I won’t say lowpoly is simply «better». I’ll say that for scene assets where the polygon budget matters, it was clearly the more practical option in these tests.

Comparison of the chair generated with TRELLIS 2: lowpoly versus highpoly with texture 1024 and 2048
Chair · lowpoly (2k/8k/20k) │ highpoly texture 1024 (the 6 from the contrast track, Q4_K_M) │ highpoly texture 2048 (Q8_0).
Comparison of the mug generated with TRELLIS 2: lowpoly versus highpoly with texture 1024 and 2048
Mug · same comparison. Texture 2048 gives the cleanest surface; at 2,000 faces the faceted interior gives the lowpoly away.
Comparison of the sneaker generated with TRELLIS 2: lowpoly versus highpoly with texture 1024 and 2048
Sneaker · complex geometry. With texture 2048, 12/12/12 + Euler is the best balance.

The three plates tell the same story: the Q8 / 2048 configurations show much less surface dirt than several of the Q4 / 1024 ones, and the Heun variants come out worse. Lowpoly holds the silhouette but loses sharpness at edges and interiors.

The lowpoly sweet spot

8,000 faces were enough for simple or medium geometry —chair and mug—: beyond that the improvement is small. The sneaker, with laces, panels, midsole and sole cavity, held its shape better at 20,000: the extra polygons have somewhere to work. At 2,000 faces the degradation is already clear —the object becomes an angular approximation—, and on the sneaker it is especially evident.

Discussion

Infographic summarizing the discussion: why process VRAM is flat (the peak is set by the largest already-dequantized DiT), why xatlas scales poorly (dense meshes produce hundreds of CPU-bound charts), why lowpoly cleans the texture (interpolation acts as a low-pass filter) and shape fidelity versus texture fidelity (the silhouette IoU barely moves with texture or polygon count).
Visual summary of the discussion: the four «whys» behind the pipeline’s behavior on 8 GB.

Why process VRAM is flat

The GGUF node in this pipeline dequantizes each DiT to BF16 at load time. The weights occupy the same in memory whether they come from Q4_K_M or Q8_0; and since the pipeline loads one DiT at a time and unloads the previous one, the process peak is set by the largest already-dequantized DiT, not by the number of steps or the texture. Hence the constant 5.3 GB. Practical consequence: in this implementation, aggressive quantization is not a VRAM lever.

Why xatlas scales badly

UV unwrap splits the mesh into charts (islands) and packs them into the atlas. On a dense curved-surface mesh —the mug— hundreds of charts with long borders come out, and «Computing charts» is pure CPU, a couple of threads. The lowpoly mesh, with few faces, produces ~100 large, clean charts: the step becomes instant. It is the biggest determinant of total time on complex objects, and it is not accelerated by the GPU.

Why lowpoly «cleans» the texture

Baking samples the attribute volume (the texture SLAT) at each texel’s 3D position. With a dense mesh, each face spans few texels and the high-frequency variation present in the attribute volume is reproduced texel by texel. With a sparse mesh, each face spans many texels and grid_sample‘s interpolation over that surface can act somewhat like a low-pass filter. The experiment shows the correlation —lowpoly has lower hf_std—, it does not directly prove the causal mechanism; partly it will be that, partly that there is less detail. The order (lowpoly < highpoly, both at 2048) holds after normalizing the metric to a common resolution.

Shape fidelity versus texture fidelity

sil_IoU is practically constant across the 36 configurations: mug ~0.95, sneaker ~0.90, chair ~0.58, not moving with steps, quantization, texture or mesh density. Shape is set by the sparse-structure and SLAT stages; everything else barely touches the silhouette. The chair’s 0.58 is its thin chrome legs: a bounding-box-normalized IoU heavily penalizes what sticks out and is thin —it’s more of a metric artifact than a quality failure—.

Method limitations

  • hf_std is sensitive to atlas resolution: a fixed-size filter measures a different spatial band at 1024 and at 2048. Except for the exploratory ten-diagnostic table —explicitly identified as measured on the native atlas—, all comparative hf_std values in the article are computed on the atlas brought to 1024 px; an earlier unnormalized version overstated the advantage of texture 2048 (roughly double). Even normalized, it mixes «cleaner» with «less detail»: lowpoly scores low partly for lacking high frequency. You also have to look at the plates.
  • sil_IoU is the best of 64 views, normalized to bounding box: it measures that an angle with that silhouette exists, not 3D geometric fidelity or pose, scale or orientation. It is deliberately optimistic.
  • The benchmark renders were a flat turntable with albedo; the plates in this article are Blender/Cycles with studio lighting, which is fairer but still not a real engine viewer.
  • The VRAM margin was measured with the desktop using ~0.8 GB. A busier desktop, or a second GPU app, gets close to OOM. Headless, the margin would be larger.
  • The contrast track (Q4 / 1024) used an earlier version of the gutter fill (median), somewhat worse than the final gaussian: its hf_std values are a ceiling, not the best possible Q4.

TRELLIS 2’s practical limits

Not to oversell it, here’s what didn’t go well:

  • The chair. Thin metal, glossy wood and a dark background was the tricky scenario. At texture 1024 —especially with Heun— speckle appears on the wood: the model bakes lighting and uncertainty as if they were color. Texture 2048 removes it almost entirely, but it’s worth knowing it’s there.
  • Open meshes. None of the 36 came out watertight. O-Voxel is a representation designed for open surfaces and non-manifold geometry, so this is expected, not a failure: for rendering, games or VFX it’s no bother. For 3D printing or manufacturing you would need to close the mesh.
  • More steps don’t fix a hard reference. If the starting photo is ambiguous, raising the sampling quality doesn’t disambiguate it.

Microsoft talks about high-fidelity assets with PBR materials, but the official card itself warns that the base model is not aligned with human preferences and that results may vary. Not every photo yields a production-ready model without review.

What configuration I’d use on 8 GB

ParameterValue
QuantizationQ8_0
Pipeline1024_cascade
Texture2048
SamplerEuler
Steps12/12/12 (best balance across the three objects). 8/8/8 goes almost the same and faster; above 12/12/12 there was no consistent improvement
Lowpoly8,000 faces for simple or medium geometry; 20,000 for complex objects like the sneaker
Recommended configuration for an 8 GB GPU.

The workflow

I’m sharing the ComfyUI flow I used, already with this configuration: you load your image and out comes the GLB. On Ampere or later (RTX 30/40/50) the sm_75-specific recompilation isn’t needed; the rest of the compatibility (drivers, PyTorch, node wheels) is that of ComfyUI-Trellis2-GGUF itself, which I haven’t tested on those cards.

On a Turing GPU (RTX 20xx, GTX 16xx) you also need to recompile the four kernels for sm_75 and apply the patches. The «Turing install» download includes a script that downloads the sources and compiles them on your machine, along with the patches and the instructions. On Ampere or later it isn’t needed.

Conclusions: five questions

Can TRELLIS 2 run on an 8 GB GPU?
Yes, on this RTX 2080 SUPER with a modified stack: 36/36 and 0 OOM.

Does it really use only 5 GB?
The process hovered around 5.3 GB; the whole card reached ~7.3–7.4 GB.

Is Q4 worth it over Q8?
Not for runtime VRAM in this implementation. I’ll stick with Q8.

Is highpoly always better?
No. 8,000 faces were enough for simple objects; the more complex ones, like the sneaker, asked for 20,000. In both cases, a better ratio of time, size and shape than the full mesh.

Is it fast?
It depends more on what the mesh does and on UV unwrap than on VRAM. The full range was 115–638 s.

TRELLIS 2 on 8 GB: what an RTX 2080 SUPER can really do

Video made with one of the lab-benchmark objects + MCP + Blender + AI. Click to support the project.

The RTX 2080 SUPER came out in 2019. The official TRELLIS 2 repository asks for at least 24 GB of VRAM and Microsoft publishes its figures on an H100. Mine has eight.

After recompiling four kernels, fixing a couple of things Turing decided to interpret creatively and running 36 generations, it’s still here: 36 finished, no OOM and textured 3D models coming out in a few minutes.

That said, no need to get carried away. The mug came out with a handle you could fit both hands through and the chair has a certain nursery-furniture air. And I don’t think GTA VI is going to put those sneakers on any of its characters.

But TRELLIS 2, whose official stack starts at 24 GB, is generating complete 3D objects on a 2019 RTX with eight. For me, that was the experiment.