vscode调试python(transformers库的llama为例)
本文参考链接如下:transformers源码阅读——vscode调试llama模型代码
1. 调试文件
因为只是搞清楚数据的流向,以是不需要下载任何预训练的参数
from transformers.models.llama import LlamaModel,LlamaConfig
import torch
def run_llama():
# part 1模型初始化
llamaconfig = LlamaConfig(vocab_size=32000,
hidden_size=4096//2,
intermediate_size=11008//2,
num_hidden_layers=32//2,
num_attention_heads=32//2,
max_position_embeddings=2048//2)
llamamodel = LlamaModel(config = llamaconfig)
# part 2 构建输入数据,在正向传播过程中,只需要传一个inputs_ids,batchsize是4,序列长度是30,每个元素是一个(0,llamaconfig.vocab_size)的随机整数
inputs_ids = torch.randint(
low=0,
high=llamaconfig.vocab_size,
size=(4,30))
# part 3
res = llamamodel(inputs_ids)##前向计算,等价于llamamodel.forward(inputs_ids)
print(res)
if __name__ == "__main__":
run_llama()
2. vscode调试
2.1 设置调试设置文件
点击左侧边栏的运行和调试按钮:
https://i-blog.csdnimg.cn/direct/9d618eea62084a9cb58f313baf4b3a60.png#pic_center
然后点击创建launch.json文件
https://i-blog.csdnimg.cn/direct/2b65427caf9746c5972d53f5ec096533.png#pic_center
然后会出现 python文件调试当前正在运行的python文件:
https://i-blog.csdnimg.cn/direct/d673fadaf5144e4bb0735ceca7316df1.png#pic_center
然后就新建了一个launch.json调试设置文件
https://i-blog.csdnimg.cn/direct/9cb0eef71acf48538b238fdb99e881c5.png#pic_center
其中"justMyCode"表现是一个否只调试当前的文件,如果是true,就没法进入transformers的代码了,以是如果想调试进入transformers的代码,就把这个属性设置为false
2.2 设置断点
先看看怎么前向盘算的。按住ctrl键,点击LlamaModel进入LlamaModel界说的源码
https://i-blog.csdnimg.cn/direct/5d78d122b6c042778818d3170c8dea41.png#pic_center但是LlamaModel界说的源码很多,可以通过资源管理器的大纲标签查看LlamaModel源码文件的代码布局:
https://i-blog.csdnimg.cn/direct/9d05d4a05b684d3ea57c9c8f3b8a0884.png#pic_center
为了快速抓住重点,在LlamaAttention的forward方法打断点:
https://i-blog.csdnimg.cn/direct/881a53a2325a4a388934b30569891684.png#pic_center
调试窗口的断点标签可以找到这个断点,直接点击可以直接定位到断点的位置。
https://i-blog.csdnimg.cn/direct/24c30331c6f145afbf4f98e9a5fcfaf2.png#pic_center
打开要调试的代码文件,然后点击调试窗口的调试按钮
https://i-blog.csdnimg.cn/direct/d6939d0e97d541acbda0b1d817092c2e.png#pic_center
然后步伐运行,在断点处停止运行。可以看到出现了调试按钮组件
https://i-blog.csdnimg.cn/direct/fd5eb5508f0647c3981f051162271119.png#pic_center
在VSCode调试过程中,各操纵按钮的功能如下:
[*] 继续(Continue)
• 图标:通常为▶️(播放按钮)。
• 功能:从当前停息的位置继续执行步伐,直到遇到下一个断点或步伐自然结束。
• 使用场景:当检查完当前状态的变量或逻辑后,希望步伐继续运行而非逐行调试。
[*] 逐过程(Step Over)
• 图标:通常为⏭️(向右箭头跨越圆点)。
• 功能:执行当前行的代码,不进入函数内部。若当前行包罗函数调用,会直接执行完该函数,并停在下一行。
• 示例:在foo();这一行使用“逐过程”,会直接执行foo()函数全部代码,停在foo();的下一行。
[*] 单步调试(Step Into)
• 图标:通常为⏬(向下箭头进入函数)。
• 功能:进入当前行代码中的函数调用内部,逐行调试函数内的逻辑。
• 示例:在foo();这一行使用“单步调试”,会跳转到foo()函数的界说处,开始逐行执行函数内的代码。
[*] 单步跳出(Step Out)
• 图标:通常为⏫(向上箭头跳出函数)。
• 功能:执行完当前函数的剩余代码,返回到调用此函数的位置。
• 使用场景:在函数内部调试时,若希望快速执行完当前函数并回到调用处。
[*] 重启(Restart)
• 图标:通常为
页:
[1]