大模型的基本功

Author: [ybq]

Link: [https://zhuanlan.zhihu.com/p/716344766]

这篇文章给大家推荐几个大模型的练手程序,也就是所谓的“基本功”。

先问个问题,除了 transformer、rope、swiglu、rms_norm,大家觉着大模型的基本功都有哪些呢?flash_attention 的原理?megatron 的各种 parallel 策略?量化和推理加速技术?cuda编程?

怎么说呢,这些“有技术含量的大模型的核心技术”确实很重要,但我个人还是觉着大多数人在实际工作中并不需要完全理解它们。因为它们追求的是模型性能的极限优化,对我们做个简单的 SFT、PPO 并无太大助力。往往我们的需求只是使用它们,而不是去优化它们。

所以,我会给出一些我个人认为工作中很常用,但却“没有技术含量”的一些基本功(刷面经的同学可以不用看了哈,我推荐的基本功面试官不会考的)。


trans_XX_to_llama.py

在开源社区,llama 的网络结构已经一统江湖了,那也就是说 modeling_llama.py 理论上可以 load 起来任何一个开源模型。

OK,请自行完成以下脚本,使得我们可以用 modeling_llama.py 加载任何一个其他开源模型

  • trans_qwen_to_llama.py

  • trans_llama_to_qwen.py

  • ……

完成这些工作,你会理解每个开源模型的独特之处,比如,qwen2 的 q、k、v 的线性变换是有 bias 的,baichuan 的 lm_head 之前有一个 normalize() 的操作,甚至每个开源模型你都能观察到一些 attention 的魔改。再然后,对着他们的论文去找,为什么他们的作者要做这些改动?能不能从这个过程中学到知识就看各自悟性了。

进阶篇:

  • trans_llama_to_megatron.py (给定参数 tp 和 pp)

  • trans_megatron_to_llama.py

并不是所有同学都用 megatron 训代码,但用 megatron 训代码的同学,这两个脚本是基本功中的基本功了。这里只提醒一下,megatron_checkpoint 的 pp_size 实现 merge 和 split 非常简单,但在对 tp_size 进行 merge 和 split 的时候,一定要留意 megatron 的 gqa 的实现方式。

modeling_XX.py

即然我们已经可以万物转 llama 了,那为什么我还一定要使用 modeling_llama.py 呢?毕竟:

  • modeling_llama.py 在加载模型的时候没有 skip_build ;

  • modeling_llama.py 缺少 stream_generate;

  • modeling_llama.py 文件不支持 sequence_parallel ;

  • modeling_llama.py 默认使用 flash_attention;

  • modeling_llama.py 并没有一个可以作为 reward_model 的 lm_head;

  • ……

因此,实现一个属于自己的 modeling_XX.py 吧,集百家之长,先去收集 modeling_llama.py、 modeling_qwen.py、 modeling_baichuan.py、 modeling_yi.py、 modeling_deepseek.py、modeling_glm.py 等所有的开源文件,再把各家公司实现的比较好用的 def 加入到自己的 modeling_XX.py 中。

这样,当市面上出现任何一个新的开源模型,我们就都可以通过“trans_newModel_to_myModel.py”,快速的对该模型进行微调操作,而不用修改任何训练代码。

进阶篇:

我们还可以给自己的 modeling 文件加入很多有趣的东西来助力日常的 debug,比如:

  • def show_cos_distance(self, layer):输出某个 layer 的 input_hidden_states 和 output_hidden_states 的余弦距离;

  • def show_topk_token(self, layer, K=10):输出用某个 layer 去预测 next token 时的最大 K 个 token;

  • def show_attention(self, layer, tokenA, tokenB):输出第 layer 层的某两个 token 之间的 attention_value。

multi_infer.py

model.generate() 我们都再熟悉不过了。在不考虑推理加速等技术时,一个客观事实是:“8 卡 load 1 个模型、开大 batch_size ”的推理速度,远远小于 “8 卡 load 8 个模型、开小 batch_size ”的推理速度。

那么有需求了,**实现一个 class infer (model_path, data_path, output_path, num_workers)**,根据自己的喜欢,可以用 torch_run,也可以用 multiprocessing,亦或是其他 python 库。达成下面这个目的即可:在推理的时候让 1 机 8 卡 load 8 / 4 / 2 / 1 个模型,来快速的推理完一大批数据。

tips:一些写法可能需要给 modeling_XX.py 加入一个 def set_device(self, device_list) 函数,毕竟如果每次都用 os.environ["CUDA_VISIBLE_DEVICES"]="3,4" 来控制使用哪些卡来 load 模型,有点不太优雅。

进阶篇:

  1. 单机的并行推理已经实现了,不妨试试多机的;

  2. 学会用 vllm 等更快的推理框架,而不是 model.generate()。

Channel Loss

在介绍领域模型 post-pretrain 的时候,我说过一句话:做 domain post-pretrain 不看 channel loss,你不如别开 tensorboard。

基本大部分情况下,post-pretrain 的 loss 曲线都呈“缓慢下降”或“持平”的变化趋势,sft 的 loss 曲线都呈“快速下降”且“阶梯状”的变化趋势,这个时候除了初始 loss 和最终 loss是否符合预期外,我们能从中得到的信息微乎其微。因此,把数据划分成不同的数据源,对每个数据源的 loss 曲线单独观察,就显得尤为有意义,这也是研究跷跷板问题的必要环节。

题目来了:改进训练代码,给自己的 sft 数据随机赋予一个 channel,然后在训练过程中绘制出每个 channel 的 loss 曲线。

tips:考虑通过 all_gather_object 实现。

进阶篇:

  1. megatron 由于有 tp 和 pp 存在,实现起来难度远大于 deepspeed;

  2. model.trainer() 的训练方式封装的很死,如何加入 channel_loss 呢?


先列出这些吧,这些基本功可能对求职没有任何帮助,但拿来优化开发效率应该蛮好用的!此外,以上提到的所有程序 ChatGPT 都会写(不包括进阶篇,进阶篇有些我也没调通过),不会的话就问问 Chat 老师。

<think>我们正在讨论威尔金森功分器(WilkinsonPowerDivider)的设计模型。威尔金森功分器是一种在微波和射频(RF)工程中常用的三端口网络,用于将输入功率等分(或按特定比例分配)到两个输出端口,同时保证输出端口之间的隔离。它由微带线或带状线实现,通常包含四分之一波长传输线段和隔离电阻。###威尔金森功分器基本模型基本的威尔金森功分器是一个两路功分器,其设计基于传输线理论和阻抗变换原理。其经典结构包括:1.**输入端口(Port1)**:信号输入。2.**两个输出端口(Port2和Port3)**:通常设计为等功率输出。3.**四分之一波长传输线**:两段特性阻抗为$Z_0\sqrt{2}$的传输线(其中$Z_0$为系统特性阻抗,通常为50Ω),长度为中心频率的四分之一波长。4.**隔离电阻**:连接在两个输出端口之间的电阻,阻值为$2Z_0$(即100Ω)。该电阻在中心频率上吸收两个输出端口之间的反射信号,提供端口隔离。设计公式:-输入端口阻抗匹配:当输出端口匹配时,输入端口(Port1)匹配到$Z_0$。-输出端口阻抗:每个输出端口直接匹配到$Z_0$。-传输线特性阻抗:$Z=\sqrt{2}Z_0$。-隔离电阻:$R=2Z_0$。###设计步骤1.**确定中心频率$f_0$**:根据工作频率确定四分之一波长传输线的长度($\lambda_g/4$,其中$\lambda_g$是导波波长)。2.**计算传输线阻抗**:$Z=\sqrt{2}Z_0$。3.**选择基板参数**:确定微带线基板的介电常数($\varepsilon_r$)和厚度($h$),利用微带线计算工具或公式计算传输线的宽度(以实现特性阻抗$Z$)。4.**计算传输线长度**:在中心频率$f_0$处,四分之一波长为$\lambda_g/4=\frac{c}{4f_0\sqrt{\varepsilon_{eff}}}$,其中$c$为光速,$\varepsilon_{eff}$为有效介电常数。5.**放置隔离电阻**:在两条输出微带线之间连接一个$2Z_0$的电阻(通常使用表面贴装电阻)。###性能分析-**带宽**:基本威尔金森功分器的带宽受限于四分之一波长传输线的频率特性。增加级数(多节)可以扩展带宽。-**隔离度**:隔离电阻的作用是吸收两个输出端口之间的反射信号,从而提供高隔离度(在中心频率处理想情况下为无穷大)。-**插入损耗**:理想情况下,输入功率被均分到两个输出端口,因此每个端口的插入损耗为3dB(即$10\log_{10}(2)\approx3$dB)。实际中还有导体和介质损耗。###设计模型示例(微带线结构)下面是一个简单的微带线威尔金森功分器示意图:```Port1||----λ/4---->Port2(Z0)|Z=√2Z0|----λ/4---->Port3(Z0)|Z=√2Z0|R=2Z0(连接Port2和Port3)```###设计优化-**多节设计**:通过多节阻抗变换,可以增加带宽。-**不等分功率**:通过调整传输线阻抗和电阻值,可以实现不等功率分配。-**小型化**:使用弯曲传输线或集总元件(电感和电容)替代分布参数传输线,以实现小型化。威尔金森功分器广泛应用于功率分配与合成,如相控阵天线、功率放大器等[^1]。§§相关问题§§1.威尔金森功分器如何实现不等分功率分配?2.如何设计一个宽带威尔金森功分器?3.威尔金森功分器的隔离电阻有什么作用?如果电阻值不准确会怎样?4.威尔金森功分器与T型结功分器有何区别?</think>### 威尔金森功分器设计模型 威尔金森功分器是一种在微波和射频(RF)系统中广泛使用的三端口网络器件,用于将输入信号等分(或按比例分配)到两个输出端口,同时保证输出端口间的高隔离度。其核心设计基于传输线理论和阻抗变换原理[^1]。 #### **基本设计模型** 1. **拓扑结构** - 输入端口(Port 1)通过两段四分之一波长($\lambda/4$)传输线连接至输出端口(Port 2, Port 3) - 输出端口间通过隔离电阻$R$连接: ``` Port 1 │ ┌─┴─┐ λ/4 λ/4 特性阻抗 $Z = \sqrt{2}Z_0$ └─┬─┘ ├───R───┤ 隔离电阻 $R = 2Z_0$ Port 2 Port 3 ``` 其中$Z_0$为系统特性阻抗(通常50Ω)。 2. **关键参数公式** - **传输线特性阻抗**:$Z = \sqrt{2}Z_0$ (例如:$Z_0=50\Omega$时,$Z \approx 70.7\Omega$) - **隔离电阻值**:$R = 2Z_0$ (例如:$Z_0=50\Omega$时,$R=100\Omega$) - **中心频率**:$f_0 = \frac{c}{4L\sqrt{\varepsilon_{\text{eff}}}}$ 其中$L$为传输线物理长度,$\varepsilon_{\text{eff}}$为基板有效介电常数,$c$为光速。 3. **S参数矩阵**(理想等分情况) $$ [S] = \begin{bmatrix} 0 & -j/\sqrt{2} & -j/\sqrt{2} \\ -j/\sqrt{2} & 0 & 0 \\ -j/\sqrt{2} & 0 & 0 \end{bmatrix} $$ - 插入损耗:$|S_{21}|^2 = |S_{31}|^2 = 0.5$(-3 dB) - 隔离度:$|S_{23}| = 0$(理想无限大) #### **设计流程** 1. **确定工作参数** - 中心频率$f_0$、功率分配比(默认1:1)、基板参数($\varepsilon_r$, 厚度$h$) 2. **计算传输线尺寸** - 使用微带线计算工具(如ADS LineCalc)求解$Z=\sqrt{2}Z_0$对应的线宽$W$ - 计算$\lambda/4$长度:$L = \frac{c}{4f_0\sqrt{\varepsilon_{\text{eff}}}}$ 3. **选择隔离电阻** - 表面贴装电阻(如0402封装),阻值$R=2Z_0$ - 需满足功率容量$P_{\text{max}} > \frac{V^2}{R}$($V$为峰值电压) 4. **仿真优化** - 在HFSS/ADS中建立模型,优化参数: - 电阻寄生效应补偿 - T型结不连续性修正 - 带宽扩展(多节设计) #### **进阶设计变体** - **不等分功率分配** 修改传输线阻抗公式: $$ Z_2 = Z_0\sqrt{\frac{1+k^2}{k^3}}, \quad Z_3 = k^2 Z_2, \quad R = Z_0\left(k + \frac{1}{k}\right) $$ 其中$k^2$为功率分配比(Port2:Port3)[^2]。 - **宽带设计** 采用多节阶梯阻抗变换,例如两节设计带宽可扩展至倍频程: ``` 输入 ──[Z1,λ/4]──[Z2,λ/4]── 输出1 │ │ └───R──────┘ ``` - **小型化技术** - 集总元件替代:用LC网络实现$\lambda/4$线等效 - 螺旋线/曲折线结构压缩物理尺寸 #### **典型应用场景** 1. 相控阵天线馈电网络 2. 功率放大器合路/分路 3. 微波测量系统(如矢量网络分析仪) 4. 5G MIMO系统射频前端[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值