\documentclass[a4paper]{article}
\usepackage[fontset=fandol]{ctex}
\usepackage{amsmath, amssymb}
\usepackage{graphicx}
\usepackage[margin=2.5cm]{geometry}
\usepackage[most]{tcolorbox}
\usepackage{etoolbox}
\usepackage{listings}
\usepackage{hyperref}
\usepackage{booktabs}
\usepackage{float}
\newtcolorbox{knowledgebox}[1]{enhanced, colback=blue!5!white, colframe=blue!75!black, colbacktitle=blue!75!black, coltitle=white, fonttitle=\bfseries, title=#1, attach boxed title to top left={yshift=-2mm, xshift=2mm}, boxrule=1pt, sharp corners}
\newtcolorbox{importantbox}[1]{enhanced, colback=yellow!10!white, colframe=yellow!80!black, colbacktitle=yellow!80!black, coltitle=black, fonttitle=\bfseries, title=#1, sharp corners}
\newtcolorbox{warningbox}[1]{enhanced, colback=red!5!white, colframe=red!75!black, colbacktitle=red!75!black, coltitle=white, fonttitle=\bfseries, title=#1, sharp corners}
\lstset{language=Python, basicstyle=\ttfamily\small, keywordstyle=\color{blue}, stringstyle=\color{red!60!black}, commentstyle=\color{green!60!black}, breaklines=true, frame=single, numbers=left, numberstyle=\tiny\color{gray}, captionpos=b, extendedchars=false}
\newcommand{\notetitle}{veRL FSDP SFT Trainer 详解}
\newcommand{\noteauthors}{基于公开课程资料整理}
\newcommand{\notedate}{2025}
\newcommand{\videochannel}{五道口纳什}
\newcommand{\videopublishdate}{2025}
\newcommand{\videoduration}{约25分钟}
\newcommand{\videourl}{}
\newcommand{\videocoverpath}{cover.jpg}
\newcommand{\repourl}{https://github.com/hqhq1025/ai-course-notes}

% Footer with repo info
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyfoot[C]{\thepage}
\fancyfoot[R]{\footnotesize\color{gray}\href{\repourl}{AI Course Notes}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}

\begin{document}
\begin{titlepage}\centering
{\Large 课程笔记\par}\vspace{1.2cm}{\huge\bfseries \notetitle\par}\vspace{0.8cm}{\large \noteauthors\par}\vspace{0.3cm}{\large \notedate\par}\vspace{1.2cm}
\ifdefempty{\videocoverpath}{}{\includegraphics[width=0.82\textwidth,height=0.45\textheight,keepaspectratio]{\videocoverpath}\par}
\vfill
\begin{tcolorbox}[width=0.9\textwidth, colback=black!2!white, colframe=black!60, sharp corners]
\textbf{视频作者/频道}：\videochannel\par\textbf{发布日期}：\videopublishdate\par\textbf{视频时长}：\videoduration\par
\ifdefempty{\videourl}{}{\textbf{视频链接}：\href{\videourl}{\nolinkurl{\videourl}}\par}\par
\textbf{项目主页}：\href{\repourl}{\nolinkurl{\repourl}}\par
\end{tcolorbox}
\end{titlepage}
\tableofcontents\newpage

\section{引言}
本期介绍 veRL 中简洁高效的 FSDP SFT Trainer，回顾 SFT 训练的完整过程。

\section{好的训练框架设计}
\begin{importantbox}{两大设计维度}
\begin{itemize}
  \item \textbf{Dataset}：数据加载和预处理抽象（SFT Dataset, RLHF Dataset）
  \item \textbf{Trainer}：训练循环抽象（SFT Trainer, PPO Trainer）
\end{itemize}
\end{importantbox}

\section{SFT Dataset}
核心是 \texttt{get\_item} 函数：将 prompt-response 数据转换为模型输入。关键点：
\begin{itemize}
  \item 只对 response 部分计算 loss（prompt 部分 mask 掉）
  \item Token 化处理：添加特殊 token、padding、attention mask
\end{itemize}

\section{FSDP SFT Trainer}
veRL 的 SFT Trainer 代码极其简洁清晰，是学习 SFT 实现细节的优秀模板。FSDP（Fully Sharded Data Parallel）实现了分布式训练。

\section{SFT vs. RL 训练差异}
\begin{itemize}
  \item SFT：有监督学习，有明确的 target，不需要 rollout
  \item RL：需要在线 rollout 生成 response，reward 作为训练信号
\end{itemize}

\subsection{本章小结}
veRL 的 SFT Trainer 是一个优秀的参考实现，代码简洁、可读性强。

\newpage
\section{代码阅读法：先看数据如何流进 Trainer}
这节课的价值，在于把 Dataset 和 Trainer 两个核心抽象钉得很清楚。真正阅读框架代码时，最值得先跟的是：一个样本如何从 \texttt{get\_item} 进入 batch，再流入 Trainer 完成前向与反向传播。

\begin{knowledgebox}{阅读训练框架的最短路径}
\begin{itemize}
  \item 先看 Dataset 如何组织输入输出
  \item 再看 Trainer 如何消费 batch
  \item 最后才去看分布式策略如何包裹训练循环
\end{itemize}
\end{knowledgebox}

\subsection{本章小结}
理解训练框架，不一定要先啃最复杂的分布式代码；先看数据流和 Trainer 逻辑，往往更容易建立全局认识。

\newpage
\section{总结与延伸}
\begin{enumerate}
  \item Dataset + Trainer 是训练框架的两大核心抽象
  \item SFT 只对 response 计算 loss
  \item FSDP 实现分布式训练
\end{enumerate}
\end{document}
