大模型系列3--pytorch dataloader的原理

news2024/11/15 2:03:54

pytorch dataloader运行原理

  • 1. 背景
  • 2. 环境搭建
    • 2.1. 安装WSL & vscode
    • 2.2. 安装conda & pytorch_gpu环境 & pytorch 2.11
    • 2.3 命令行验证python环境
    • 2.4. vscode启用pytorch_cpu虚拟环境
  • 3. 调试工具
    • 3.1. vscode 断点调试
    • 3.2. py-spy代码栈探测
    • 3.3. gdb attach
    • 3.4. 查看进程访问的系统调用
  • 4. DataLoader代码分析
    • 4.1. DataLoader代码示例
    • 输出结果
    • 4.2.

1. 背景

工作中遇到需要跟踪dataloader访问IO卡住的问题,有一个类似于IO read的堆栈的hang,需要判断是否是真的IO hang住,于是乎趁着周末仔细阅读一下dataloader的代码,了解下torch dataloader的内部原理。作为一个初学者,这个文章会比较杂一些,请各位读者谅解。

为了和linux相配套,本文拟采用WSL环境来搭建conda + torch的开发环境。

2. 环境搭建

2.1. 安装WSL & vscode

参考系列中的一篇文章:环境部署

2.2. 安装conda & pytorch_gpu环境 & pytorch 2.11

下载conda
在WSL中安装conda,通过以下命令下载sh脚本
wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
有另外一个镜像站,下载很快:https://mirrors.sustech.edu.cn/anaconda/archive/

对下载的内容进行SHA-256校验

  • Get-FileHash filename -Algorithm SHA256
  • c536ddb7b4ba738bddbd4e581b29308cb332fa12ae3fa2cd66814bd735dff231
    在这里插入图片描述

安装conda

  • bash Anaconda3-2024.02-1-Linux-x86_64.sh
  • 按照提示,填yes,设置安装目录,更新shell,随后重启WSL的terminal界面。可以看到如下图,zshrc环境已经被更新了,重启shell会默认进入到(base)环境。
    在这里插入图片描述

创建python虚拟环境
创建python虚拟环境pytorch_cpu,并激活它

  • conda create --name pytorch_cpu python=3.11
  • conda activate pytorch_cpu
  • 替换conda安装源,因为默认的anaconda的源实在是太慢
    • https://blog.csdn.net/Xiao_Spring/article/details/109130663
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/

安装2.1版本pytorch

  • conda install pytorch==2.1 cpuonly -c pytorch

安装pandas

  • conda install pandas

2.3 命令行验证python环境

准备构造一段数据:使用ChatGPT写一段代码,要求生成1-100个文件,采用pickle + gzip的模式,命名为1-100.pkl.gz,每个文件中是10个随机的kv对,k和v都是随机数字转换成的字符串。构造的代码如下:

import os
import pickle
import gzip
import random
import string

# 解释代码 | 注释代码 | 生成单测 |
def generate_random_dict():
    random_dict = {}
    for _ in range(10):
        key = ''.join(random.choice(string.digits) for _ in range(5))
        value = ''.join(random.choice(string.digits) for _ in range(5))
        random_dict[key] = value
    return random_dict

def generate_files():
    file_names = [f'{i}.pkl.gz' for i in range(1, 101)]
    for file_name in file_names:
        with gzip.open(file_name, 'wb') as f:
            random_dict = generate_random_dict()
            pickle.dump(random_dict, f)
    for file_name in file_names:
        print(file_name)

if __name__ == "__main__":
    os.chdir("c:\\workspace\\llm\\hello_project_1\\dataset\\data\\filelist")
    generate_files()

运行上述代码:

  • python demo_gen_pkl_gz.py

输出结果如下:
在这里插入图片描述

2.4. vscode启用pytorch_cpu虚拟环境

vscode中启动WSL,然后打开一个python文件,点击vscode屏幕右下角的python环境,默认是/usr/bin/python,会自动提示多个python环境,选择pytorch_cpu环境,如下图所示:
在这里插入图片描述
打开上述python文件demo_gen_pkl_gz.py,点击右上角的三角符号,选择Run Python File,即可run此python文件。
在这里插入图片描述

