写作与公文
准备 PyTorch 面试/从零手写算子时:用…
当你要练习或考察「不用 torch.relu/softmax 等现成算子、从零手写 PyTorch 算子与 Transformer 组件」时,用 TorchCode 的 notebook 模板做题并用 torch-judge 即时判题。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
准备 PyTorch 面试/从零手写算子特定
解决思路
- 零安装在线练习:直接打开 Hugging Face Spaces 的 https://huggingface.co/spaces/duoan/TorchCode,或在 Colab 中打开带 "Open in Colab" 徽章的 notebook。
- 在 Colab 或已有 Python 环境里只装判题包:pip install torch-judge。
- 用 Docker 起服务:docker run -p 8888:8888 -e PORT=8888 ghcr.io/duoan/torchcode:latest,然后浏览器打开 http://localhost:8888。
- 本地构建:git clone https://github.com/duoan/TorchCode.git,cd TorchCode,make run,再打开 http://localhost:8888;make run 会自动检测 Docker 或 Podman,当 registry 镜像不可用(Apple Silicon/arm64 常见)时回退到本地构建,也可显式执行 make build 和 make start。
- Colab 里报 check() not found 时,执行 !pip install torch-judge 然后重启 runtime。
- 在 notebook 里导入判题 API:from torch_judge import check, status, hint, reset_progress。
- 用 status() 列出全部 40 道题和当前进度。
- 实现完调用 check("relu")、check("softmax")、check("layernorm")、check("attention")、check("gpt2") 判题;返回逐用例彩色 pass/fail、与 PyTorch 参考实现对比的正确性、梯度验证(autograd 兼容性)和耗时。
- 卡住时用 hint("softmax") 获取不带剧透的提示。
- 用 reset_progress("relu") 重置某题的进度。
- 按 Easy → Medium → Hard 顺序推进题目集,覆盖 ReLU、Softmax、Linear、LayerNorm、Self-Attention、Multi-Head Attention、BatchNorm、RMSNorm、Cross-Entropy、Dropout、Embedding、GELU、Kaiming Init、Gradient Clipping、Gradient Accumulation、Linear Regression 等。
- 在 templates/01_relu.ipynb 这类空白 notebook 里作答:Cell 1 导入 judge 与 torch,Cell 2 写自己的实现(如 def my_relu(x): raise NotImplementedError),Cell 3 跑 check("relu")。
- 自己先尝试,再打开 solutions/02_softmax.ipynb 等对应参考解对照学习。
- 想重练时用 JupyterLab 工具栏的 "Reset" 按钮把 notebook 恢复成原始空白模板。
- ReLU 实现:return torch.clamp(x, min=0);备选 x * (x > 0) 或 torch.where(x > 0, x, torch.zeros_like(x))。
- Softmax 要数值稳定:先 x_max = x.max(dim=dim, keepdim=True).values,x_shifted = x - x_max,exp_x = torch.exp(x_shifted),最后 exp_x / exp_x.sum(dim=dim, keepdim=True)。
- LayerNorm:mean = x.mean(dim=-1, keepdim=True),var = x.var(dim=-1, keepdim=True, unbiased=False),x_norm = (x - mean) / torch.sqrt(var + eps),返回 weight * x_norm + bias(eps 默认 1e-5)。
- RMSNorm(LLaMA 风格):rms = torch.sqrt((x ** 2).mean(dim=-1, keepdim=True) + eps),返回 (x / rms) * weight(eps 默认 1e-6)。
- 缩放点积自注意力:scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k);有 mask 时 scores.masked_fill(mask == 0, float('-inf'));再 F.softmax(scores, dim=-1) 与 V 相乘。
- 因果注意力 mask:torch.tril(torch.ones(T, T, device=device)).unsqueeze(0).unsqueeze(0)。
- Multi-Head Attention:__init__ 中 assert d_model % num_heads == 0,用 nn.Linear 建 W_q/W_k/W_v/W_o;forward 中把张量 view(B, T, num_heads, head_dim).transpose(1, 2) 拆头,注意力算完后 attn_out.transpose(1, 2).contiguous().view(B, T, C) 合并,最后过 W_o。
- Cross-Entropy Loss:用 logsumexp 技巧,log_sum_exp = torch.logsumexp(logits, dim=-1),log_probs = logits[torch.arange(len(targets)), targets],返回 (log_sum_exp - log_probs).mean()。
- Dropout:if not self.training or self.p == 0 时直接返回 x;否则 mask = torch.bernoulli(torch.ones_like(x) * (1 - self.p)),返回 x * mask / (1 - self.p)(inverted scaling)。
- Kaiming Init:fan_in = weight.size(1),std = math.sqrt(2.0 / fan_in),with torch.no_grad(): weight.normal_(0, std)。
- 梯度裁剪:筛出 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),若 clip_coef < 1 则对每个 p.grad.data.mul_(clip_coef),最后返回 total_norm.item()。
- 梯度累积:循环前 optimizer.zero_grad();每个 micro-batch 用 loss = criterion(outputs, targets) / accumulation_steps 缩放后再 loss.backward();每 (i + 1) % accumulation_steps == 0 时执行 optimizer.step() 和 optimizer.zero_grad()。
- 自定义层统一用 nn.Module 骨架:__init__ 里 super().__init__() 并定义 nn.Parameter(torch.empty(...))/nn.Parameter(torch.zeros(...)),写 _init_weights() 用 nn.init.kaiming_uniform_(self.weight) 初始化,在 forward 里实现前向。
- BatchNorm 的 train/eval 分支:训练时用 batch 统计(mean = x.mean(dim=0),var = x.var(dim=0, unbiased=False))并按 momentum 更新 running_mean / running_var;eval 时直接用 running_mean / running_var,最后归一化后乘 weight 加 bias。
- 梯度校验失败但输出正确时,检查是否中途用了 NumPy:要保证全程用 PyTorch 算子(torch.exp(x) 而非 np.exp(x.numpy())),否则 autograd 断链。
- 把「exp() 之前先减最大值」当作通用数值稳定模式,Softmax、Cross-Entropy、LogSumExp 类题目都适用。
适用边界 · 注意事项
- 不是 PyTorch 技术栈、或要用 NumPy/JAX 实现的场景不适用,判题和梯度校验依赖 PyTorch autograd。
- 只想要理论讲解或直接看答案时不必装 judge,直接读 templates/ 与 solutions/ 即可。
- Apple Silicon/arm64 上 ghcr.io 的 Docker 镜像可能不可用,需改用本地构建(make build && make start)而非直接 docker run。