Torchcode Pytorch Interview Practice

by reason-machines2384a003145aNo license83 starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 3 months ago

LeetCode-style PyTorch interview practice environment with auto-grading for implementing softmax, attention, GPT-2 and more from scratch.

AI-generated overview

Guided PyTorch interview practice with 40 from-scratch problems and an auto-grading judge.

What it does
This skill walks an ML engineer through a curated set of 40 LeetCode-style PyTorch problems, from ReLU and softmax to LayerNorm, multi-head attention and GPT-2 components. It supplies notebook templates, reference solutions, hints and worked implementation examples, and uses the torch_judge package to check correctness against PyTorch references, verify gradients and measure timing. It also covers setup paths (online, pip, Docker, local build) and troubleshooting for common judge and autograd issues.
When to use it
Use it when preparing for PyTorch or ML coding interviews and wanting structured, graded practice. It fits requests to implement operators or transformer components from scratch, run the torchcode judge, or check a PyTorch implementation. It is also useful for studying numerical stability, initialization and train/eval behavior patterns.
Requirements
Requires Python with PyTorch and the torch-judge package for the judge API; notebooks run in Jupyter, Colab or a Docker image. Some setup options need network access to fetch the package, clone the repository or pull the container image. No scripts ship with the skill; it is instructions and code examples only.

TorchCode — PyTorch Interview Practice

Skill by ara.so — Daily 2026 Skills collection.

TorchCode is a Jupyter-based, self-hosted coding practice environment for ML engineers. It provides 40 curated problems covering PyTorch fundamentals and architectures (softmax, LayerNorm, MultiHeadAttention, GPT-2, etc.) with an automated judge that gives instant pass/fail feedback, gradient verification, and timing — like LeetCode but for tensors.


Installation & Setup

Option 1: Online (zero install)

Option 2: pip (for use inside Colab or existing environment)

bash
pip install torch-judge

Option 3: Docker (pre-built image)

bash
docker run -p 8888:8888 -e PORT=8888 ghcr.io/duoan/torchcode:latest# Open http://localhost:8888

Option 4: Build locally

bash
git clone https://github.com/duoan/TorchCode.gitcd TorchCodemake run# Open http://localhost:8888

make run auto-detects Docker or Podman and falls back to local build if the registry image is unavailable (common on Apple Silicon/arm64).


Judge API

The torch_judge package provides the core API used in every notebook.

python
from torch_judge import check, status, hint, reset_progress
# List all 40 problems and your progressstatus()
# Run tests for a specific problemcheck("relu")check("softmax")check("layernorm")check("attention")check("gpt2")
# Get a hint without spoilershint("softmax")
# Reset progress for a problemreset_progress("relu")

check() return values

  • Colored pass/fail per test case
  • Correctness check against PyTorch reference implementation
  • Gradient verification (autograd compatibility)
  • Timing measurement

Problem Set Overview

Difficulty levels: Easy → Medium → Hard

#ProblemKey Concepts
1ReLUActivation functions, element-wise ops
2SoftmaxNumerical stability, exp/log tricks
3Linear Layery = xW^T + b, Kaiming init, nn.Parameter
4LayerNormNormalization, affine transform
5Self-AttentionQKV projections, scaled dot-product
6Multi-Head AttentionHead splitting, concatenation
7BatchNormBatch vs layer statistics, train/eval
8RMSNormLLaMA-style norm
16Cross-Entropy LossLog-softmax, logsumexp trick
17DropoutTrain/eval mode, inverted scaling
18EmbeddingLookup table, weight[indices]
19GELUtorch.erf, Gaussian error linear unit
20Kaiming Initstd = sqrt(2/fan_in)
21Gradient ClippingNorm-based clipping
31Gradient AccumulationMicro-batching, loss scaling
40Linear RegressionNormal equation, GD from scratch

Working Through a Problem

Each problem notebook has the same structure:

templates/  01_relu.ipynb       # Blank template — your workspace  02_softmax.ipynb  ...solutions/  01_relu.ipynb       # Reference solution (study after attempt)

Typical notebook workflow

python
# Cell 1: Import judgefrom torch_judge import check, hintimport torchimport torch.nn as nn
# Cell 2: Your implementationdef my_relu(x: torch.Tensor) -> torch.Tensor:    # TODO: implement ReLU without using torch.relu or F.relu    raise NotImplementedError
# Cell 3: Run the judgecheck("relu")