3. 调试工具

为了更方便地进行问题跟踪,我们需要学习几种调试工具

3.1. vscode 断点调试

  • 在相应的代码增加断点
  • 点击右上角的Python Debugger: Debugger using launch.json 按钮
  • 它会自动在断点处停下来
    • 查看local和global的变量,主动添加新的监视
    • 查看线程堆栈
    • 单步运行或者继续或者停止均可
      在这里插入图片描述
      如果将断点放在内部库的代码,例如在gzip.open实现内部打断点,会发现断点不生效。需要在lanuch.json中增加一行配置:"justMyCode": false,就可以使得断点生效了。
      在这里插入图片描述

在这里插入图片描述

3.2. py-spy代码栈探测

  • pip3 install py-spy
  • py-spy dump --pid ${pid}
    在这里插入图片描述
  • 支持的一些有用的参数
    在这里插入图片描述

3.3. gdb attach

  • conda install gdb
  • apt-get install python3-dbg
  • gdb -p ${pid} 加载进程,即可使用各种命令进行调试
    在这里插入图片描述

3.4. 查看进程访问的系统调用

  • strace -f -p ${pid} -s 1024

4. DataLoader代码分析

4.1. DataLoader代码示例

下面是一个采用多进程来读取数据的代码,它的代码逻辑很简单。首先创建一个DataLoader结构,它传入的最关键的参数为dataset,用以从dataset数据集中读取数据;最后通过for data in dataloader:将数据从dataloader中打印出来。可以通过调整num_workers来设置是否启动后台进程进行load数据


import gzip
import os
import pickle
import random
import time

import pandas as pd
import torch
from torch.utils.data import DataLoader, Dataset


def load_gzip_pickle(pkl_fpath):
    with gzip.open(pkl_fpath, "rb") as f:
        data = pickle.load(f)
    return data


class MapDataSet(Dataset):
    def __init__(self, index_list_fpath):
        self.index_list = pd.read_csv(index_list_fpath)

    def __len__(self):
        return len(self.index_list)

    def __getitem__(self, idx):
        pkl_fpath = self.index_list.iloc[idx].tolist()[0]
        pkl_fpath = f"filelist/{pkl_fpath}"
        print("try to simulate slow io wait...")
        #time.sleep(10)
        data = load_gzip_pickle(pkl_fpath)
        # post processing
        print("try to simulate slow data processing...")
        #time.sleep(10)
        print(pkl_fpath, ": idx:", idx, ": data:", data.keys(), ": len", len(data), ": pid:", os.getpid())
        return data


def get_data_loader(index_list_fpath, batch_size=1, num_workers=16):
    dataset = MapDataSet(index_list_fpath=index_list_fpath)
    return DataLoader(dataset, batch_size=batch_size, num_workers=num_workers, collate_fn=lambda batch: batch[0])


def test_dataloader(index_list_fpath):
    batch_size = 1
    num_workers = 0
    dataloader = get_data_loader(index_list_fpath=index_list_fpath, batch_size=batch_size, num_workers=num_workers)
    for data in dataloader:
        print(data.keys(), ": len", len(data), ": pid:", os.getpid())


if __name__ == "__main__":
    os.chdir("c:\\workspace\\llm\\hello_project_1\\dataset\\data")
    index_list_fpath = "filelist.csv"
    test_dataloader(index_list_fpath)

输出结果

try to simulate slow io wait...
try to simulate slow data processing...
filelist/1.pkl.gz : idx: 0 : data: dict_keys(['86099', '83840', '15119', '03197', '57912', '42663', '32969', '49818', '47455', '53997']) : len 10 : pid: 9724
dict_keys(['86099', '83840', '15119', '03197', '57912', '42663', '32969', '49818', '47455', '53997']) : len 10 : pid: 9724
try to simulate slow io wait...
try to simulate slow data processing...
filelist/2.pkl.gz : idx: 1 : data: dict_keys(['91534', '12121', '94084', '12699', '03382', '10877', '21595', '20303', '41507', '47594']) : len 10 : pid: 9724
dict_keys(['91534', '12121', '94084', '12699', '03382', '10877', '21595', '20303', '41507', '47594']) : len 10 : pid: 9724
try to simulate slow io wait...
try to simulate slow data processing...
filelist/3.pkl.gz : idx: 2 : data: dict_keys(['85974', '89204', '39248', '46884', '09986', '30033', '97369', '18704', '24227', '15649']) : len 10 : pid: 9724
dict_keys(['85974', '89204', '39248', '46884', '09986', '30033', '97369', '18704', '24227', '15649']) : len 10 : pid: 9724
try to simulate slow io wait...
.......

