项目 | 内容 |
---|---|
课程:北航-2020-春-软件工程 | 博客园班级博客 |
作业要求 | 技术规格说明书 |
我们在这个课程的目标是 | 提升团队管理及合作能力,开发一项满意的工程项目 |
这个作业在哪个具体方面帮助我们实现目标 | 说明项目技术规格与特性 |
一、概述&技术栈
1. 产品概述
本团队继承了上一届的VisualPytorch,宏观架构基本一致。上一届在实现拖拽生成模型代码并提供打包下载的基础上,实现了用户注册登录,访问量统计,以及帮助界面,新手引导等功能。本组打算在其基础上进行拓展,具体内容见:功能设计
计划\(\alpha\)阶段实现①扩展更多的网络层,②支持将网络封装成块,③经典模型,④更精美的可视化
在\(\beta\), \(\gamma\)阶段实现⑤GPU云环境的部署,⑥集成tensorboard可视化,⑦用户登录与模型保存,⑧模型分享与交流
2.技术栈
本项目开发的技术栈结构如上图所示,具体描述如下:
A. 前端框架
之前的项目使用了完整的前端框架,包含Jquery+BootStrap+CSS+html,拖拽部分使用JqueryUI和Jsplumb,为了实现嵌套功能,会对前端拖拽部分进行修改。
- Jquery封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互
- bootstrap框架提供了非常丰富的CSS样式,也可以从源码定制自己所需要的样式,所以给我们造就了比较大的自定义空间
- jQuery UI 是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库。包含底层用户交互、动画、特效和可更换主题的可视控件。我们可以直接用它来构建具有很好交互性的web应用程序
- Jsplumb适用于必须绘制图表的Web应用程序,例如类似于Visio的应用程序或工作流程设计器等。由于图表项目和连接的所有参数都是非常精细可控的
B. 后端框架
采用Django+Django rest framework进行前后端分离管理后端的数据库,为前端的展示提供保障。
另外生成的代码基于Pytorch,但上一届生成时采用了硬编码,仅仅单独针对了minst手写数据集,这部分未来会被修改,适应更加灵活的场景。
- Django是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框架模式,即模型M,视图V和控制器C
- Django REST Framework可以在Django的基础上迅速实现API,并且自身还带有WEB的测试页面,可以方便的测试自己的API。使用在前后端分离的应用模式中
C. 数据库
沿用上一届架构,采用MySql数据库。由于后端采用ORM框架,因此数据库选用比较灵活。
D. Web引擎
Apache和Nginx均可。考虑采用nginx + uwsgi方式部署。
-
nginx 是一个开源的高性能的 HTTP 服务器和反向代理:处理静态文件和索引文件效果非常高;非常注重效率;稳定性高,配置简洁;并有强大的反向代理和负载均衡功能
-
uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。Nginx 中HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换
E. 云环境
往届由学校提供相关资源,今年受到疫情影响,暂未公布具体情况。但根据往届情况来看,使用一台服务器并将数据库、缓存库、存储内容部署在本机即可。
如果\(\alpha\)阶段任务完成情况较好,实现了主要的核心功能,我们就可以尝试使用GPU资源实现网络模型在线学习功能。
3. 接口规格(暂定)
请求方法 | 请求路径 | 路由指向 | 用途 | |
---|---|---|---|---|
1 | post |
/api/journal/visit/ |
/journal/views.py/Visit |
根据用户IP更新总访问量和日访问量 |
2 | get |
/api/journal/statistics/ |
/journal/views.py/Statistics |
查看后台相关数据如访问量/网络数/用户数 |
3 | get |
/api/NeuralNetwork/network/?id=x |
/NeuralNetwork/views.py/NetworkList |
获取用户所有的网络模型 |
4 | post |
/api/NeuralNetwork/network/?id=x |
/NeuralNetwork/views.py/NetworkList |
更新或创建用户网络模型 |
5 | get |
/api/NeuralNetwork/network/id/ |
/NeuralNetwork/views.py/NetworkDetail |
获取用户网络模型 |
6 | put |
/api/NeuralNetwork/network/id/ |
/NeuralNetwork/views.py/NetworkDetail |
从客户端向服务器传送的数据取代指定的文档的内容 |
7 | delete |
/api/NeuralNetwork/network/id/ |
/NeuralNetwork/views.py/NetworkDetail |
删除id对应网络 |
8 | post |
/api/NeuralNetwork/getcode/ |
/NeuralNetwork/views.py/gen_code |
生成代码 |
9 | post |
/api/NeuralNetwork/download/ |
/NeuralNetwork/views.py/download_project |
提供代码下载 |
10 | post |
/api/user/register/ |
/user/views.py/UserRegister |
用户注册 |
11 | get |
/api/user/login/ |
/user/views.py/UserInfo |
提供用户信息 |
二、分析
1. 抽象 、模块化、封装
底层数据抽象化:将底层的数据访问封装成面向对象的形态(ORM)
- 将SQL的各类操作语句,封装成OOP的操作
- 将数据库内的数据信息,封装成OOP对象形态,方便读写
- 将数据库结构的变动,维护成数据库迁移(migration),方便日后的不断后续开发维护
用户视图封装:支持将网络封装成模块
- 在用户搭建神经网络,尤其是较为复杂的网络时,不会因为网络层结构的复杂而眼花缭乱
- 我们在经典模型中提供一些组建好的网络模型,用户可以随时拖动该模块进入框内进行连接,而不需要关系模型内部结构
- 支持用户自己封装一些基本块,随时调用并嵌入到他们自己的模型中去,供用户自己创建模块的超参数
RESTful API
-
传统的Web App是后端与前端写在一起。这样做的缺点是,前端和后端互相干扰,能够通过模板引擎中的参数随意修改对方的值。显然,这样的开发方式是不利于信息的封装的。
-
我们的设计使用了RESTful API,前端只需要在特定的时候调用后端提供的API,就可以获得其想要的数据;后端只需要为前端提供API,无法干涉前端的运作方式。如此,前后端都被各自封装起来,相互透明,内部信息不会对外界暴露,只通过API来交换信息,做到了信息的封装和隐藏。
2. 界面和实现的分离
我们采用的前后端分离方案,就是由后端提供统一的RESTful API接口,前端调用以获得数据。
我们组的前端开发人员负责编写前端页面的代码,后端开发人员负责编写后端代码,两组人员之间没有交叠,可以并行开发,靠的就是这一套设计得当的API。RESTful API传递的是与语言环境无关的json格式数据,借此我们做到了完全的前后端分离。
3. 如何处理错误情况
当服务器出现意外,返回错误的信息时,前端会及时根据HTTP Status Code判断发生了什么异常,并给予用户弹窗提醒。对于最常见的没有找到目标对象的错误,前端会根据后端提供的信息,给用户以详细的提示和操作指导。
4. 应对变化的灵活性
由于前后端是分离开发的,因此在遇到新的需求或需求变更时,只需要新增或修改一下API接口,便可以前端后端同步进行开发,以实现新的需求。由于后端和前端都有良好的模块化特性,许多新需求变更只需要编写一个简单的模块,再将其嵌入整个系统便可以解决。
5. 对大量数据的处理能力
我们的项目的核心功能是在前端由可视化模型生成代码,生成过程不会产生大量的数据。同时,两次提交请求之间会有较大的间隔,模型简单且数量有限,可以应对大多数情况。
而如果我们实现在线训练功能,最主要的瓶颈还是数据模块,针对不同的模型,数据量可能会变得相当地大,如果我们提供了在线训练功能的话,需要用户将数据导入网站或者提前准备好大数据。
Google Colab已经提供了一个相当强大的在线训练平台,提供了T4的GPU和大存储空间,提供给用户在线training及inference,对于大数据,我们可以借鉴他们的处理方式。