Skip to content

dbsxdbsx/only_torch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

这是啥?

一个用纯Rust(不用C++)打造的仿Pytorch的玩具型AI框架(目前尚不成熟,请勿使用)。该项目不打算支持GPU--因后期可能要支持安卓等平台,不想受制于某(几)种非CPU设备。但可能会加入NEAT等网络进化的算法。

名字由来

一部分原因是受到pytorch的影响,希望能写个和pytorch一样甚至更易用的AI框架;另一部分是希望本框架只触及(touch)一些关键的东西:

  • only torch Rust --- 只用Rust(不用C++是因为其在复杂逻辑项目中容易写出内存不安全代码);也不打算支持Python接口);亦不用第三方lib(所以排除tch-rs),这样对跨平台支持会比较友好。
  • only torch CPU --- 不用GPU,因要照顾多平台也不想被某个GPU厂商制约,且基于NEAT进化的网络结构也不太好被GPU优化(也省得考虑数据从CPU的堆栈迁移到其他设备内存的开销问题了)。
  • only torch node --- 没有全连接、卷积、resnet这类先入为主的算子概念,具体模型结构均基于NEAT进化。
  • only torch tensor --- 所有的数据类型都是内置类型tensor(实现可能会参考peroxide),不需要第三方处理库,如numpyarrayopenBLAS关于blas的一些说明)。
  • only torch f32 --- 网络的参数(包括模型的输入、输出)不需要除了f32外的数据类型。

文档

目前无人性化的文档。可直接看Rust自动生成的Api Doc即可。

使用示例

(无)

TODO

  • pass-id实现后:test_variable_node_initialization_and_set_value_for_forward_count_mechanismtest_reset_graph_forward_cnt_for_forward_count_mechanismfn test_a_complete_case_for_forward_count_mechanism()删除

  • graph反向传播中有些节点没有值需要过滤怎么添加(如多个output的网络结构)?

  • 针对loss1.backward(retain_graph=True)detach()还有多output输出,多次backward的问题;

  • ada_line还是有问题

  • 对比Node_variable和Graph的测试,看看如何优化精简Graph的测试

  • Graph测试中该包含各种pub method的正确及错误测试

  • Graph测试中最好添加某个节点后,测试该节点还有其父节点的parents/children属性(又比如:同2个节点用于不同图的add节点,测试其parents/children属性是否正确)(Variable 节点无父节点)、“节点var1在图default_graph中重复”

  • add a graph for unit test to test the 多层的jacobi计算,就像ada_line那样?

  • 各种assign类的op(如:add_assign)是否需要重载而不是复用基本算子?

  • 在python中仿造ada_Line构造一个复合多节点,然后基于此在rust中测试这种复合节点,已验证在复合多层节点中的反向传播正确性

  • jacobi到底该测试对parent还是children?

  • how to expose only in crate::nn to the nn::Graph`?

  • should completely hide the NodeHandle?

  • Graph/NodeHandle rearrange blocks due to visibility and funciontality

  • NodeHandle重命名为Node? 各种parent/children/node_id重命名为parents/children/id?

  • should directly use parents but not parents_ids?

  • unit test for Graph, and parent/children

  • unit test for each current module methods

  • check other unused methods

  • draw_graph(graphvis画图)

  • save/load网络模型(已有test_save_load_tensor)

  • 后期当NEAT,可以给已存在节点添加父子节点后,需要把现有节点检测再完善下;

  • 当后期(NEAT阶段)需要在一个已经forwarded的图中添加节点(如将已经被使用过的var1、var2结合一个新的未使用的var3构建一个add节点),可能需要添加一个reset_forward_cnt方法来保证图forward的一致性。

  • NEAT之后,针对图backward的loss1.backward(retain_graph=True)detach()机制的实现(可在GAN和强化学习算法实例中针对性实现测试),可能须和forward_cnt机制结合, 还要考虑一次forward后多次backward()后的结果。

  • Tensor 真的需要uninit吗?

  • 各种命名规范“2维”,“二维”,“二阶”,“2阶”,“一个”,“两个”,“三个”,“需要”,“需”,“须要”,“须”,“值/value”,"变量/variable","node/handle",“注/注意:”,”dim/dimension/rank“,"维/阶",","改为", ","仍然"改为”仍“

  • 根据matrixSlow+我笔记重写全部实现!保证可以后期以NEAT进化,能ok拓展至linear等常用层,还有detach,,容易添加edge(如已存在的add节点的父节点),。

  • 等ada_line例子跑通后:Variable节点做常见的运算重载(如此便不需要用那些丑陋的节点算子了)

  • 图错误“InvalidOperation” vs “ComputationError”

  • parent.borrow_mut().children_mut()改变后如何保证其matrix形状是合法的该节点运算后matrix?

  • Tensorlei的index将[[优化成[?

  • Tensor类的slice(&[0..m, j..j+1])是否需要?

  • children_mut是否可合并至children()? and value_mut是否可合并至value?

  • fn as_node_enum(&self) -> NodeEnum trait method 是否多余,对于具体实现的节点,可否隐式转换或直接各节点返回NodeEnum?(只要不要影响后期各种算子的重载)?

  • use approx::assert_abs_diff_eq; need or not?

  • 使用f16代替f32?

目前需要先解决有没有的问题,而不是好不好

  • [] 实现类似tch-rs中tch::no_grad(|| {});的无梯度功能;
  • [] 常用激活函数,tanh,Softplus,sech
  • [] 基于本框架解决XOR监督学习问题
  • [] 基于本框架解决Mnist(数字识别)的监督学习问题
  • [] 基于本框架解决CartPole(需要openAI Gym或相关crate支持)的深度强化学习问题
  • [] 尝试实现下CFC

参考资料

训练用数据集(包括强化学习gym)

数学/IT原理

开源示例

(较为成熟的3方库)

NEAT、神经架构进化

符号派:逻辑/因果推断

神经网络的可解释性

超参数优化

CPU加速

强化学习

rust+大语言模型(LLM)

(自动、交互式)定理证明

博弈论(game)

其他

遵循协议

本项目遵循MIT协议(简言之:不约束,不负责)。

About

Rust写的简易ML库(尚很不成熟)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages