deepspeed使用vscode进行远程调试debug环境配置与解读

news/2024/7/16 8:20:31 标签: vscode, ide, 编辑器, deepspeed, debug, 大模型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、vscode命令参数传递
    • 1、验证参数py文件
  • # 2、第一种vscode调用方法(launch.json配置)
  • # 3、第二种vscode调用方法(launch.json配置)
  • 二、deepspeed运行py文件代码(deepspeed_test.py)
  • 三、deepspeed命令调用(无法debug)
  • 四、deepspeed使用vscode进行调试(能debug)
  • 五、vscode执行类似sh命令调试总结(能debug)
    • 1、launch.json的args、program、justMyCode、env参数说明
    • 2、python **.py 命令执行
    • 3、deepspeed 命令执行
  • 总结


前言

最近在研究deepspeed相关内容,但使用命令方式无法单步调式调用代码的问题,若直接离线看代码,在一定程度上降低效率。同时,使用deepspeed方式debug代码内容较少。为此,我特意在少有信息中和代码实验验证完成基于vscodedeepspeed进行debug方法。特别的,该方式不仅适合deepspeed命令debug,也适用torchrun命令debug,更能延伸其它命令debug模式。本文内容分为三部分,第一部分介绍如何使用vscode传递参数debug;第二部分介绍如何使用deepspeed进行debug;第三部分介绍vscode通用命令方式进行debug


源码路径:点击这里

vscode_17">一、vscode命令参数传递

验证python文件的argparse参数传递,或者是命令使用–param的参数传递方式,第一个列子使用常规python调用,我将写一个简单py文件,然后在说明vscode如何配置launch.json文件。

1、验证参数py文件

代码很简单,大家可直接查看,文件名为test_py.py,如下:

import argparse
def parse_opt():
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default='yolov5l.pt', help='initial weights path')
    
    parser.add_argument('--epochs', type=int, default=300)
    # opt =  parser.parse_args(args=[])
    opt =  parser.parse_args()
    return opt

def main(opt) :
    
    print('opt.weights:',opt.weights)
    print('opt.epochs:',opt.epochs)
    
    value=opt.epochs+90000
    print('value:',value)

if __name__ == '__main__':
    opt = parse_opt()
    main(opt)

如果使用命令修改参数调用需要执行:

python test_py.py  --weights yolos  --epchs 600

vscodelaunchjson_48"># 2、第一种vscode调用方法(launch.json配置)

此方式直接按F5即可执行,该方式指定运行python解释器,也在program指定了运行py文件为test_py.py路径。

{
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "test_py",
            "type": "python",
            "request": "launch",
            "python": "/home/ubuntu/miniconda3/envs/dp/bin/python", // 指定python解释器
            "program": "/home/ubuntu/vscode-main/test_py.py", //"${file}",
            "console": "integratedTerminal",
            "justMyCode": true, //为true表示只debug自己代码,为false表示可debug库中文件
            "args": [ //这里配置参数
                "--weights","model_yolov5s",//"--weights=model_yolov5s"  字符串也可以使用这种方式,能自动解析
                "--epochs=600", //"--epochs", "600", 整形也可以使用这种方式,能自动解析
            ]   
        }     
    ]
}

说明:args配置有2种方式都已在代码注释中

vscodelaunchjson_74"># 3、第二种vscode调用方法(launch.json配置)

此方式需打开对应test_py.py文件(当前页面是这个),按F5即可执行,与上区别在于未指定了运行py文件test_py.py路径,其它都一样。


{
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "test_py2",
            "type": "python",
            "request": "launch",
            "python": "/home/ubuntu/miniconda3/envs/dp/bin/python", // 指定python解释器
            "program":  "${file}",
            "console": "integratedTerminal",
            "justMyCode": true, //为true表示只debug自己代码,为false表示可debug库中文件
            "args": [ //这里配置参数

                "--weights","model_yolov5s",//"--weights=model_yolov5s"  字符串也可以使用这种方式,能自动解析
                "--epochs=200", //"--epochs", "600", 整形也可以使用这种方式,能自动解析
            ]
           
        }

        
    ]
}

deepspeedpydeepspeed_testpy_105">二、deepspeed运行py文件代码(deepspeed_test.py)

至于代码模块不是本文重点内容,我将不在介绍,直接给出代码,如下:

import torch
import os
from datetime import datetime
from transformers import HfArgumentParser
from dataclasses import dataclass, field
from typing import Optional
import sys
from transformers import TrainingArguments


@dataclass
class ModelArguments:
    """
    Arguments pertaining to which model/config/tokenizer we are going to fine-tune from.
    """

    model_name_or_path: str = field(
        metadata={
            "help": "Path to pretrained model or model identifier from huggingface.co/models"}
    )


def gen_data():
    x = torch.randn(10, 10).to('cuda')
    return x


def main() -> int:

    parser = HfArgumentParser((ModelArguments, TrainingArguments))
    if len(sys.argv) == 2 and sys.argv[1].endswith(".json"):
        # If we pass only one argument to the script and it's the path to a json file,
        # let's parse it to get our arguments.
        model_args, train_args = parser.parse_json_file(
            json_file=os.path.abspath(sys.argv[1]))
    else:
        model_args, train_args = parser.parse_args_into_dataclasses()

    print(model_args)
    print(train_args)

    gen_data()

    local_rank = int(os.environ["LOCAL_RANK"])
    world_size = int(os.environ["WORLD_SIZE"])
    cur_dateime = datetime.now()
    print("*" * 80)
    value = torch.cuda.device_count()
    print(
        f"----> cur_datetime: {cur_dateime},world size: {world_size}, local_rank: {local_rank}, gpu count: {value}")
    return value


if __name__ == '__main__':
    main()

deepspeeddebug_169">三、deepspeed命令调用(无法debug)

你也可以直接使用命令,也可使用sh脚本调用,如下:

deepspeed --num_nodes=1 --num_gpus=2 \
    deepspeed_test.py  \
    --deepspeed "./config/default_offlload_zero2.json" \
    --model_name_or_path my_model \
    --output_dir "./save_dir"

运行结果如下:
在这里插入图片描述

deepspeedvscodedebug_182">四、deepspeed使用vscode进行调试(能debug)

同样调用deepspeedvscode一样是配置launch.json文件,如下配置:

{
    "version": "0.2.0",
    "configurations": [
        
{
            "name": "ds_zero2",
            "type": "python",
            "request": "launch",
            "program": "/home/ubuntu/miniconda3/envs/cogvlm/bin/deepspeed", //"${file}",
            "console": "integratedTerminal",
            "justMyCode": true,
            "args": [
                "--num_nodes",
                "1",
                "--num_gpus",
                "2",
                "${file}", //这个就是当前界面运行文件
                "--deepspeed",
                "./config/default_offlload_zero2.json",
                "--model_name_or_path",
                "my_model",
                "--output_dir",
                "./out_dir"
            ],
            "env": {
                "CUDA_VISIBLE_DEVICES": "0",
                "PYDEVD_DISABLE_FILE_VALIDATION": "1",
            }
        }

        
    ]
}

在py当前界面选择项目直接F5即可执行,结果如下:
在这里插入图片描述

vscodeshdebug_223">五、vscode执行类似sh命令调试总结(能debug)

使用vscode执行命令方式最大优势能进行debug模式,而原有命令debug非常困难或无法debug(除利用其它工具),
都可将sh命令在vscode中转换,我已多次实验,总结下要点。

1、launch.json的args、program、justMyCode、env参数说明

justMyCode:是否允许库文件设置断点进行debug,fasle表示允许,true表示不允许
env:环境变量,特别是cuda显卡设置

program:设定执行程序路径,很重要
args:类似sh给执行程序参数设定,与program配置使用

2、python **.py 命令执行

直接给列子,若执行 python test.py --weights yolov5s.pt --epochs 20
在launch.json文件需配置python解释器路径,有单独参数“python”,也需要配置执行文件,配置如下:

"python": "/home/ubuntu/miniconda3/envs/yolo/bin/python", // 指定python解释器
"program":"${file}" //可以理解为相对执行py文件路径
# "program": "/home/ubuntu/vscode-main/test_py.py", //相对给定一个绝对执行路径

上面的program配置是二选一都可以,相当于已经写了sh命令写好:python test_py.py,但还缺参数,使用args配置如下::

"args": [ 
            "--weights",“yolov5s.pt”
            "--epochs=600", 
        ]   