4.2.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于锚框的物体检测过程

说明:基于锚框的物体检测过程:分为单阶段和两阶段 整体步骤: 提供目标候选区域: 锚框提供了一组预定义的候选区域,这些区域可以覆盖各种尺度和长宽比的目标。通过这些锚框,可以在不同的位置和不同的尺度上…

02-Charles的安装与配置

一、Charles的安装 Charles的下载地址:https://www.charlesproxy.com/。 下载之后,傻瓜式安装即可。 二、Charles组件介绍 主导航栏介绍: 请求导航栏介绍: 请求数据栏介绍: 三、Charles代理设置 四、客户端-windows代理…

【Linux】多线程_6

文章目录 九、多线程7. 生产者消费者模型生产者消费者模型的简单代码结果演示 未完待续 九、多线程 7. 生产者消费者模型 生产者消费者模型的简单代码 Makefile: cp:Main.ccg -o $ $^ -stdc11 -lpthread .PHONY:clean clean:rm -f cpThread.hpp: #i…

React学习笔记02-----

一、React简介 想实现页面的局部刷新,而不是整个网页的刷新。AJAXDOM可以实现局部刷新 1.特点 (1)虚拟DOM 开发者通过React来操作原生DOM,从而构建页面。 React通过虚拟DOM来实现,可以解决DOM的兼容性问题&#x…

NSSCTF_RE(一)暑期

[SWPUCTF 2021 新生赛]简单的逻辑 nss上附件都不对 没看明白怎么玩的 dnspy分析有三个 AchievePoint , game.Player.Bet - 22m; for (int i 0; i < Program.memory.Length; i) { byte[] array Program.memory; int num i; array[num] ^ 34; } Environment.SetEnvironment…

【CICID】GitHub-Actions-SpringBoot项目部署

[TOC] 【CICID】GitHub-Actions-SpringBoot项目部署 0 流程图 1 创建SprinBoot项目 ​ IDEA创建本地项目&#xff0c;然后推送到 Github 1.1 项目结构 1.2 Dockerfile文件 根据自身项目&#xff0c;修改 CMD ["java","-jar","/app/target/Spri…

Scrapy框架实现数据采集的详细步骤

需求描述&#xff1a; 本项目目标是使用Scrapy框架从宁波大学经济学院网站&#xff08;nbufe.edu.cn&#xff09;爬取新闻或公告详情页的内容。具体需求如下&#xff1a; 1、通过遍历多个页面&#xff08;共55页&#xff09;构建翻页URL。 2、使用scrapy自带的xpath从每页的…

STM32智能机器人避障系统教程

目录 引言环境准备智能机器人避障系统基础代码实现&#xff1a;实现智能机器人避障系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;机器人导航与避障问题解决方案与优化收尾与总结 1. 引言 智能机器人避…

Android ImageDecoder把瘦高/扁平大图相当于fitCenter模式decode成目标小尺寸Bitmap,Kotlin

Android ImageDecoder把瘦高/扁平大图相当于fitCenter模式decode成目标小尺寸Bitmap&#xff0c;Kotlin val sz Size(MainActivity.SIZE, MainActivity.SIZE)val src ImageDecoder.createSource(mContext?.contentResolver!!, uri)val bitmap ImageDecoder.decodeBitmap(sr…

iPhone数据恢复篇:在 iPhone 上恢复找回短信的 5 种方法

方法 1&#xff1a;检查最近删除的文件夹 iOS 允许您在 30 天内恢复已删除的短信。您需要先从“设置”菜单启用“过滤器”。让我们来实际检查一下。 步骤 1&#xff1a;打开“设置” > “信息”。 步骤 2&#xff1a;选择“未知和垃圾邮件”&#xff0c;然后切换到“过滤…

