In Python, when a set of objects constructs a reference cycle, none of them would reach a zero refcount. In this case, even if these objects all go out-of-scope and are no longer accessible, they will not be immediately released. The Python ecosystem typically accepts reference cycles as an inevitable issue, and relies on garbage collection (GC) to avoid leaks. A GC is triggered by the Python…
People have many different opinions about config systems. Having worked with various styles of configs, I also want to write about what a great config subsystem in a large-scale (in terms of system complexity, number of users, etc.) system should look like. The design space is complex, so in this article I'll start with a smaller topic: registration in config systems. I'll show why this…
Since I joined Google Brain, I brought PyTorch to Google's internal infra and owned its maintenance. Being a "tech island", it's well known that almost everything in Google works differently from the outside world, and that creates many challenges when building a massive library like PyTorch. Among those challenges, there are a few tricky bugs related to static initialization order…
A typical PyTorch training program on 8 GPUs with 4 dataloader workers per GPU would create at least processes. A naive use of PyTorch dataset and dataloader can easily replicate your dataset's RAM usage by 40 times . This issue has probably affected everyone who has done anything nontrivial with PyTorch. In this post, we will explain why it happens, and how to avoid the 40x RAM usage .
"Loss function" is one of the most basic concepts today in deep learning. Despite that, it is actually not necessarily a good programming abstraction when designing general-purpose systems. A system should not assume that a model always comes together with a separate "loss function".
Building a library for research and experiments is quite different from building other types of software. A key challenge is that, in research, abstractions and APIs are rarely set in stone: users may want to propose a slight variant or modification to literally ANYWHERE in the whole program, just because they have a new idea.
This post is about a small functionality that is found useful in TensorFlow / JAX / PyTorch. Low-level components of these systems often use a plain list of values/tensors as inputs & outputs. However, end-users that develop models often want to work with more complicated data structures: Dict[str, Any] , List[Any] , custom classes, and their nested combinations. Therefore, we need bidirectional…
PyTorch provides two methods to turn an nn.Module into a graph represented in TorchScript format: tracing and scripting. This article will: Compare their pros and cons, with a focus on useful tips for tracing. Try to convince you that torch.jit.trace should be preferred over torch.jit.script for deployment of non-trivial models.
In large systems, logs can be terrifying: they are huge in volume, and hard to understand. This note lists some suggestions and common misuse of Python's logging module, with the aim of: Reduce redundant logs & spams from libraries. Allow more control of logging behaviors. Make logs more informative to users.
Technically, an image is a function that maps a continuous domain, e.g. a box , to intensities such as (R, G, B). To store it on computer memory, an image is discretized to an array array[H][W] , where each element array[i][j] is a pixel . How does discretization work? How does a discrete pixel relate to the abstract notion of the underlying continuous image? These basic questions play an…