相当于在python test_py.py命令跟上了 --weights yolov5s.pt --epochs 600参数,代码合起来为命令参数且可debug,如下:

python test_py.py  --weights  yolov5s.pt   --epochs  600

deepspeed__255">3、deepspeed 命令执行

这个是使用deepspeed命令运行,无需配置python解释器,在launch.json文件需配置deepspeed执行路径,需给program,配置如下:

"program": "/home/ubuntu/miniconda3/envs/cogvlm/bin/deepspeed", 

上面的program配置相当于已经写了sh命令写好:deepspeed,仍需配置参数(注意位置),使用args配置如下::

    "args": [
        "--num_nodes","1",
        "--num_gpus","2",
        "${file}", //这个就是当前界面运行文件
        "--deepspeed",
        "./config/default_offlload_zero2.json",
        "--model_name_or_path", "my_model",
        "--output_dir", "./out_dir"
    ]

其中"${file}"表示运行文件,上面相当于在deepspeed后面添加

--num_nodes=1 --num_gpus=2 \
    deepspeed_test.py  \
    --deepspeed "./config/default_offlload_zero2.json" \
    --model_name_or_path my_model \
    --output_dir "./save_dir"

最终实现类似sh的命令执行,如下完整命令代码:

deepspeed --num_nodes=1 --num_gpus=2 \
    deepspeed_test.py  \
    --deepspeed "./config/default_offlload_zero2.json" \
    --model_name_or_path my_model \
    --output_dir "./save_dir"

注:需要注意args配置的位置


总结

deepspeedvscode进行debug方式使用方法,也适用于torchrun使用方法,我个人觉得只要类似sh脚本命令,理论都可使用。

推荐视屏:点击这里


http://www.niftyadmin.cn/n/5262388.html

相关文章

JavaScript中的this指向哪?

一、引言 this可以说是前端开发中比较常见的一个关键字,由于其指向是在运行时才确定,所以大家在开发中判断其方向时也会很模糊,今天就把this的指向问题拆开了,揉碎了,好好讲一讲。 先来看一个场景,看看该处…

XML映射文件(第二种方式执行SQL语句)

第一种方式是注解的方式在下面: 注解操作SQL语句https://blog.csdn.net/m0_71149935/article/details/134908856?spm1001.2014.3001.5501 要想使用XML,需要遵守三项规范: XML映射文件的名称与Mapper接口名称一致,并且将XML映射…

C# 如何控制多线程同步执行

写在前面 使用Task类来控制多线程的同步执行,可应用于多任务分发执行后,再做归并处理。Tas既拥有线程池的优点,同时也解决了使用ThreadPool不易控制的弊端;可以非常简便并可靠地实现多线程的顺序执行。 代码实现 public class …

机器学习 | 机器学习基础知识

一、机器学习是什么 计算机从数据中学习规律并改善自身进行预测的过程。 二、数据集 1、最常用的公开数据集 2、结构化数据与非结构化数据 三、任务地图 1、分类任务 Classification 已知样本特征判断样本类别二分类、多分类、多标签分类 二分类:垃圾邮件分类、图像…

vue3页面调接口时加载卡住不响应

在Vue 3中,如果你发现在调用接口时页面加载卡住或不响应,可能是由以下几个原因造成的: 接口请求耗时过长:如果后端接口处理时间过长,会导致前端等待响应的时间增加,从而感觉页面卡住。可以尝试优化后端接口…

华为政企城市一张网研究报告

图4-2:数字经济虚拟网服务图

单元测试二(理论)-云计算2023.12-云南农业大学

文章目录 一、单选题1、三次握手、四次挥手发生在网络模型的哪一层上?2、互联网Internet的拓扑结构是什么?3、以下哪一种网络设备是工作在网络层的?4、以下哪种关于分组交换网络的说法是错误的?5、以下哪种协议是在TCP/IP模型中的…

Axure的安装及界面基本功能介绍

目录 一. Axure概述 二. Axure安装 2.1 安装包下载 2.2 安装步骤 三. Axure功能介绍​ 3.1 工具栏介绍 3.1.1 复制,剪切及粘贴 3.1.2 选择模式和连接 3.1.3 插入形状 3.1.4 点(编辑控点) 3.1.5 置顶和置底 3.1.6 组合和取消组合 …