Arganzheng's Blog

stay hungry, stay foolish

通信与互联:从 NCCL 到 RDMA(总纲)

Communication and Interconnect for AI-Infra, from NCCL to RDMA

内容简介 《通信与互联:从 NCCL 到 RDMA》是一组共八篇的系列文章,面向已经跑过多卡训练或多卡推理、准备向下进入通信层的工程师,系统讲解 GPU 之间的数据是怎么流动的:经过哪些硬件链路、由哪些软件层驱动、每一层的代价是什么、出问题时到哪里去看。 它回答的问题是: 一次 all_reduce 从调用到完成,数据在 PCIe、NVLink、InfiniBand 上是怎么流动的?为什么有时候是带宽的问题,有时候是延迟的问题?1 站在框架的层面看,通信是一行代码:dist.all_reduce(t)。它返回得很快,然后在某个时刻”完成”。Profiler 里它是一段 ncclDevKernel_AllReduce_* 的时间条;nccl-tests...

LoRA 专题(04):系列总结与通关自测

LoRA Series: Recap and Final Self-Test

三篇正文回答了一个问题:为什么给一个几十亿参数的模型加两个瘦矩阵就能把它微调好,每个旋钮该取多少,训完的东西怎么上线。第一篇讲低秩假设、\(W + \frac{\alpha}{r}BA\) 的梯度与四本账,并直接检验全量微调的 \(\Delta W\) 有多低秩;第二篇把十三种配置在同一份数据上各训 80 步,每个旋钮给一组数字;第三篇从 adapter 文件走到 multi-LoRA 服务。本文把三篇压成一张速查表,拎出贯穿三篇的四条线,列常见误区,再给一套自测。 一、总览 一张速查表: 三篇正文的速查表 问题 答案 在哪篇 LoRA 的公式 \(...

LoRA 专题(03):工程:adapter 文件、合并、多 LoRA 服务与参考模型

LoRA 03: In Production — Adapter Files, Merging, Multi-LoRA Serving and the Free Reference Model

更新 @2026-09-30:实验用 peft 0.21.1、transformers 5.17.0、bitsandbytes 0.50.2、PyTorch 2.14(CPU),模型 Qwen2.5-0.5B,adapter 是第二篇训出的 r16_all(\(r = 16\) 全部线性层)与 r16_attn(\(r = 16\) 只挂 attention)。配套脚本 ai-learning-labs/lora/03_deploy.py(子实验 files / merge / quant / multi / tokens)。 前两篇回答了”为什么”与”怎么配”,训出来的东西是一个目录:adapter_config.json 加一个几十 MB 的 adap...

LoRA 专题(02):选参:r、target_modules、alpha、lr 与 QLoRA / DoRA / PiSSA 各让模型变成什么

LoRA 02: Choosing r, target_modules, alpha and lr — and What QLoRA, DoRA and PiSSA Each Change

更新 @2026-09-30:实验用 peft 0.21.1、trl 1.14.1、transformers 5.17.0、bitsandbytes 0.50.2、PyTorch 2.14(CPU,8 线程),模型 Qwen2.5-0.5B(base),数据 HuggingFaceH4/no_robots。配套脚本 ai-learning-labs/lora/02_knobs.py,--list 列出全部配置名;正文给出每种配置的数字。 LoraConfig(r=16, lora_alpha=32, target_modules="all-linear", lora_dropout=0.05) 加 learning_rate=2e-4——这一行出现在几乎每...

LoRA 专题(01):低秩假设:为什么两个瘦矩阵够用,以及它省了哪几本账

LoRA 01: The Low-Rank Hypothesis — Why Two Thin Matrices Suffice, and Exactly What They Save

更新 @2026-09-30:实验用 peft 0.21.1、trl 1.14.1、transformers 5.17.0、PyTorch 2.14(CPU,8 线程),模型 Qwen2.5-0.5B(base),数据 no_robots。配套脚本 ai-learning-labs/lora/01_low_rank.py(子实验 hand / account / speed / init / spectrum);正文给出理解所需的全部数字。 LoRA 的全部内容是一句话:冻结 \(W\),只训一对瘦矩阵 \(B\)、\(A\),让 \(W' = W + \frac{\alpha}{r} BA\)。这一句里有三个不显然的地方:为什么改动可以只有秩 \(r\)...

LoRA 专题:SFT 的默认微调方式,从低秩假设到多租户服务(总纲)

LoRA, the Default Way to Fine-Tune: From the Low-Rank Hypothesis to Multi-Tenant Serving — Series Overview

更新 @2026-09-30:本系列的实验用 peft 0.21.1、trl 1.14.1、transformers 5.17.0、bitsandbytes 0.50.2、PyTorch 2.14(CPU),模型是本地缓存的 Qwen2.5-0.5B,数据是 HuggingFaceH4/no_robots。文中的参数名(r、lora_alpha、target_modules、use_rslora、init_lora_weights……)以这组版本为准;LoRA 的数学与账目不随版本变。 内容简介 《LoRA 专题》是一组共三篇正文加一篇总结的系列文章,是《AI 算法工程师学习地图》 L5 后训练层的专题篇。LoRA(Low-Rank Adaptation...

读 Hugging Face 源码(05):系列总结与通关自测

Reading the Hugging Face Source: Series Recap and Final Self-Test

四篇正文回答了一个问题:工具箱第五篇那六行代码,执行时各经过哪些文件的哪些函数。第一篇读模型的加载与一次前向,第二篇读 generate 的循环,第三篇读文本与数据两条流水线,第四篇读 LoRA 怎么挂上去与三种 loss 各在哪一行。本文把四篇压成一张「问题 → 文件 → 函数」的索引表,拎出贯穿五个库的四条设计线,再给一套自测。 读完这四篇,你应该能回答哪些问题?1 哪些文件名、函数名与数字必须能脱口而出?2 怎么判断自己是”读过”还是”掌握”了?3 先把整个系列放在一张图上——箭头是调用或数据上的依赖,不是阅读顺序: %%{init: {"flowchart": {"wrappingWidth": 230}}}%% %% 图:四篇的依赖:03 造...

读 Hugging Face 源码(04):peft 与 trl——LoRA 怎么挂上去,SFT / DPO / GRPO 的 loss 各在哪一行

Inside peft and trl: get_peft_model, the LoRA Linear, SFT Labels and Packing, dpo_loss and GRPO Advantages

更新 @2026-09-30:本文对着 peft 0.21.0(tuners/lora/layer.py 2739 行、tuners/tuners_utils.py 2781 行)与 trl 1.13.0(trainer/sft_trainer.py 1927 行、dpo_trainer.py 1823 行、grpo_trainer.py 3497 行)读,配套脚本在 ai-learning-labs/hf-source-reading/,模型用本地缓存的 Qwen2.5-0.5B。trl 是 Hugging Face 几个库里改得最快的一个(一年三十多个版本,SFTTrainer 的数据契约改过数次),路径与名字以 1.13.0 为准,不引用行号;读别的版本...

读 Hugging Face 源码(03):tokenizers 与 datasets——从 messages 到 input_ids,从 Arrow 文件到 collate_fn

Inside tokenizers and datasets: the Rust Pipeline, Chat Templates, Arrow Tables, map and Fingerprints

更新 @2026-09-30:本文对着 tokenizers 0.23.2(Rust 库 + Python 绑定)、transformers 5.17.0 的 tokenization_utils_base.py / tokenization_utils_tokenizers.py / utils/chat_template_utils.py、datasets 5.0.1 的 arrow_dataset.py(7417 行)/ load.py / builder.py / iterable_dataset.py 读,配套脚本在 ai-learning-labs/hf-source-reading/,用本地缓存的 Qwen2.5-0.5B tokenizer 与...

读 Hugging Face 源码(02):generate——一次采样的完整调用链

Inside transformers, Part 2: generate, GenerationConfig, LogitsProcessors, StoppingCriteria and the Decode Loop

更新 @2026-09-30:本文对着 transformers 5.17.0 的 generation/ 目录读(utils.py 4250 行、logits_process.py 3222 行、stopping_criteria.py 643 行、configuration_utils.py 1892 行),配套脚本在 ai-learning-labs/hf-source-reading/,模型用本地缓存的 Qwen2.5-0.5B。路径与名字以该版本为准,不引用行号。 上一篇的前向在 logits 处结束:[B, T, 151936] 个分数。推理时接下来的每一件事——把最后一个位置的分数变成一个 token、把它拼回去、再前向一次——都在 mode...

×