PyTorch3D: a mesh and rendering library for 3D deep learning
PyTorch3D is FAIR's library of reusable components for deep learning with 3D data
At a glance
- What is it?
- PyTorch3D gives PyTorch users differentiable mesh operations, a differentiable renderer and the Implicitron trainer. The install is the hard part, and the README points at INSTALL.md rather than a single pip line.
- Who is it for?
- Adopt PyTorch3D if your model already lives in PyTorch and you need differentiable mesh operations or a differentiable renderer inside the training loop; the tutorials under docs/tutorials are the fastest way to see whether the API fits. Skip it if you only need to read, clean or inspect meshes and point clouds, where Open3D's non-differentiable toolkit is a better fit, or if you cannot control the CUDA toolkit on the machine.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 15 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What PyTorch3D is for, and who ends up using it
The problem PyTorch3D addresses is that 3D data does not fit the tensor shapes PyTorch was designed around. A triangle mesh is a vertex list plus a face index list, and a minibatch of meshes has a different number of vertices per sample. Ordinary dense tensors cannot express that without padding, and padding wastes compute and complicates gradients. PyTorch3D introduces a Meshes data structure and a matching set of operators so that projective transformations, graph convolution, sampling and loss functions can run on those structures. The README states the operators are implemented with PyTorch tensors, handle minibatches of heterogeneous data, can be differentiated, and can use GPUs.
That combination defines the audience. It is a research library, not a viewer or a file converter. If you are training a network that predicts a mesh, fits a mesh to images, or renders a textured surface as part of a loss, the differentiation requirement is what pushes you here. The README names Mesh R-CNN as a FAIR project built on it, which is the kind of use case the library was shaped by. Someone who just wants to open a .obj file and look at it is not the target reader.
How the mesh, renderer and Implicitron pieces fit together
Three layers are visible in the repository. The first is the data structure layer: Meshes and Pointclouds containers that hold vertices, faces and per-vertex or per-face features, with batching handled internally rather than by padding. The README lists the operations on triangle meshes as projective transformations, graph convolution, sampling and loss functions, all of which take those containers as input and return tensors or updated containers.
The second layer is the differentiable mesh renderer. The repository carries a separate note at docs/notes/renderer_getting_started.md and a note on heterogeneous batching at docs/notes/batching.md, which tells you the renderer is a substantial subsystem rather than a helper function. Because it is differentiable, gradients can flow from rendered pixels back to geometry or camera parameters, which is what makes the camera position optimization tutorial possible.
The third layer is Implicitron, a framework for new-view synthesis via implicit representations, kept under projects/implicitron_trainer with its own README and a config system documented in a tutorial notebook. It is a trainer built on top of the library rather than part of the core API. Treating those three as one thing is a mistake: you can use Meshes and the renderer without ever touching Implicitron's configuration.
Installing PyTorch3D and rendering a first mesh
The README does not contain install commands. It says: "For detailed instructions refer to INSTALL.md". That file, not this article, is the authority on the build, and it matters because setup.py compiles C++ and CUDA extensions from pytorch3d/csrc. The build needs a CUDA toolkit matching the PyTorch build when CUDA is used, and setup.py reads CUDA_HOME and ROCM_HOME from torch.utils.cpp_extension to decide what to compile.
There is an escape hatch in setup.py for machines without a working toolchain. The script reads the environment variable PYTORCH3D_NO_EXTENSION, and when it is set to "1" the extension build is skipped. The relevant lines are:
no_extension = os.getenv("PYTORCH3D_NO_EXTENSION", "0") == "1"
if no_extension:
msg = "SKIPPING EXTENSION BUILD. PYTORCH3D WILL NOT WORK!"
print(msg, file=sys.stderr)
warnings.warn(msg)
return []Take that message literally: the pure-Python parts import, but the compiled operators do not exist, so anything touching mesh operations or the renderer will fail. It is useful for reading the source or running shape-only tests, not for training.
Once installed, the tutorials under docs/tutorials are the intended entry point. The README links a set of notebooks, including deforming a sphere mesh to a dolphin, rendering textured meshes, rendering textured pointclouds, fitting a textured mesh, and camera position optimization with differentiable rendering. Each notebook is self-contained and loads its own data. A reasonable first use is to open the textured mesh rendering notebook and run it end to end, then change the camera parameters and re-run to see the rendered image change. That exercises the renderer, the mesh container and the gradient path in one pass.
Where PyTorch3D gets in your way
The build is the first real limitation. Because the extensions are compiled against a specific CUDA toolkit, a mismatch between the toolkit used to build PyTorch and the one on the machine produces a build or link failure rather than a helpful error. The README defers entirely to INSTALL.md here, and INSTALL.md is the file you have to read before choosing a branch.
The branch policy is the second limitation, and it is stated plainly in the README. The main branch is described as "actively developed, without any guarantee, Anything can be broken at any time". If you pin to main to get a recent fix, you accept that a later pull can break your training script. Pinning to a release tag is the alternative, at the cost of waiting for fixes to land in a release. The README does not document a rollback procedure or a compatibility matrix for older releases, so upgrade planning has to come from the release notes and INSTALL.md.
The third limitation is scope. PyTorch3D assumes you want gradients. If your task is loading a mesh, decimating it, computing a bounding box or exporting it, the library's strength is irrelevant and its build cost is pure overhead. It is also not a scene format library: the README's mesh IO note covers reading and writing, but the project does not present itself as a general asset pipeline.
PyTorch3D against Open3D and plain PyTorch
The most common comparison is with Open3D. Open3D is a general 3D processing toolkit with visualization, registration, reconstruction and file format support, and it is not built around autograd. PyTorch3D inverts that priority: the containers and operators exist so that gradients flow, and the README's four bullet points about the operators are all about differentiability, batching and GPU use. If you need to inspect a point cloud interactively, Open3D has the tool and PyTorch3D does not. If you need the rendered image to be a term in a loss, Open3D is the wrong layer and PyTorch3D is the right one. They are not substitutes so much as different stages of a pipeline, and pairing them is normal.
The comparison with PyTorch itself is a category error that the search data suggests people make. PyTorch3D is not a fork or a replacement. It depends on torch, imports it in setup.py to find CUDA_HOME, and its operators return PyTorch tensors. You still write a PyTorch training loop; PyTorch3D supplies the 3D-specific layers and the renderer that the loop calls. The README says the library is "designed to integrate smoothly with deep learning methods", which is a statement about being a component, not a framework.
Licence, releases and what an upgrade costs
The README states PyTorch3D is released under the BSD License and links LICENSE, with a separate LICENSE-3RD-PARTY file at the repository root for third-party components. The repository metadata reports the licence as NOASSERTION, which is a signal that the machine-readable licence field was not resolved automatically; the README's own statement and the LICENSE file are what you should read, and if the distinction matters for your distribution you should have someone qualified review it rather than relying on the metadata field.
Release cadence is uneven. The recent tags are v0.7.9 on 2025-11-28, V0.7.8 on 2024-09-13 and v0.7.7 on 2024-06-27, so there was roughly a year between 0.7.8 and 0.7.9 and about two and a half months between 0.7.7 and 0.7.8. The last push to the repository was on 2026-09-15, which is recent, so the main branch is moving even when releases are not. That gap between branch activity and release activity is the practical upgrade cost: fixes you want may sit on main for a long time before they appear in a tag, and the README's warning about main applies to anything you cherry-pick from it. Budget for a rebuild of the C++ and CUDA extensions on every upgrade, not just a package swap.
Editorial conclusion
Adopt PyTorch3D if your model already lives in PyTorch and you need differentiable mesh operations or a differentiable renderer inside the training loop; the tutorials under docs/tutorials are the fastest way to see whether the API fits. Skip it if you only need to read, clean or inspect meshes and point clouds, where Open3D's non-differentiable toolkit is a better fit, or if you cannot control the CUDA toolkit on the machine. Before committing, verify that the CUDA toolkit version on the target machine matches the PyTorch build, and read INSTALL.md for the branch you intend to use, because the README itself gives no install commands.
Frequently asked questions
How do I install PyTorch3D?
The README does not give install commands; it says to refer to INSTALL.md for detailed instructions, and that file is the authority because setup.py compiles C++ and CUDA extensions from pytorch3d/csrc. If you set PYTORCH3D_NO_EXTENSION to "1", setup.py skips the extension build and warns that PyTorch3D will not work, so that path is only for reading the source.
Can I install PyTorch3D with pip?
The README points to INSTALL.md rather than showing a pip command, and setup.py builds C++ and CUDA extensions during installation. The only pip-related behaviour traceable to the repository is the PYTORCH3D_NO_EXTENSION switch, which the script itself warns will leave the library non-functional.
How do I install PyTorch3D on Windows?
The README does not cover platform-specific installation and defers to INSTALL.md. Because setup.py compiles CUDA extensions and reads CUDA_HOME and ROCM_HOME from torch.utils.cpp_extension, the CUDA toolkit version on the machine has to match the PyTorch build, and INSTALL.md is where that requirement is documented.
What is PyTorch3D?
It is FAIR's library of reusable components for deep learning with 3D data, built on PyTorch. The README lists a triangle mesh data structure, mesh operations such as projective transformations and graph convolution, a differentiable mesh renderer, and Implicitron for new-view synthesis via implicit representations.
How does PyTorch3D compare with Open3D?
Open3D is a general 3D processing toolkit and is not built around autograd, while PyTorch3D's operators are described in the README as differentiable, batched over heterogeneous data and GPU-capable. The choice follows from whether the rendered result has to be part of a training loss.
Is PyTorch3D a replacement for PyTorch?
No. It depends on torch, imports it in setup.py to locate CUDA_HOME, and its operators return PyTorch tensors. You still write the training loop; PyTorch3D supplies the 3D data structures, operators and renderer that the loop calls.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/facebookresearch-pytorch3d)