Real Implementation Examples

ReLU (Problem 1 — Easy)

python
def my_relu(x: torch.Tensor) -> torch.Tensor:    return torch.clamp(x, min=0)    # Alternative: return x * (x > 0)    # Alternative: return torch.where(x > 0, x, torch.zeros_like(x))

Softmax (Problem 2 — Easy, numerically stable)

python
def my_softmax(x: torch.Tensor, dim: int = -1) -> torch.Tensor:    # Subtract max for numerical stability (prevents overflow)    x_max = x.max(dim=dim, keepdim=True).values    x_shifted = x - x_max    exp_x = torch.exp(x_shifted)    return exp_x / exp_x.sum(dim=dim, keepdim=True)

LayerNorm (Problem 4 — Medium)

python
def my_layer_norm(    x: torch.Tensor,    weight: torch.Tensor,   # gamma (scale)    bias: torch.Tensor,     # beta (shift)    eps: float = 1e-5) -> torch.Tensor:    mean = x.mean(dim=-1, keepdim=True)    var = x.var(dim=-1, keepdim=True, unbiased=False)    x_norm = (x - mean) / torch.sqrt(var + eps)    return weight * x_norm + bias

RMSNorm (Problem 8 — Medium, LLaMA-style)

python
def rms_norm(x: torch.Tensor, weight: torch.Tensor, eps: float = 1e-6) -> torch.Tensor:    rms = torch.sqrt((x ** 2).mean(dim=-1, keepdim=True) + eps)    return (x / rms) * weight

Scaled Dot-Product Self-Attention (Problem 5 — Medium)

python
import torch.nn.functional as Fimport math
def scaled_dot_product_attention(    Q: torch.Tensor,  # (B, heads, T, head_dim)    K: torch.Tensor,    V: torch.Tensor,    mask: torch.Tensor = None) -> torch.Tensor:    d_k = Q.size(-1)    scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k)    if mask is not None:        scores = scores.masked_fill(mask == 0, float('-inf'))    attn_weights = F.softmax(scores, dim=-1)    return torch.matmul(attn_weights, V)

Multi-Head Attention (Problem 6 — Medium)

python
class MyMultiHeadAttention(nn.Module):    def __init__(self, d_model: int, num_heads: int):        super().__init__()        assert d_model % num_heads == 0        self.num_heads = num_heads        self.head_dim = d_model // num_heads        self.d_model = d_model
        self.W_q = nn.Linear(d_model, d_model)        self.W_k = nn.Linear(d_model, d_model)        self.W_v = nn.Linear(d_model, d_model)        self.W_o = nn.Linear(d_model, d_model)
    def forward(self, x: torch.Tensor, mask: torch.Tensor = None) -> torch.Tensor:        B, T, C = x.shape
        def split_heads(t):            return t.view(B, T, self.num_heads, self.head_dim).transpose(1, 2)
        Q = split_heads(self.W_q(x))        K = split_heads(self.W_k(x))        V = split_heads(self.W_v(x))
        attn_out = scaled_dot_product_attention(Q, K, V, mask)        # (B, heads, T, head_dim) -> (B, T, d_model)        attn_out = attn_out.transpose(1, 2).contiguous().view(B, T, C)        return self.W_o(attn_out)

Cross-Entropy Loss (Problem 16 — Easy)

python
def cross_entropy_loss(logits: torch.Tensor, targets: torch.Tensor) -> torch.Tensor:    # logits: (B, C), targets: (B,) with class indices    # Use logsumexp trick for numerical stability    log_sum_exp = torch.logsumexp(logits, dim=-1)  # (B,)    log_probs = logits[torch.arange(len(targets)), targets]  # (B,)    return (log_sum_exp - log_probs).mean()

Dropout (Problem 17 — Easy)

python
class MyDropout(nn.Module):    def __init__(self, p: float = 0.5):        super().__init__()        self.p = p
    def forward(self, x: torch.Tensor) -> torch.Tensor:        if not self.training or self.p == 0:            return x        mask = torch.bernoulli(torch.ones_like(x) * (1 - self.p))        return x * mask / (1 - self.p)  # inverted scaling

Kaiming Init (Problem 20 — Easy)

python
def kaiming_init(weight: torch.Tensor) -> torch.Tensor:    fan_in = weight.size(1)    std = math.sqrt(2.0 / fan_in)    with torch.no_grad():        weight.normal_(0, std)    return weight

Gradient Clipping (Problem 21 — Easy)

python
def clip_grad_norm(parameters, max_norm: float) -> float:    params = [p for p in parameters if p.grad is not None]    total_norm = torch.sqrt(sum(p.grad.data.norm() ** 2 for p in params))    clip_coef = max_norm / (total_norm + 1e-6)    if clip_coef < 1:        for p in params:            p.grad.data.mul_(clip_coef)    return total_norm.item()

Gradient Accumulation (Problem 31 — Easy)

python
def train_with_accumulation(model, optimizer, dataloader, accumulation_steps=4):    optimizer.zero_grad()    for i, (inputs, targets) in enumerate(dataloader):        outputs = model(inputs)        loss = criterion(outputs, targets) / accumulation_steps  # scale loss        loss.backward()
        if (i + 1) % accumulation_steps == 0:            optimizer.step()            optimizer.zero_grad()

Common Patterns & Tips

Numerical stability pattern

Always subtract the max before exp():

python
# WRONG — can overflow for large valuesexp_x = torch.exp(x)
# CORRECT — numerically stableexp_x = torch.exp(x - x.max(dim=-1, keepdim=True).values)

Causal attention mask (for GPT-style models)

python
def causal_mask(T: int, device) -> torch.Tensor:    return torch.tril(torch.ones(T, T, device=device)).unsqueeze(0).unsqueeze(0)

nn.Module skeleton (used in many problems)

python
class MyLayer(nn.Module):    def __init__(self, ...):        super().__init__()        self.weight = nn.Parameter(torch.empty(...))        self.bias = nn.Parameter(torch.zeros(...))        self._init_weights()
    def _init_weights(self):        nn.init.kaiming_uniform_(self.weight)
    def forward(self, x: torch.Tensor) -> torch.Tensor:        ...

Train vs eval mode pattern

python
def forward(self, x):    if self.training:        # use batch statistics        mean = x.mean(dim=0)        var = x.var(dim=0, unbiased=False)        # update running stats        self.running_mean = (1 - self.momentum) * self.running_mean + self.momentum * mean        self.running_var = (1 - self.momentum) * self.running_var + self.momentum * var    else:        # use running statistics        mean = self.running_mean        var = self.running_var    return (x - mean) / torch.sqrt(var + self.eps) * self.weight + self.bias

Project Structure

TorchCode/├── templates/          # Blank notebooks for each problem (your workspace)│   ├── 01_relu.ipynb│   ├── 02_softmax.ipynb│   └── ...├── solutions/          # Reference solutions (study after attempting)│   └── ...├── torch_judge/        # Auto-grading package│   ├── __init__.py     # check(), status(), hint(), reset_progress()│   └── tasks/          # Per-problem test cases├── Dockerfile├── Makefile└── pyproject.toml      # torch-judge package definition

Troubleshooting

Docker image not available for Apple Silicon (arm64)

bash
# make run auto-falls back to local build, or force it:make buildmake start

check() not found in Colab

bash
!pip install torch-judge# then restart runtime

Notebook reset to blank template

Use the toolbar "Reset" button in JupyterLab to reset any notebook to its original blank state — useful for re-practicing a problem.

Gradient check fails but output is correct

Ensure your implementation uses PyTorch operations (not NumPy) so autograd works:

python
# WRONG — breaks autogradimport numpy as npresult = np.exp(x.numpy())
# CORRECT — autograd compatibleresult = torch.exp(x)

Viewing reference solution

After attempting a problem, open the matching file in solutions/:

solutions/02_softmax.ipynb

Key Concepts Tested

ConceptProblems
Numerical stabilitySoftmax, Cross-Entropy, LogSumExp
Autograd / nn.ParameterLinear, LayerNorm, all nn.Module problems
Train vs eval behaviorBatchNorm, Dropout
BroadcastingLayerNorm, RMSNorm, attention masking
Shape manipulationMulti-Head Attention (view, transpose, contiguous)
Weight initializationKaiming Init, Linear Layer
Memory-efficient trainingGradient Accumulation, Gradient Clipping

Source and attribution

Source:reason-machines/trending-skillsinskills/torchcode-pytorch-interview-practiceat commit2384a00

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal