网站用哪些系统做的比较好,电子商务网站建设论文课题,做一个网站要多久,投稿的网站pytorch dataloader运行原理 1. 背景2. 环境搭建2.1. 安装WSL vscode2.2. 安装conda pytorch_gpu环境 pytorch 2.112.3 命令行验证python环境2.4. vscode启用pytorch_cpu虚拟环境 3. 调试工具3.1. vscode 断点调试3.2. py-spy代码栈探测3.3. gdb attach3.4. … pytorch dataloader运行原理 1. 背景2. 环境搭建2.1. 安装WSL vscode2.2. 安装conda pytorch_gpu环境 pytorch 2.112.3 命令行验证python环境2.4. vscode启用pytorch_cpu虚拟环境 3. 调试工具3.1. vscode 断点调试3.2. py-spy代码栈探测3.3. gdb attach3.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 SHA256c536ddb7b4ba738bddbd4e581b29308cb332fa12ae3fa2cd66814bd735dff231
安装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 python3.11conda 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 pytorch2.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] valuereturn random_dictdef 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-spypy-spy dump --pid ${pid} 支持的一些有用的参数
3.3. gdb attach
conda install gdbapt-get install python3-dbggdb -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 timeimport pandas as pd
import torch
from torch.utils.data import DataLoader, Datasetdef load_gzip_pickle(pkl_fpath):with gzip.open(pkl_fpath, rb) as f:data pickle.load(f)return dataclass 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 ffilelist/{pkl_fpath}print(try to simulate slow io wait...)#time.sleep(10)data load_gzip_pickle(pkl_fpath)# post processingprint(try to simulate slow data processing...)#time.sleep(10)print(pkl_fpath, : idx:, idx, : data:, data.keys(), : len, len(data), : pid:, os.getpid())return datadef get_data_loader(index_list_fpath, batch_size1, num_workers16):dataset MapDataSet(index_list_fpathindex_list_fpath)return DataLoader(dataset, batch_sizebatch_size, num_workersnum_workers, collate_fnlambda batch: batch[0])def test_dataloader(index_list_fpath):batch_size 1num_workers 0dataloader get_data_loader(index_list_fpathindex_list_fpath, batch_sizebatch_size, num_workersnum_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.csvtest_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.