# stensor **Repository Path**: ligan15/stensor ## Basic Information - **Project Name**: stensor - **Description**: building deep learning framework - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-03-24 - **Last Updated**: 2025-04-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README - [stensor介绍](#stensore介绍) - [快速开始](#快速开始) - [目录层级](#目录层级) - [common模块](#common模块) - [dataset模块](#dataset模块) - [nn模块](#nn模块) - [ops模块](#ops模块) - [TODO](#TODO) - [展望](#展望) - [动静统一](#动静统一) - [元模块模版](#元模块模版) # stensor介绍 stensor是一种轻量化的深度学习训练/推理框架,对标pytorch提供的接口。 主要特性包括: - 自动微分 - 算子入参类型校验 - tensor接口注册机制 # 快速开始 ```python # 测试使用Transformer模型实现文本翻译任务 pytest -vs tests/model/py或test_transformer.py # 测试生成式预训练大语言模型 pytest -vs tests/model/test_gpt_model.py ``` 模型主要包括以下流程: - 设置超参数 - arg = ArgConfig() - 读取数据 - 创建Dateset - Dataset传递给DataLoader - 创建模型 - 模型初始化 model = Model(arg) - 创建优化器 - 优化器初始化 opt = Optimizer(arg_opt, model.parameters()) - 训练 - DataLoader迭代产生训练数据提供给模型 - 模型计算 y = model(x) - 损失函数计算 loss = loss_f(y, target) - 反向传播 loss.backward() - 优化器更新参数 opt.update() - 推理 # 目录层级 - `model/` —— 模型库 - `stensor/` —— 源代码目录 - `common/` —— tensor类 - `dataset/` —— datase - `common/` —— tensor类定义 - `dataset/` —— dataload类 - `nn/` —— nn部分代码 - `ops/` —— 算子库 - `__init__.py` —— 暴露的所有api接口 - `config.py` —— 上下文环境管理 - `tests/` —— 测试用例 - `requirements.txt` —— 依赖的三方库 - `README.md` —— 当前文件 - `LICENSE` —— 许可证文件 - `.gitignore` —— Git忽略文件列表 ## common模块 - `common/` —— 源代码目录 - `__init__.py` —— 暴露接口 - `_register_for_tensor.py` —— 在functional.py中注册tensor接口 - `tensor.py` —— Tensor类 - `utils.py` —— 工具函数 Tensor类的设计思路: 1. Tensor类属性self.data中承载真实数据。 2. 以loss的输出Tensor开始,调用backward接口进行自动微分流程。 Parameter类的设计思路: 1. 继承自Tensor类,定义为模型层中的权重参数。以属性self.required_grad来判断是否进行权重更新。 ## dataset模块 - `common/` —— 源代码目录 - `__init__.py` —— 暴露接口 - `dataloaders.py` —— Dataset负责建立索引到样本的映射 - `datasets.py` —— DataLoader负责以特定的方式从数据集中迭代的产生 一个个batch的样本集合 —— 源代码目录 - `layer/` —— 所有nn层接口 - `__init__.py` —— 暴露接口 - `activation.py` —— 激活函数层 - `convolution.py` —— 卷积层 - `embedding.py` —— 编码层 - `linear.py` —— 线性层 - `normalization.py` —— 正则化层 - `pooling.py` —— 池化层 - `rnn.py` —— RNN层 - `loss/` —— 损失函数层 - `__init__.py` —— 暴露接口 - `loss.py` —— 损失函数层,通常作为独立的一层与模型组合 - `opt/` —— 优化器 - `__init__.py` —— 暴露接口 - `optimizer.py` —— 优化器更新参数 - `__init__.py` —— 暴露接口 - `container.py` —— module的容器类 - `metric.py` —— 评测指标 - `module.py` —— 模型构建的基本单元 - `utils.py` —— 工具函数 ## nn模块 Module类的设计思路: 1.'__init__'和forward两个函数进行模型的初始化和正向计算过程的搭建。 2.用_params储存所有的参数。用_submodules储存所有的子模块。通过重载__setattr__魔术方法,在构建model时,自动将当前module的parameter和submodule存储,最终树状结构通过names_and_parameters和names_and_submodules两个接口使用yield打印出来。 3.to_gpu和to_cpu接口分别将params转化为numpy/cupy的格式。 4.load_weights和load_weights接口将numpy格式的params保存和加载。 5.plot接口序列化为dot格式文件,并调用第三方工具dot画出计算图。 Optimizer类的设计思路: 1.初始化时传入需要更新的参数。 2.zero_grad接口进行梯度重置。 3.step接口进行一次梯度更新。 4.add_hook接口在参数更新前进行hook函数的操作。 ## ops模块 - `nn/` —— 源代码目录 - `operations/` —— 所有ops接口 - `__init__.py` —— 暴露接口 - `activation_ops.py` —— 激活函数算子 - `common_ops.py` —— Tensor操作算子 - `math_ops.py` —— 数学计算类算子 - `nn_ops.py` —— nn类算子 - `utils.py` —— 工具函数 - `__init__.py` —— 暴露接口 - `functional.py` —— 所有functional接口 - `primitive.py` —— 算子构建基本单元 Primitive类的设计思路: 1.重载__call__方法,取出输入的Tensor类中承载的真实数据,调用forward进行正向计算,并封装成Tensor返回。 2.Tensor.backward接口中使用链式法则调用单算子反向计算函数Primitive.backward完成自动微分。 # TODO 1. 完善_type_check,支持可变输入的Tensor。 2. 完善dataset模块,支持Sample类。 3. 扩展到单卡多机,多卡多机训练。 # 展望 未来支持的特性包括: ## 元模块模版 (基础模版)提供元模块模版,用户可以通过yaml定义组建模型,自动生成编译好的图,从而进行组合。 (支持定制)对于自定义的模型, 可以通过最小粒度的元类型模版进行搭建,再调用编译接口,生成编译好的子图并保存。 ## 动静统一 合并动态图和静态图的概念,用户组件好的模型将自动生成编译成整图,达到最优性能执行。