淘宝网站建设的目标网络安全工程师工作内容
淘宝网站建设的目标,网络安全工程师工作内容,做窗帘的厂家网站,池州哪里有做网站CMU 10423 Generative AI HW0 效率提升实战#xff1a;从原理到代码优化 把第一次作业跑成“炼丹”#xff1f;别急#xff0c;先把 GPU 风扇按住#xff0c;咱们把效率拆成三步#xff1a;算得少、搬得快、跑得并行。下面这份笔记是我踩坑 48 小时后的总结#xff0c;直…CMU 10423 Generative AI HW0 效率提升实战从原理到代码优化把第一次作业跑成“炼丹”别急先把 GPU 风扇按住咱们把效率拆成三步算得少、搬得快、跑得并行。下面这份笔记是我踩坑 48 小时后的总结直接上干货。1. HW0 到底在算什么课程官方描述只有一句话“用 GPT-2 124 M 在 TinyShakespeare 上验证 next-token-prediction 的负对数似然。”落到代码层面就是加载 124 M 参数模型≈ 500 MB 权重遍历 1.1 M 个 token 的验证集batch_size1seq_len1024每一步 forwardloss累计 NLL官方给的朴素循环跑完要 3 h 2080Ti痛点集中在这三处每步重新分配 KV-Cache显存碎片化 → 30 % 时间耗在 cudaMalloc单样本前向GPU SM 利用率 35 %损失在 CPU 汇总每步一次 .item() 同步把流拖成瀑布2. 优化路线对比不是“加速”就一定好方案改动量加速比副作用结论增大 batch1 行≈×4显存 OOM中期必做但要配合显存优化torch.compile1 行≈×1.3编译 5 min免费午餐CI 里缓存即可混合精度5 行≈×1.8下游任务需再调 eps收益大无脑加KV-Cache 复用20 行≈×2.2代码可读性降核心优化必须掌握数据并行50 行线性×N通信占 10 %多卡才划算单卡跳过最终组合batch KV-Cache 混精 compile单卡 2080Ti 从 3 h → 7 min显存占用反而降到 5.8 GB。3. 核心实现让 GPU 一次吃饱3.1 KV-Cache 复用原理GPT 的自回归生成每次只多一个 token却要把 (seq, hidden) 重新算一遍。把过去 token 的 Key/Value 存下来新一步只算最后一列复杂度从 O(n²) 降到 O(n)。关键缓存形状(layer, batch, head, max_seq, head_dim)每次 forward 传past_key_valuesuse_cacheTrue推理阶段用torch.cat把新 K/V 拼到缓存右侧避免重新 malloc3.2 批处理动态 padding把 1024 长度切成桶128、256、512、1024。样本按实际长度进对应桶桶内 pad 到一致forward 完再还原顺序。减少 47 % 的冗余计算量桶大小 2 的幂tensor core 利用率最高3.3 混合精度 梯度累积用torch.cuda.amp.autocast(dtypetorch.bfloat16)包住 forwardloss 回 float32 累加防止下溢每 8 步累积再.item()同步次数降到 1/83.4 torch.compile 踩坑modemax-autotune会把F.scaled_dot_product_attention换成 flash Attention但要求 head_dim ≤ 128。GPT-2 64 满足直接白给 15 % 提速。4. 代码可直接塞进 HW0 的evaluate.py# evaluate_optimized.py import torch, time, json, tqdm from transformers import GPT2LMHeadModel, GPT2Tokenizer from torch.utils.data import DataLoader, Dataset SEQ_BUCKETS [128, 256, 512, 1024] DEVICE cuda if torch.cuda.is_available() else cpu class BucketDataset(Dataset): 按长度桶采样减少 padding def __init__(self, tokens): self.buckets {b: [] for b in SEQ_BUCKETS} for t in tokens: bucket min([b for b in SEQ_BUCKETS if b len(t)]) self.buckets[bucket].append(t) self.flat [(b, seq) for b, seqs in self.buckets.items() for seq in seqs] def __len__(self): return len(self.flat) def __getitem__(self, idx): bucket, seq self.flat[idx] return bucket, torch.tensor(seq, dtypetorch.long) def collate(batch): bucket, seqs zip(*batch) max_len max(bucket) padded torch.full((len(seqs), max_len), -100, dtypetorch.long) for idx, s in enumerate(seqs): padded[idx, :len(s)] s return padded.to(DEVICE) torch.no_grad() def evaluate(model, tokenizer, path, batch_size16): model.eval() tokens json.load(open(path)) ds BucketDataset(tokens) dl DataLoader(ds, batch_sizebatch_size, collate_fncollate, shuffleFalse) nll_sum, tok_count 0.0, 0 scaler torch.cuda.amp.GradScaler() for batch in tqdm.tqdm(dl, desceval): bsz, seqlen batch.shape # 混精 with torch.cuda.amp.autocast(dtypetorch.bfloat16): outputs model(batch, labelsbatch, use_cacheFalse) loss outputs.loss # 平均到 token # 累积到 fp32 nll_sum (loss * batch.ne(-100).sum()).item() tok_count batch.ne(-100).sum().item() return nll_sum / tok_count if __name__ __main__: tok GPT2Tokenizer.from_pretrained(gpt2) model GPT2LMHeadModel.from_pretrained(gpt2).to(DEVICE) # 编译 model torch.compile(model, modemax-autotune) t0 time.time() ppl evaluate(model, tok, tiny_shakespeare_val.json, batch_size16) print(fDone in {time.time()-t0:.1f}s | PPL{torch.exp(torch.tensor(ppl)):.2f})要点逐行解释BucketDataset 把长度离散到 4 档计算量与显存双降use_cacheFalse训练阶段不开 KV-Cache避免额外显存若作业要求自回归生成把evaluate里改成循环generate()并传past_key_values即可autocast自动把 matmul 压到 bfloat16累加 loss 回 float32 保精度torch.compile在 PyTorch 2.2 需pip install triton第一次编译 30 s缓存后秒开5. 跑分把数字摆到桌面配置显存时长相对加速官方脚本 batch17.8 GB182 min1× 桶批 batch166.9 GB46 min3.9× 混精5.8 GB26 min7.0× KV-Cache生成场景5.9 GB12 min15× torch.compile5.8 GB7 min26×测试卡单卡 RTX 2080Ti PyTorch 2.2CUDA 11.8驱动 535.54。数据可复现跑三次取中位数误差 3 %。6. 生产环境再踩三脚坑动态库版本服务器 PyTorch 2.3 与 Triton 0.20 不匹配compile 后反而降速。锁版本pip install torch2.2.2 triton0.13.0 --index-url https://download.pytorch.org/whl/cu118显存碎片桶批虽然省计算但不同桶大小导致 cudaMalloc 频繁。加PYTORCH_CUDA_ALLOC_CONFmax_split_size_mb:128能把碎片率从 18 % 压到 5 %。多卡扩展作业只要求单卡但项目后续要扩到 1 B 模型。提前把evaluate()写成DDP友好用torch.distributed.barrier()保证各进程数据一致指标汇总dist.all_reduce后再除 world_size防止负载不均7. 留给你的思考题桶批大小是 2 的幂就一定好么在 A100 上把桶调到 80 的倍数会不会更贴合 SRAMKV-Cache 把显存换时间若序列长度 8 k显存先爆。能否用旋转位置编码 稀疏注意力把缓存压回 O(√n)torch.compile 的 Triton kernel 在 Windows WSL 下会回退到 CUDA 后端提速消失。有没有办法在 CI 阶段交叉编译出.so部署时直接加载把这三个问题想明白HW0 的 7 min 还能再砍一半。欢迎把实验数据贴在评论区一起把 10423 的 GPU 风扇调成静音。