全开源批量SEO外链工具html源码

全开源批量SEO外链工具html源码&#xff0c;已更新增加大量高质量外链 若需要增加修改其他外链请打开txt文件 修复优化页面端代码&#xff0c;界面布局 源码为自适应端&#xff0c;手机和电脑端都适配 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725…

Redis作为缓存,如何保证MySQL数据库与Redis缓存一致性(双写一致性)?

双写一致性&#xff1a;当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致。 强一致性&#xff1a;如果项目要求数据库与Redis保持高度一致&#xff0c;可以采用读写锁保证强一致性。采用redisson实现的读写锁&#xff0c;在读的时候添加共…

基于单片机的停车场车位管理系统设计

1.简介 停车场车位管理系统是日常中随处可见的一种智能化车位管理技术&#xff0c;使用该技术可以提高车位管理效率&#xff0c;从而减轻人员车位管理工作负荷。本系统集成车牌识别、自动放行、自助缴费等技术&#xff0c;并且具备车位占用状态实时监测与车位数量实时统计、查询…

论文翻译:Rethinking Interpretability in the Era of Large Language Models

https://arxiv.org/abs/2402.01761 在大型语言模型时代的可解释性再思考 摘要 在过去十年中&#xff0c;随着越来越大的数据集和深度神经网络的兴起&#xff0c;可解释机器学习领域的兴趣迅速增长。同时&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在广泛的任务中…

STM32-寄存器点灯案例详解

本文以PA1引脚点亮LED灯为案例&#xff0c;解析了STM32寄存器操作的配置过程&#xff0c;以及从手册查询方法和寄存器配置步骤。 一、概念 1.十六进制和二进制之间相互转换关系 首先&#xff0c;需要了解十六进制和二进制之间的基本转换方法。十六进制是一种基数为16的数制&…

如何在VS200和VScode里面查看数组全部值

如何在VS200和VScode里面查看数组全部值 如何在VS200和VScode里面查看数组全部值 如何在VS200和VScode里面查看数组全部值 需要在调试阶段&#xff0c;在监视窗口添加表达式即可 第一种是解包&#xff0c;能够从0开始查看指定元素个数 第二种是指针索引&#xff0c;能够从0开…

Dpm-tse:目标声音提取的扩散概率模型

第二章 目标说话人提取之《DPM-TSE: A DIFFUSION PROBABILISTIC MODEL FOR TARGET SOUND EXTRACTION》 文章目录 前言一、任务二、动机三、挑战四、方法1.概率扩散模型2.修正噪音时间表和采样步骤3. 模型框架4. 五、实验评价1.数据集2.消融实验3.客观评价4.主观评价 六、结论七…

链接追踪系列-10.mall-swarm微服务运行并整合elk-上一篇的番外

因为上一篇没对微服务代码很详细地说明&#xff0c;所以在此借花献佛&#xff0c;使用开源的微服务代码去说明如何去做链路追踪。 项目是开源项目&#xff0c;fork到github以及gitee中&#xff0c;然后拉取到本地 后端代码&#xff1a; https://gitee.com/jelex/mall-swarm.gi…

全栈 Discord 克隆:Next.js 13、React、Socket.io、Prisma、Tailwind、MySQL笔记(一)

前言 阅读本文你需要有 Next.js 基础 React 基础 Prisma 基础 tailwind 基础 MySql基础 准备工作 打开网站 https://ui.shadcn.com/docs 这不是一个组件库。它是可重用组件的集合&#xff0c;您可以将其复制并粘贴到应用中。 打开installation 选择Next.js 也就是此页面…

C字符串和内存函数介绍(三)——其他的字符串函数

在#include<string.h>的这个头文件里面&#xff0c;除了前面给大家介绍的两大类——长度固定的字符串函数和长度不固定的字符串函数。还有一些函数以其独特的用途占据一席之地。 今天要给大家介绍的是下面这三个字符串函数&#xff1a;strstr&#xff0c;strtok&#xf…